Уведомления в Telegram
CI / test (push) Successful in 2m45s
Release / release (push) Successful in 1m17s

- второй канал рядом с ntfy, оба необязательные: токен бота, несколько chat id,
  тема форума, свой адрес Bot API
- успешные бэкапы приходят без звука, в сообщениях ссылка на карточку клиента
- тестовая отправка синхронная: в настройках виден результат по каждому каналу
- токен бота не попадает в тексты ошибок и логи

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-06 22:29:26 +03:00
1 parent a488d2ea08
commit 897ad48a2d
8 files changed
+354 -38

No files matched your search

+27 -3
View File
@@ -2,15 +2,39 @@
{{define "content"}}
<h1>Настройки</h1>
{{if .Saved}}<p class="ok-text">Сохранено.</p>{{end}}
{{if .Tested}}
{{if .TestResults}}
<ul class="results">
{{range .TestResults}}
<li>{{.Channel}}: {{if .Err}}<span class="fail-text">ошибка — {{.Err}}</span>{{else}}<span class="ok-text">отправлено</span>{{end}}</li>
{{end}}
</ul>
{{else}}
<p class="error">Ни один канал уведомлений не настроен.</p>
{{end}}
{{end}}
<form method="post" action="/settings" class="card narrow">
<input type="hidden" name="csrf" value="{{.CSRF}}">
<h2>Уведомления ntfy</h2>
<h2>ntfy</h2>
<label>URL топика <input name="ntfy_url" value="{{.NtfyURL}}" placeholder="https://ntfy.example.com/backups"></label>
<label>Авторизация <input name="ntfy_auth" type="password" autocomplete="off" placeholder="{{if .NtfyAuthSet}}задана — оставьте пустым, чтобы не менять{{else}}tk_... или user:password{{end}}"></label>
{{if .NtfyAuthSet}}<label class="check"><input type="checkbox" name="ntfy_auth_clear" value="1"> Удалить авторизацию</label>{{end}}
<label class="check"><input type="checkbox" name="notify_success" value="1" {{if .NotifySuccess}}checked{{end}}> Сообщать и об успешных бэкапах</label>
<p class="hint">Пустой URL — ntfy выключен.</p>
<h2>Telegram</h2>
<label>Токен бота <input name="tg_token" type="password" autocomplete="off" placeholder="{{if .TGTokenSet}}задан — оставьте пустым, чтобы не менять{{else}}123456:ABC... от @BotFather{{end}}"></label>
{{if .TGTokenSet}}<label class="check"><input type="checkbox" name="tg_token_clear" value="1"> Удалить токен (выключить Telegram)</label>{{end}}
<label>Chat ID <input name="tg_chats" value="{{.TGChats}}" placeholder="123456789, -1001234567890"></label>
<p class="hint">Можно несколько через запятую. Личный чат — ваш числовой id (напишите боту и откройте <code>https://api.telegram.org/bot&lt;токен&gt;/getUpdates</code>), группа — id вида <code>-100…</code>, бот должен быть её участником.</p>
<label>ID темы (необязательно) <input name="tg_thread" value="{{.TGThread}}" placeholder="для группы с темами"></label>
<label>Адрес Bot API (необязательно) <input name="tg_api_url" value="{{.TGAPIURL}}" placeholder="https://api.telegram.org"></label>
<p class="hint">Свой Bot API сервер или прокси, если api.telegram.org недоступен с сервера бэкапов.</p>
<h2>Что отправлять</h2>
<label class="check"><input type="checkbox" name="notify_success" value="1" {{if .NotifySuccess}}checked{{end}}> Сообщать и об успешных бэкапах (в Telegram — без звука)</label>
<p class="hint">Ошибки бэкапа и отсутствие бэкапа дольше заданного у клиента срока приходят всегда, во все настроенные каналы.</p>
<label class="check"><input type="checkbox" name="test" value="1"> Отправить тестовое уведомление после сохранения</label>
<p class="hint">Ошибки бэкапа и отсутствие бэкапа дольше заданного у клиента срока приходят всегда.</p>
<button class="primary">Сохранить</button>
</form>
<p class="hint">Логин и пароль администратора меняются на сервере: <code>backupctl admin-passwd &lt;логин&gt;</code></p>