Единый observability-стек: Prometheus + Loki + Grafana + Caddy auth-гейт
Deploy Observability / Deploy Observability Stack (push) Failing after 20s
Deploy / Deploy to Data VPS (push) Failing after 19s

Отдельный от 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 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 23:22:11 +07:00
parent f373601025
commit 414667062c
14 changed files with 698 additions and 0 deletions
+59
View File
@@ -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 <<EOF
GRAFANA_PASSWORD=${GRAFANA_PASSWORD}
EOF
chmod 600 .env.observability
docker compose --env-file .env.observability -f docker-compose.observability.yml pull
docker compose --env-file .env.observability -f docker-compose.observability.yml up -d --remove-orphans
docker image prune -f
echo "✅ netrunner-data observability stack synchronized."
echo "⚠️ Не забудьте: firewall на этом VPS должен пускать 3100 (Loki push) ТОЛЬКО с IP backend/landing/каждой прокси-ноды по мере их появления."
env:
GRAFANA_PASSWORD: ${{ secrets.GRAFANA_PASSWORD }}