version: '3.8' services: # PostgreSQL Database db: image: postgres:15-alpine container_name: todo-db environment: POSTGRES_USER: todouser POSTGRES_PASSWORD: todopassword POSTGRES_DB: tododb volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U todouser"] interval: 10s timeout: 5s retries: 5 # FastAPI Backend api: build: context: . dockerfile: Dockerfile container_name: todo-api environment: DATABASE_URL: postgresql://todouser:todopassword@db:5432/tododb JWT_SECRET_KEY: ${JWT_SECRET_KEY:-your-super-secret-key-change-this-min-32-characters-long} JWT_ALGORITHM: HS256 ACCESS_TOKEN_EXPIRE_MINUTES: 30 CORS_ORIGINS: http://localhost:3000,http://localhost:3001 SMTP_HOST: ${SMTP_HOST:-smtp.gmail.com} SMTP_PORT: ${SMTP_PORT:-587} SMTP_USERNAME: ${SMTP_USERNAME} SMTP_PASSWORD: ${SMTP_PASSWORD} SMTP_USE_TLS: ${SMTP_USE_TLS:-true} EMAIL_FROM: ${EMAIL_FROM} EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-Todo Application} FRONTEND_URL: ${FRONTEND_URL:-http://localhost:3000} PASSWORD_RESET_TOKEN_EXPIRY_MINUTES: 15 PASSWORD_RESET_MAX_REQUESTS_PER_HOUR: 3 COHERE_API_KEY: ${COHERE_API_KEY} ports: - "8000:8000" depends_on: db: condition: service_healthy volumes: - ./src:/app/src restart: unless-stopped volumes: postgres_data: