Hermes Agent VPS 호스팅 운영 가이드
💡 요약 정리
- 운영 핵심 명령어:
hermes-setup,hermes-start/stop/restart,hermes-update,hermes-chat - 직접
podman명령 실행 시에는 반드시su - hermes로 전환 후 수행 - 모델 변경/메신저 추가 후에는 반드시
hermes-restart로 재시작 필요 - Credential Pool(같은 프로바이더 키 순환), Fallback Model(다른 프로바이더 전환), Smart Routing(복잡도 분기) 세 기능을 조합해 고가용성 구성 가능
- 백업은
/opt/hermes/data/전체를 tar로 묶어 보관하며, 백업 책임은 고객에게 있음
서비스 운영 중 필요한 관리, 모니터링, 문제 해결 가이드입니다.
1. 운영 명령어
기본 진입
ssh root@{아이디}.mycafe24.com
설정 메뉴 (hermes-setup)
hermes-setup
============================================================
Hermes Agent Configuration (Stage 2)
============================================================
Select an option:
[1] Full Setup (hermes setup)
[2] Status Check
[3] View Logs
[0] Reset Options
Select (1/2/3/0): _
관리 스크립트
| 명령 | 설명 |
|---|---|
hermes-setup | 대화형 설정 메뉴 (TUI) |
hermes-start | 에이전트 + 대시보드 시작 |
hermes-stop | 에이전트 + 대시보드 중지 |
hermes-restart | 전체 재시작 (헬스체크 포함) |
hermes-chat | 터미널 대화 인터페이스 |
hermes-update | 최신 이미지로 업데이트 |
hermes-update --rollback | 이전 이미지로 롤백 |
모든 관리 스크립트는 root에서 실행 시 hermes 사용자로 자동 위임됩니다.
주요 명령어 트리
hermes-setup 설정 메뉴
hermes-start 에이전트 + 대시보드 시작
hermes-stop 에이전트 + 대시보드 중지
hermes-restart 전체 재시작
hermes-chat 터미널 채팅
hermes-update 최신 이미지로 업데이트
hermes-update --rollback 이전 이미지로 롤백
su - hermes hermes 유저로 전환
├ podman ps 컨테이너 상태 확인
├ podman logs -f hermes-agent 실시간 로그
├ podman logs --tail 100 hermes-agent 최근 100줄 로그
└ podman exec -it hermes-agent 컨테이너 접속
├ hermes status 에이전트 상태 확인
├ hermes model AI 모델 확인/변경
├ hermes doctor 시스템 진단
└ hermes gateway status 게이트웨이(메신저) 상태
직접 podman 명령어를 사용하려면 su - hermes로 전환 후 실행합니다.
2. 상태 확인
서버 상태 확인
su - hermes
podman ps
정상 출력:
CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4e5f6 docker.io/nousresearch/hermes-agent:latest Up 2 hours hermes-agent
에이전트 상태 확인
su - hermes
podman exec hermes-agent hermes status
시스템 진단
su - hermes
podman exec hermes-agent hermes doctor
hermes doctor는 아래 항목을 점검합니다:
| 점검 항목 | 설명 |
|---|---|
| Python 환경 | 버전, 가상환경 여부 |
| 필수 패키지 | OpenAI SDK, Rich, dotenv 등 |
| 설정 파일 | .env, config.yaml 상태 |
| 인증 상태 | Nous Portal, OpenAI Codex 등 |
| 디렉토리 | cron, sessions, logs, skills, memories |
| 상태 DB | 세션 수 |
| 외부 도구 | git, Node.js, browser |
| API 연결 | 설정된 프로바이더 |
3. 로그 관리
실시간 로그
su - hermes
podman logs -f hermes-agent
Ctrl+C로 중단.
최근 로그 (지정 줄)
su - hermes
podman logs --tail 50 hermes-agent
파일 기반 로그
su - hermes
cat /opt/hermes/data/logs/agent.log # 에이전트 로그
cat /opt/hermes/data/logs/errors.log # 에러 로그
cat /opt/hermes/data/dashboard.log # 대시보드 로그
systemd 서비스 로그
su - hermes
journalctl --user -u hermes-agent -f
4. 재시작 / 중지 / 시작
에이전트 + 대시보드 재시작 (권장)
hermes-restart
에이전트 + 대시보드 중지
hermes-stop
에이전트 + 대시보드 시작
hermes-start
설정 변경 후에는 반드시 재시작이 필요합니다.
hermes-setup > [1] Full Setup 완료 시 자동 재시작됩니다.
hermes-start는 컨테이너 시작 후 Gateway PID 대기(최대 60초) → Dashboard 자동 시작까지 수행합니다.
4-1. 대시보드 관리
대시보드 접근
http://<서버IP>:9119
대시보드 상태 확인
# 대시보드 프로세스 확인
su - hermes -c 'podman exec hermes-agent pgrep -f "hermes dashboard"'
# 대시보드 로그 확인
su - hermes -c 'cat /opt/hermes/data/dashboard.log'
# systemd 서비스 상태
su - hermes -c 'systemctl --user status hermes-dashboard'
대시보드만 재시작
su - hermes -c 'podman exec hermes-agent pkill -f "hermes dashboard"'
# hermes-start가 대시보드를 다시 시작합니다
hermes-start
대시보드는 hermes-start, hermes-stop, hermes-restart 명령에 포함되어 자동 관리됩니다.
5. AI 모델 변경
방법 1: hermes-setup 기존 사용자 메뉴 사용
hermes-setup
# → [1] Full Setup 선택
기존 설정이 있으면 아래 메뉴가 나타납니다:
Welcome Back!
[1] Quick Setup
[2] Full Setup
[3] Model & Provider
[4] Terminal Backend
[5] Messaging Platforms (Gateway)
[6] Tools
[7] Agent Settings
[8] Exit
[3] Model & Provider를 선택하면 프로바이더 선택 → API Key → 모델 선택 순서로 변경할 수 있습니다.
방법 2: CLI로 직접 실행
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes setup model'
방법 3: 터미널 채팅 중 변경
hermes-chat
# 채팅 중 /model 명령 입력
방법 4: 컨테이너 내부에서 현재 모델 확인
su - hermes
podman exec -it hermes-agent hermes model
모델 변경 후에는 hermes-restart로 재시작이 필요합니다 (CLI/TUI로 변경한 경우).
6. 메신저 추가/변경
방법 1: hermes-setup 기존 사용자 메뉴 사용
hermes-setup
# → [1] Full Setup 선택
기존 사용자 메뉴에서 [5] Messaging Platforms (Gateway)를 선택합니다.
17개 플랫폼 체크리스트가 나타납니다. Space 키로 선택/해제하고 Enter로 확정합니다:
(Space: select/deselect, Enter: confirm, Arrow keys: move)
[ ] Telegram
[ ] Discord
[ ] Slack
[ ] Signal
[ ] Email
[ ] SMS (Twilio)
[ ] Matrix
[ ] Mattermost
[ ] WhatsApp
[ ] DingTalk
[ ] Feishu / Lark
[ ] WeCom (Enterprise WeChat)
[ ] WeCom Callback (Self-Built App)
[ ] Weixin (WeChat)
[ ] BlueBubbles (iMessage)
[ ] QQ Bot
[ ] Webhooks (GitHub, GitLab, etc.)
─────────────────
Continue →
방법 2: CLI로 직접 실행
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes setup gateway'
개별 섹션 CLI 명령어 참고
| 섹션 | CLI 명령어 |
|---|---|
| 모델/프로 바이더 | hermes setup model |
| 메시징 플랫폼 | hermes setup gateway |
| 터미널 백엔드 | hermes setup terminal |
| 도구 | hermes setup tools |
| 에이전트 설정 | hermes setup agent |
| TTS | hermes setup tts |
위 명령어는 컨테이너 내부에서 실행해야 합니다:
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes setup <섹션>'
개별 섹션 실행 후에는 hermes-restart로 게이트웨이를 재시작해야 변경사항이 적용됩니다.
6-1. Credential Pool (같은 프로바이더 복수 키 순환)
Credential Pool은 동일한 프로바이더에 여러 API 키를 등록하고, Rate Limit이나 장애 시 다음 키로 자동 전환하는 기능입니다.
주의: 서로 다른 프로바이더 간 전환은 Credential Pool이 아닌 Fallback Model(6-2 참조)로 설정합니다.
Credential Pool CLI 명령어
모든 명령은 컨테이너 내부에서 실행합니다:
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth <명령>'
| 명령 | 설명 | 예시 |
|---|---|---|
auth add <프로바이더> | API 키 추가 | hermes auth add anthropic |
auth list | 등록된 전체 키 목록 | hermes auth list |
auth remove <번호> | 특정 키 삭제 | hermes auth remove 2 |
auth strategy <프로바이더> | 순환 전략 변경 | hermes auth strategy anthropic |
auth reset <프로바이더> | 쿨다운 상태 초기화 | hermes auth reset anthropic |
프로바이더별 키 등록 예시
# 첫 번째 키
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth add anthropic'
# → Paste your API key: sk-ant-aaaa...
# → Label: anthropic-key-1
# 두 번째 키
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth add anthropic'
# → Paste your API key: sk-ant-bbbb...
# → Label: anthropic-key-2
OpenRouter 키 2개 등록:su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth add openrouter'
# → Paste your API key: sk-or-aaaa...
# → Label: openrouter-key-1
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth add openrouter'
# → Paste your API key: sk-or-bbbb...
# → Label: openrouter-key-2
순환 전략 설정
config.yaml 방식:su - hermes -c 'vi /opt/hermes/data/config.yaml'
# config.yaml 최상위 레벨에 추가
credential_pool_strategies:
anthropic: fill_first
openrouter: round_robin
CLI 방식:
su - hermes -c 'podman exec -it hermes-agent /opt/hermes/.venv/bin/hermes auth strategy anthropic'
# → [1] Fill-first / sticky
# → [2] Round robin
# → [3] Random
# → 선택: 1
| 전략 | 동작 | 적합한 상황 |
|---|---|---|
fill_first (기본) | 첫 번째 키 소진 시 다음 키로 전환 | 주 키 + 백업 키 구성 |
round_robin | 요청마다 순차적으로 다음 키 사용 | 여러 키에 고르게 부하 분산 |
random | 매 요청 시 랜덤 키 선택 | 예측 불가능한 분산 |
least_used | 사용량 가장 적은 키 우선 (config.yaml 직접 편집만 가능) | 실제 사용량 기반 분산 |
쿨다운 동작
| 에러 | 쿨다운 시간 | 의미 |
|---|---|---|
| 429 | 1시간 | Rate Limit 초과 → 다음 키로 자동 전환 |
| 402 | 1시간 | 과금/쿼터 초과 → 다음 키로 자동 전환 |
설정 변경 후에는 hermes-restart로 재시작해야 적용됩니다.
*주의: TUI를 2회 이상 반복 실행하면 .env 키 자동 시드와 수동 등록 키가 충돌할 수 있습니다. TUI는 최초 1회만 사용하고, 이후 키 추가는 CLI(hermes auth add)로 진행하세요.
6-2. Fallback Model (다른 프로바이더로 자동 전환)
주 모델이 실패할 때 다른 프로바이더의 모델로 자동 전환하는 기능입니다. 세션당 최대 1회 발동합니다.
TUI에서는 설정 불가. config.yaml 직접 편집으로만 설정합니다.
트리거 조건
| HTTP 코드 | 의미 | 동작 |
|---|---|---|
| 429 | Rate Limit 초과 | 재시도 소진 후 fallback 전환 |
| 503 | 서비스 일시 불가 | 재시도 소진 후 fallback 전환 |
| 529 | Overloaded | 재시도 소진 후 fallback 전환 |
| Connection Error | 연결 실패 | 즉시 fallback 전환 |
설정 방법
su - hermes -c 'vi /opt/hermes/data/config.yaml'
config.yaml의 fallback_model 주석을 해제하고 프로바이더/모델을 지정합니다.
시나리오별 설정 예시
API 키, 봇 토큰 등의 민감 정보는 TUI 및 CLI 화면, 설정 파일 모두에서 ******** 형태로 마스킹 처리되어 제공됩니다. 원문 값은 화면에 노출되지 않습니다.
fallback_model:
provider: openrouter
model: anthropic/claude-sonnet-4
.env에 필요한 키:
ANTHROPIC_API_KEY=******** # 주 모델용
OPENROUTER_API_KEY=******** # fallback용
시나리오 2: Anthropic(주) → MiniMax(fallback)
fallback_model:
provider: minimax
model: MiniMax-M1-80k
.env에 필요한 키:
ANTHROPIC_API_KEY=******** # 주 모델용
MINIMAX_API_KEY=******** # fallback용
시나리오 3: OpenRouter(주) → 로컬 모델(fallback)
fallback_model:
provider: custom
model: llama-3.1-70b
base_url: http://localhost:11434/v1
api_key_env: OLLAMA_API_KEY
시나리오 4: 다단계 fallback 체인 (3단계 순차 시도)
fallback_providers:
- provider: openrouter
model: anthropic/claude-sonnet-4
- provider: minimax
model: MiniMax-M1-80k
- provider: kimi-coding
model: kimi-k2.5
.env에 각 프로바이더의 키 모두 등록 필요.
fallback에 사용 가능한 프로바이더
| 프로바이더 | 필요한 환경변수 | 비고 |
|---|---|---|
openrouter | OPENROUTER_API_KEY | 가장 범용적 (200+ 모델) |
anthropic | ANTHROPIC_API_KEY | Claude 직접 연결 |
nous | OAuth (hermes auth) | Nous Research |
minimax | MINIMAX_API_KEY | MiniMax 글로벌 |
zai | ZAI_API_KEY | ZhipuAI GLM 모델 |
kimi-coding | KIMI_API_KEY | Moonshot/Kimi |
custom | api_key_env로 지정 | 자체 호스팅/로컬 모델 |
설정 후 hermes-restart로 재시작 필수.
6-3. Smart Model Routing (요청 복잡도별 모델 분기)
짧고 단순한 요청은 저렴한 모델로, 복잡한 요청은 주 모델로 자동 라우팅합니다.
TUI에서는 설정 불가. config.yaml 직접 편집으로만 설정합니다.
설정 방법
# config.yaml에 추가
smart_model_routing:
enabled: true
max_simple_chars: 160
max_simple_words: 28
cheap_model:
provider: openrouter
model: google/gemini-2.5-flash
| 요청 유형 | 라우팅 대상 |
|---|---|
| 160자/28단어 이하 (짧고 단순) | cheap_model (예: Gemini Flash) |
| 그 외 (복잡한 요청) | 주 모델 (예: Claude Opus) |
6-4. 세 가지 기능 조합 요약
| 기능 | 범위 | 설정 방법 | TUI 지원 |
|---|---|---|---|
| Credential Pool | 같은 프로바이더 내 키 순환 | CLI (hermes auth add) + config.yaml | Full Setup에서 가능 (1회만) |
| Fallback Model | 다른 프로바이더로 전환 | config.yaml 직접 편집 | 불가 |
| Smart Routing | 요청 복잡도별 모델 분기 | config.yaml 직접 편집 | 불가 |
요청 → Smart Routing 판단 (simple/complex)
│
├─ simple → cheap_model 사용
│
└─ complex → 주 모델 사용
│
├─ 성공 → 응답
│
└─ 실패 → Credential Pool 내 다음 키로 전환
│
├─ 성공 → 응답
│
└─ 모든 키 소진 → Fallback Model 발동
└─ 다른 프로바이더로 전환
7. 설정 리셋
hermes-setup > [0] Reset Options에서 3단계 리셋을 선택할 수 있습니다.
[Reset] Select reset scope:
[1] Reset Sessions/Memories
[2] Reset Operational Data
[3] Factory Reset (Full Wipe)
[4] Cancel
| 레벨 | 삭제 대상 | 보존 대상 | 확인 |
|---|---|---|---|
| [1] Reset Sessions/Memories | 대화 기록, 기억, state.db | 설정, API Key, 스킬 전부 | y/n |
| [2] Reset Operational Data | 대화, 기억, 크론, 로그, 스킬, gateway_state.json, SOUL.md | 설정(config.yaml), API Key(.env) | y/n |
| [3] Factory Reset (Full Wipe) | 위 전부 + API Key, 캐시, 모든 상태 파일. config.yaml은 템플릿에서 복원 | config.yaml.template | 'yes' 전체 입력 |
리셋 시 컨테이너가 자동으로 중지 → 데이터 삭제 → 재시작 → Dashboard 복구됩니다.
리셋 전 symlink 검증 + 경로 화이트리스트 보안 검증이 자동 수행됩니다.
8. Hermes Agent 업데이트
방법 1: hermes-update 사용 (권장)
# 최신 이미지로 업데이트
hermes-update
# 문제 발생 시 이전 이미지로 롤백
hermes-update --rollback
hermes-update는 다음을 자동 수행합니다:
- 현재 이미지 ID를
.prev_image에 저장 (롤백 대비) - 최신 이미지 다운로드
- 기존 컨테이너 중지/삭제
- 동일 보안/리소스 파라미터로 새 컨테이너 생성
- 데이터 볼륨 유지 (
/opt/hermes/data) - Dashboard 재시작
방법 2: 수동 업데이트
su - hermes
podman pull docker.io/nousresearch/hermes-agent:latest
podman stop hermes-agent
podman rm hermes-agent
podman run -d --name hermes-agent --init --restart unless-stopped \
--cap-drop=ALL \
--cap-add=CHOWN --cap-add=DAC_OVERRIDE --cap-add=FOWNER \
--cap-add=SETUID --cap-add=SETGID \
--pids-limit=256 \
--memory=3g --cpus=2 --shm-size=1g \
--log-opt max-size=10m --log-opt max-file=3 \
--health-cmd="test -f /opt/data/gateway.pid" --health-interval=30s \
-p 9119:9119 \
-v /opt/hermes/data:/opt/data \
-e TZ=Asia/Seoul \
docker.io/nousresearch/hermes-agent:latest gateway run
systemctl --user restart hermes-agent.service
업데이트 시 /opt/hermes/data/의 설정과 데이터는 보존됩니다.
9. 데이터 백업
주요 데이터 위치
| 데이터 | 경로 | 설명 |
|---|---|---|
| 설정 | /opt/hermes/data/config.yaml | 메인 설정 |
| API Key | /opt/hermes/data/.env | 프로바이더 인증 정보 |
| 기억 | /opt/hermes/data/memories/ | 영구 기억 데이터 |
| 대화 기록 | /opt/hermes/data/sessions/ | 세션 기록 (JSONL) |
| 스킬 | /opt/hermes/data/skills/ | 스킬 데이터 |
| 크론 | /opt/hermes/data/cron/ | 예약 작업 |
| 성격 | /opt/hermes/data/SOUL.md | 에이전트 성격 정의 |
백업 명령어
su - hermes
tar czf /tmp/hermes-backup-$(date +%Y%m%d).tar.gz /opt/hermes/data/
복원
su - hermes
podman stop hermes-agent
tar xzf /tmp/hermes-backup-YYYYMMDD.tar.gz -C /
podman start hermes-agent
백업 책임은 고객에게 있습니다. 중요한 데이터는 주기적으 로 별도 백업을 권장합니다.
10. 방화벽 관리
기본 구성
| 항목 | 기본 설정 |
|---|---|
| 인바운드 | SSH(22번) + Dashboard(9119번) 허용 |
| 아웃바운드 | 제한 없음 |
| fail2ban | SSH 5회 실패 → 30분 차단 |
대시보드(9119)는 설정과 API 키를 노출할 수 있으므로, 신뢰하지 않는 네트워크에서는 허용 IP를 제한하는 것을 권장합니다.
방화벽 설정 변경
나의 서비스 관리 > 서버관리 > 방화벽관리에서 포트별 허용 IP를 추가/삭제할 수 있습니다.
11. 요금 및 연장
요금제
| 플랜 | 월 요금 (VAT 포함) | 사양 |
|---|---|---|
| Lite | 14,000원 | 공유CPU / 2GB RAM / 40GB SSD / 500GB 트래픽 |
| Core (추천) | 33,000원 | 공유CPU / 4GB RAM / 100GB SSD / 1.2TB 트래픽 |
| Pro | 55,000원 | 공유CPU / 6GB RAM / 150GB SSD / 1.5TB 트래픽 |
초과 트래픽
- 단가: 165원/GB (VAT 포함)
- 월 단위 초기화, 익월 후불 정산
- 미납 시 서버 차단 가능
연장
나의 서비스 관리 > 연장/변경/추가옵션 > 연장신청에서 진행
업그레이드
변경신청 메뉴에서 차액 결제로 즉시 업그레이드
만료 주의
- 만료 시 서버 차단
- 만료 후 15일 경과 시 데이터 삭제 가능 (복구 불가)
12. 문제 해결
| 증상 | 원인 | 해결 |
|---|---|---|
| SSH 접속 불가 | 서버 OFF / 방화벽 차단 | 나서관에서 ON 확인 + 방화벽 22번 포트 확인 |
hermes-setup 안 됨 | 컨테이너 미실행 | hermes-start 실행 |
| AI 응답 없음 | API Key 미입력/만료 | hermes-setup > [1] Full Setup > model에서 재입력 |
| 텔레그램 봇 무응답 | Gateway 미연결 | hermes-setup > [2] Status Check 확인 |
| "권한 없음" 에러 | root에서 podman 실행 | su - hermes 후 재실행 |
| 컨테이너 크래시 | 메모리 부족 | podman logs hermes-agent로 확인 후 요금제 업그레이드 검토 |
| 기억이 안 됨 | 메모리 비활성 | hermes-setup > [1] Full Setup > agent에서 memory_enabled 확인 |
| 느린 응답 | 모델/네트워크 이슈 | hermes doctor로 진단 |
| 대시보드 접속 불가 | 방화벽 차단 / 프로세스 중지 | 방화벽관리에서 9119번 포트 허용 + hermes-restart |
| 대시보드 빈 화면 | Dashboard 프로세스 미시작 | cat /opt/hermes/data/dashboard.log 확인 → hermes-restart |
| 업데이트 후 문제 | 새 이미지 호환성 | hermes-update --rollback으로 이전 이미지 복원 |