- список клиентов: поиск по домену и названию, фильтр по статусу (чипы со счётчиками), сортировка по любой колонке, пагинация 10/25/50/100; состояние в URL — отфильтрованный вид можно сохранить ссылкой - размеры последних бэкапов одним запросом вместо запроса на клиента - шапка выровнена по колонке контента; настройки на всю ширину: ntfy и Telegram двумя карточками, на узком экране — друг под другом Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
3.7 KiB
HTML
52 lines
3.7 KiB
HTML
{{define "title"}}Настройки — backup-master{{end}}
|
|
{{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="settings">
|
|
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
|
|
|
<div class="cards">
|
|
<section class="card">
|
|
<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}}
|
|
<p class="hint">Пустой URL — ntfy выключен.</p>
|
|
</section>
|
|
|
|
<section class="card">
|
|
<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<токен>/getUpdates</code>), группа — id вида <code>-100…</code>, бот должен быть её участником.</p>
|
|
<div class="grid">
|
|
<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>
|
|
</div>
|
|
<p class="hint">Тема — для группы с темами. Свой Bot API сервер или прокси — если api.telegram.org недоступен с сервера бэкапов.</p>
|
|
</section>
|
|
</div>
|
|
|
|
<section class="card">
|
|
<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>
|
|
<button class="primary">Сохранить</button>
|
|
</section>
|
|
</form>
|
|
<p class="hint">Логин и пароль администратора меняются на сервере: <code>backupctl admin-passwd <логин></code></p>
|
|
{{end}}
|