From 414667062c41b35a973308d42e870ee9c17f72fe Mon Sep 17 00:00:00 2001 From: nineap Date: Thu, 9 Jul 2026 23:22:11 +0700 Subject: [PATCH] =?UTF-8?q?=D0=95=D0=B4=D0=B8=D0=BD=D1=8B=D0=B9=20observab?= =?UTF-8?q?ility-=D1=81=D1=82=D0=B5=D0=BA:=20Prometheus=20+=20Loki=20+=20G?= =?UTF-8?q?rafana=20+=20Caddy=20auth-=D0=B3=D0=B5=D0=B9=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Отдельный от db+vaultwarden compose-файл (разный жизненный цикл, свой deploy-workflow) — единственное место сбора для backend, лендинга и каждой прокси-ноды, которые физически живут на других серверах. Prometheus скрейпит наружу (сам ходит в /metrics на тех хостах — там нужно только открыть порт метрик для IP этого VPS). Loki, наоборот, принимает пуши логов ИЗВНЕ — порт 3100 публикуется наружу и обязательно фильтруется firewall'ом по IP тех хостов. Grafana не торчит в интернет напрямую (127.0.0.1-only) — единственный вход через Caddy с forward_auth, гейтящим по cookie-сессии netrunner-backend (GET /api/v1/admin/observability/check, Owner/Moderator). 3 provisioned дашборда (backend/landing/прокси-ноды). Список scrape-таргетов для прокси-нод (observability/targets/nodes.json) генерится и заливается автоматически из netrunner-proxy при каждом деплое нод — вручную ничего не поддерживается. Co-Authored-By: Claude Sonnet 5 --- .env.example | 9 ++ .gitea/workflows/deploy-observability.yml | 59 +++++++++ .github/workflows/deploy-observability.yml | 59 +++++++++ docker-compose.observability.yml | 123 ++++++++++++++++++ observability/Caddyfile | 28 ++++ observability/grafana-dashboards-provider.yml | 17 +++ observability/grafana-dashboards/backend.json | 108 +++++++++++++++ observability/grafana-dashboards/landing.json | 71 ++++++++++ .../grafana-dashboards/proxy-nodes.json | 90 +++++++++++++ observability/grafana-datasources.yml | 17 +++ observability/loki-config.yml | 37 ++++++ observability/prometheus.yml | 41 ++++++ observability/promtail-config.yml | 38 ++++++ observability/targets/nodes.json | 1 + 14 files changed, 698 insertions(+) create mode 100644 .gitea/workflows/deploy-observability.yml create mode 100644 .github/workflows/deploy-observability.yml create mode 100644 docker-compose.observability.yml create mode 100644 observability/Caddyfile create mode 100644 observability/grafana-dashboards-provider.yml create mode 100644 observability/grafana-dashboards/backend.json create mode 100644 observability/grafana-dashboards/landing.json create mode 100644 observability/grafana-dashboards/proxy-nodes.json create mode 100644 observability/grafana-datasources.yml create mode 100644 observability/loki-config.yml create mode 100644 observability/prometheus.yml create mode 100644 observability/promtail-config.yml create mode 100644 observability/targets/nodes.json diff --git a/.env.example b/.env.example index b603d78..812b351 100644 --- a/.env.example +++ b/.env.example @@ -41,3 +41,12 @@ SMTP_PASSWORD=CHANGE_ME_GMAIL_APP_PASSWORD # BACKUP_RETENTION_DAYS=14 # RCLONE_REMOTE=b2:netrunner-backups # RCLONE_CONFIG_CONTENT содержимое rclone.conf одной переменной, см. rclone.conf.example + +# --- Наблюдаемость (docker-compose.observability.yml — Prometheus/Loki/ +# Grafana, отдельный стек от Postgres/Vaultwarden выше) --- +GRAFANA_PASSWORD=CHANGE_ME_GRAFANA_PASSWORD +# ВАЖНО: порт Loki (3100) публикуется наружу — сюда пушат логи тонкие +# promtail с backend/landing/каждой прокси-ноды. Firewall на этом VPS +# ОБЯЗАН ограничивать 3100 только IP этих хостов (см. шапку +# docker-compose.observability.yml) — сам Loki не защита от постороннего +# пуша логов. diff --git a/.gitea/workflows/deploy-observability.yml b/.gitea/workflows/deploy-observability.yml new file mode 100644 index 0000000..67b4f6a --- /dev/null +++ b/.gitea/workflows/deploy-observability.yml @@ -0,0 +1,59 @@ +name: Deploy Observability + +# Отдельный от deploy.yml workflow — Prometheus/Loki/Grafana не должны +# рестартовать вместе с Postgres/Vaultwarden (docker-compose.observability.yml +# вместо docker-compose.yml, разные жизненные циклы). Деплоится на тот же +# DATA_VPS_IP/DATA_SSH_PRIVATE_KEY, что и основной стек — тот же VPS. +# +# GRAFANA_PASSWORD — единственный настоящий секрет здесь, остальное (список +# таргетов, конфиги Loki/promtail/Grafana-datasources) — публичный код +# репозитория, не секреты. +on: + push: + branches: [main] + workflow_dispatch: + +jobs: + deploy: + name: Deploy Observability Stack + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - name: Sync compose file + observability configs to VPS + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ vars.DATA_VPS_IP }} + username: root + key: ${{ secrets.DATA_SSH_PRIVATE_KEY }} + source: "docker-compose.observability.yml,observability" + target: "/root/netrunner-data" + strip_components: 0 + + - name: Write .env and deploy via SSH + uses: appleboy/ssh-action@v1 + with: + host: ${{ vars.DATA_VPS_IP }} + username: root + key: ${{ secrets.DATA_SSH_PRIVATE_KEY }} + envs: "GRAFANA_PASSWORD" + script: | + set -e + cd /root/netrunner-data + + # Свой .env.observability, НЕ общий .env (тот принадлежит + # deploy.yml/docker-compose.yml и перезаписывается им целиком на + # каждом своём прогоне — общий файл рассинхронизировал бы стеки). + cat > .env.observability < .env.observability <