services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: termprep POSTGRES_PASSWORD: termprep POSTGRES_DB: termprep ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U termprep -d termprep"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" backend: build: ./backend ports: - "8000:8000" environment: DATABASE_URL: postgresql://termprep:termprep@postgres:5432/termprep REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-dev-secret-key-change-me} FRONTEND_URL: http://localhost:5173 AI_PROVIDER: ${AI_PROVIDER:-deepseek} AI_API_KEY: ${AI_API_KEY:-} AI_MODEL: ${AI_MODEL:-deepseek-chat} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} depends_on: postgres: condition: service_healthy redis: condition: service_started volumes: - ./backend/app:/app/app command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload worker: build: ./backend environment: DATABASE_URL: postgresql://termprep:termprep@postgres:5432/termprep REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-dev-secret-key-change-me} AI_PROVIDER: ${AI_PROVIDER:-deepseek} AI_API_KEY: ${AI_API_KEY:-} AI_MODEL: ${AI_MODEL:-deepseek-chat} depends_on: postgres: condition: service_healthy redis: condition: service_started volumes: - ./backend/app:/app/app command: celery -A app.celery_app worker -l info -c 2 frontend: image: node:20-alpine working_dir: /app ports: - "5173:5173" volumes: - ./frontend:/app - /app/node_modules command: sh -c "npm install && npm run dev" environment: VITE_API_BASE_URL: http://localhost:8000/api/v1 volumes: postgres_data: