# ===================================================================== # 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:-gitea.netrunner-vpn.com/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:-gitea.netrunner-vpn.com/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/Loki/Grafana больше НЕ здесь — единый стек теперь на VPS с # данными (netrunner-data/docker-compose.observability.yml), т.к. ему # всё равно нужно видеть лендинг и все прокси-ноды, не только бэкенд. # /metrics бэкенда (см. src/api.rs) — тот central Prometheus скрейпит # удалённо; отсюда только пуш логов через тонкий promtail. promtail: image: grafana/promtail:latest container_name: netrunner-promtail environment: - LOKI_PUSH_URL=${LOKI_PUSH_URL} 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 # -config.expand-env: без него promtail не подставит ${LOKI_PUSH_URL} # внутри самого config.yml — сама переменная передаётся выше через # environment, файл конфига читает её только с этим флагом. command: -config.file=/etc/promtail/config.yml -config.expand-env=true restart: always user: root networks: - netrunner_grid networks: netrunner_grid: driver: bridge