SilverElixir commited on
Commit
2d6a16c
·
1 Parent(s): 08be160

Telegram alert on state-backup failure instead of Actions summary only (audit M11)

Browse files
Files changed (1) hide show
  1. .github/workflows/state-backup.yml +28 -2
.github/workflows/state-backup.yml CHANGED
@@ -7,6 +7,10 @@ name: State backup
7
  # ADMIN_PANEL_KEY — см. curl -H "Authorization: Bearer <BOT_TOKEN>" .../admin_keys
8
  # STATE_BACKUP_REPO — приватный репозиторий для бэкапов, например S1lverElixir/Lumen-state
9
  # STATE_BACKUP_TOKEN — fine-grained PAT с Contents: read+write только на STATE_BACKUP_REPO
 
 
 
 
10
  #
11
  # ПРИВАТНОСТЬ (инцидент, сентябрь 2026): раньше файл заливался артефактом
12
  # Actions, а артефакты публичного репозитория может скачать любой. Теперь
@@ -63,9 +67,31 @@ jobs:
63
  git -c "http.https://github.com/.extraheader=AUTHORIZATION: basic $(printf 'x-access-token:%s' "${STATE_BACKUP_TOKEN}" | base64 -w0)" \
64
  push origin HEAD:main
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  - name: Report backup failure
67
- # Канала уведомлений нет (нужен отдельный секрет/чат — решение владельца):
68
- # минимум фиксируем провал видимым шагом и сводкой, а не тишиной в логах.
69
  if: failure()
70
  run: |
71
  echo "## State backup FAILED — проверьте вкладку Actions" >> "$GITHUB_STEP_SUMMARY"
 
7
  # ADMIN_PANEL_KEY — см. curl -H "Authorization: Bearer <BOT_TOKEN>" .../admin_keys
8
  # STATE_BACKUP_REPO — приватный репозиторий для бэкапов, например S1lverElixir/Lumen-state
9
  # STATE_BACKUP_TOKEN — fine-grained PAT с Contents: read+write только на STATE_BACKUP_REPO
10
+ # Опционально (алерт о провале, аудит M11):
11
+ # STATE_ALERT_TOKEN — токен бота-сканера (lumen_smoke_bot), без прав админа
12
+ # STATE_ALERT_CHAT — личный chat_id владельца с этим ботом
13
+ # Без них провал виден только в сводке Actions.
14
  #
15
  # ПРИВАТНОСТЬ (инцидент, сентябрь 2026): раньше файл заливался артефактом
16
  # Actions, а артефакты публичного репозитория может скачать любой. Теперь
 
67
  git -c "http.https://github.com/.extraheader=AUTHORIZATION: basic $(printf 'x-access-token:%s' "${STATE_BACKUP_TOKEN}" | base64 -w0)" \
68
  push origin HEAD:main
69
 
70
+ - name: Alert backup failure to Telegram
71
+ # Бэкап — единственный резерв истории чатов, и раньше его провал жил только
72
+ # в логах Actions (аудит M11, 10.2026). Состояние выводится из секретов:
73
+ # без них шаг тихо пропускается и падение всё равно уходит в сводку ниже.
74
+ # STATE_ALERT_TOKEN — токен бота-сканера (лumen_smoke_bot), без прав админа
75
+ # STATE_ALERT_CHAT — личный chat_id владельца с этим ботом
76
+ # Токен не печатаем и не кладём в URL: он в extraheader-подобном Bearer.
77
+ if: failure()
78
+ env:
79
+ STATE_ALERT_TOKEN: ${{ secrets.STATE_ALERT_TOKEN }}
80
+ STATE_ALERT_CHAT: ${{ secrets.STATE_ALERT_CHAT }}
81
+ run: |
82
+ if [ -z "${STATE_ALERT_TOKEN}" ] || [ -z "${STATE_ALERT_CHAT}" ]; then
83
+ echo "alert secrets not set — skipping Telegram alert" >> "$GITHUB_STEP_SUMMARY"
84
+ exit 0
85
+ fi
86
+ curl -sf --retry 2 --max-time 20 -X POST \
87
+ "https://api.telegram.org/bot${STATE_ALERT_TOKEN}/sendMessage" \
88
+ -H "Content-Type: application/json" \
89
+ -d "$(jq -nc --arg c "$STATE_ALERT_CHAT" \
90
+ --arg t "Lumen: ежедневный бэкап состояния ПРОВАЛИЛСЯ. Проверь вкладку Actions." \
91
+ '{chat_id:$c, text:$t}')" \
92
+ || echo "Telegram alert failed" >> "$GITHUB_STEP_SUMMARY"
93
+
94
  - name: Report backup failure
 
 
95
  if: failure()
96
  run: |
97
  echo "## State backup FAILED — проверьте вкладку Actions" >> "$GITHUB_STEP_SUMMARY"