Deployment matrix
| App | Dev target | Dev trigger | Prod target | Prod trigger | Who / access |
|---|---|---|---|---|---|
Backend (emaw-django-app) | development-django-vm, Docker Compose at /opt/emaw/emaw-django-app → dev.emaw-app.com | Manual: SSH, git pull origin develop, docker compose up -d --build | DockerApp VM via Portainer → app.emaw-app.com | Manual: Portainer redeploy from main | Tailscale + SSH key (dev); IP whitelist + Portainer (prod) |
Website (emaw-website) | Cloudflare Pages emaw-website branch develop → develop-website.everymanawarrior.cc | GitHub Action on push to develop | Pages production branch → everymanawarrior.com at launch | Manual wrangler pages deploy dist --branch main | GitHub env develop secrets; Cloudflare API token for manual |
Web app (emaw-web-app) | Pages emaw-react-web-app branch develop → develop-web-app.everymanawarrior.cc | GitHub Action on push to develop | Pages branch main → app.everymanawarrior.cc | GitHub Action on push to main | GitHub envs develop / production |
Admin CRM (emaw-crm-app) | Worker emaw-admin-dev → admin-dev.everymanawarrior.cc | GitHub Action on push to develop | Worker emaw-admin → admin.everymanawarrior.cc | Manual npm run deploy:production | GitHub env develop; Cloudflare API token for manual |
Mobile app (emaw-mobile-app) | EAS development / preview builds; channel development / preview | eas build, eas update by a developer | App Store and Google Play; channel production | eas build --profile production, eas submit, store review; JS-only changes via eas update | EAS project access; Apple / Google console roles |
Docs (emaw-documentation) | Pages emaw-documentation branch develop → docs-dev.everymanawarrior.cc | GitHub Action on push to develop | Pages branch main → docs.everymanawarrior.cc | GitHub Action on push to main | GitHub envs develop / production |
Legacy and gaps
- Backend:
.github/workflows/main_emawweb.ymlandazure-pipelines.ymlstill deploy to the Azure Web AppEMAWWebon push tomain. That is not the live backend. See Backend deployment. - Website and Admin CRM have no production workflow yet; the web app's
deploy-production.ymlis the template. - No pipeline runs tests before deploying. The CRM has a Vitest suite and the backend has pytest; both are run by hand.
Shared secrets
Every frontend workflow needs CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID on the relevant GitHub environment. The backend has no deploy secrets in GitHub; its .env lives on the VM (dev) and in Portainer (prod).