Agent saya berjalan di satu server sahaja. Itu risiko: kalau server itu rosak atau perlu dipindahkan, persona, skills dan konfigurasi yang dikumpul berminggu-minggu perlu dibina semula dengan tangan.

Matlamat runbook ini mudah: bawa agent ke server baru, boleh docker pull dan run bila-bila, di mana-mana.

Idea asasnya ialah memisahkan dua jenis kandungan:

  • Dalam image: persona, semua skills dan tetapan umum, dalam bentuk sanitized (tanpa rahsia).
  • Di luar image: data peribadi dan rahsia, yang dimount semasa run.

Status asal nota ini ialah “belum bermula”, tetapi image dan sandaran sudah siap seperti dalam jadual di bawah. Langkah pemulihan di server baru ialah prosedur yang dirancang; saya belum merekodkan ujian penuh di mesin kosong.


Apa yang sudah siap

ItemStatus
Image agent dibina dan di-push ke GHCRSiap. Visibility private
Skills dan persona dalam imageSiap, disanitize (kata laluan ditukar kepada CHANGE_ME)
Login GHCRSiap, dengan token baharu yang ada write:packages
Sandaran direktori homeSiap, ke object storage (sekitar 1,900 fail, 147 MB)
Sandaran fail kerjaSiap, ke object storage
Sandaran config aktif OpenStack/KollaSiap

Apa dalam image, apa tidak

Dalam image (~3.9 GB):

  • Base: image rasmi agent (nousresearch/hermes-agent:latest)
  • Persona dan semua skills (sanitized)
  • Tetapan config, tanpa rahsia

Tidak dalam image, mesti dimount semasa run:

ItemSebab
~/.hermes/.envKunci API
~/.hermes/auth.jsonToken OAuth
Sesi WhatsAppSesi hidup
state.dbMemori dan sejarah perbualan

Peraturan emas yang menentukan pembahagian ini: jangan bake .env atau auth.json ke dalam image. Selepas itu rahsia terbocor ke registry, dan lapisan image tidak boleh dipadam dengan benar. (Saya tulis tentang cara menghalang ini di Image Tags That Don’t Lie.)


Jalankan di server baru

# 1. Pasang Docker (jika belum)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER      # log masuk semula

# 2. Login GHCR dengan PAT yang ada read:packages
echo "<PAT>" | docker login ghcr.io -u <username> --password-stdin

# 3. Tarik image
docker pull ghcr.io/<username>/pg-agent:latest

# 4. Run, mount ~/.hermes dari host
HERMES_UID=$(id -u) HERMES_GID=$(id -g) docker run -d \
  --name pg \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  ghcr.io/<username>/pg-agent:latest

# 5. Semak log
docker logs -f pg

Simpan PAT dalam password manager, bukan dalam chat atau nota.

Pindahkan data

Dari server lama, bungkus direktori .hermes:

tar czf hermes-backup.tgz -C ~ .hermes
scp hermes-backup.tgz user@newserver:~/      # atau guna object storage / rclone

Di server baru:

tar xzf hermes-backup.tgz -C ~

Perkara penting dalam ~/.hermes:

Fail / folderFungsi
config.yamlTetapan
.envKunci API (wajib)
skills/Sudah dalam image, tetapi boleh di-override dengan mount
memories/, sessions/, state.dbSejarah dan memori
profiles/Jika menggunakan profile

Rollback

docker stop pg && docker rm pg
# atau kembali kepada image asal
docker pull nousresearch/hermes-agent:latest

Oleh kerana data berada dalam volume yang dimount dan bukan dalam container, memadam container tidak menghilangkan memori agent.

Nota keselamatan

  • Jangan bake .env / auth.json dalam image.
  • Image berstatus private: orang tanpa read:packages tidak boleh menariknya.
  • Jika mahu menjadikan image public, scrub rahsia dengan teliti dahulu, dan jangan bergantung pada ingatan sahaja. Gunakan imbasan automatik.
  • Backup .hermes mengandungi rahsia. Layan fail hermes-backup.tgz seperti kata laluan: jangan tinggalkan ia di folder kongsi.

Pengajaran

Pembahagian “image sanitized + data dimount” bermakna agent boleh dipindahkan dengan satu arahan, dan image tidak perlu dilayan sebagai rahsia. Tetapi ia hanya selamat jika sanitize itu betul. Bahagian yang paling rapuh dalam proses ini ialah langkah manual “tukar kata laluan kepada CHANGE_ME”. Saya kemudian menambah ujian automatik yang dijalankan sebelum build. Lihat juga Packing an Agent into a Container untuk apa yang berlaku di dalam container selepas ia dijalankan.