- docker-compose.yml: replace build: sections with image: refs
(git.buzzbee.dev/BuzzbeeSCD/projecte-{svc}:)
- ci.yml: remove deploy + smoke jobs (Komodo owns build+deploy)
- DEPLOY.md: rewrite for Komodo-era workflow, keep deploy.sh as break-glass
- Gitea webhook already wired to Komodo build endpoint
3.0 KiB
Project E — Deploy Guide
Production runs as a docker-compose stack on the deploy host (10.0.0.52). The stack has four services: PostgreSQL, the Hono API, the Vite SPA served by Caddy, and the Bun worker. Komodo now owns builds and deploys — Gitea Actions runs quality+e2e only.
Architecture
Internet → :3000 (SPA container, Caddy)
├── /api/* → api:3000 (Hono/Bun)
├── /mcp* → api:3000 (Hono/Bun)
└── /* → index.html (SPA fallback)
API (:3001, direct) → PostgreSQL (:5432)
Worker → PostgreSQL
Caddy (in the spa container) serves the built SPA and reverse-proxies /api/* and /mcp* to the api service. The API is also exposed directly on :3001 for debugging.
Services
| Service | Container | Image | Ports | Notes |
|---|---|---|---|---|
db |
project-e-db |
postgres:16-alpine |
5432 | Data in project-e-pg-data volume |
api |
project-e-api |
git.buzzbee.dev/BuzzbeeSCD/projecte-api:{tag} |
3001 → 3000 | Hono on Bun |
spa |
project-e-spa |
git.buzzbee.dev/BuzzbeeSCD/projecte-spa:{tag} |
3000 → 80 | Built Vite SPA + Caddy |
worker |
project-e-worker |
git.buzzbee.dev/BuzzbeeSCD/projecte-worker:{tag} |
none | Bun worker |
All services share the project-e-network bridge and restart unless stopped.
CI/CD pipeline
Gitea Actions (quality + e2e only)
The workflow lives at .gitea/workflows/ci.yml and runs on the self-hosted runner projecte-runner. It runs only quality checks and e2e tests:
quality— runs on every push and PR: typecheck → web build → docker compose builde2e— runs after quality: ephemeral Postgres → db:migrate → Playwright tests
Komodo (build + deploy)
Komodo manages image builds and stack deploys:
- Build trigger: push a
v*tag → Gitea webhook fires → Komodo builds images → pushes to Gitea registry - Deploy trigger: Komodo procedure
release-projectebuilds all three images, then deploys the stack on10.0.0.52 - Webhook URL:
https://komodo.example.com/listener/github/repo/{id}/build - Rollback: re-deploy a previous version tag via Komodo UI or API
Deploying
Primary: Komodo
- Push a version tag:
git tag v1.0.0 && git push origin v1.0.0 - Komodo builds images and deploys automatically
- Verify:
docker pson .52, health checks
Break-glass: deploy.sh
If Komodo is unavailable, script/deploy.sh still works:
ssh projecte
cd /opt/app/ProjectE
export PROJECTE_IMAGE_TAG=v1.0.0
bash script/deploy.sh
This pulls images from the registry and redeploys. It no longer builds — that's Komodo's job.
Rollback
- In Komodo UI: Deployments → projecte → select previous version tag → Redeploy
- Or via API:
POST /execute/DeployStackwith the previous image tag - Verify health checks pass
Secrets
Komodo manages runtime secrets (POSTGRES_PASSWORD, AUTH_SECRET, etc.) as Komodo variables. The host .env is kept as break-glass fallback only.