Local Configuration & Setup
This guide will walk you through the steps to get the Single Repo Data Platform (SRDP) running on your local machine. There are two options:
- Docker Compose — simplest, no Kubernetes needed, good for trying out the stack locally.
- Kubernetes (Helm) — closer to the production setup, requires a local cluster.
Both options require mkcert for local TLS certificates and /etc/hosts entries for the *.local.dev domains.
Option A: Docker Compose
1) Clone the repo
bash
git clone git@github.com:srdp-hub/srdp.git # or git clone https://github.com/srdp-hub/srdp.git
cd srdp
2) Point DNS at localhost
Add the following line to your hosts file (/etc/hosts on macOS/Linux):
127.0.0.1 auth.local.dev marimo.local.dev quarto.local.dev dagster.local.dev
3) Install the local CA and generate TLS certificates
The stack serves everything over HTTPS because Zitadel and OAuth2-Proxy require it. mkcert creates locally-trusted certificates so your browser won't show warnings.
bash
brew install mkcert # or see mkcert docs for other platforms
mkcert -install # one-time: installs a local Certificate Authority
just docker-tls # generates certs in deploy/docker/certs/
4) Create the environment file
bash
cp deploy/docker/.env.example deploy/docker/.env
The defaults in .env.example are fine for local development. You will need to update OIDC_CLIENT_ID and OIDC_CLIENT_SECRET after Zitadel creates the OIDC application on first boot (see 03-usage.md).
5) Start the stack
bash
just docker-up
This builds the Marimo and Quarto images locally and starts all services: Traefik, PostgreSQL, Zitadel, OAuth2-Proxy, Marimo, and Quarto. First run will take a few minutes while images are pulled and built.
To stop the stack:
bash
just docker-down
Warning: Do not run
docker compose down -vunless you want to destroy all persistent data, including your Zitadel configuration.
Option B: Kubernetes (Helm)
1) Clone the repo
bash
git clone git@github.com:srdp-hub/srdp.git # or git clone https://github.com/srdp-hub/srdp.git
cd srdp
2) Point DNS at your cluster
The chart uses *.local.dev by default. Point those hostnames at the IP you will use to reach Traefik:
- For NodePort/local clusters:
127.0.0.1is usually fine. - For a LoadBalancer: use the external IP once Traefik comes up.
Add one line to your hosts file (/etc/hosts on macOS/Linux):
127.0.0.1 auth.local.dev marimo.local.dev quarto.local.dev dagster.local.dev
3) Install the local CA and generate TLS certificates
bash
brew install mkcert # or see mkcert docs for other platforms
mkcert -install # one-time: installs a local Certificate Authority
just local-tls # generates certs and creates the k8s TLS secret
Or manually:
```bash mkdir -p deploy/kubernetes/certs mkcert -cert-file deploy/kubernetes/certs/selfsigned.crt -key-file deploy/kubernetes/certs/selfsigned.key \ "auth.local.dev" "marimo.local.dev" "quarto.local.dev" "dagster.local.dev"
kubectl create namespace srdp --dry-run=client -o yaml | kubectl apply -f - kubectl create secret tls custom-ingress-cert \ --namespace srdp \ --key deploy/kubernetes/certs/selfsigned.key \ --cert deploy/kubernetes/certs/selfsigned.crt \ --dry-run=client -o yaml | kubectl apply -f - ```
4) Build local container images
The Helm chart references three application images. For local development the pull policy is set to Never, so the images must exist in your local Docker/containerd cache:
bash
docker build -t rg.nl-ams.scw.cloud/srdp-registry/marimo:v1.0 services/marimo
docker build -t rg.nl-ams.scw.cloud/srdp-registry/quarto:v1.0 services/quarto
docker build -t rg.nl-ams.scw.cloud/srdp-registry/srdp-etl:v1.0 -f projects/default-etl/Dockerfile .
5) Fill in secrets and local values
Update deploy/kubernetes/srdp-chart/values-local.yaml before installing:
- set your own Zitadel master key, DB passwords, OAuth2 client values, and cookie secret
- keep
custom-ingress-cert(created above) or point to another TLS secret if you prefer.
6) Install the chart locally
bash
cd deploy/kubernetes/srdp-chart
helm dependency update
helm upgrade --install srdp . \
--namespace srdp --create-namespace \
-f values.yaml \
-f values-local.yaml
Or simply run:
bash
just local-deploy
To re-run with updated values, run the same helm upgrade command (or just local-deploy).
The chart deploys the full stack: Traefik, PostgreSQL (in-cluster via Bitnami Helm chart), Zitadel, OAuth2-Proxy, Dagster (webserver + daemon + user code), Marimo, and Quarto. PostgreSQL hosts both the zitadel and dagster databases, created automatically via zitadel-db.primary.initdb.scripts.
Congratulations! The local environment should now be up and running. Proceed to the next section, Usage & Verification, to confirm that everything is working correctly.