services: postgres: image: postgres:16 environment: POSTGRES_USER: ${POSTGRES_USER:-finmind} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-finmind} POSTGRES_DB: ${POSTGRES_DB:-finmind} ports: ["5432:5432"] volumes: ["pgdata:/var/lib/postgresql/data"] restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-finmind} -d ${POSTGRES_DB:-finmind}"] interval: 10s timeout: 5s retries: 10 redis: image: redis:7 ports: ["6379:6379"] restart: unless-stopped backend: build: ./packages/backend env_file: - .env depends_on: postgres: condition: service_healthy redis: condition: service_started ports: ["8000:8000"] volumes: - ./packages/backend/app:/app/app - ./packages/backend/wsgi.py:/app/wsgi.py - ./packages/backend/tests:/app/tests - ./.flake8:/app/.flake8:ro - ./.bandit:/app/.bandit:ro command: sh -c "python -m flask --app wsgi:app init-db && export PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc && rm -rf $$PROMETHEUS_MULTIPROC_DIR && mkdir -p $$PROMETHEUS_MULTIPROC_DIR && gunicorn --reload --workers=2 --threads=4 --bind 0.0.0.0:8000 wsgi:app" restart: unless-stopped nginx: image: nginx:1.27-alpine depends_on: [backend] ports: ["8080:80"] volumes: - ./monitoring/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro restart: unless-stopped frontend-dev: image: node:20-alpine working_dir: /app env_file: - .env environment: - CHOKIDAR_USEPOLLING=true - WATCHPACK_POLLING=true volumes: - ./app:/app - /app/node_modules ports: ["5173:5173"] depends_on: [backend] command: sh -c "npm install && npm run dev -- --host 0.0.0.0 --port 5173" restart: unless-stopped prometheus: image: prom/prometheus:v2.54.1 command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.retention.time=14d - --storage.tsdb.retention.size=1GB volumes: - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus ports: ["9090:9090"] restart: unless-stopped loki: image: grafana/loki:2.9.10 command: -config.file=/etc/loki/config.yml volumes: - ./monitoring/loki/config.yml:/etc/loki/config.yml:ro - loki-data:/loki ports: ["3100:3100"] restart: unless-stopped promtail: image: grafana/promtail:3.0.0 command: -config.file=/etc/promtail/config.yml volumes: - ./monitoring/promtail/config.yml:/etc/promtail/config.yml:ro - /var/run/docker.sock:/var/run/docker.sock:ro depends_on: [loki] restart: unless-stopped grafana: image: grafana/grafana-oss:11.1.5 depends_on: [prometheus, loki] environment: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-finmind_admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-change-this-admin-password} GF_USERS_ALLOW_SIGN_UP: "false" volumes: - ./monitoring/grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro - ./monitoring/grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards:ro - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro - grafana-data:/var/lib/grafana ports: ["3000:3000"] restart: unless-stopped node-exporter: image: quay.io/prometheus/node-exporter:v1.8.2 command: - --path.rootfs=/host volumes: - /:/host:ro restart: unless-stopped postgres-exporter: image: quay.io/prometheuscommunity/postgres-exporter:v0.16.0 environment: DATA_SOURCE_NAME: postgresql://${POSTGRES_USER:-finmind}:${POSTGRES_PASSWORD:-finmind}@postgres:5432/${POSTGRES_DB:-finmind}?sslmode=disable depends_on: postgres: condition: service_healthy restart: unless-stopped redis-exporter: image: oliver006/redis_exporter:v1.63.0 environment: REDIS_ADDR: redis://redis:6379 depends_on: [redis] restart: unless-stopped nginx-exporter: image: nginx/nginx-prometheus-exporter:1.3.0 command: - -nginx.scrape-uri=http://nginx/nginx_status depends_on: [nginx] restart: unless-stopped volumes: pgdata: prometheus-data: loki-data: grafana-data: