Maginhawang daan ang pribadong Telegram bot sa agent sa VPS, ngunit hindi sapat ang connected gateway upang patunayang masasagot ang tamang tao. Nagsisimula ito sa bagong Hermes Agent data directory, nagpapahintulot sa isang numeric Telegram ID, nagsusuri ng tunay na sagot at nag-iiwan ng napatunayang paraan ng paghinto. Sinusunod nito ang Docker instructions v0.22.2 at Telegram instructions ng NousResearch, sinuri noong 19 Oktubre 2026. Hindi nagpatakbo ng VPS, nag-pull ng image, gumawa ng bot o tumawag ng model ang BIG CHANGE para rito.

Ang malaking pagbabago

  • Ano ang nagbago: Ang digest-pinned, version-checked Docker image at nakalaang mount na /opt/data ang nagpapakilala sa software at estado ng gateway na ito.
  • Bakit mahalaga: Ang numeric Telegram allowlist at tunay na pribadong sagot ang nagpapakita kung magagamit ng tamang account ang gateway.
  • Dapat bantayan: Maaaring palawakin ng pairing o global grants ang access. Hindi nililimitahan ng harmless prompt ang tools ng agent. Suriin ang grants, logs, restart at stopped state.

Kailangan ang awtoridad na mangasiwa ng Linux VPS sa SSH, gumaganang Docker Engine at host recovery access, Telegram account na makakagawa ng BotFather bot, at kuwalipikadong Hermes model-provider account. Ihambing ang arkitektura at resources sa opisyal na amd64 o arm64 image at suriin ang access at singil bago ang wizard. Ipinapalagay na gumagana na ang Docker; nakadepende sa OS at provider ang pag-install at firewall. Kailangan ang outbound access sa Telegram at model provider. Maglaan ng pribadong state directory at limitahan ang makakabasa: /opt/data ang maglalaman ng credentials, session at logs. Ang Docker manual ang tumutukoy rito bilang permanenteng pangunahing tala ng estado.

1. I-pin ang image bago mag-setup

Kumonekta sa SSH at manatili sa parehong shell. Maaaring gumalaw ang tag na stable. I-pull, itala ang repository digest at tiyaking mismong image ang nag-uulat ng bersiyong 0.22.2. Huminto kung iba ang bersiyon, walang digest, may lumang state o may container nang hermes ang pangalan. I-update ang gabay sa tunay na bersiyon o kumuha ng katugmang dokumentadong image bago magpatuloy. Tinutukoy ng digest ang image, ngunit hindi nito nag-iisa pinatutunayan ang release version.

Terminal
set -eu
docker info >/dev/null
docker container inspect hermes >/dev/null 2>&1 && { echo 'Container hermes already exists; stop here.'; exit 1; }
HERMES_DATA="$HOME/.hermes"
if [ -e "$HERMES_DATA" ]; then echo 'Hermes data path already exists; stop here.'; exit 1; fi
mkdir -m 700 "$HERMES_DATA"
docker pull nousresearch/hermes-agent:stable
docker image inspect nousresearch/hermes-agent:stable --format '{{json .RepoDigests}}'
IMAGE_REF="$(docker image inspect nousresearch/hermes-agent:stable --format '{{index .RepoDigests 0}}')"
if ! printf '%s\n' "$IMAGE_REF" | grep -Eq '^nousresearch/hermes-agent@sha256:[0-9a-f]{64}$'; then
  echo 'No valid repository digest; stop here.'; exit 1
fi
printf 'Pinned image: %s\n' "$IMAGE_REF"
VERSION_OUTPUT="$(docker run --rm "$IMAGE_REF" --version)"
printf 'Image version: %s\n' "$VERSION_OUTPUT"
if ! printf '%s\n' "$VERSION_OUTPUT" | grep -Eq '(^|[^0-9])v?0[.]22[.]2([^0-9]|$)'; then
  echo 'Image version is not 0.22.2; stop here.'; exit 1
fi

set -eu ang humihinto sa shell sequence kung walang Docker, pumalya ang pull/inspect o version command. Hihinto rin ang tahasang check kapag walang digest o iba ang bersiyon. Huwag mag-setup pagkatapos ng ganoong resulta. Panatilihin ang nakatalang nousresearch/hermes-agent@sha256:… value. Parehong ginagamit ng setup at gateway sa ibaba ang IMAGE_REF, kaya hindi palihim na magbabago ang container kapag gumalaw ang tag. Gawin ang mga check sa tunay na VPS; walang verified image digest sa artikulo. Gumamit ng bagong dedicated directory sa native filesystem ng host. Huwag magpatakbo ng dalawang gateway sa iisang data directory.

2. I-configure ang provider at isang pribadong sender

Patakbuhin ang Docker setup wizard gamit ang mounted directory. Pumili ng model route na pinapayagan ng account, mag-authenticate at suriin ang provider/model setting. Nakadepende sa account ang access at singil. Hindi patunay ng matagumpay na request ang naka-save na setting.

Terminal
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setup

Sa Telegram, humiling kay @BotFather ng bot gamit ang /newbot at ilihim ang token. Kunin ang numeric Telegram user ID ng sender, halimbawa sa paraang naka-link sa Telegram manual; hindi ID ang username. Maaaring isulat ng wizard o hermes gateway setup ang token at allowlist. Kung manu-mano, ilagay ang TELEGRAM_BOT_TOKEN=<private token> at TELEGRAM_ALLOWED_USERS=<your numeric ID> sa $HERMES_DATA/.env, na makikita bilang /opt/data/.env sa container. Huwag ilagay ang token sa command, shell history, shared note o artikulong ito.

Sa $HERMES_DATA/config.yaml (/opt/data/config.yaml sa container), itakda ang global behavior para sa unauthorized private message:

YAML
unauthorized_dm_behavior: ignore

Paglabas ng setup container, maaaring nailipat ng opisyal na image ang $HERMES_DATA sa runtime UID 10000. Nililimitahan ng bootstrap ang .env sa mode 600 at hinihigpitan ang umiiral na config.yaml sa 640; maaaring kailangan din iyon ng config na unang nilikha sa boot na iyon. Maaaring hindi mabuksan ng ordinaryong SSH login ang mga file. Kung hindi naitakda ng wizard ang keys, maaaring ang awtorisadong host administrator ang tumingin at mag-edit sa dalawang eksaktong file gamit ang sudo, saka ibalik ang runtime owner at pribadong modes. Maaaring hindi matawid ng host editor na UID 10000 ang login-owned $HOME, kaya host admin access ang gamit. Sa host na may sudo at vi, gamitin lamang matapos ang nonsecret owner/mode readback. Huwag magpatuloy kung iba ang UID o kulang ang file; lutasin muna ang host access.

Terminal
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
# Expected: directory owner 10000 and mode 700; .env owner 10000 and mode 600.
# config.yaml should have owner 10000; its first-boot mode can vary.
sudo vi "$HERMES_DATA/.env"
sudo vi "$HERMES_DATA/config.yaml"
sudo chown 10000:10000 "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
sudo chmod 700 "$HERMES_DATA"
sudo chmod 600 "$HERMES_DATA/.env"
sudo chmod 640 "$HERMES_DATA/config.yaml"
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"

Dapat ipakita ng huling stat ang UID/GID 10000 sa parehong file, directory mode 700, .env mode 600 at config.yaml mode 640; metadata ito, hindi credentials. Dalawang file lang ang target ng chown, kasama ang replacement ng editor. Kung walang sudo o vi, gumamit ng awtorisadong admin procedure na may parehong owner at mode readback. Huwag gawing world-readable ang state o i-remap ang container user para rito.

Panatilihin ang provider settings habang nag-eedit. Tiyaking walang Telegram-specific override ng unauthorized_dm_behavior na nagtatakda ng pair, at walang global GATEWAY_ALLOWED_USERS o GATEWAY_ALLOW_ALL_USERS na nagbibigay ng mas malawak na access. Sa config.yaml, tiyaking hindi true ang gateway.allow_all_users o ang top-level allow_all_users, at walang dagdag na sender sa global o Telegram allowlist. Huwag gumamit ng * sa allowlist, magdagdag ng group allowlist o mag-apruba ng pairing code. Iniiwasan ng bagong directory ang lumang grants; kung may data na, huminto at inspeksiyunin sa halip na patungan. Panatilihing enabled ang BotFather group privacy; huwag isali ang bot sa grupo o gawing admin nito. Ipinapaliwanag ng gateway access manual na magkahiwalay na daan ang allowlist at permanenteng pairing grant. Inilalarawan ng security manual ang ignore bilang tahimik na pagtatapon ng unauthorized private message.

Kinokontrol ng allowlist kung sino ang makakapagsimula ng usapan, hindi ang magagawa ng pinayagang agent. May terminal tools ang Hermes Telegram session bilang default. Suriin ang tool permissions, mounts, provider access at host policy bago magpapasok. Test prompt lamang ang harmless prompt.

3. Simulan at suriin ang unang sagot

Magsimula ng isang pinangalanang container mula sa recorded digest. May opsiyonal na -p 8642:8642 sa opisyal na Docker command para sa API; alisin dito dahil walang kailangang public API o dashboard port ang pribadong Telegram DM. Sinusubaybayan ng image ang gateway, samantalang ang Docker policy na unless-stopped ang namamahala sa restart kapag nagsimula ang Docker. Napapanatili ng mount ang config at session sa restart.

Terminal
docker run -d --name hermes --restart unless-stopped \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" gateway run
if ! {
  docker inspect hermes --format '{{.Image}} {{.State.Status}}' &&
  [ "$(docker inspect hermes --format '{{.State.Status}}')" = running ] &&
  docker logs --tail 50 hermes &&
  docker exec -u hermes hermes hermes pairing list
}; then
  echo 'State, logs or pairing check failed; stopping before any message.'
  docker stop hermes || true
  docker inspect hermes --format '{{.State.Status}}' || true
  exit 1
fi

Tiyaking ang container ay running, tingnan ang logs para sa Telegram connection at provider errors, at basahin ang pairing list bago mag-message. Kapag pumalya ang unang read, ihihinto ng code ang gateway at ilalabas ang state; hindi clearance ang hindi kilalang CLI/grant result. Tiyaking exited bago mag-imbestiga at huwag mag-message o restart kung hindi tiyak. Walang ibang approved sender dapat. Kung may lumitaw, huminto at suriin ang stopped state. docker exec ay hindi magagamit sa stopped container; maaaring ibalik ng ordinaryong entrypoint ang dating gateway. Sa bagong default-UID setup, ang offline check sa ibaba ay pinned Hermes CLI lang bilang UID 10000, walang network at walang gateway startup. Adaptasyon ito ng dokumentadong pairing at entrypoint, hindi test ng BIG CHANGE. Gamitin lamang kapag parehong 10000 ang running UID at data owner. Kung hindi tiyak ang owner, UID, CLI output o grants, manatiling stopped hanggang malutas bago restart.

Terminal
if [ "$(docker exec -u hermes hermes id -u)" != 10000 ] || [ "$(stat -c %u "$HERMES_DATA")" != 10000 ]; then
  echo 'Runtime UID or data owner differs; stop for a host-specific repair.'; docker stop hermes; exit 1
fi
docker stop hermes
if [ "$(docker inspect hermes --format '{{.State.Status}}')" != exited ]; then
  echo 'Container is not exited; do not mount state in another container.'; exit 1
