Skip to main content

Deployments

Deployments are fully automatic on merge to main; production promotion is one manual click.

Flow

StageTriggerWorkflowResult
Staging (auto)push to mainbuild-and-push.ymldeploy-staging.ymlDocker images built + tagged sha-<commit>, staging deploy fires
Docs (auto)push to maindocs.ymlDocusaurus site rebuilt and published to GitHub Pages
Releaseversion change merged to mainrelease-library.yml, release-standalone.yml, release-vscode-extension.ymlnpm / VS Code Marketplace publish + Docker retag to vX.Y.Z + cosign sign + GitHub Release
ProductionActions → Deploy to Production (manual)deploy-prod.ymlprod runs the selected image-tag

version-monotonicity.yml guards every PR by failing if a workspace package.json version moves backwards.

See Releases for the release-cut procedure.

Compose files

FilePurposeLifecycle
docker/compose.proxy.ymlTraefik reverse proxy + maintenance pagedeployed once; stays up during app deploys
docker/compose.db.ymlRedisdeployed once; stays up during app deploys
docker/compose.app.ymlServer + webappdeployed by CI on every merge + release
docker/compose.local.db.ymlRedis for local developmentstarted by pnpm dev / locally on demand
docker/compose.local.ymlLocal server + webapp stackoptional; for docker compose-based dev

Required environment variables

Set per GitHub Environment. Values are deployment-specific; names are fixed.

VarPurposeExample
APP_HOSTNAMESingle public hostname the reverse proxy serves and that Let's Encrypt issues a certificate for.apollon.aet.cit.tum.de
ACME_EMAILRegistration email for Let's Encrypt.admin@tum.de
VM_HOSTSSH target the deploy workflow connects to. May differ from APP_HOSTNAME.apollon-prod.aet.cit.tum.de
VM_USERNAMESSH user on the VM.github_deployment
VM_SSH_PRIVATE_KEYSSH key (secret).
OWNER_SECRETHMAC secret for the soft-ownership cookie. Required (compose.app.yml fails closed if unset). Rotate per ops/runbook.md.random 32-byte hex

Optional environment variables

VarPurposeExample
APP_HOSTNAME_ALIASES_RULETraefik matcher listing additional hostnames that should permanently 301-redirect to APP_HOSTNAME. Each listed hostname also receives its own Let's Encrypt certificate so HTTPS bookmarks redirect cleanly. Combine multiple hosts with || — Traefik v3's Host() matcher takes a single argument. Leave unset on environments without aliases.Host(`apollon-prod.aet.cit.tum.de`) || Host(`apollon.ase.cit.tum.de`) || Host(`apollon.ase.in.tum.de`)
LEGAL_PROFILESelects a bundled legal-pages profile (e.g., tumaet). Leave unset for a generic deployment showing the red disclaimer banner. See ops/legal-pages.md.tumaet

Run locally in Docker

docker compose -f ./docker/compose.local.db.yml up -d
docker compose -f ./docker/compose.local.yml up --build

The webapp is served at http://localhost:8080.