feat(ops): проверка бэкапа и уборка файлов без записи

- glchat verify-backup: расшифровка age, integrity_check, foreign_key_check,
  схема и состав данных, сверка с манифестом; живые данные не трогает
- чистка удаляет файлы на диске, у которых не осталось записи в базе (так
  оставались вложения удалённых серверов), и пустые подкаталоги; работает
  через os.Root, чтобы символическая ссылка не вывела за каталог файлов
- удаление сервера теперь чистит и содержимое файлов, а не только записи
- install.sh пишет значения .env с пробелами в кавычках: файл подключается
  через `set -a && . .env`, иначе имя главного сервера выполнялось как команда
- тесты: Go на уборку файлов без записи (свежие не трогаются, пустые
  каталоги удаляются)
This commit is contained in:
2026-09-21 23:33:04 +03:00
parent ef871bcd96
commit 1cb949a7a4
8 changed files with 329 additions and 4 deletions
+13
View File
@@ -18,6 +18,7 @@ glchat — управление инстансом
glchat restart [service] перезапуск стека или сервиса
glchat backup бэкап БД и файлов (age-шифрование)
glchat restore <файл> восстановление из бэкапа
glchat verify-backup <файл> проверить бэкап, не трогая данные
glchat update [--channel X] обновление (бэкап → pull → up → smoke)
glchat reset-password <email> сброс пароля пользователя (фаза 1)
glchat make-admin <email> выдать права инстанс-админа (фаза 1)
@@ -151,6 +152,17 @@ cmd_version() {
[ -f "$ENV_FILE" ] && grep -E '^(APP_VERSION|IMAGE_TAG|DOMAIN|PROFILE)=' "$ENV_FILE" || true
}
# cmd_verify_backup проверяет архив бэкапа: расшифровка, целостность базы и
# состав данных (AGENT.md 10.8).
cmd_verify_backup() {
require_stack
[ -n "${1:-}" ] || {
echo "использование: glchat verify-backup <файл.tar.gz[.age]>" >&2
exit 2
}
GLCHAT_ETC_DIR="${GLCHAT_ETC_DIR}" bash "${GLCHAT_ETC_DIR}/verify-backup.sh" "$@"
}
cmd_reindex() {
require_stack
${COMPOSE} exec -T app glchat reindex
@@ -182,6 +194,7 @@ main() {
profile) cmd_profile "$@" ;;
security-check) cmd_security_check "$@" ;;
reindex) cmd_reindex "$@" ;;
verify-backup) cmd_verify_backup "$@" ;;
cleanup) cmd_cleanup "$@" ;;
change-domain) cmd_change_domain "$@" ;;
uninstall) cmd_uninstall "$@" ;;