{"repo": "backend-thanhlong/sudungthuoc", "files": {"docker-compose.yml": {"cc278c05ae523df2c5a17f643b92a91d79ef8b86": {"t": 1786068526.397881, "n": 5976, "h": "051a59c8ac939a90", "c": "services:\n # PostgreSQL Database\n db:\n image: postgres:15-alpine\n container_name: sudungthuoc_db\n environment:\n POSTGRES_USER: ${POSTGRES_SUPERUSER:-postgres}\n POSTGRES_PASSWORD: ${POSTGRES_SUPERUSER_PASSWORD:?POSTGRES_SUPERUSER_PASSWORD is required}\n POSTGRES_DB: ${POSTGRES_DB:-sudungthuoc_db}\n volumes:\n - postgres_data:/var/lib/postgresql/data\n networks:\n - sudungthuoc_network\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_SUPERUSER:-postgres} -d ${POSTGRES_DB:-sudungthuoc_db}\"]\n interval: 10s\n timeout: 5s\n retries: 5\n restart: unless-stopped\n\n db-bootstrap:\n image: postgres:15-alpine\n depends_on:\n db:\n condition: service_healthy\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sudungthuoc_db}\n POSTGRES_SUPERUSER: ${POSTGRES_SUPERUSER:-postgres}\n POSTGRES_SUPERUSER_PASSWORD: ${POSTGRES_SUPERUSER_PASSWORD:?POSTGRES_SUPERUSER_PASSWORD is required}\n APP_DB_USER: ${APP_DB_USER:?APP_DB_USER is required}\n APP_DB_PASSWORD: ${APP_DB_PASSWORD:?APP_DB_PASSWORD is required}\n AI_DB_USER: ${AI_DB_USER:-ai_readonly}\n AI_DB_PASSWORD: ${AI_DB_PASSWORD:-${APP_DB_PASSWORD:?APP_DB_PASSWORD is required}}\n volumes:\n - ./scripts/docker:/scripts:ro\n entrypoint: [\"/bin/sh\", \"/scripts/bootstrap-app-db-role.sh\"]\n networks:\n - sudungthuoc_network\n restart: \"no\"\n\n # Next.js Application\n app:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: sudungthuoc_app\n environment:\n DATABASE_URL: ${APP_DATABASE_URL:?APP_DATABASE_URL is required}\n AUTH_SECRET: ${AUTH_SECRET:?AUTH_SECRET is required}\n AUTH_URL: ${AUTH_URL:-https://khoduoc.nvdcantho.com}\n REPORT_UPLOAD_SIGNING_SECRET: ${REPORT_UPLOAD_SIGNING_SECRET:?REPORT_UPLOAD_SIGNING_SECRET is required}\n DRUG_ORDER_QR_SIGNING_SECRET: ${DRUG_ORDER_QR_SIGNING_SECRET:?DRUG_ORDER_QR_SIGNING_SECRET is required}\n AI_DATABASE_READ_URL: ${AI_DATABASE_READ_URL:-postgresql://${AI_DB_USER:-ai_readonly}:${AI_DB_PASSWORD:-${APP_DB_PASSWORD:?APP_DB_PASSWORD is required}}@db:5432/${POSTGRES_DB:-sudungthuoc_db}}\n AI_PRIMARY_PROVIDER: ${AI_PRIMARY_PROVIDER:-google}\n AI_PRIMARY_MODEL: ${AI_PRIMARY_MODEL:-gemini-3.1-flash-lite-preview}\n GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-}\n GEMINI_API_KEY: ${GEMINI_API_KEY:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n AI_DEEPSEEK_MODEL: ${AI_DEEPSEEK_MODEL:-deepseek-v4-flash}\n AI_ENABLE_FALLBACK: ${AI_ENABLE_FALLBACK:-true}\n AI_FALLBACK_PROVIDER: ${AI_FALLBACK_PROVIDER:-google}\n AI_FALLBACK_MODEL: ${AI_FALLBACK_MODEL:-gemma-4-31b-it}\n OPENAI_API_KEY: ${OPENAI_API_KEY:-}\n AI_MAX_OUTPUT_TOKENS: ${AI_MAX_OUTPUT_TOKENS:-3000}\n AI_PROVIDER_TIMEOUT_MS: ${AI_PROVIDER_TIMEOUT_MS:-60000}\n AI_ADMIN_CHAT_DAILY_LIMIT: ${AI_ADMIN_CHAT_DAILY_LIMIT:-80}\n AI_ADMIN_REVIEW_DAILY_LIMIT: ${AI_ADMIN_REVIEW_DAILY_LIMIT:-40}\n AI_FACILITY_CHAT_DAILY_LIMIT: ${AI_FACILITY_CHAT_DAILY_LIMIT:-30}\n AI_FACILITY_REVIEW_DAILY_LIMIT: ${AI_FACILITY_REVIEW_DAILY_LIMIT:-15}\n NODE_ENV: \"production\"\n ALLOW_PRODUCTION_SEED: ${ALLOW_PRODUCTION_SEED:-false}\n SEED_ADMIN_USERNAME: ${SEED_ADMIN_USERNAME:-admin}\n depends_on:\n db:\n condition: service_healthy\n db-bootstrap:\n condition: service_completed_successfully\n networks:\n - sudungthuoc_network\n restart: unless-stopped\n\n app-admin:\n profiles: [\"admin\"]\n build:\n context: .\n dockerfile: Dockerfile\n target: builder\n environment:\n DATABASE_URL: ${DATABASE_ADMIN_URL:?DATABASE_ADMIN_URL is required}\n AUTH_SECRET: ${AUTH_SECRET:?AUTH_SECRET is required}\n AUTH_URL: ${AUTH_URL:-https://khoduoc.nvdcantho.com}\n REPORT_UPLOAD_SIGNING_SECRET: ${REPORT_UPLOAD_SIGNING_SECRET:?REPORT_UPLOAD_SIGNING_SECRET is required}\n DRUG_ORDER_QR_SIGNING_SECRET: ${DRUG_ORDER_QR_SIGNING_SECRET:?DRUG_ORDER_QR_SIGNING_SECRET is required}\n AI_DATABASE_READ_URL: ${AI_DATABASE_READ_URL:-postgresql://${AI_DB_USER:-ai_readonly}:${AI_DB_PASSWORD:-${APP_DB_PASSWORD:?APP_DB_PASSWORD is required}}@db:5432/${POSTGRES_DB:-sudungthuoc_db}}\n AI_PRIMARY_PROVIDER: ${AI_PRIMARY_PROVIDER:-google}\n AI_PRIMARY_MODEL: ${AI_PRIMARY_MODEL:-gemini-3.1-flash-lite-preview}\n GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-}\n GEMINI_API_KEY: ${GEMINI_API_KEY:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n AI_DEEPSEEK_MODEL: ${AI_DEEPSEEK_MODEL:-deepseek-v4-flash}\n AI_ENABLE_FALLBACK: ${AI_ENABLE_FALLBACK:-true}\n AI_FALLBACK_PROVIDER: ${AI_FALLBACK_PROVIDER:-google}\n AI_FALLBACK_MODEL: ${AI_FALLBACK_MODEL:-gemma-4-31b-it}\n OPENAI_API_KEY: ${OPENAI_API_KEY:-}\n AI_MAX_OUTPUT_TOKENS: ${AI_MAX_OUTPUT_TOKENS:-3000}\n AI_PROVIDER_TIMEOUT_MS: ${AI_PROVIDER_TIMEOUT_MS:-60000}\n AI_ADMIN_CHAT_DAILY_LIMIT: ${AI_ADMIN_CHAT_DAILY_LIMIT:-80}\n AI_ADMIN_REVIEW_DAILY_LIMIT: ${AI_ADMIN_REVIEW_DAILY_LIMIT:-40}\n AI_FACILITY_CHAT_DAILY_LIMIT: ${AI_FACILITY_CHAT_DAILY_LIMIT:-30}\n AI_FACILITY_REVIEW_DAILY_LIMIT: ${AI_FACILITY_REVIEW_DAILY_LIMIT:-15}\n NODE_ENV: \"production\"\n ALLOW_PRODUCTION_SEED: ${ALLOW_PRODUCTION_SEED:-false}\n SEED_ADMIN_USERNAME: ${SEED_ADMIN_USERNAME:-admin}\n depends_on:\n db:\n condition: service_healthy\n db-bootstrap:\n condition: service_completed_successfully\n command: [\"tail\", \"-f\", \"/dev/null\"]\n networks:\n - sudungthuoc_network\n restart: \"no\"\n\n # Cloudflare Tunnel\n tunnel:\n image: cloudflare/cloudflared:latest\n container_name: sudungthuoc_tunnel\n command: tunnel --no-autoupdate run\n environment:\n - TUNNEL_TOKEN=${TUNNEL_TOKEN}\n depends_on:\n - app\n networks:\n - sudungthuoc_network\n restart: unless-stopped\n\nnetworks:\n sudungthuoc_network:\n driver: bridge\n\nvolumes:\n postgres_data:\n"}}}}