conjurer: produkcyjny ('deploy') bot + seeding/backup danych #11

Merged
gitea merged 2 commits from conjurer-deploy-bot into master 2026-08-03 17:47:33 +00:00
Owner

Produkcyjny bot

Drugi Conjurer obok testowego, w tym samym namespace conjurer, dzielący librarian/musician/radio i wspólny CONJURER_API_KEY. Różnice:

  • token Discorda z sekretu deploy-conjurer-netrc (już istnieje),
  • osobne nazwy/labelki (deploy-bot) i NodePort 32443,
  • /data jako wolumen NFS (RWX) zamiast blokowego PVC — bo dokładnie to pozwala wgrywać pliki na żywo (kopiujesz wprost na share) i backupować równolegle bez zatrzymywania bota. (Testowy bot zostaje na swoim RWO PVC.)

Seedowanie danych

/data to zwykły export NFS, więc wgrywasz pliki kopiując je na share — bez kubectl cp, bez skalowania bota do zera. Z hosta widzącego export (np. PVE z /srv/data):

rsync -a /srv/data/ 192.168.1.34:/mnt/Tank1/conjurer_swap/deploy-bot/data/

Trafiają tam, gdzie bot ich szuka (CONJURER_DATA_DIR=/data): accident_log.json, Conjurer_graphics/, music/, pamiec.json, pamiec_muzyki.json, settings.json, system_gpt_settings.json, transcripts/.

Backup (tylko produkcja)

CronJob deploy-bot-backup codziennie 04:17:

  • mirror (rsync --delete) całego /databackups/current/ (miejsce-oszczędnie, z muzyką),
  • datowane snapshoty krytycznego małego stanu (obie pamięci, settings, accident log, transcripts) → backups/snapshots/deploy-state-<data>.tgz, retencja 30 dni.
    Testowy bot nie jest backupowany (amnezja tam OK).

Do decyzji (opisane w DEPLOY-BOT.md)

  • Sekret deploy-conjurer-netrc już masz — Deployment go montuje na /secrets/.netrc.
  • Ścieżki NFS (192.168.1.34:/mnt/Tank1/conjurer_swap/deploy-bot/{data,backups}) — dostosuj do realnego exportu; wzoruję się na layoutcie librariana.
  • Routing callbacków: librarian (CONJURER_MAIN_BOT) i musician wysyłają wyniki/eventy do jednego bota (teraz …:32442 = testowy). Żeby to szło do produkcyjnego, przełącz ich CONJURER_MAIN_BOT na 192.168.1.73:32443. Tylko jeden bot naraz może je dostawać.
  • Oba boty dzielą obraz (te same images.newTag w kustomization → aktualizują się razem). Jak chcesz pinować produkcję osobno — dołóż drugi images: alias.

kubectl kustomize buduje się czysto (10 obiektów).

🤖 Generated with Claude Code

## Produkcyjny bot Drugi Conjurer obok testowego, w tym samym namespace `conjurer`, dzielący librarian/musician/radio i wspólny `CONJURER_API_KEY`. Różnice: - token Discorda z sekretu **`deploy-conjurer-netrc`** (już istnieje), - osobne nazwy/labelki (`deploy-bot`) i **NodePort 32443**, - **`/data` jako wolumen NFS (RWX)** zamiast blokowego PVC — bo dokładnie to pozwala **wgrywać pliki na żywo** (kopiujesz wprost na share) i **backupować równolegle** bez zatrzymywania bota. (Testowy bot zostaje na swoim RWO PVC.) ## Seedowanie danych `/data` to zwykły export NFS, więc wgrywasz pliki kopiując je na share — bez `kubectl cp`, bez skalowania bota do zera. Z hosta widzącego export (np. PVE z `/srv/data`): ``` rsync -a /srv/data/ 192.168.1.34:/mnt/Tank1/conjurer_swap/deploy-bot/data/ ``` Trafiają tam, gdzie bot ich szuka (`CONJURER_DATA_DIR=/data`): `accident_log.json, Conjurer_graphics/, music/, pamiec.json, pamiec_muzyki.json, settings.json, system_gpt_settings.json, transcripts/`. ## Backup (tylko produkcja) CronJob `deploy-bot-backup` codziennie 04:17: - **mirror** (`rsync --delete`) całego `/data` → `backups/current/` (miejsce-oszczędnie, z muzyką), - **datowane snapshoty** krytycznego małego stanu (obie pamięci, settings, accident log, transcripts) → `backups/snapshots/deploy-state-<data>.tgz`, retencja 30 dni. Testowy bot **nie** jest backupowany (amnezja tam OK). ## Do decyzji (opisane w DEPLOY-BOT.md) - **Sekret** `deploy-conjurer-netrc` już masz — Deployment go montuje na `/secrets/.netrc`. - **Ścieżki NFS** (`192.168.1.34:/mnt/Tank1/conjurer_swap/deploy-bot/{data,backups}`) — dostosuj do realnego exportu; wzoruję się na layoutcie librariana. - **Routing callbacków**: librarian (`CONJURER_MAIN_BOT`) i musician wysyłają wyniki/eventy do **jednego** bota (teraz `…:32442` = testowy). Żeby to szło do produkcyjnego, przełącz ich `CONJURER_MAIN_BOT` na `192.168.1.73:32443`. Tylko jeden bot naraz może je dostawać. - Oba boty dzielą obraz (te same `images.newTag` w kustomization → aktualizują się razem). Jak chcesz pinować produkcję osobno — dołóż drugi `images:` alias. `kubectl kustomize` buduje się czysto (10 obiektów). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gitea self-assigned this 2026-08-03 16:08:19 +00:00
gitea added 1 commit 2026-08-03 16:08:20 +00:00
A second Conjurer bot alongside the test one, sharing librarian/musician/
radio and the API key, differing only in:
 * Discord token from the deploy-conjurer-netrc secret,
 * distinct names/labels (deploy-bot) and NodePort 32443,
 * /data on an NFS export (RWX) instead of a block PVC - so config/state
   can be uploaded while it runs (copy onto the share) and backed up
   concurrently.

deploy-bot-backup: a daily CronJob that mirrors /data and keeps 30 days of
dated snapshots of the critical small state (both memories, settings,
accident log, transcripts) on NFS. Production only - the test bot's
amnesia is fine. DEPLOY-BOT.md documents seeding, backup/restore, and the
librarian/musician callback routing (they push to one bot; repoint
CONJURER_MAIN_BOT to :32443 to feed this one).

kubectl kustomize builds cleanly (10 objects).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea added 1 commit 2026-08-03 16:38:47 +00:00
Pairs with conjurer#18: each bot advertises its own callback so the shared
librarian answers results/pongs back to the bot that asked - test bot
http://192.168.1.73:32442, deploy bot :32443. No CONJURER_MAIN_BOT
repointing needed for the librarian anymore; DEPLOY-BOT.md updated (only
the musician stays single-target).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea merged commit 5b6040c60d into master 2026-08-03 17:47:33 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/deploy#11