Единый 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
+38
View File
@@ -0,0 +1,38 @@
# Собирает докер-логи ТОЛЬКО этого хоста (Postgres/Vaultwarden/backup из
# netrunner-data/docker-compose.yml + prometheus/loki/grafana этого же
# compose — docker_sd_configs видит все контейнеры хоста через общий
# docker.sock, не только контейнеры этого конкретного compose-проекта).
#
# Логи с backend/landing/каждой прокси-ноды приходят СЮДА ЖЕ по сети —
# на каждом из тех хостов свой отдельный тонкий promtail, пушащий прямо в
# Loki на этом VPS (см. netrunner-backend/promtail-config.yml после
# переноса — `clients.url` там указывает на публичный адрес этого хоста).
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker_service_logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ["__meta_docker_container_name"]
regex: "/(.*)"
target_label: "container"
pipeline_stages:
- docker: {}
- json:
expressions:
level: level
module: target
message: message
- labels:
level:
module: