- список клиентов: поиск по домену и названию, фильтр по статусу (чипы
со счётчиками), сортировка по любой колонке, пагинация 10/25/50/100;
состояние в URL — отфильтрованный вид можно сохранить ссылкой
- размеры последних бэкапов одним запросом вместо запроса на клиента
- шапка выровнена по колонке контента; настройки на всю ширину:
ntfy и Telegram двумя карточками, на узком экране — друг под другом
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- второй канал рядом с ntfy, оба необязательные: токен бота, несколько chat id,
тема форума, свой адрес Bot API
- успешные бэкапы приходят без звука, в сообщениях ссылка на карточку клиента
- тестовая отправка синхронная: в настройках виден результат по каждому каналу
- токен бота не попадает в тексты ошибок и логи
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ci.yml: gofmt, go vet, тесты, сборка backupctl linux/amd64+arm64 на push и PR
- release.yml: на тег v* — сборка, checksums.txt и публикация релиза через API Gitea
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Один бинарник backupctl:
- server: API для агентов и restore, веб-морда (один админ), SQLite,
ретеншн GFS, heavy-части, уведомления ntfy, раздача agent.sh/restore.sh;
- backup/plan: сбор по каталогу категорий (files/systemd/xui/compose),
горячие дампы Postgres/Mongo/MySQL, снимок x-ui.db, docker-тома,
digest образов, проверка crontab, потоковая отправка tar.zst;
- restore: провижининг на основе vps_installer с теми же версиями пакетов,
recipes 3x-ui/nebula/sing-box нужных версий, восстановление compose
с заливкой дампов и закреплением образов по digest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>