fi
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing list
# For a listed unwanted Telegram user, read the exact numeric ID first:
printf 'Unwanted numeric Telegram user ID: '; IFS= read -r UNWANTED_ID
if ! printf '%s\n' "$UNWANTED_ID" | grep -Eq '^[0-9]+$'; then echo 'Invalid ID; leave gateway stopped.'; exit 1; fi
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing revoke telegram "$UNWANTED_ID"
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing list

Tiyaking wala na ang unwanted ID sa huling listahan. Pribadong suriin ang $HERMES_DATA/.env at config.yaml para sa iba pang platform/global allowlist, * o allow-all, at alisin ang unwanted grants sa dokumentadong config route. Panatilihing stopped hanggang masuri lahat ng access. Hindi binabawi ng pag-alis ng isang list entry ang hiwalay na pairing/global grant. Pagkatapos ng readback, docker start hermes ang sadyang bumabalik sa orihinal na container; suriin muli ang logs at pairing bago mag-message.

Mula sa pinayagang account, magbukas ng pribadong chat at magpadala ng harmless request gaya ng “Sumagot ng maikling pagbati.” Tiyaking may tunay na sagot at tingnan ang kaugnay na log/session. Hindi sagot ang sent status, typing indicator, display o tapos na setup. Maipapakita ng Telegram /whoami ang aktibong messaging scope, hindi host authorization. Nonsensitive evidence lamang ang itabi.

Kung walang sagot, basahin muna ang container state at docker logs --tail 50 hermes. Suriin ang token, eksaktong numeric TELEGRAM_ALLOWED_USERS, model authentication at usage eligibility, at outbound connection. Kung hindi tiyak ang turn, tingnan muna ang private chat at logs bago umulit. Maaaring mawala ang pending updates sa dokumentadong cold boot; limitado sa memory ang duplicate suppression. Walang exactly-once delivery guarantee.

4. Suriin ang restart, stop at recovery

Pagkatapos matapos ang unang turn, i-restart ang parehong container, tingnan ang bagong logs at nakaimbak na /opt/data state, saka magpadala ng bagong harmless private prompt at tiyakin ang sagot. Ihinto at basahin ang Docker state. exited ang stop signal; hindi sapat ang tahimik na chat. docker start hermes ang sadyang paraan ng muling pagsisimula.

Terminal
docker restart hermes
docker logs --tail 50 hermes
docker inspect hermes --format '{{.State.Status}}'
# After the restarted gateway is ready, send a new private test message.
docker stop hermes
docker inspect hermes --format '{{.State.Status}}'
# Expected after stop: exited
# When intentionally resuming later: docker start hermes

Kung pumalya ang restart, tingnan ang Docker state/logs, pagkatapos ang $HERMES_DATA/logs/gateways/default/current at $HERMES_DATA/logs/container-boot.log, mount, owner at pinned image/version. Inilalarawan ng v0.22.2 release notes ang boot-liveness fix ngunit hindi ang nangyari sa iyong host. Huwag burahin ang state directory bilang repair. Kung tumagas ang token, huminto, bawiin sa BotFather, pribadong palitan sa mounted .env at suriin ang access bago restart. Bawiin din ang unwanted pairing at tingnan ang aktuwal na allowlists.

Maaaring magkahiwalay ang hosting at model cost. Suriin ang tunay na plan, limits at singil; walang runtime, free allowance o availability target na ipinangako. Pinoproseso ng Telegram at provider ang mensahe; itinatago ng host ang local secrets at state. Isang host, bot at unang reply lang ang saklaw. Hiwalay na BIG CHANGE guides ang para sa Hermes backup at recovery at paulit-ulit na Hermes job.

Mga sanggunian at karagdagang babasahin

Ang Docker setup, Telegram setup, gateway access guide, security guide at v0.22.2 release ay primaryang sources ng NousResearch. Ang mabilisang simula ang nagpapaliwanag ng model-provider setup. Dokumentasyon ang mga ito, hindi rekord ng BIG CHANGE VPS o bot operation.