Um bot privado do Telegram facilita chegar a um agente no VPS, mas uma conexão não prova que a pessoa certa receberá resposta. Começamos com um diretório Hermes Agent novo, permitimos um ID numérico, verificamos uma resposta real e deixamos uma parada conferida. Seguimos as instruções Docker v0.22.2 e instruções Telegram da NousResearch, verificadas em 19 de outubro de 2026. A BIG CHANGE não operou VPS, baixou imagem, criou bot ou chamou modelo para este guia.
A grande mudança
- O que mudou: Uma imagem Docker fixada por digest e conferida por versão, com um mount dedicado
/opt/data, identifica software e estado deste gateway. - Por que importa: A lista numérica de permitidos e uma resposta privada real mostram se a conta pretendida pode usar o gateway.
- O que observar: Pareamento ou permissões globais ampliam acesso; um pedido inofensivo não limita ferramentas. Verifique permissões, registos, reinício e parada.
O utilizador precisa de autoridade para administrar um VPS Linux por SSH, Docker Engine funcionando e acesso de recuperação do host, conta Telegram para criar bot via BotFather e conta elegível de provedor Hermes. Compare arquitetura e recursos à imagem oficial amd64 ou arm64, e verifique acesso e faturação antes do assistente. Pressupõe-se Docker operacional; instalação e firewall dependem do sistema e provedor. O host precisa alcançar Telegram e modelo por conexões de saída. Reserve diretório privado de estado e restrinja leitores: /opt/data guardará credenciais, sessões e registos. O manual Docker chama esse mount de fonte persistente de referência.
1. Fixe a imagem antes da configuração
Conecte via SSH e mantenha o mesmo shell. A tag stable pode mudar. Baixe, registe o digest do repositório e confirme a versão que a própria imagem informa: 0.22.2. Pare se for diferente, faltar digest, já houver estado ou um contêiner chamado hermes. Atualize as instruções para a versão real ou obtenha imagem documentada correspondente antes de seguir. O digest fixa a imagem, mas não prova sozinho sua versão.
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
fiset -eu interrompe a sequência se Docker estiver indisponível, falhar o download/inspect ou o comando de versão. As verificações explícitas também param um digest vazio ou outra versão. Não prossiga à configuração nesses casos. Guarde o valor nousresearch/hermes-agent@sha256:… registado. Configuração e gateway usam IMAGE_REF, impedindo troca silenciosa por mudança posterior da tag. O leitor deve verificar no VPS real; o artigo não fornece digest validado. Use diretório novo dedicado no sistema de ficheiros nativo. Nunca execute dois gateways nos mesmos dados.
2. Configure provedor e um remetente privado
Execute o assistente de configuração Docker com o diretório montado. Escolha rota de modelo permitida, autentique e inspecione provedor/modelo. Acesso e custo dependem da conta. Configuração salva não prova pedido bem-sucedido.
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setupNo Telegram, peça a @BotFather um bot com /newbot e mantenha o token privado. Obtenha o ID numérico Telegram do remetente, por exemplo pelo método indicado no manual Telegram; nome de utilizador não é ID. O assistente ou hermes gateway setup escreve token e lista. Manualmente, coloque TELEGRAM_BOT_TOKEN=<private token> e TELEGRAM_ALLOWED_USERS=<your numeric ID> em $HERMES_DATA/.env, visível como /opt/data/.env dentro do contêiner. Não exponha token em comandos, histórico, notas compartilhadas ou neste artigo.
Em $HERMES_DATA/config.yaml (/opt/data/config.yaml no contêiner), defina o comportamento global de mensagens privadas não autorizadas:
unauthorized_dm_behavior: ignoreApós a saída do contêiner de configuração, a imagem pode ter mudado $HERMES_DATA para o UID de execução10000. O início restringe .env ao modo 600 e um config.yaml existente a 640; uma configuração criada nesse início pode exigir igual restrição. Um login SSH comum talvez não abra esses ficheiros. Se faltarem chaves, um administrador autorizado do host pode inspecionar e editar os dois ficheiros exatos com sudo e restaurar proprietário e modos privados. Um editor como UID 10000 pode não atravessar um $HOME do utilizador de login; por isso se usa administração do host. Em host com sudo e vi, use após conferir metadados de proprietário/modo sem segredos. Com outro UID ou ficheiro ausente, pare e resolva o acesso primeiro.
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"A saída final de stat deve mostrar UID/GID 10000 nos dois ficheiros, modo do diretório 700, .env modo 600 e config.yaml modo 640. São metadados, não credenciais. O chown atinge só os dois ficheiros, incluindo substituição criada pelo editor. Se não houver sudo ou vi, use administração autorizada com a mesma conferência. Não torne os dados legíveis por todos nem remapeie o utilizador do contêiner.
Preserve os ajustes do provedor ao editar. Nenhuma substituição Telegram de unauthorized_dm_behavior deve definir pair, nem ajuste global GATEWAY_ALLOWED_USERS ou GATEWAY_ALLOW_ALL_USERS ampliar acesso. Em config.yaml, verifique também que nem gateway.allow_all_users nem o parâmetro superior allow_all_users sejam true, e nenhuma lista global/Telegram tenha remetente adicional. Não use * em listas, adicione grupos ou aprove códigos de pareamento. Diretório novo evita permissões herdadas; com dados anteriores, pare e inspecione sem sobrescrever. Mantenha privacidade de grupos do BotFather, não adicione o bot a grupos nem o torne administrador. O manual de acesso do gateway trata listas e pareamentos persistentes como caminhos separados. O manual de segurança descreve ignore como descarte silencioso de mensagens não autorizadas.
A lista controla quem inicia conversa, não o que faz o agente autorizado. Sessões Telegram Hermes incluem terminal por padrão. Reveja ferramentas, mounts, provedor e política do host antes de permitir o remetente. Pedido inofensivo de teste é apenas pedido.
3. Inicie e verifique a primeira resposta
Inicie um contêiner nomeado pelo digest registado. O comando Docker publicado contém -p 8642:8642 opcional para API; omita, pois mensagem privada dispensa porta pública de API ou painel. A imagem supervisiona o gateway; a política Docker unless-stopped controla reinício quando o Docker inicia. O diretório mantém ajustes e sessões nos reinícios.
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
fiConfirme estado running, veja conexão Telegram e erros nos registos e leia pareamentos antes do pedido. Se qualquer leitura inicial falhar, o bloco para o gateway e mostra estado; resultado CLI/permissão desconhecido não autoriza seguir. Confirme exited antes de investigar, sem mensagem ou reinício na incerteza. Não deve haver outro remetente aprovado; se houver, pare e verifique a parada. docker exec não roda contra contêiner parado; a entrada comum pode restaurar um gateway anterior. Na instalação nova com UID padrão, a verificação offline abaixo roda só a CLI Hermes fixada como UID 10000, sem rede e sem iniciar gateway. É adaptação dos comandos e entrada documentados, não teste BIG CHANGE. Use só após confirmar UID ativo e proprietário 10000. Se proprietário, UID, saída CLI ou permissões forem incertos, mantenha parado e resolva antes de reiniciar.
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 listConfirme que o ID indesejado saiu da lista final. Examine em privado $HERMES_DATA/.env e config.yaml para outras listas de plataforma/globais, * ou permissão total. Remova concessões pelo caminho documentado. Mantenha parado até rever todos os acessos. Apagar uma entrada não revoga pareamento independente ou permissão global. Após conferir, docker start hermes retoma deliberadamente o contêiner original; verifique registos e pareamentos antes de conversar.
Na conta permitida abra um chat privado com o bot e envie algo inofensivo como “Responda com uma saudação breve”. Confirme resposta real e registo/sessão correspondente. Mensagem enviada, digitação, status ou configuração concluída não são resposta. O comando Telegram /whoami mostra o escopo ativo, não prova autorização do host. Guarde só evidência não sensível.
Sem resposta, leia primeiro estado e docker logs --tail 50 hermes. Verifique token, valor numérico exato de TELEGRAM_ALLOWED_USERS, autenticação e elegibilidade do provedor e saída de rede. Se o turno for incerto, leia chat e registos antes de repetir. O início a frio pode descartar atualizações pendentes; deduplicação é limitada à memória. Não há garantia de entrega exatamente uma vez.
4. Verifique reinício, parada e recuperação
Terminado o primeiro turno, reinicie o mesmo contêiner, veja registos novos e estado retido em /opt/data, depois envie pedido privado inofensivo novo e confirme a resposta. Pare e leia o estado Docker. exited sinaliza parada; silêncio no chat não basta. docker start hermes é a retomada intencional mais tarde.
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 hermesSe falhar, verifique Docker e registos, depois $HERMES_DATA/logs/gateways/default/current e $HERMES_DATA/logs/container-boot.log, mount, proprietário e imagem/versão fixadas. As notas v0.22.2 descrevem correção da atividade no início, não o ocorrido no seu host. Não apague o estado para reparar. Se token vazar, pare, revogue no BotFather, troque em privado no ficheiro montado .env e reveja acesso antes de reiniciar. Revogue pareamentos indesejados e examine listas efetivas.
VPS e modelo podem cobrar separadamente. Verifique plano, limites e custos reais; não se promete duração, franquia gratuita ou disponibilidade. Telegram e provedor processam mensagens; o host retém segredos e estado. É uma verificação de primeira resposta de um host e bot. Outros guias BIG CHANGE cobrem backup e recuperação do Hermes e um trabalho recorrente do Hermes.
Fontes e leitura adicional
Os guias de configuração Docker, configuração Telegram, acesso do gateway, segurança e versão v0.22.2 são fontes primárias da NousResearch. O início rápido explica o provedor. Documentam procedimento, não operação de VPS ou bot pela BIG CHANGE.



