Restore: перевод бэкапов на восстановленный сервер
CI / test (push) Successful in 1m36s
Release / release (push) Successful in 1m33s

Раньше восстановленная копия получала конфиг и таймер агента со старым токеном
(через категории etc и units), и бэкапы шли с двух серверов одновременно.

- конфиг и юниты агента больше не бэкапятся
- в конце restore спрашивает, сделать ли сервер основным: сервер бэкапов
  выпускает новый токен (POST /api/v1/restore/takeover), restore ставит
  агента; токен старого сервера отозван — его агент получает отказ
- --takeover / --no-takeover; без них — вопрос (с --yes — да)
- уведомление «Сервер восстановлен» в ntfy/Telegram

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-17 15:29:34 +03:00
1 parent 488abc2d34
commit 97c7051021
12 files changed
+195 -4

No files matched your search

+19
View File
@@ -440,3 +440,22 @@ func (s *Server) servePart(w http.ResponseWriter, r *http.Request, b *Backup, na
filepath.Base(filepath.Dir(b.Dir)), b.ID, name))
http.ServeContent(w, r, "", fi.ModTime(), f)
}
// apiTakeover делает восстановленный сервер основным: выпускает клиенту новый
// агентский токен. Старый токен перестаёт работать, поэтому агент старого сервера,
// если тот ещё жив, получает отказ и больше не шлёт бэкапы.
func (s *Server) apiTakeover(w http.ResponseWriter, r *http.Request) {
c := clientFrom(r)
tok := newToken()
if err := s.st.SetClientToken(c.ID, hashToken(tok)); err != nil {
jsonErr(w, http.StatusInternalServerError, err.Error())
return
}
log.Printf("%s: бэкапы переведены на восстановленный сервер, старый токен отозван", c.Domain)
s.notify(notification{
Title: "Сервер восстановлен: " + c.Domain,
Msg: "Бэкапы теперь присылает восстановленный сервер, токен старого отозван.",
Tags: "white_check_mark", Link: s.clientLink(c.ID),
})
jsonResp(w, http.StatusOK, map[string]string{"token": tok})
}