Architecture¶
Core components¶
| Component | Location | Purpose |
|---|---|---|
| App registry | /home/steam/automation/apps/*.conf |
Declares how each managed app is deployed and checked |
| Deploy wrapper | /home/steam/automation/deployctl.sh |
Shared entrypoint for deploy, restart, status, health, rollback, and image update checks |
| Jenkins controller | /home/steam/automation/jenkins |
Operator dashboard, scheduled jobs, webhook-triggered deploys |
| Onboarding helper | /home/steam/automation/onboard-managed-app.sh |
Creates or updates app contracts, optional nginx config, and Jenkins deploy jobs |
| Host reverse proxy | /etc/nginx/sites-available and /etc/nginx/sites-enabled |
Public ingress for each service |
| Host maintenance | /home/steam/automation/systemd |
Timers and services that should run independently of Jenkins |
Deployment model¶
Each managed app is represented by a shell contract file. The important fields are:
APP_ID: stable machine identifier used in job names and scriptsAPP_DIR: working directory on diskCOMPOSE_FILE: compose file relative toAPP_DIRCOMPOSE_PROJECT_NAME: explicit compose project name when neededDEPLOY_MODE:compose-buildfor local source builds,compose-imagefor upstream image stacksGIT_BRANCH: expected branch for auto-pull and webhook filteringHEALTHCHECK_TYPE:http,container, ornoneHEALTHCHECK_TARGET: HTTP endpoint whenHEALTHCHECK_TYPE=http
The deploy flow is intentionally simple:
- Load the app contract.
- Run backup or pre-deploy hooks if configured.
- Update git or pull images when the contract allows it.
- Run
docker compose up -d --buildordocker compose up -d. - Wait for the configured health signal.
- Run any post-deploy hook.
Reverse proxy model¶
Host nginx is the public entrypoint. Most apps follow the same pattern:
- shared TLS certificate from
/etc/nginx/ssl/ilgaming.xyz-crt.pem - per-app
server_name proxy_pass http://localhost:<port>- optional websocket headers on
/or a dedicated socket path
The onboarding helper can now write and enable site configs because Jenkins mounts the host /etc/nginx tree. That helper validates syntax after writing the config.
Important limitation: nginx reload is still a separate host action. New configs can be generated and enabled automatically, but the running nginx service must still reload before a new vhost is live.