From 3c5fdace31415b22dff40c04adcc6dac4aa3f6b6 Mon Sep 17 00:00:00 2001 From: John Lightner Date: Tue, 7 Apr 2026 01:42:58 -0500 Subject: [PATCH] MAESTRO: Update docker-compose.yml with corrected XPLTD conventions Fixed DATABASE_URL to use standard postgresql:// scheme, hardcoded DB credentials for dev simplicity, added API_KEY pass-through, set worker working_dir, and made JWT_SECRET optional with dev default. All 5 services: db (:5434), redis, api (MCP :8401), worker (Celery), web (:8400). --- Auto Run Docs/01-scaffold.md | 3 ++- docker-compose.yml | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Auto Run Docs/01-scaffold.md b/Auto Run Docs/01-scaffold.md index 3ed1a09..ecd9d6d 100644 --- a/Auto Run Docs/01-scaffold.md +++ b/Auto Run Docs/01-scaffold.md @@ -11,7 +11,8 @@ Set up the PromptLooper repository, Docker infrastructure, and basic project ske - [x] Create .env.example with all environment variables from the spec's Environment Variables table, with sensible defaults and comments explaining each group. Include DATABASE_URL, REDIS_URL, JWT_SECRET, DEFAULT_ENDPOINT_URL, MAX_CONCURRENT_RUNS, and all others. > Created .env.example with all 13 environment variables organized into 7 groups (Database, Redis, Server, Auth, Default LLM Endpoint, Limits, Storage, MCP). Production-only vars (DATABASE_URL, REDIS_URL, JWT_SECRET, API_KEY, DEFAULT_ENDPOINT_*) are commented out with explanatory notes. Single-container defaults work out of the box. -- [ ] Create docker-compose.yml following XPLTD conventions: project name xpltd_promptlooper, network promptlooper (172.33.0.0/24), PostgreSQL on port 5434, Redis, API service, worker service, and web service on port 8400. Use bind mounts under /vmPool/r/services/promptlooper_* for persistent data. Model this after Chrysopedia's docker-compose.yml patterns. +- [x] Create docker-compose.yml following XPLTD conventions: project name xpltd_promptlooper, network promptlooper (172.33.0.0/24), PostgreSQL on port 5434, Redis, API service, worker service, and web service on port 8400. Use bind mounts under /vmPool/r/services/promptlooper_* for persistent data. Model this after Chrysopedia's docker-compose.yml patterns. + > Updated existing docker-compose.yml: fixed DATABASE_URL to use standard postgresql:// scheme (not asyncpg), hardcoded DB credentials instead of requiring .env vars, added API_KEY pass-through, added working_dir for worker service, made JWT_SECRET optional with dev default. All 5 services defined: db (:5434), redis, api (MCP :8401), worker (Celery), web (:8400). Bind mounts under /vmPool/r/services/promptlooper_*. Health checks on db and redis with dependency conditions. - [ ] Create the multi-stage Dockerfile in docker/ that builds both backend and frontend into a single image. Stage 1: Node build for frontend (npm ci && npm run build). Stage 2: Python runtime with uvicorn, copying the built frontend assets. Include nginx.conf that serves the frontend and proxies /api and /ws to uvicorn. The image should work standalone with SQLite when no DATABASE_URL is provided. diff --git a/docker-compose.yml b/docker-compose.yml index a69e3cc..644b732 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,13 +17,13 @@ services: ports: - "5434:5432" environment: - POSTGRES_USER: ${POSTGRES_USER:-promptlooper} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env} - POSTGRES_DB: ${POSTGRES_DB:-promptlooper} + POSTGRES_USER: promptlooper + POSTGRES_PASSWORD: promptlooper + POSTGRES_DB: promptlooper volumes: - /vmPool/r/services/promptlooper_db:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-promptlooper}"] + test: ["CMD-SHELL", "pg_isready -U promptlooper"] interval: 10s timeout: 5s retries: 5 @@ -54,15 +54,16 @@ services: ports: - "8401:8401" # MCP server environment: - DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-promptlooper}:${POSTGRES_PASSWORD}@promptlooper-db:5432/${POSTGRES_DB:-promptlooper} + DATABASE_URL: postgresql://promptlooper:promptlooper@promptlooper-db:5432/promptlooper REDIS_URL: redis://promptlooper-redis:6379/0 - JWT_SECRET: ${JWT_SECRET:?Set JWT_SECRET in .env} + JWT_SECRET: ${JWT_SECRET:-dev-secret-change-in-production} + API_KEY: ${API_KEY:-} DEFAULT_ENDPOINT_URL: ${DEFAULT_ENDPOINT_URL:-} DEFAULT_ENDPOINT_KEY: ${DEFAULT_ENDPOINT_KEY:-} MAX_CONCURRENT_RUNS: ${MAX_CONCURRENT_RUNS:-4} MAX_TOKENS_PER_SWEEP: ${MAX_TOKENS_PER_SWEEP:-0} MCP_ENABLED: ${MCP_ENABLED:-true} - MCP_PORT: 8401 + MCP_PORT: "8401" depends_on: promptlooper-db: condition: service_healthy @@ -78,9 +79,10 @@ services: restart: unless-stopped networks: - promptlooper - command: celery -A backend.worker:app worker --loglevel=info --concurrency=${MAX_CONCURRENT_RUNS:-4} + command: celery -A worker:celery_app worker --loglevel=info --concurrency=${MAX_CONCURRENT_RUNS:-4} + working_dir: /app/backend environment: - DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-promptlooper}:${POSTGRES_PASSWORD}@promptlooper-db:5432/${POSTGRES_DB:-promptlooper} + DATABASE_URL: postgresql://promptlooper:promptlooper@promptlooper-db:5432/promptlooper REDIS_URL: redis://promptlooper-redis:6379/0 DEFAULT_ENDPOINT_URL: ${DEFAULT_ENDPOINT_URL:-} DEFAULT_ENDPOINT_KEY: ${DEFAULT_ENDPOINT_KEY:-}