Dagster+ Hybrid Architecture (evaluated, not adopted)
What Would Have Changed: Self-Hosted β Dagster+ Hybrid
Section titled βWhat Would Have Changed: Self-Hosted β Dagster+ HybridβBefore (Self-Hosted)
Section titled βBefore (Self-Hosted)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Your Infrastructure ββ ββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β dagster-web βββββββββΆβ dagster-code-server β ββ β (Port 3000) β gRPC β (Port 4000) β ββ ββββββββββββββββ β Runs CONTINUOUSLY β ββ β Serves code via β ββ ββββββββββββββββ β gRPC β ββ βdagster-daemonββββββββββ β ββ β (Scheduler) β β ββ ββββββββββββββββ β ββ ββββββββββββββββββββββββ ββ β apps/dagster/ β ββ β (Your code) β ββ β Loaded by code β ββ β server β ββ ββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββComponents:
- dagster-code-server: Runs 24/7, serves your code via gRPC
- dagster-web: Runs 24/7, connects to code server, serves UI
- dagster-daemon: Runs 24/7, connects to code server, runs schedules
- apps/dagster/: Your pipeline code, loaded by code server
After (Dagster+ Hybrid)
Section titled βAfter (Dagster+ Hybrid)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Dagster+ Cloud ββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββ β Webserver β β Daemon β β Metadata β ββ β (UI) β β (Scheduler) β β Storage β ββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββ β² ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β gRPC/HTTPSββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ Your Infrastructure ββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β dagster-agent β ββ β Runs CONTINUOUSLY β ββ β Connects to Dagster+ β ββ β Waits for job requests β ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β ββ β When job runs: ββ βΌ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β User Code Container (ON-DEMAND) β ββ β - Pulls image: ghcr.io/.../dagster:tag β ββ β - Contains: apps/dagster/ (built in) β ββ β - Runs job β ββ β - Stops when done β ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β Another Job Container (if concurrent) β ββ β (Same image, separate container) β ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββComponents:
- dagster-agent: Runs 24/7, connects to Dagster+ cloud, launches containers
- User Code Containers: Launched ON-DEMAND when jobs run, stop when done
- apps/dagster/: Still your code, but now built into Docker image
Key Differences
Section titled βKey Differencesβ| Aspect | Self-Hosted | Dagster+ Hybrid |
|---|---|---|
| Code Server | β Runs 24/7 (port 4000) | β Not needed |
| Webserver | β Runs 24/7 (port 3000) | β Dagster+ manages |
| Daemon | β Runs 24/7 | β Dagster+ manages |
| Agent | β Not needed | β Runs 24/7 |
| Code Location | Loaded by code server | Built into Docker image |
| Job Execution | Daemon spawns processes | Agent launches containers |
| Metadata Storage | Your PostgreSQL | Dagster+ manages |
What Role Does apps/dagster/ Play Now?
Section titled βWhat Role Does apps/dagster/ Play Now?βapps/dagster/ is still critical! It contains:
-
Pipeline Definitions (
erp_pipeline/definitions.py)- Your jobs, assets, sensors, schedules
- What gets executed
-
DLT Pipelines (
erp_pipeline/dlt/)- Data extraction logic
- Transformers
-
dbt Models (
dbt/)- SQL transformations
-
Configuration (
dagster_cloud.yaml)- Tells Dagster+ where to find your code
The difference: Instead of being loaded by a code server, itβs now:
- Built into a Docker image during CI/CD
- Pushed to GHCR (
ghcr.io/ERP-Unlocked/ordermatic/dagster:tag) - Pulled by agent when jobs run
- Executed in containers that start/stop per job
How It Works Now
Section titled βHow It Works Nowβ1. Code Changes
Section titled β1. Code Changesβ# You edit apps/dagster/erp_pipeline/definitions.pygit push2. CI/CD Builds Image
Section titled β2. CI/CD Builds Imageβ# GitHub Actions builds Docker imagedocker build -t ghcr.io/.../dagster:v1.2.3 apps/dagster/docker push ghcr.io/.../dagster:v1.2.33. CI/CD Notifies Dagster+
Section titled β3. CI/CD Notifies Dagster+β# GitHub Actions tells Dagster+ about new imagedagster-cloud serverless deploy-python-executable \ --image ghcr.io/.../dagster:v1.2.34. Agent Pulls & Runs
Section titled β4. Agent Pulls & Runsβ1. Dagster+ schedules a job (via daemon)2. Dagster+ tells agent: "Run job X"3. Agent pulls image: ghcr.io/.../dagster:v1.2.34. Agent launches container with your code5. Container runs job (executes apps/dagster/ code)6. Container stops when doneWhat You Still Need
Section titled βWhat You Still Needββ Keep These
Section titled ββ Keep Theseβapps/dagster/- Your pipeline code (still critical!)- Dockerfile - Builds your code into image
- CI/CD - Builds and pushes images
- Environment variables - Passed to containers
β No Longer Need
Section titled ββ No Longer Needβ- dagster-code-server - Agent launches containers instead
- dagster-web - Dagster+ provides UI
- dagster-daemon - Dagster+ manages scheduling
- Dagster PostgreSQL - Dagster+ manages metadata
- workspace.yaml - Not used (code is in image)
Benefits
Section titled βBenefitsβ- Simpler Infrastructure: One agent vs three services
- Better Isolation: Each job runs in its own container
- Automatic Scaling: Containers start/stop as needed
- No Code Server Crashes: Code issues donβt affect agent
- Managed UI/Daemon: Dagster+ handles reliability
Summary
Section titled βSummaryβapps/dagster/ is still your code - it just gets packaged differently:
- Before: Code server loads it from filesystem
- After: Built into Docker image, launched in containers
No code server needed because:
- Agent pulls pre-built images
- Launches containers on-demand
- Containers contain your code already
Youβre essentially moving from βload code at runtimeβ to βpackage code at build timeβ - much more reliable!