Environments overview
There are two environments. Development is where every branch merge lands and where staff test workflows; production serves real customers. They share nothing except the Azure Blob storage account and the Stripe account (test mode versus live mode).
| Development | Production | |
|---|---|---|
| Backend URL | https://dev.emaw-app.com | https://app.emaw-app.com |
| Azure resource group | EMAW-Development | EMAW-APP-RG |
| Django host | development-django-vm (Linux VM, Docker Compose started by hand over SSH) | DockerApp VM, stack managed through Portainer |
| Database | development-database-vm (Linux VM running PostgreSQL behind pgbouncer) | emawweb-server (Azure Database for PostgreSQL flexible server) |
| Database reachable from | Tailscale, or vnet-emaw-dev | EMAWWebVnet only (the Django app) |
| Virtual network | vnet-emaw-dev | EMAWWebVnet |
| Blob storage | emawblob (in EMAW-APP-RG), container media | same account, same container |
| Backend exposure | Cloudflare tunnel; the token can also run on a developer laptop | Cloudflare tunnel on the VM |
| Website | https://develop-website.everymanawarrior.cc (Cloudflare Access) | https://everymanawarrior.com (legacy site until launch) |
| Admin CRM | https://admin-dev.everymanawarrior.cc (Cloudflare Access) | https://admin.everymanawarrior.cc (Cloudflare Access) |
| Web app | https://develop-web-app.everymanawarrior.cc | https://app.everymanawarrior.cc |
| Docs | https://docs-dev.everymanawarrior.cc (Cloudflare Access) | https://docs.everymanawarrior.cc (Cloudflare Access) |
| Stripe | test mode; test cards work, nothing is charged | live mode |
| Deposco | sandbox (DEPOSCO_BASE_URL default) | live UFS account |
| Campaign email | sending disabled; if enabled, only group 36 | live via ACS |
| Django settings module | EMAW_BACKEND.settings.development | EMAW_BACKEND.settings.production |
| Deploy trigger | push to develop (frontends with a workflow); manual compose on the VM (backend) | push to main (web app, docs); manual for website, CRM and backend |
What "development" means here
The dev environment is shared and live: staff use the dev website to test event registration and book purchases with Stripe test cards, and the Admin CRM against dev shows about 4,000 real contacts imported from Planning Center. Treat it as a staging environment, not a sandbox you can break.
Two things make dev unusual:
- The tunnel can move. The dev backend is whichever machine runs the compose stack with the dev
TUNNEL_TOKEN. Developers take the tunnel over to test their branch end to end with the real frontends, then hand it back. See Backend local development. - The database is shared. Starting the stack runs migrations against it.
Cost
Azure runs on Microsoft nonprofit credits, so hosting is currently free. Cloudflare usage (Pages, Workers, R2's free terabyte with no egress fees) is within free tiers. If the credits lapsed, the estimate for the server and database environment is roughly $150 a month.
Next
- Azure: resource groups, VMs, database, blob, Key Vault, Maps, ACS.
- Cloudflare: DNS, Pages, Workers, R2, tunnels, Access.
- Tailscale and SSH: getting onto the machines.
- Domains and URLs: every hostname in one table.