backup-master: сервер бэкапов, агент и восстановление VPS
Один бинарник 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>
This commit is contained in:
commit
1d44d067e9
53 files changed
+7278
No files matched your search
@@ -0,0 +1,39 @@
|
||||
package catalog
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestDefaultAndMerge(t *testing.T) {
|
||||
base, err := Default()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if base.Find("stoat") == nil || base.Find("xui") == nil {
|
||||
t.Fatal("в каталоге нет stoat/xui")
|
||||
}
|
||||
over, err := Parse([]byte(`
|
||||
categories:
|
||||
- {name: scripts, disabled: true}
|
||||
- name: extra
|
||||
type: files
|
||||
paths: [/srv/extra]
|
||||
- name: telegraf
|
||||
type: files
|
||||
paths: [/etc/telegraf]
|
||||
`))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
m := Merge(base, over)
|
||||
if err := m.Validate(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !m.Find("scripts").Disabled || len(m.Find("scripts").Paths) == 0 {
|
||||
t.Error("короткая форма disabled должна сохранять остальные поля")
|
||||
}
|
||||
if m.Find("extra") == nil {
|
||||
t.Error("новая категория не добавлена")
|
||||
}
|
||||
if m.Find("telegraf").Type != TypeFiles {
|
||||
t.Error("категория не заменена")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user