Deployment
How it works
This repo deploys as a pointer, not a copy. No source, dbt project, or manifest ever leaves the repo — the orchestration deployment serves this location’s image over gRPC.
On every push to main, the deploy.yml workflow:
- Validates the Definitions graph — CI imports
betting_combat.mainexactly as Dagster will load it, so a location that cannot import never reaches the cluster. - Builds the container image and pushes it to
ghcr.io/null-capital/betting-combat, tagged with the immutable commit SHA. - Dispatches
register-dagster-locationto the orchestration repo with the image repository, the SHA tag, and the module path. Orchestration validates, renders the location into its registry, and commits — the Dagster deployment then serves this image over gRPC.
The first rollout is born stopped
A freshly registered location starts with nothing running. The intended sequence:
- Confirm the location loads cleanly in the Dagster UI.
- Launch a manual canary run of a representative job.
- Enable only the schedules and sensors you actually intend to run.
Nothing materializes until you turn it on — a bad first registration can never start writing data on its own.
Rolling forward and back
Every registration points at an immutable SHA. To roll back, re-register a
known-good SHA (re-run the deploy workflow from the old commit, or trigger it
manually via GitHub Actions → “Run workflow” on deploy.yml). The
orchestration registry history is the audit trail of what served when.
Local parity
./run local starts dagster dev -m betting_combat.main — the same
module CI validates and production serves, so what loads locally is what
deploys.
Grafana dashboards
deploy/ is a dashboards-only Helm chart — no Deployment, Service or
secrets; Dagster runs the code. The platform’s ArgoCD generator onboards it
from deploy/argocd/betting-combat.yaml (born with auto-sync off: sync it
once in ArgoCD, then flip autoSync: true). To ship a dashboard:
- Export the dashboard JSON from Grafana into
deploy/dashboards/<name>.json. - Set
monitoring.dashboard.enabled: trueindeploy/values.yaml. - Merge — Grafana’s sidecar loads it into the
betting-combatfolder (override withmonitoring.dashboard.folder).