From 1ce2587e3d609450a978f6aa4813ee19851787fc Mon Sep 17 00:00:00 2001 From: Clawd Date: Sun, 1 Mar 2026 00:14:22 +0100 Subject: [PATCH] feat(staging): add Traefik-based staging with automatic subdomains --- docker-compose.staging.yml | 45 ++++++++++++++-------------- scripts/create-staging.sh | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 22 deletions(-) diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml index 7c3e84f..37bd3b0 100644 --- a/docker-compose.staging.yml +++ b/docker-compose.staging.yml @@ -1,28 +1,29 @@ +# Staging Docker Compose - Traefik version version: "3.8" services: - frontend: - container_name: staging-gravl-PLACEHOLDER-frontend - networks: - - staging-network + gravl-frontend: + container_name: staging-gravl-frontend-BRANCH_NAME + labels: + - traefik.enable=true + - traefik.http.routers.staging-gravl-BRANCH_NAME.rule=Host(`BRANCH_NAME.gravl.homelab.local`) + - traefik.http.routers.staging-gravl-BRANCH_NAME.entrypoints=websecure + - traefik.http.routers.staging-gravl-BRANCH_NAME.tls=true + - traefik.http.services.staging-gravl-BRANCH_NAME.loadbalancer.server.port=80 environment: - - VITE_API_URL=http://localhost:3001 - - backend: - container_name: staging-gravl-PLACEHOLDER-backend - networks: - - staging-network - environment: - - NODE_ENV=staging - - PORT=3001 - - CORS_ORIGIN=http://localhost:5173 - - db: - container_name: staging-gravl-PLACEHOLDER-db - image: postgres:15-alpine - networks: - - staging-network + - VITE_API_URL=https://BRANCH_NAME.api.gravl.homelab.local + + gravl-backend: + container_name: staging-gravl-backend-BRANCH_NAME + labels: + - traefik.enable=true + - traefik.http.routers.staging-gravl-BRANCH_NAME-api.rule=Host(`BRANCH_NAME.api.gravl.homelab.local`) + - traefik.http.routers.staging-gravl-BRANCH_NAME-api.entrypoints=websecure + - traefik.http.routers.staging-gravl-BRANCH_NAME-api.tls=true + - traefik.http.services.staging-gravl-BRANCH_NAME-api.loadbalancer.server.port=3001 networks: - staging-network: - driver: bridge + proxy: + external: true + homelab: + external: true diff --git a/scripts/create-staging.sh b/scripts/create-staging.sh index e69de29..99dd15a 100755 --- a/scripts/create-staging.sh +++ b/scripts/create-staging.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Create staging environment for a branch + +BRANCH_NAME=${1:-} +if [ -z "$BRANCH_NAME" ]; then + echo "Usage: $0 " + echo "Example: $0 03-design-polish" + exit 1 +fi + +echo "Creating staging for branch: $BRANCH_NAME" + +# Create temp directory +STAGING_DIR=/tmp/staging-$BRANCH_NAME-$(date +%s) +mkdir -p $STAGING_DIR + +# Clone repo +git clone --branch feature/$BRANCH_NAME /workspace/gravl "$STAGING_DIR" 2>/dev/null || { + echo "Failed to clone branch feature/$BRANCH_NAME" + exit 1 +} + +cd "$STAGING_DIR" + +# Replace placeholder with actual branch name +sed -i "s/BRANCH_NAME/$BRANCH_NAME/g" docker-compose.yml +cat docker-compose.staging.yml | sed "s/BRANCH_NAME/$BRANCH_NAME/g" > docker-compose.staging-override.yml + +# Create staging DB volume +mkdir -p .staging + +# Start services +echo "Starting staging containers..." +docker compose -f docker-compose.yml -f docker-compose.staging-override.yml up -d + +# Register metadata +cat > ".staging/$BRANCH_NAME.json" << EOF +{ + "branch": "$BRANCH_NAME", + "featureBranch": "feature/$BRANCH_NAME", + "stagingUrl": "https://$BRANCH_NAME.gravl.homelab.local", + "apiUrl": "https://$BRANCH_NAME.api.gravl.homelab.local", + "created": "$(date -Iseconds)", + "status": "active", + "containers": { + "frontend": "staging-gravl-frontend-$BRANCH_NAME", + "backend": "staging-gravl-backend-$BRANCH_NAME", + "db": "staging-gravl-db-$BRANCH_NAME" + } +} +EOF + +echo "" +echo "✅ Staging environment ready!" +echo "" +echo "🌐 URL: https://$BRANCH_NAME.gravl.homelab.local" +echo "📡 API: https://$BRANCH_NAME.api.gravl.homelab.local" +echo "" +echo "Make sure to add to your /etc/hosts:" +echo " 192.168.1.XXX $BRANCH_NAME.gravl.homelab.local $BRANCH_NAME.api.gravl.homelab.local" +echo ""