diff --git a/CLAUDE.md b/CLAUDE.md index 4a892f7..a91400b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ GitOps-style Docker Compose setup for a self-hosted VPS running Nextcloud, Gitea ## Architecture -Four independent service stacks, each with its own `docker-compose.yml`: +A root `docker-compose.yml` uses `include` to compose four service stacks, each with its own `docker-compose.yml`: - **caddy/** — Reverse proxy with auto HTTPS. All services route through the shared `proxy` Docker network. - **nextcloud/** — Nextcloud 29 + PostgreSQL 16 + Redis 7 + cron container. Has its own `.env` for DB credentials and Nextcloud config. Uses internal `nextcloud-internal` network for DB/Redis isolation. @@ -16,8 +16,9 @@ Four independent service stacks, each with its own `docker-compose.yml`: - **monitoring/** — Grafana Alloy collecting Docker logs (Loki) and node metrics (Prometheus) to Grafana Cloud. Has its own `.env` for cloud credentials. Key design patterns: +- Root `docker-compose.yml` includes all stacks via `include:` — single command to manage everything - All stacks share the external `proxy` Docker network for Caddy routing -- Each service's compose file requires `--env-file .env` (root-level) for `DATA_ROOT` and `DOMAIN` +- Root `.env` provides `DATA_ROOT` and `DOMAIN` (pass via `--env-file .env`) - Service-specific secrets live in per-service `.env` files (loaded via `env_file:` in compose) - All persistent data under `${DATA_ROOT}` (default `/opt/docker-data/`) @@ -27,6 +28,11 @@ Key design patterns: # Deploy everything (installs Docker if needed, creates dirs, starts all stacks) ./scripts/deploy.sh +# Manage all services +docker compose --env-file .env up -d +docker compose --env-file .env logs -f +docker compose --env-file .env down + # Manage individual services docker compose -f /docker-compose.yml --env-file .env up -d docker compose -f /docker-compose.yml --env-file .env logs -f @@ -43,10 +49,11 @@ docker exec caddy caddy reload --config /etc/caddy/Caddyfile ## Adding a New Service 1. Create `myapp/docker-compose.yml` joining the `proxy` external network, with data under `${DATA_ROOT}/myapp/` -2. Add reverse proxy entry in `caddy/Caddyfile` -3. Add data directory creation to `scripts/deploy.sh` -4. Add backup steps to `scripts/backup.sh` if it has persistent data -5. Create DNS A record for the subdomain +2. Add `- path: myapp/docker-compose.yml` to root `docker-compose.yml` +3. Add reverse proxy entry in `caddy/Caddyfile` +4. Add data directory creation to `scripts/deploy.sh` +5. Add backup steps to `scripts/backup.sh` if it has persistent data +6. Create DNS A record for the subdomain ## Environment Files diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9c843b6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,5 @@ +include: + - path: caddy/docker-compose.yml + - path: nextcloud/docker-compose.yml + - path: gitea/docker-compose.yml + - path: monitoring/docker-compose.yml diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 76e3859..d1f3fa8 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -73,23 +73,11 @@ for svc in nextcloud gitea monitoring; do done # ------------------------------------------------------------------ -# Start stacks in order +# Start all stacks # ------------------------------------------------------------------ -echo "==> Starting Caddy..." -docker compose -f "$REPO_ROOT/caddy/docker-compose.yml" --env-file "$REPO_ROOT/.env" pull -docker compose -f "$REPO_ROOT/caddy/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d - -echo "==> Starting Nextcloud..." -docker compose -f "$REPO_ROOT/nextcloud/docker-compose.yml" --env-file "$REPO_ROOT/.env" pull -docker compose -f "$REPO_ROOT/nextcloud/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d - -echo "==> Starting Gitea..." -docker compose -f "$REPO_ROOT/gitea/docker-compose.yml" --env-file "$REPO_ROOT/.env" pull -docker compose -f "$REPO_ROOT/gitea/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d - -echo "==> Starting Monitoring..." -docker compose -f "$REPO_ROOT/monitoring/docker-compose.yml" --env-file "$REPO_ROOT/.env" pull -docker compose -f "$REPO_ROOT/monitoring/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d +echo "==> Pulling and starting all services..." +docker compose --env-file "$REPO_ROOT/.env" --project-directory "$REPO_ROOT" pull +docker compose --env-file "$REPO_ROOT/.env" --project-directory "$REPO_ROOT" up -d echo "" echo "==> All services started. Verify with: docker ps"