# ════════════════════════════════════════════════════════════ # مُصادَق (Musadaq) — Full Stack Docker Compose # ════════════════════════════════════════════════════════════ # Services: # - Frontend: React/Vite (80 -> Proxy to API) # - API: NestJS (3300) # - DB: PostgreSQL (5300 internally) # - Redis: Cache & Queue (6400 internally) # ════════════════════════════════════════════════════════════ services: # ── Frontend (Ingress) ────────────────────────────────── frontend: build: context: ./musadaq-frontend dockerfile: Dockerfile container_name: musadaq-frontend restart: unless-stopped ports: - "9090:80" depends_on: - api networks: - musadaq-network # ── NestJS API ───────────────────────────────────────── api: build: context: ./musadaq-backend dockerfile: Dockerfile container_name: musadaq-api restart: unless-stopped ports: - "3300:3300" environment: - NODE_ENV=production - DB_HOST=db - DB_PORT=5432 - REDIS_HOST=redis - REDIS_PORT=6379 - DB_USER=${DB_USER} - DB_PASS=${DB_PASS} - DB_NAME=${DB_NAME} - JWT_SECRET=${JWT_SECRET} - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} - ENCRYPTION_KEY=${ENCRYPTION_KEY} - GEMINI_API_KEY=${GEMINI_API_KEY} - JOFOTARA_SANDBOX_URL=${JOFOTARA_SANDBOX_URL} - JOFOTARA_PROD_URL=${JOFOTARA_PROD_URL} - JOFOTARA_ENV=${JOFOTARA_ENV} - STORAGE_PATH=/app/uploads volumes: - invoice_uploads:/app/uploads depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - musadaq-network # ── PostgreSQL ──────────────────────────────────────── db: image: postgres:16-alpine container_name: musadaq-db restart: unless-stopped environment: - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASS} - POSTGRES_DB=${DB_NAME} volumes: - postgres_data:/var/lib/postgresql/data networks: - musadaq-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"] interval: 10s timeout: 5s retries: 5 # ── Redis ───────────────────────────────────────────── redis: image: redis:7-alpine container_name: musadaq-redis restart: unless-stopped volumes: - redis_data:/data networks: - musadaq-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 volumes: postgres_data: redis_data: invoice_uploads: networks: musadaq-network: driver: bridge