헤르메스 대시보드, 원격 서버에서 24시간 영구 호스팅하기
원격 서버에 올려둔 헤르메스 에이전트를 매번 터미널로만 들여다보긴 번거롭습니다.
헤르메스에는 설정·API 키·세션·로그를 브라우저로 한눈에 관리하는 웹 대시보드가 들어 있습니다.
그런데 이 대시보드를 그냥 띄우면 SSH 창을 닫는 순간 같이 꺼져버립니다.
이 가이드에서는 대시보드가 서버가 살아 있는 한 24시간 계속 떠 있도록 만드는 방법을 난이도 순서대로 풀어드립니다.
마지막에는 외출 중에도 휴대폰이나 노트북에서 대시보드를 여는 방법까지 이어집니다.
💡 사전 요구사항: 원격 서버(미니PC·클라우드 VPS)에 헤르메스가 이미 설치되어 있어야 합니다. 설치 전이라면 먼저 헤르메스 설치 가이드부터 끝내고 오세요.
먼저 알아둘 것, 대시보드는 "터미널에 붙어 도는" 프로세스입니다
헤르메스 대시보드는 hermes dashboard 명령으로 띄우는 평범한 서버 프로세스입니다.
별도의 데몬이 아니라, 명령을 실행한 그 터미널 세션에 그대로 붙어서 돌아갑니다.
그래서 SSH 연결이 끊기거나 터미널 창을 닫으면 프로세스도 함께 종료됩니다.
먼저 옵션부터 확인해볼게요.
hermes dashboard --help
실제 출력은 이렇습니다.
usage: hermes dashboard [-h] [--port PORT] [--host HOST] [--no-open]
[--insecure] [--tui] [--skip-build] [--stop]
[--status]
Launch the Hermes Agent web dashboard for managing config, API keys, and sessions
options:
--port PORT Port (default 9119)
--host HOST Host (default 127.0.0.1)
--no-open Don't open browser automatically
--insecure Allow binding to non-localhost (DANGEROUS: exposes API keys on the network)
--stop Stop all running hermes dashboard processes and exit
--status List running hermes dashboard processes and exit
여기서 두 가지를 꼭 기억해두세요.
기본 포트는 9119입니다. 흔히 예시로 도는 8787이 아니라 헤르메스의 기본값은 9119예요.
기본 호스트는 127.0.0.1, 즉 서버 자기 자신입니다. 이 말은 기본 설정으로는 다른 기기에서 접속이 안 된다는 뜻인데, 외부 접속은 이 문서 후반부에서 따로 다룹니다.
지금 떠 있는 대시보드가 있는지는 --status로 확인합니다.
hermes dashboard --status
1 hermes dashboard process(es) running:
PID 407287: .../python3 .../hermes dashboard --host 127.0.0.1 --port 9119 --no-open
⚠️
--stop은 "전부 종료"입니다.hermes dashboard --stop은 떠 있는 모든 대시보드 프로세스를 한꺼번에 내립니다. 특정 하나만 끄는 옵션이 아니니, 서버에서 대시보드를 여러 개 굴리고 있다면 주의하세요.
1단계. 가장 빠른 방법, nohup 으로 띄우기
"터미널만 닫아도 계속 돌면 된다" 싶으면 nohup이 제일 간단합니다.
nohup hermes dashboard --port 9119 --no-open > ~/hermes-dashboard.log 2>&1 &
한 줄이지만 세 부분으로 나눠 읽으면 쉽습니다.
nohup은 터미널이 끊길 때 프로세스로 날아오는 종료 신호(SIGHUP)를 무시하게 해서, 창을 닫아도 안 죽게 합니다.
> ~/hermes-dashboard.log 2>&1은 화면에 찍힐 로그를 파일 하나로 모아둡니다. 나중에 tail -f ~/hermes-dashboard.log로 들여다볼 수 있어요.
마지막 &는 백그라운드로 보내서 터미널을 계속 쓸 수 있게 합니다.
실행한 뒤 hermes dashboard --status로 떠 있는지 확인하면 됩니다.
⚠️ nohup의 한계, 재부팅에는 못 버팁니다. nohup은 "터미널이 닫혀도" 살아남게 할 뿐입니다. 서버 자체가 재부팅되면 프로세스는 사라집니다. 정전이나 커널 업데이트 후에도 자동으로 다시 떠야 한다면 3단계 systemd 방식으로 가세요.
2단계. 다시 붙어서 로그를 보고 싶다면, tmux
장시간 돌리면서 가끔 "같은 콘솔에 다시 들어가" 로그를 직접 보고 싶을 때가 있습니다.
그럴 땐 tmux가 nohup보다 편합니다. 세션을 만들어두고 필요할 때 다시 붙으면 되거든요.
먼저 이름을 붙여 세션을 엽니다.
tmux new -s hermes-dash
새로 열린 tmux 안에서 대시보드를 띄웁니다.
hermes dashboard --port 9119 --no-open
이제 Ctrl + b를 누르고 손을 뗀 다음 d를 누르면 세션에서 빠져나옵니다(detach). 대시보드는 tmux 안에서 계속 돌아갑니다.
SSH를 끊거나 터미널을 닫아도 tmux 세션과 그 안의 헤르메스 프로세스는 그대로 유지됩니다.
실제로 detach한 뒤 확인해보면 이렇게 살아 있습니다.
$ tmux ls
hermes-dash: 1 windows (created ...)
$ hermes dashboard --status
1 hermes dashboard process(es) running:
PID ...: .../hermes dashboard --port 9119 --no-open
다시 들어가 로그를 보고 싶을 땐 attach로 붙습니다.
tmux attach -t hermes-dash

💡
screen을 즐겨 쓰신다면screen -S hermes로 세션을 열고 안에서 똑같이hermes dashboard --no-open을 실행하면 됩니다. 빠져나올 땐Ctrl + a에 이어d, 다시 붙을 땐screen -r hermes입니다.
3단계. 진짜 영구 호스팅, systemd 사용자 서비스 (권장)
nohup과 tmux는 "터미널이 닫혀도" 버티는 방법이지, 서버 재부팅까지 책임지진 않습니다.
서버가 꺼졌다 켜져도, 로그아웃을 해도 대시보드가 알아서 다시 떠 있게 하려면 systemd 사용자 서비스로 등록하는 게 가장 깔끔합니다. 운영 환경에서 권장하는 방식이에요.
⚠️ 이 방법은 마지막 한 줄에서
sudo권한이 필요합니다. 공용 VPS나 학교·회사 서버처럼sudo를 쓸 수 없는 환경이라면, 이 3단계를 건너뛰고 바로 아래 "3단계 대안, sudo 없이 부팅 자동 실행하기" 로 가세요.
먼저 서비스 정의 파일을 하나 만듭니다.
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/hermes-dashboard.service
아래 내용을 그대로 붙여넣으세요.
[Unit]
Description=Hermes Agent Dashboard
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=%h/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
Restart=always
RestartSec=5
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=default.target
각 줄의 뜻을 짚어둘게요.
ExecStart는 서비스가 실행할 명령입니다. %h는 홈 디렉터리를 가리키는 systemd 변수라, 사용자 이름이 달라도 알아서 맞춰집니다. 헤르메스 설치 경로가 다르면 which hermes로 확인해 바꾸세요.
Restart=always와 RestartSec=5는 프로세스가 어떤 이유로든 죽으면 5초 뒤 자동으로 다시 띄우라는 뜻입니다. 이게 영구 호스팅의 핵심이에요.
이제 서비스를 등록하고 켭니다.
systemctl --user daemon-reload
systemctl --user enable --now hermes-dashboard.service
⚠️
Failed to connect to bus오류가 나면 SSH 세션에 사용자 systemd 통로가 아직 안 열린 경우입니다.export XDG_RUNTIME_DIR="/run/user/$(id -u)"를 먼저 실행하고 다시 시도하세요. 그래도 안 되면 아래 linger 명령을 먼저 실행한 뒤 SSH 에 다시 접속하면 통로가 열립니다.
상태를 확인합니다.
systemctl --user status hermes-dashboard.service
active (running)이 보이면 성공입니다.
마지막으로 한 가지가 더 필요합니다. 사용자 서비스는 기본적으로 "그 사용자가 로그인해 있는 동안"만 돕니다. SSH 로그아웃 후에도, 재부팅 후에도 계속 돌게 하려면 linger를 켜야 합니다.
sudo loginctl enable-linger $USER
이렇게 해두면 서버가 켜져 있는 한 대시보드는 항상 떠 있습니다.
💡
sudo를 쓸 수 없어 이 linger 명령을 실행하지 못한다면, 로그아웃하는 순간 서비스가 멈춥니다. 그럴 땐 바로 아래 "3단계 대안" 의 cron 방식으로 대신하세요.

💡 세 방법 중 무엇을 고를까요. 잠깐 띄워보고 끌 거면 nohup, 로그를 자주 들여다볼 거면 tmux, 한 번 세팅하고 계속 굴릴 거면 systemd입니다. 강의용으로 미니PC를 상시 켜두신다면 3단계 systemd를 권합니다.
3단계 대안, sudo 없이 부팅 자동 실행하기 (cron @reboot)
sudo 권한이 없으면 위 linger 를 켤 수 없어서, 로그아웃하거나 재부팅하면 대시보드가 멈춥니다. 이럴 땐 cron 의 @reboot 을 쓰면 됩니다. cron 은 sudo 없이 본인 계정만으로 등록할 수 있고, 서버가 부팅될 때마다 대시보드를 자동으로 띄워줍니다.
먼저 헤르메스의 정확한 경로를 확인합니다. cron 은 평소 터미널의 환경 변수를 물려받지 않아서, 명령을 절대 경로로 적어야 하거든요.
which hermes
이제 cron 편집기를 엽니다.
crontab -e
맨 아래에 한 줄을 추가합니다. 경로는 방금 which hermes 로 확인한 값으로 바꿔 넣으세요.
@reboot /home/사용자명/.local/bin/hermes dashboard --port 9119 --no-open >> /home/사용자명/hermes-dashboard.log 2>&1
저장하고 나오면 끝입니다. 다음 재부팅부터 대시보드가 자동으로 떠 있습니다. 지금 당장 한 번 띄워두고 싶으면, 위 1단계의 nohup 명령을 한 번 실행해두면 됩니다.
💡 tmux 안에서 띄우고 싶다면
@reboot /usr/bin/tmux new-session -d -s hermes-dash '/home/사용자명/.local/bin/hermes dashboard --port 9119 --no-open'처럼 적습니다. 이때도tmux경로를which tmux로 확인해 절대 경로로 넣으세요.
외부 접속편, tailscale 사설망으로 어디서나 대시보드 열기
여기까지 따라오면 대시보드는 서버 안에서 24시간 떠 있습니다. 하지만 아직 서버 자기 자신(127.0.0.1)에서만 열립니다.
외출 중에 노트북이나 휴대폰으로 대시보드를 열려면 한 단계가 더 필요합니다.
가장 깔끔한 방법은 tailscale 사설망을 쓰는 겁니다. 포트포워딩 없이, 공인 IP 없이도 내 기기들끼리 안전하게 연결되거든요.
💡 사전 요구사항: tailscale 설치와 사설 IP 확인이 먼저입니다. 아직이라면 Tailscale 설치 및 사용 가이드를 끝내고 오세요. 그 가이드에서 만든 사설망 위에서 이 절차가 진행됩니다.
대시보드를 사설망에 여는 방법은 두 가지입니다.
방법 A (권장). tailscale serve 로 안전하게 프록시하기
tailscale serve는 서버 안에서만 돌던 127.0.0.1:9119를 사설망에 HTTPS로 대신 열어줍니다.
대시보드 자체는 그대로 로컬에 두고 tailscale이 암호화된 통로만 뚫어주는 구조라, API 키가 평문으로 네트워크에 노출되지 않습니다. 그래서 가장 안전합니다.
tailscale serve --bg 9119
설정한 뒤 상태를 봅니다.
tailscale serve status
이제 같은 tailscale 계정에 연결된 다른 기기의 브라우저에서 아래 주소로 접속하면 됩니다.
https://<내-서버-이름>.<내-tailnet>.ts.net/
⚠️
tailscale serve는 관리자(operator) 권한이 필요합니다. 명령이 조용히 안 먹으면 권한 문제일 가능성이 큽니다.sudo tailscale serve ...로 실행하거나, 한 번만sudo tailscale set --operator=$USER로 본인 계정에 권한을 준 뒤 sudo 없이 쓰면 됩니다.
방법 B. tailscale IP 에 직접 바인딩하기
권한 설정이 번거롭다면, 대시보드를 처음부터 사설 IP에 띄우는 방법도 있습니다.
본인 서버의 tailscale 사설 IP는 이렇게 확인합니다.
tailscale ip -4
그 IP를 --host에 넣어 띄웁니다. 100.113.196.93 자리는 본인 IP로 바꾸세요.
hermes dashboard --host 100.113.196.93 --port 9119 --insecure --no-open
실제로 이렇게 띄운 뒤, 같은 사설망에 있는 노트북에서 접속해보면 정상적으로 열립니다.
$ curl -s -o /dev/null -w "HTTP %{http_code}\n" http://100.113.196.93:9119/
HTTP 200
⚠️
--insecure의 의미를 알고 쓰세요. 이 옵션은 대시보드를 로컬 바깥에 노출하도록 허용합니다. 사설망이라도 그 망에 들어와 있는 사람은 누구나 대시보드에 닿을 수 있다는 뜻이에요. API 키를 다루는 화면이니, 본인과 신뢰하는 사람만 들어와 있는 tailscale 망에서만 쓰고, 공개 인터넷에는 절대 이 방식으로 열지 마세요.
⚠️ 함정 하나, 이름 말고 IP로 접속하세요. tailscale의 MagicDNS 이름(
...ts.net)으로 접속하면 대시보드가 요청을 거부해400오류가 날 수 있습니다. 대시보드가 접속 주소(Host)를 검사하기 때문인데,100.x.x.x형태의 사설 IP로 직접 접속하면 깔끔하게 열립니다. 실제로 IP 접속은200, 이름 접속은400이 나옵니다.

방법 B를 systemd 서비스로 영구화하려면, 3단계의 서비스 파일에서 ExecStart 줄만 바꾸면 됩니다.
ExecStart=%h/.local/bin/hermes dashboard --host 100.113.196.93 --port 9119 --insecure --no-open
영구 호스팅 명령 한 장 (빠른 참조)
# 현재 떠 있는 대시보드 확인
hermes dashboard --status
# 방법 1) 빠르게 — nohup (재부팅엔 안 버팀)
nohup hermes dashboard --port 9119 --no-open > ~/hermes-dashboard.log 2>&1 &
# 방법 2) 다시 붙어 로그 보기 — tmux
tmux new -s hermes-dash
# 안에서: hermes dashboard --port 9119 --no-open
# 빠져나오기: Ctrl + b 누른 뒤 d
# 다시 붙기: tmux attach -t hermes-dash
# 방법 3) 진짜 영구 — systemd 사용자 서비스 (권장)
nano ~/.config/systemd/user/hermes-dashboard.service # 위 ini 내용 작성
systemctl --user daemon-reload
systemctl --user enable --now hermes-dashboard.service # bus 오류 시: export XDG_RUNTIME_DIR="/run/user/$(id -u)"
systemctl --user status hermes-dashboard.service
sudo loginctl enable-linger $USER
# 방법 3 대안) sudo 가 없다면 — cron @reboot (재부팅 자동 실행)
which hermes # 절대 경로 확인
crontab -e
# 맨 아래에: @reboot /home/사용자명/.local/bin/hermes dashboard --port 9119 --no-open >> ~/hermes-dashboard.log 2>&1
# 외부 접속 A) tailscale serve (권장, operator 권한 필요)
sudo tailscale set --operator=$USER # 최초 1회
tailscale serve --bg 9119
tailscale serve status
# 외부 접속 B) 사설 IP 직접 바인딩
tailscale ip -4 # 내 사설 IP 확인
hermes dashboard --host <사설IP> --port 9119 --insecure --no-open
# 접속은 이름(.ts.net) 말고 http://<사설IP>:9119 로
자주 만나는 문제
Address already in use 가 떠요. 이미 9119 포트에 대시보드가 떠 있다는 뜻입니다. hermes dashboard --status로 확인하고, 새로 띄울 거면 --port 9120처럼 다른 포트를 쓰세요.
대시보드가 여러 개 떠 있어요. --status에 프로세스가 여러 줄 잡히면 nohup이나 tmux로 중복 실행한 경우가 많습니다. systemd 서비스 하나로 정리하는 걸 권합니다. 다만 --stop은 전부 내리니, 운영 중인 게 섞여 있으면 PID를 확인해 개별로 정리하세요.
systemctl --user 가 Failed to connect to bus 라고 떠요. SSH 세션에 사용자 systemd 통로가 안 열린 경우입니다. export XDG_RUNTIME_DIR="/run/user/$(id -u)" 를 먼저 실행하세요. 그래도 안 되면 sudo loginctl enable-linger $USER 를 한 뒤 다시 접속하면 됩니다.
sudo 권한이 없어서 linger 를 못 켜요. 3단계 systemd 는 마지막에 sudo 한 줄이 필요합니다. sudo 를 쓸 수 없다면 "3단계 대안" 의 cron @reboot 방식으로 부팅 자동 실행을 대신할 수 있습니다.
재부팅했더니 안 떠 있어요. nohup이나 tmux로 띄웠다면 정상입니다. 재부팅 후 자동 실행은 3단계 systemd + loginctl enable-linger가 필요합니다.
사설망에서 접속하면 400 오류가 나요. MagicDNS 이름 대신 100.x.x.x 사설 IP로 접속하세요. 위 "함정 하나" 콜아웃을 참고하시면 됩니다.
tailscale serve 명령이 아무 반응이 없어요. operator 권한 문제입니다. sudo를 붙이거나 sudo tailscale set --operator=$USER로 권한을 부여한 뒤 다시 시도하세요.
마무리, 한 번 세팅하면 계속 켜져 있습니다
세 가지 방법을 난이도 순으로 살펴봤습니다.
잠깐 쓸 거면 nohup, 로그를 자주 볼 거면 tmux, 운영용으로 계속 굴릴 거면 systemd 사용자 서비스입니다.
여기에 tailscale 사설망을 얹으면 외출 중에도 휴대폰으로 대시보드를 열어 헤르메스 상태를 점검할 수 있습니다.
다음 단계로는 대시보드에서 모델·API 키 설정을 정리하고, 게이트웨이(슬랙·텔레그램) 연결을 점검해보시길 권합니다.
진행하시다가 막히는 부분이 생기면 언제든 인프런 Q&A 또는 댓글로 질문 남겨주세요.
