세상은 멈춰 있지 않습니다.RSS
BIG CHANGE.

Markdown 버전

AI-translated from English; not yet reviewed by a fluent editor.

# VPS에서 Hermes Agent 게이트웨이 하나를 실행하고 Telegram 비공개 답변 확인하기

> Linux VPS에 버전을 확인한 Hermes Docker 게이트웨이를 설정하고 Telegram 비공개 발신자 한 명만 허용합니다. 실제 답변과 재시작·중지 제어를 확인하세요.

By BIG CHANGE Editorial

Published: 2026-10-19T20:31:34.981Z
Updated: 2026-10-19T20:31:34.981Z
Canonical: https://bigchange.ai/blog/hermes-vps-docker-private-telegram-first-reply

![Conceptual charcoal illustration of one hand holding an unbranded phone with two blank message shapes on its screen.](https://bigchange.ai/api/media/file/hermes-private-reply-check-hero-v1.png)
AI-generated conceptual illustration by BIG CHANGE; no actual Telegram interface, Hermes deployment or observed reply is depicted.

Telegram 비공개 봇으로 VPS 에이전트에 편하게 접근할 수 있지만 연결만으로 지정한 사람에게 답하는지는 알 수 없습니다. 새 Hermes Agent 데이터 디렉터리에서 시작해 숫자 ID 하나를 허용하고 실제 답변과 검증된 중지 수단을 확인합니다. NousResearch의 [v0.22.2 Docker 설명](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md) 및 [Telegram 설명](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md)에 따르며 2026년 10월 19일 확인했습니다. BIG CHANGE는 VPS 운영, 이미지 가져오기, 봇 생성이나 모델 호출을 하지 않았습니다.

## 큰 변화

- **달라진 점:** 다이제스트 고정·버전 확인 Docker 이미지와 전용 `/opt/data` 마운트로 이 게이트웨이의 소프트웨어와 상태를 식별합니다.
- **중요한 이유:** Telegram 숫자 허용 목록과 실제 비공개 답변으로 지정 계정이 사용할 수 있는지 확인합니다.
- **주의할 점:** 페어링이나 전역 허용이 접근을 넓힐 수 있고 무해한 프롬프트는 도구를 제한하지 않습니다. 권한·로그·재시작·중지를 확인하세요.

SSH로 Linux VPS 한 대를 관리할 권한, 작동하는 Docker Engine과 호스트 복구 접근, BotFather로 봇을 만들 Telegram 계정, 사용 가능한 Hermes 모델 공급자 계정이 필요합니다. VPS 구조·자원을 공식 amd64/arm64 이미지와 대조하고 마법사 전에 공급자의 접근·청구 조건을 확인하세요. Docker는 이미 작동한다고 가정합니다. 설치·방화벽은 OS와 공급자에 따라 다릅니다. 호스트는 Telegram과 모델 공급자에 아웃바운드 연결이 필요합니다. 비공개 상태 디렉터리를 만들고 읽을 사람을 제한하세요. `/opt/data`에 자격 증명·세션·로그가 저장됩니다. [Docker 설명서](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md)는 이 마운트를 지속 보존되는 기준 데이터로 설명합니다.

## 1. 설정 전에 이미지 고정

SSH 접속 후 같은 셸에서 명령을 실행하세요. `stable` 태그는 바뀔 수 있습니다. 이미지를 가져와 저장소 다이제스트를 기록하고 이미지 자체가 보고하는 버전이 `0.22.2`인지 확인합니다. 버전이 다르거나 다이제스트가 없거나 기존 상태 또는 이름이 `hermes` 이름의 컨테이너가 있으면 중지하세요. 실제 버전에 맞게 설명을 갱신하거나 대응 문서가 있는 이미지를 확보한 뒤 진행합니다. 다이제스트는 이미지를 고정할 뿐 버전 자체를 증명하지 않습니다.

```sh
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`는 Docker 불가, 가져오기·검사 실패, 버전 명령 실패 시 셸 흐름을 멈춥니다. 명시적 검사는 빈 다이제스트나 다른 버전도 막습니다. 그런 결과라면 설정을 진행하지 말고 기록한 `nousresearch/hermes-agent@sha256:…` 값을 보관하세요. 아래 설정과 게이트웨이는 `IMAGE_REF`를 사용해 이후 태그 변경으로 컨테이너가 몰래 바뀌지 않게 합니다. 실제 VPS에서 독자가 검사할 사항이며 본문에 검증된 이미지 다이제스트는 없습니다. 호스트 기본 파일 시스템의 새 전용 디렉터리를 쓰고 두 게이트웨이가 같은 데이터를 공유하지 않게 하세요.

## 2. 공급자와 비공개 발신자 한 명 설정

마운트된 디렉터리로 [Docker 설정 마법사](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md)를 실행합니다. 계정이 허용하는 모델 경로를 선택·인증하고 공급자/모델 설정을 확인하세요. 접근·요금은 계정에 달립니다. 저장됐다고 모델 요청 성공이 입증되지는 않습니다.

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

Telegram에서 [@BotFather](https://t.me/BotFather)에게 `/newbot`로 봇을 요청하고 토큰은 비밀로 유지하세요. 발신자의 **숫자 Telegram 사용자 ID**를 얻습니다. 예를 들어 [Telegram 설명서](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md)의 ID 확인 방법을 사용하세요. 사용자 이름은 ID가 아닙니다. 마법사나 `hermes gateway setup`가 토큰과 허용 목록을 쓸 수 있습니다. 수동이면 `TELEGRAM_BOT_TOKEN=<private token>` 및 `TELEGRAM_ALLOWED_USERS=<your numeric ID>`를 `$HERMES_DATA/.env`에 넣습니다. 컨테이너 안에서는 `/opt/data/.env` 위치입니다. 토큰을 명령·셸 기록·공유 메모·기사에 넣지 마세요.

다음 `$HERMES_DATA/config.yaml` (`/opt/data/config.yaml`: 컨테이너 내부 경로)에서 미허가 개인 메시지의 전역 동작을 설정합니다.

```yaml
unauthorized_dm_behavior: ignore
```

설정 컨테이너 종료 후 공식 이미지는 `$HERMES_DATA` 소유자를 실행 UID 10000으로 바꿨을 수 있습니다. 시작 절차가 `.env`를 모드 `600`로, 기존 `config.yaml`를 `640`로 제한합니다. 그때 처음 생성한 설정에도 같은 강화가 필요할 수 있습니다. 일반 SSH 사용자는 파일을 못 열 수 있습니다. 필요한 키가 없다면 **권한 있는 호스트 관리자**가 두 파일을 정확히 `sudo`로 확인·수정한 뒤 실행 소유권과 비공개 모드를 복원합니다. UID 10000으로 실행한 편집기는 로그인 사용자 소유의 `$HOME`를 통과 못 할 수 있어 호스트 관리자 권한을 사용합니다. `sudo` 및 `vi`가 있는 호스트에서 비밀 없는 소유자·모드 확인 후 사용하세요. UID가 다르거나 파일이 없으면 진행하지 말고 호스트 접근부터 해결합니다.

```sh
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"
```

최종 `stat` 출력은 두 파일의 UID/GID 10000, 디렉터리 모드 `700`, `.env` 모드 `600` 및 `config.yaml` 모드 `640`를 보여야 합니다. 자격 증명이 아닌 메타데이터입니다. `chown`은 편집기 대체 파일을 포함한 두 파일만 대상으로 합니다. `sudo` 또는 `vi`가 없으면 승인된 호스트 관리 절차로 같은 값을 확인하세요. 누구나 읽을 수 있게 하거나 컨테이너 사용자를 재매핑하지 마세요.

편집 시 공급자 설정을 유지합니다. Telegram 전용 `unauthorized_dm_behavior` 덮어쓰기가 `pair`를 설정하지 않고 전역 `GATEWAY_ALLOWED_USERS` 또는 `GATEWAY_ALLOW_ALL_USERS` 설정도 접근을 넓히지 않게 하세요. `config.yaml`에서 `gateway.allow_all_users` 및 최상위 `allow_all_users`가 모두 true가 아니며 전역·Telegram 목록에 다른 발신자가 없는지도 확인합니다. `*`를 쓰거나 그룹 목록을 더하거나 페어링 코드를 승인하지 마세요. 새 디렉터리는 상속 권한을 피합니다. 데이터가 이미 있으면 덮어쓰지 말고 중지·검사하세요. BotFather 그룹 개인정보 보호를 켜 두고 봇을 그룹에 넣거나 관리자로 만들지 않습니다. [게이트웨이 접근 설명서](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md)는 허용 목록과 영속 페어링 권한을 별도 경로로 설명합니다. [보안 설명서](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md)에 따르면 `ignore`는 미허가 개인 메시지를 조용히 버립니다.

허용 목록은 대화 시작자를 통제할 뿐 허용된 에이전트 행동을 가두지 않습니다. Hermes Telegram 세션에는 기본으로 터미널 도구가 있으므로 도구 권한·마운트·공급자 접근·호스트 정책부터 확인하세요. 무해한 테스트 요청은 요청일 뿐입니다.

## 3. 시작 후 첫 답변 확인

기록한 다이제스트로 이름 있는 컨테이너 하나를 시작합니다. 공개된 Docker 명령에는 선택적 API 접근 `-p 8642:8642`가 있지만 개인 Telegram 메시지는 공개 API·대시보드 포트가 필요 없어 생략합니다. 이미지는 게이트웨이를 감독하고 Docker `unless-stopped` 정책은 Docker 시작 때 컨테이너 재시작을 관리합니다. 마운트는 설정과 세션을 보존합니다.

```sh
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
```

컨테이너가 `running`인지, 로그에 Telegram 연결·공급자 오류가 있는지 보고 메시지 전에 페어링 목록을 확인합니다. 초기 읽기가 실패하면 코드는 중지 후 상태를 출력합니다. CLI·권한 결과 불명은 진행 허가가 아닙니다. `exited`를 확인한 뒤 조사하고 불확실할 때 전송·재시작하지 마세요. 다른 승인 발신자가 있으면 중지하고 상태를 검사합니다. `docker exec`는 중지된 컨테이너에 쓸 수 없고 일반 진입점은 이전 게이트웨이를 복원할 수 있습니다. 새 기본 UID 설치에서 아래 오프라인 검사는 고정 Hermes CLI만 UID 10000, 네트워크 없이 실행해 게이트웨이 시작을 우회합니다. 문서 명령·진입점을 응용했으며 BIG CHANGE가 시험하지 않았습니다. 실행 UID와 데이터 소유자가 모두 10000일 때만 사용합니다. 소유권·UID·CLI 출력·권한이 불명확하면 중지를 유지하고 해결 전 재시작하지 마세요.

```sh
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
```

최종 목록에서 원치 않는 ID가 없어졌는지 확인합니다. `$HERMES_DATA/.env` 및 `config.yaml`를 비공개로 열어 다른 플랫폼·전역 목록, `*` 또는 전체 허용 설정을 검사하고 문서 경로로 불필요한 권한을 없앱니다. 모든 접근을 검사할 때까지 중지합니다. 목록 하나 삭제는 독립 페어링·전역 권한을 취소하지 않습니다. 확인 후 `docker start hermes`로 원래 컨테이너를 의도적으로 재개하고 메시지 전 로그·목록을 재검사합니다.

허용 계정에서 봇과 **비공개** 대화를 열고 “짧은 인사로 답해주세요” 같은 무해한 요청을 보냅니다. 실제 답변과 해당 로그·세션을 확인하세요. 전송·입력 표시·상태·설정 완료는 답변이 아닙니다. Telegram `/whoami`는 현재 메시지 범위를 표시할 뿐 호스트 권한의 증거가 아닙니다. 민감하지 않은 증거만 보관하세요.

무응답이면 컨테이너 상태와 `docker logs --tail 50 hermes`부터 읽습니다. 토큰, 정확한 숫자 `TELEGRAM_ALLOWED_USERS` 값, 공급자 인증·사용 자격, 외부 연결을 확인합니다. 처리 결과가 불명확하면 대화·로그를 먼저 읽고 재전송을 결정하세요. 문서의 콜드 부팅은 대기 업데이트를 버릴 수 있고 중복 억제도 메모리에서 제한적입니다. 정확히 한 번 전달은 보장되지 않습니다.

## 4. 재시작·중지·복구 검사

첫 처리가 끝나면 같은 컨테이너를 재시작해 새 로그와 유지된 `/opt/data` 상태를 확인한 뒤 **새로운** 무해한 개인 요청과 답변을 검사합니다. 컨테이너를 중지하고 Docker 상태를 읽으세요. `exited`가 중지 신호이며 조용한 채팅만으로는 부족합니다. `docker start hermes`가 나중에 의도적으로 재개하는 방법입니다.

```sh
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
```

재시작 실패 시 Docker 상태·로그, 다음으로 `$HERMES_DATA/logs/gateways/default/current` 및 `$HERMES_DATA/logs/container-boot.log`·마운트·소유권·고정 이미지/버전을 확인합니다. [v0.22.2 릴리스 노트](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2)는 시작 생존성 수정이지 해당 호스트의 사건 증거가 아닙니다. 복구하려고 데이터 디렉터리를 삭제하지 마세요. 토큰 유출 시 중지·BotFather 취소 후 마운트된 `.env`에서 비공개 교체하고 접근을 확인한 뒤 재시작합니다. 불필요한 페어링도 취소하고 실제 목록을 확인합니다.

VPS와 모델은 각각 요금이 들 수 있습니다. 실제 요금제·상한·청구를 확인하세요. 시간·무료 할당·가용성 목표는 약속하지 않습니다. Telegram·제공자는 메시지를 처리하고 호스트는 비밀·상태를 보존합니다. 한 호스트·한 봇의 첫 답변 검사이며 별도 BIG CHANGE 가이드는 [Hermes 백업과 복구](https://bigchange.ai/blog/hermes-encrypted-github-backup-recovery-guide) 및 [Hermes 정기 작업을 다룹니다](https://bigchange.ai/blog/hermes-skill-recurring-job-first-run).

## 출처와 추가 자료

다음 [Docker 설정](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md), [Telegram 설정](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md), [게이트웨이 접근](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md), [보안](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md) 및 [v0.22.2 릴리스](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2)는 NousResearch 1차 자료입니다. [빠른 시작](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/getting-started/quickstart.md)은 모델 공급자 설정을 설명합니다. 절차 문서이며 BIG CHANGE의 VPS·봇 실행 기록은 아닙니다.

## Sources

- [Hermes Agent v0.22.2 릴리스](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2) — 릴리스 날짜와 문서상 시작 생존성 수정.
- [Hermes Docker 설정, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md) — 이미지 채널·마운트·설정·감독·포트·로그.
- [공식 Dockerfile, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/Dockerfile) — 진입점·실행 UID·HERMES_HOME·오프라인 페어링 확인용 CLI 경로.
- [Docker 2단계 훅, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/docker/stage2-hook.sh) — 설정 후 특정 데이터 소유권과 .env/config 권한.
- [Telegram 설정, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md) — BotFather·토큰·숫자 목록·개인정보·전달 제한.
- [메시징과 게이트웨이, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md) — 실제 접근·페어링 확인·취소.
- [보안, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md) — 미허가 개인 메시지 처리와 접근 제한.
- [빠른 시작, v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/getting-started/quickstart.md) — 모델 공급자 설정 경로.