Wiki · Funkce do hloubky
Zálohy a obnova
Záloha, kterou jste nikdy nezkusili obnovit, není záloha. Prakticky: co zálohovat, jak obnovit a jak se chovat, když se sezení rozbije.
Co je potřeba zálohovat
Všechno důležité je v jedné složce — v domovské složce Hermese (~/.hermes/).
| Co | Proč na tom záleží |
|---|---|
config.yaml, .env, auth.json | Nastavení, klíče k modelům a přihlášení. Bez nich je obnova jen prázdný agent |
state.db (+ -wal, -shm) | Všechny konverzace, sezení a navazující data |
skills/, memories/ | Co se agent naučil a co si o vás pamatuje |
cron/ | Pravidelné úlohy — bez nich agent po obnově „zapomene“, co má dělat každý den |
SOUL.md, profily | Osobnost agenta a všechny další profily |
Pokud používáte víc profilů, každý má vlastní state.db i vlastní složku.
Záloha na úrovni celého ~/.hermes/ je proto bezpečnější než kopírovat jen „ten svůj“ profil.
Záloha jedním příkazem
| Vlastnost | Jak to funguje |
|---|---|
| Záloha za běhu | Kopírování jde přes SQLite backup(), takže je konzistentní i když agent právě pracuje (WAL režim) |
| Co v archivu není | Samotný kód agenta, modely a runtime (desítky GB, dají se stáhnout znovu), keše, kontrolní body a staré zálohy |
| Návratový kód | 0 = vše v archivu; 1 = část souborů chyběla (archiv zůstane, ať se dá obnovit zbytek); 2 = jiná záloha právě běží |
Kód 1 je důležitý: kdyby zálohu pouštěl cron, musí se podle kódu poznat, že archiv
není úplný. Právě proto se --keep v takovém případě nemaže starší (a kompletní) archivy.
Obnova
Archiv se před zápisem celý rozbalí a zkontroluje (CRC). Když je poškozený, příkaz skončí s chybou a nic nezapíše. Soubory, které se nepodaří obnovit, vypíše — a vrátí kód 1, takže se částečná obnova nikdy netváří jako úspěch.
Záloha versus předání profilu
| hermes backup | hermes profile export | |
|---|---|---|
| K čemu | Přesun celého stroje, obnova po havárii | Předání nebo přenos jednoho profilu |
| Rozsah | Všechny profily, globální nastavení, klíče, sezení | Jeden profil: SOUL.md, paměť, sezení, skilly |
| Tajné údaje | Jsou uvnitř (.env, auth.json) | Nejsou — odstraní se, aby se dal profil bezpečně sdílet |
| Formát | .zip | .tar.gz |
Praktický důsledek: zálohu z hermes backup nikdy nikomu neposílejte —
obsahuje klíče. Na sdílení je určený export profilu.
Když se sezení rozbije (a co nikdy nedělat)
Hermes vede každou konverzaci v jednom souboru state.db na profil. Když se při psaní
objeví hláška o „staré kopii write-ahead logu“, nic se neztratilo — agent právě
přestal psát, aby data nepoškodil. Řeší se to třemi kroky:
| Nikdy | Proto |
|---|---|
Mazat state.db-wal nebo state.db-shm | Log obsahuje konverzace, které ještě nejsou v hlavním souboru — smazáním je ztratíte natrvalo |
Kopírovat state.db samo přes cp | Ty tři soubory jsou jeden celek; správně je to hermes backup nebo hermes sessions recover |
Pouštět hermes doctor --fix za běhu | Může se stát druhým zapisovatelem — přesně tím, co problém způsobilo |
Pouštět sessions optimize pod živou branou | Přepisuje databázi (VACUUM, přestavba indexu), takže příkaz to pozná a odmítne — i s výpisem procesů, které databázi drží. --dry-run je vždy povolený, --force jde použít, ale jen když víte, že ty procesy nic nečtou |
sessions prune pod živou branou | Tady je to naopak bezpečné: náhled se udělá jen pro čtení a maže sama brána (sezení s běžícím tahem přeskočí). Odmítne jen tehdy, když brána neběží a databázi drží jiný proces |
Diagnostika a oprava poškozeného souboru
Vedle state.db můžete potkat soubory jako state.db.pre-update-emergency-*.bak
(snímek před aktualizací) nebo state.db.corrupt.*.bak (kopie poškozeného souboru).
První se hodí na obnovu, druhý nikdy nevracejte přes state.db — je to stejná chyba.
Jak to děláme u nás na serveru
| Zvyk | Proč |
|---|---|
Snímek před každou aktualizací: hermes backup --quick --label "pred-upgradem" | Vrácení je pak jeden příkaz a nemusíte řešit, co se změnilo |
| Denní plná záloha mimo web (jiná složka, jiný stroj) | Záloha na stejném disku jako data není záloha |
| Obnova se zkouší do zkušebního profilu, ne do produkce | Ověříte, že archiv opravdu funguje, a přitom si nerozbijete běžícího agenta |
| Web a aplikace mají vlastní zálohu (git, dump databáze) | Hermes záloha řeší agenta, ne vaše weby — ŠipkyLiga má replikaci databáze, weby jsou v gitu |
Cesty k hermes si ověřte příkazem which hermes — v cronu nebývá
v PATH to, co v interaktivním shellu.
Časté chyby
| Příznak | Příčina a řešení |
|---|---|
Záloha hlásí Backup incomplete | Něco nešlo přečíst (často socket nebo síťový disk). Archiv zůstává; podívejte se, které soubory chybí |
| Po obnově agent „zapomněl“ pravidelná sezení | V archivu nebylo cron/ (např. se použil export profilu) — cron se klonováním profilu nepřenáší |
| Obnova skončila kódem 1 | Část souborů se nepřenesla (výpis Warnings) — zkontrolujte, co chybí, než smažete původní data |
