services: # ── PostgreSQL + PostGIS ───────────────────────────────────────────────── db: image: postgis/postgis:15-3.3 container_name: georesilience_db restart: unless-stopped environment: POSTGRES_DB: ${DB_NAME:-fyp_georesilience} POSTGRES_USER: ${DB_USER:-fyp_user} POSTGRES_PASSWORD: ${DB_PASSWORD:-fyp_pass} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-fyp_user} -d ${DB_NAME:-fyp_georesilience}"] interval: 10s timeout: 5s retries: 5 # ── Django Backend ─────────────────────────────────────────────────────── backend: build: context: ./backend dockerfile: Dockerfile container_name: georesilience_backend restart: unless-stopped depends_on: db: condition: service_healthy environment: SECRET_KEY: ${SECRET_KEY} DEBUG: ${DEBUG:-False} DB_NAME: ${DB_NAME:-fyp_georesilience} DB_USER: ${DB_USER:-fyp_user} DB_PASSWORD: ${DB_PASSWORD:-fyp_pass} DB_HOST: db DB_PORT: 5432 FRONTEND_URL: ${FRONTEND_URL:-http://localhost} GROQ_API_KEY: ${GROQ_API_KEY} volumes: # Persist outputs (graph pickle, logs) across restarts - backend_outputs:/app/outputs ports: - "8000:8000" command: > sh -c "python manage.py migrate --run-syncdb && gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 --timeout 120" # ── Pipeline Runner ────────────────────────────────────────────────────── pipelines: build: context: ./pipelines dockerfile: Dockerfile container_name: georesilience_pipelines restart: unless-stopped depends_on: db: condition: service_healthy environment: DB_NAME: ${DB_NAME:-fyp_georesilience} DB_USER: ${DB_USER:-fyp_user} DB_PASSWORD: ${DB_PASSWORD:-fyp_pass} DB_HOST: db DB_PORT: 5432 GROQ_API_KEY: ${GROQ_API_KEY} volumes: # Share outputs with backend (graph_baseline.gpickle etc.) - backend_outputs:/app/outputs # Keep pipeline data files in container - ./pipelines/data:/app/data:ro # Run scenario simulation; override for other scripts: # docker-compose run pipelines python hazard_model.py command: python scenario_simulation.py profiles: - pipeline # Only starts when explicitly requested # ── React Frontend (Nginx) ─────────────────────────────────────────────── frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_URL: ${VITE_API_URL:-/api} VITE_MAPTILER_KEY: ${VITE_MAPTILER_KEY} VITE_CESIUM_TOKEN: ${VITE_CESIUM_TOKEN} container_name: georesilience_frontend restart: unless-stopped depends_on: - backend ports: - "80:80" volumes: postgres_data: backend_outputs: