[5/7] PC에 Hermes Agent 구축하고 Obsidian에서 접속하기
이 글은 실제 Abulafium 구축 이력(2026-10-09 기준)을 바탕으로 다시 작성한 공개용 실습 매뉴얼입니다.
[실제 검증]은 구축 과정에서 성공을 확인한 상태,[재현 절차]는 이를 일반화한 실행 순서,[확인 필요]는 실제 소스·대시보드를 추가 확인해야 하는 사항입니다. 명령어의<USER>,<REPO_URL>등은 자신의 환경으로 변경하세요.
완성 목표
상시 가동하는 Windows PC의 WSL2 Ubuntu에 Hermes Agent를 설치하고, 외부에 관리 페이지를 공개하지 않은 채 Tailscale Serve를 통해 개인 기기의 Obsidian에서 채팅한다.
범위: 실제 구성과 오류 해결은 확인됐지만, 공식 설치 마법사의 모든 입력 화면·정확한 버전 고정값은 현재 기록에 없다. 버전별 Hermes 초기 설정 방법은 사용 중인 이미지의 실제 도움말을 우선 확인한다. 인증값을 문서에 포함하지 않는다.
1. 설치 환경과 선택 이유 [구성 확인]
- 서버: Windows PC → WSL2 Ubuntu → Docker Engine 및 Compose.
- 개인 데이터: Windows
C:\works\abulafium\garden(WSL2의/mnt/c/works/abulafium/garden). - AI 추론: OpenRouter API 방식. GTX 1650 장비에서 대규모 로컬 LLM을 필수로 요구하지 않기 위해 선택했다.
- 대시보드: 로컬
9119, Gateway 관련 포트8642. - 공개 인터넷 직접 노출 대신 Tailscale Serve + Hermes 자체 로그인 사용.
2. 사전 점검 [재현 절차]
WSL2 Ubuntu:
wsl.exe --status # Windows PowerShell에서 실행할 때
Ubuntu 터미널:
docker version
docker compose version
ls -ld /mnt/c/works/abulafium/garden
mkdir -p "$HOME/docker/hermes"
Windows PowerShell의 wsl.exe --status와 Ubuntu 안의 Docker 명령은 실행 위치가 다르다. 기존 Docker 서비스가 있다면 전체 Docker 재설치나 Compose 정리를 하지 않는다.
3. Hermes Compose [실제 구성 확인]
파일: ~/docker/hermes/compose.yaml. ${HOME} 치환을 사용하는 재현 예시는 다음과 같다. 실제 설치 당시에는 /home/oralcoder 절대경로를 사용했다. 아래는 별도 검증되지 않은 경로 일반화 예시이므로 적용 전 docker compose config로 결과를 확인한다.
services:
hermes:
image: nousresearch/hermes-agent:latest
container_name: hermes
restart: unless-stopped
command: gateway run
environment:
HERMES_DASHBOARD: "1"
volumes:
- /home/<USER>/.hermes:/opt/data
- /mnt/c/works/abulafium/garden:/workspace/garden:ro
ports:
- "127.0.0.1:8642:8642"
- "127.0.0.1:9119:9119"
<USER>를 실제 WSL2 로그인 계정으로 치환한다. latest는 업데이트마다 동작이 달라질 수 있으므로 장기적인 완전 재현을 원하면 실제로 검증한 digest로 고정한다(현재 digest 미확인). Garden 쓰기 권한 추가는 7편에서 진행한다.
cd "$HOME/docker/hermes"
docker compose config --quiet
docker compose up -d
docker compose ps
docker logs --tail=80 hermes
초기 API 공급자·키 등록은 컨테이너가 제공하는 공식 설정 흐름에 따라 수행한다. 실제 구축에서는 OpenRouter를 선택해 Hermes CLI 대화를 성공적으로 테스트했다. API 키를 채팅이나 공개 Markdown에 붙여넣지 않는다.
4. Dashboard 인증이 필요했던 이유 [실제 검증]
처음에는 Dashboard 바인딩/접근 과정에서 인증 없이 외부 바인딩할 수 없다는 제약이 발생했다. Hermes 제공 해시 기능을 통해 비밀번호 해시를 생성했다.
docker exec -it hermes python -c 'from plugins.dashboard_auth.basic import hash_password; import getpass; print(hash_password(getpass.getpass("Dashboard password: ")))'
그 해시를 기존 /home/<USER>/.hermes/config.yaml의 dashboard.basic_auth 아래에 반영한다. 기존 config.yaml을 통째로 덮어쓰지 않는다. 실제 설정 개념:
dashboard:
basic_auth:
username: "<DASHBOARD_USER>"
password_hash: "<GENERATED_HASH>"
컨테이너 UID가 10000인 파일이 있어 WSL2 일반 계정으로 파일 접근이 제한될 수 있다. 소유자·권한을 확인하고 필요한 범위에서만 관리자 권한을 사용한다. 무분별한 chmod -R 777은 사용하지 않는다.
cd "$HOME/docker/hermes"
docker compose restart hermes
Windows 브라우저에서 http://localhost:9119 로그인·채팅을 확인한다.
5. Tailscale Serve로 원격 접근 [실제 검증]
서버와 개인 기기 모두 동일 Tailnet에 연결한다. Serve는 Tailnet 내부 접근, Funnel은 일반 인터넷 공개라는 점을 혼동하지 않는다.
PC Windows PowerShell에서:
curl.exe -I http://127.0.0.1:9119
tailscale serve --bg http://127.0.0.1:9119
tailscale serve status
실제 응답은 /login으로 이동하는 HTTP 302였고 Tailscale HTTPS 주소에서 Hermes 로그인에 성공했다. 개인 Tailnet 주소는 공개 튜토리얼에 고정값으로 싣지 않으며 tailscale serve status의 자신의 주소를 사용한다. 인증 페이지 자체도 계속 활성화해 둔다.
6. Obsidian 안에서 Hermes 사용 [실제 검증]
- Obsidian 기본 플러그인 **웹 뷰어(Web Viewer)**를 활성화한다.
- 명령 팔레트 → 웹 뷰어: 웹 뷰어 열기를 실행한다.
- Tailscale HTTPS 주소에 접속해 Hermes Dashboard에 로그인한다.
- Markdown 편집 탭과 Hermes 채팅을 나란히 둔다.
실제 사용 시 오른쪽의 좁은 사이드바에 Dashboard를 배치하면 채팅이 지나치게 좁아져 일반 탭 구성을 유지했다. 로그인은 Obsidian 재시작 후에도 유지되는 것을 확인했다(세션 만료는 별개).
7. 완료 점검
-
docker compose ps에서 Hermes 실행 중 -
docker exec -it hermes hermes로 CLI 응답 테스트 - 로컬
http://localhost:9119로그인 가능 - Tailnet 내부 기기에서 HTTPS 주소 접속 가능
- Obsidian Web Viewer에서 채팅 사용 가능
- Tailnet 밖 외부 사용자는 Dashboard에 직접 접근하지 못함
[확인 필요] Windows 재부팅 이후 WSL2·Docker·Tailscale·Hermes가 모두 무인 자동 시작되는지는 아직 검증하지 않았다.