diff --git a/.forgejo/workflows/deploy-metrics.yml b/.forgejo/workflows/deploy-metrics.yml index 336f322a..ce23046c 100644 --- a/.forgejo/workflows/deploy-metrics.yml +++ b/.forgejo/workflows/deploy-metrics.yml @@ -153,11 +153,33 @@ jobs: METRICS_TELEGRAM_BOT_TOKEN="$METRICS_TELEGRAM_BOT_TOKEN" \ METRICS_TELEGRAM_CHAT_ID="$METRICS_TELEGRAM_CHAT_ID" \ METRICS_TELEGRAM_TOPIC_LINE="$METRICS_TELEGRAM_TOPIC_LINE" \ + # rm перед записью обязателен: после chown ниже файл принадлежит + # 65534 с правами 600, и на СЛЕДУЮЩЕМ деплое `>` в него уже не + # запишет. Каталог принадлежит деплой-пользователю, поэтому + # пересоздать файл он может, а перезаписать — нет. + rm -f ops/metrics/alertmanager/alertmanager.yml envsubst '${METRICS_TELEGRAM_BOT_TOKEN} ${METRICS_TELEGRAM_CHAT_ID} ${METRICS_TELEGRAM_TOPIC_LINE}' \ < ops/metrics/alertmanager/alertmanager.yml.tmpl \ > ops/metrics/alertmanager/alertmanager.yml chmod 600 ops/metrics/alertmanager/alertmanager.yml + # В файле лежит токен бота, поэтому 600 не ослабляем. Но и amtool + # ниже, и сам Alertmanager в образе prom/alertmanager работают под + # `nobody` (65534) и файл владельца-деплойщика прочитать не могут: + # проверка падала на `open /tmp/am.yml: permission denied`, а + # контейнер после подъёма упал бы ровно там же. Гейт не поймали + # раньше только потому, что без токена профиль alerts вообще не + # включался и эта ветка не исполнялась ни разу. + # + # Отдаём файл тому, кто его читает. chown делаем одноразовым + # контейнером от root: passwordless sudo на хосте нет, а + # бинд-маунт правит host-инод напрямую. + # + # Почему не 644: это внесло бы токен в список файлов, читаемых + # любым локальным пользователем машины. Владение 65534 при 600 + # оставляет доступ ровно у контейнера, и ни у кого больше. + docker run --rm --user 0:0 -v "$PWD/ops/metrics/alertmanager/alertmanager.yml:/tmp/am.yml" --entrypoint chown "$(grep -oE 'prom/alertmanager:[^ ]+' docker-compose.metrics.yml | head -1)" 65534:65534 /tmp/am.yml + # Проверяем ДО подъёма, как и Caddyfile ниже. Битый конфиг # Alertmanager не «деградирует» — контейнер не стартует вовсе, и # алертинг молча исчезает целиком. amtool берём из того же образа,