Hệ thống timelapse construction monitoring.
https://git.k9tech.space/kingkong/timelapse-2a6224640fb6f576f6cba46f0e1646500c87226b6 (Personal Access Token)--registry https://registry.npmjs.org/ khi cài packageMacOS (code) → Gogs push → webhook → Pi 4 (deploy)
↓
┌─ postgres (docker)
├─ redis (docker)
├─ api-server (NestJS)
├─ web-dashboard (Next.js)
└─ worker (Node)
apps/* trong workspaces — device-agent là PythonWorkspace config đúng:
"workspaces": ["apps/api-server", "apps/web-dashboard", "apps/worker", "packages/*"]
@shared-types KHÔNG hợp lệ — dùng @shared/types
Luôn cd vào workspace trước khi bun add
# List repos
curl -H "Authorization: token <TOKEN>" https://git.k9tech.space/api/v1/user/repos
# Create repo
curl -X POST -H "Authorization: token <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"name":"repo-name","private":false}' \
https://git.k9tech.space/api/v1/user/repos
# Create webhook
curl -X POST -H "Authorization: token <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"type":"gogs","active":true,"config":{"url":"http://<pi>:9000/webhook","content_type":"json"},"events":["push"]}' \
https://git.k9tech.space/api/v1/repos/<user>/<repo>/hooks
# Push với token
git remote set-url origin "https://<TOKEN>@git.k9tech.space/kingkong/timelapse-2.git"
git push -u origin main
Trên Pi 4 cần:
git clone https://git.k9tech.space/kingkong/timelapse-2.git /opt/timelapseTạo /opt/timelapse/.env với:
GOGS_TOKEN=<deploy_token>
GOGS_REPO_URL=https://git.k9tech.space/kingkong/timelapse-2.git
DATABASE_URL=postgres://user:pass@postgres:5432/timelapse
REDIS_URL=redis://redis:6379
JWT_SECRET=...
Chạy webhook server: node scripts/webhook-server.js
Update Gogs webhook URL với IP thật của Pi 4
Deploy script: bash scripts/deploy.sh
docker compose up -d postgres redis
docker compose up -d --build api-server web-dashboard worker
src/modules/auth/ — AuthController/Service/Strategies stubssrc/modules/devices/ — heartbeat endpoint + API key guard + repo/service/controllersrc/common/ — guards, decoratorssrc/modules/orgs|projects|captures|videos|alerts/ — stubssrc/realtime/ — stubapps/api-server/src/db/schema.ts@shared-types → @shared/typesdevice-agent (Python) trong npm workspaces → loại khỏi workspacesnpm install không hoạt động → bun install --registry https://registry.npmjs.org/bun add với nexus registry → luôn --registry https://registry.npmjs.org/db không export được → import từ database.module.ts riêngexperimentalDecorators thiếu → thêm vào packages/config/tsconfig.node.jsonsrc/ → cleanup .js/.d.ts/*.js.map + fix outDir/v1/orgs) có JWT guardorg_admin: full org/project/member managementproject_manager: create/update projectviewer: read-onlyGET /v1/orgs/:id/membersPOST /v1/orgs/:id/members (org_admin)PATCH /v1/orgs/:id/members/:userId (org_admin)DELETE /v1/orgs/:id/members/:userId (org_admin)POST /v1/projectsGET /v1/projects?orgId=GET /v1/projects/:idPATCH /v1/projects/:idDELETE /v1/projects/:id
(đều có JwtAuthGuard)# Cài deps
bun install --registry https://registry.npmjs.org/
# Dev
cd apps/api-server && bun run dev
cd apps/web-dashboard && bun run dev
# Build (verify)
cd apps/api-server && bun run build
cd apps/web-dashboard && bun run build
# Test heartbeat
curl -X POST http://localhost:3001/v1/devices/test-device/heartbeat \
-H "Content-Type: application/json" \
-H "X-API-Key: dev-key-123" \
-d '{"deviceId":"test-device","apiKey":"dev-key-123","status":"online","storageFreeGb":50,"capturesToday":12,"firmwareVersion":"1.0.0"}'