services: # PostgreSQL Database db: image: postgres:16-alpine container_name: swag-db restart: unless-stopped environment: POSTGRES_USER: swag POSTGRES_PASSWORD: ${DB_PASSWORD:-devpassword} POSTGRES_DB: swag volumes: - swag-db-data:/var/lib/postgresql/data networks: - swag-internal healthcheck: test: ["CMD-SHELL", "pg_isready -U swag"] interval: 5s timeout: 5s retries: 5 # Redis for sessions/cache redis: image: redis:7-alpine container_name: swag-redis restart: unless-stopped volumes: - swag-redis-data:/data networks: - swag-internal # FastAPI Backend backend: build: context: ./backend dockerfile: Dockerfile container_name: swag-backend restart: unless-stopped environment: - DATABASE_URL=postgresql://swag:${DB_PASSWORD:-devpassword}@db:5432/swag - REDIS_URL=redis://redis:6379 - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET} - PRODIGI_API_KEY=${PRODIGI_API_KEY} - PRINTFUL_API_TOKEN=${PRINTFUL_API_TOKEN} - POD_SANDBOX_MODE=${POD_SANDBOX_MODE:-true} - JWT_SECRET=${JWT_SECRET:-dev-secret-change-me} - CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:3000} - DESIGNS_PATH=/app/designs - CONFIG_PATH=/app/config - GEMINI_API_KEY=${GEMINI_API_KEY} volumes: - ${DESIGNS_PATH:-../mycopunk-swag/designs}:/app/designs - ${CONFIG_PATH:-../mycopunk-swag/config}:/app/config:ro depends_on: db: condition: service_healthy networks: - swag-internal - traefik-public labels: - "traefik.enable=true" - "traefik.http.routers.swag-api.rule=Host(`swag.mycofi.earth`) && PathPrefix(`/api`)" - "traefik.http.routers.swag-api.entrypoints=web" - "traefik.http.services.swag-api.loadbalancer.server.port=8000" - "traefik.docker.network=traefik-public" # Next.js Frontend frontend: build: context: ./frontend dockerfile: Dockerfile args: - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-http://localhost:8000/api} - NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY} container_name: swag-frontend restart: unless-stopped environment: - NODE_ENV=production depends_on: - backend networks: - swag-internal - traefik-public labels: - "traefik.enable=true" - "traefik.http.routers.swag-web.rule=Host(`swag.mycofi.earth`)" - "traefik.http.routers.swag-web.entrypoints=web" - "traefik.http.services.swag-web.loadbalancer.server.port=3000" - "traefik.docker.network=traefik-public" volumes: swag-db-data: swag-redis-data: networks: swag-internal: driver: bridge traefik-public: external: true