From e7f127bc6eb5fdb9b73ffff62fb918ab3249f6ad Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 12 Sep 2026 14:09:37 +0300 Subject: [PATCH] =?UTF-8?q?chore(ops):=20=D0=BC=D0=B0=D1=80=D1=88=D1=80?= =?UTF-8?q?=D1=83=D1=82=20=D0=B8=20=D1=81=D0=B5=D0=BA=D1=80=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B7=D0=B5=D1=80=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B0=D0=BB=D0=B5=D1=80=D1=82=D0=BE=D0=B2=20Gli?= =?UTF-8?q?tchTip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обвязка к #3482, который добавил сам эндпоинт в alert-ack, но не мог тронуть caddy и workflow: файлы Caddy в тот момент правил параллельный PR #3478. Три вещи: маршрут /glitchtip* на metrics.gendsgn.ru, проброс нового секрета ALERT_ACK_GLITCHTIP_SECRET в окружение деплоя, и предупреждение шага, если секрет пуст. Последнее не косметика: при пустом секрете эндпоинт отвечает 503 на всё, и без предупреждения резервный канал молча не поднялся бы. Секрет намеренно отдельный от продуктового TRADEIN_INTERNAL_AUTH_SECRET — это другой хост и другой домен безопасности. Refs #3471, #3482 --- .forgejo/workflows/deploy-metrics.yml | 11 ++++++++++- caddy/sites/infra.caddy | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) 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`. -- 2.45.3