# ===================================================================== # PRODUCTION — VPS только тянет готовый образ из GHCR и запускает его. # Никакой компиляции Rust на сервере. Деплой = pull + migrate + up. # # ВАЖНО: своего Postgres здесь больше нет. БД физически стоит на отдельном # VPS (см. netrunner-data/docker-compose.yml — там же Vaultwarden, тот же # Postgres-процесс, вторая база) и слушает по сети, не в одном # Docker-стеке с этим compose. DATABASE_URL ниже указывает на DB_HOST:DB_PORT # (внешний IP того VPS), не на "db" как раньше — и требует sslmode=require, # т.к. трафик идёт по публичной сети между двумя разными серверами. Бэкапы # тоже переехали туда же (netrunner-data/scripts/backup.sh) — дампить # логичнее там, где физически лежат данные. # ===================================================================== services: # One-shot: применяет миграции и завершается. Требует только DATABASE_URL. migrate: image: ${IMAGE:-ghcr.io/nineap/netrunner-control-plane:latest} container_name: netrunner-migrate command: ["./netrunner-control-plane", "--migrate"] environment: - DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT:-5432}/${DB_NAME}?sslmode=require restart: "no" networks: - netrunner_grid app: image: ${IMAGE:-ghcr.io/nineap/netrunner-control-plane:latest} container_name: netrunner-app restart: always ports: - "8080:8080" env_file: - .env environment: - APP_ENV=production - FRONTEND_DIR=/app/frontend/dist - DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT:-5432}/${DB_NAME}?sslmode=require volumes: - ./keys:/app/keys:ro depends_on: redis: condition: service_healthy migrate: condition: service_completed_successfully healthcheck: test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"] interval: 30s timeout: 5s retries: 3 start_period: 20s networks: - netrunner_grid redis: image: redis:7-alpine container_name: netrunner-redis restart: always healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s networks: - netrunner_grid # ========================================== # МОНИТОРИНГ # ========================================== prometheus: image: prom/prometheus:latest container_name: netrunner-prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro ports: - "127.0.0.1:9090:9090" restart: always networks: - netrunner_grid loki: image: grafana/loki:latest container_name: netrunner-loki volumes: - ./loki-config.yml:/etc/loki/local-config.yaml:ro ports: - "127.0.0.1:3100:3100" command: -config.file=/etc/loki/local-config.yaml restart: always networks: - netrunner_grid promtail: image: grafana/promtail:latest container_name: netrunner-promtail volumes: - ./promtail-config.yml:/etc/promtail/config.yml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro command: -config.file=/etc/promtail/config.yml restart: always user: root depends_on: - loki networks: - netrunner_grid grafana: image: grafana/grafana:latest container_name: netrunner-grafana ports: - "127.0.0.1:3030:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} volumes: - grafana_data:/var/lib/grafana - ./grafana-datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml:ro depends_on: - prometheus - loki restart: always networks: - netrunner_grid networks: netrunner_grid: driver: bridge volumes: grafana_data: