diff --git a/.forgejo/workflows/deploy-metrics.yml b/.forgejo/workflows/deploy-metrics.yml index 559784aa..7abe3707 100644 --- a/.forgejo/workflows/deploy-metrics.yml +++ b/.forgejo/workflows/deploy-metrics.yml @@ -90,8 +90,9 @@ jobs: METRICS_TELEGRAM_TOPIC_ID: ${{ secrets.METRICS_TELEGRAM_TOPIC_ID }} METRICS_TELEGRAM_INFRA_TOPIC_ID: ${{ secrets.METRICS_TELEGRAM_INFRA_TOPIC_ID }} METRICS_TELEGRAM_ONCALL: ${{ secrets.METRICS_TELEGRAM_ONCALL }} + ALERT_ACK_GLITCHTIP_SECRET: ${{ secrets.ALERT_ACK_GLITCHTIP_SECRET }} with: - envs: METRICS_TELEGRAM_BOT_TOKEN,METRICS_TELEGRAM_CHAT_ID,METRICS_TELEGRAM_TOPIC_ID,METRICS_TELEGRAM_INFRA_TOPIC_ID,METRICS_TELEGRAM_ONCALL + envs: METRICS_TELEGRAM_BOT_TOKEN,METRICS_TELEGRAM_CHAT_ID,METRICS_TELEGRAM_TOPIC_ID,METRICS_TELEGRAM_INFRA_TOPIC_ID,METRICS_TELEGRAM_ONCALL,ALERT_ACK_GLITCHTIP_SECRET host: ${{ secrets.INFRA_DEPLOY_HOST || secrets.DEPLOY_HOST }} username: ${{ secrets.INFRA_DEPLOY_USER || secrets.DEPLOY_USER }} key: ${{ secrets.INFRA_DEPLOY_SSH_KEY || secrets.DEPLOY_SSH_KEY }} @@ -188,6 +189,14 @@ jobs: echo "Инфраструктура: тема ${INFRA_TOPIC_ID} по умолчанию (METRICS_TELEGRAM_INFRA_TOPIC_ID не задана)." fi + # Резервный приёмник GlitchTip (#3471) отвечает 503 на любой + # запрос, пока секрет пуст: тихо принимать чужие алерты настежь + # хуже, чем не принимать вовсе. Молчаливого отказа тут быть не + # должно — деплой обязан сказать, что канал не поднялся. + if [ -z "${ALERT_ACK_GLITCHTIP_SECRET:-}" ]; then + echo "::warning title=Резервный канал GlitchTip выключен::ALERT_ACK_GLITCHTIP_SECRET пуст — alert-ack отвечает 503 на /glitchtip, и при падении продуктового бэкенда его ошибки доставлять будет нечем." + fi + if [ -n "${METRICS_TELEGRAM_ONCALL:-}" ]; then echo "Клиентские инциденты: зовём ${METRICS_TELEGRAM_ONCALL} поимённо." else diff --git a/caddy/sites/infra.caddy b/caddy/sites/infra.caddy index 15788ff9..4d22fa65 100644 --- a/caddy/sites/infra.caddy +++ b/caddy/sites/infra.caddy @@ -105,11 +105,24 @@ metrics.gendsgn.ru { # угадавший, — ложная отметка «принято» в чате, где сразу видно, что её # поставил не человек. Прав в системе токен не даёт никаких. # - # Сервис отвечает только на /ack/* и /healthz; всё прочее — 404. + # Сервис отвечает только на /ack/*, /glitchtip и /healthz; всё прочее — 404. handle /ack/* { reverse_proxy alert-ack:8080 } + # Резервный приёмник алертов GlitchTip (#3471). Основной получатель — + # продуктовый бэкенд на Selectel, то есть тот самый сервис, за которым эти + # алерты и следят: пока он лежит, его собственные ошибки доставлять некому. + # Этот путь живёт у другого провайдера и с чистой сетью до Telegram, поэтому + # переживает падение Selectel целиком. + # + # Секрет — в значении query-параметра, а не в пути: путь сам по себе не + # секрет, и его попадание в access-лог безопасно. Само значение вырезает + # scrub_credentials в Alloy до записи в Loki (#3154). + handle /glitchtip* { + reverse_proxy alert-ack:8080 + } + # Вход ОДИН — собственный вход Grafana (#3078). Внешний basic_auth снят по # решению владельца: два запроса пароля подряд мешали работе, а Grafana имеет # собственную аутентификацию с ролями и `GF_USERS_ALLOW_SIGN_UP=false`.