VPS 환경에서 webhook 구성시 차이점.
뭔가 VPS 환경에서는 다르게 해야하는 것은 아닌가 싶어서 문의드려봅니다.
질문 요약 사항은 ,
"VPS Docker 환경(Hostinger, v0.19.0)입니다" (전제)
"웹훅 secret 검증이 X-Gitlab-Token으로도 계속 Invalid signature입니다" (핵심)
"구독 hot-reload가 안 되고 컨테이너 재시작해야만 반영됩니다" (원인 후보)
"gateway를 VPS에서 어떻게 관리하는 게 맞나요" (구조)
"8644 외부 노출은 어떻게 하나요" (4단계 대비)
관련 출력 5개 첨부
=========================
구체적인 사항은 아래처럼,
질문 1 — 웹훅 secret 검증이 안 통합니다.
"대시보드에서 웹훅 ENABLE하고 magma-inquiry 구독을 만들었는데,
hermes webhook test도curl도 계속{"error": "Invalid signature"}가 납니다. secret을test123으로 고정하고X-Gitlab-Token: test123헤더로 보내도 실패합니다. 코드(gateway/platforms/webhook.py)를 보면X-Gitlab-Token == secret이면 통과해야 하는데도요. VPS/Docker 환경에서 웹훅 secret 검증을 통과시키는 정확한 방법이 뭔가요?"
질문 2 — 구독 hot-reload가 안 됩니다.
"가이드는 '구독 변경은 수신기가 켜져 있으면 hot-reload된다'고 하는데, 제 환경에선 CLI로 구독 secret을 바꿔도 gateway가 안 읽습니다.
webhook_subscriptions.json파일은 바뀌는데 gateway 로그의 'Reloaded'는 시작 시점 한 번뿐이고, 컨테이너를 재시작해야만 반영됩니다. 이게 정상인가요, 아니면 Docker 환경 설정 문제인가요?"
질문 3 — gateway를 어떻게 띄워야 하나요 (VPS 방식).
"가이드의
hermes dashboard --isolated --port나hermes gateway run/restart를 CLI로 쓰니까 gateway가 포그라운드로 떠서 터미널에 묶이고 불안정해졌습니다. VPS/Docker에선 gateway를 어떻게 관리해야 하나요? 컨테이너 entrypoint가 자동으로 띄우는 것 같은데, 프로필별 격리 대시보드(--isolated)는 VPS에서도 필요한가요?"
그리고 4단계 관련해서 하나 더:
질문 4 — 웹훅 외부 노출.
docker ps를 보니 이 컨테이너는 4860 포트만 밖으로 매핑돼 있고 웹훅 8644는 컨테이너 내부에만 열려 있습니다. 웹훅 URL도localhost:8644로 나옵니다. 나중에 Tally 같은 외부 폼을 붙이려면 8644를 어떻게 외부에 노출해야 하나요? Traefik 라우팅을 추가해야 하나요?"
참조:
root@1a810f0dfc56:/opt/hermes# hermes -p sophie webhook list
1 webhook subscription(s):
◆ magma-inquiry
Agent-created subscription: magma-inquiry
URL: http://localhost:8644/webhooks/magma-inquiry
Events: (all)
Deliver: slack
root@1a810f0dfc56:/opt/hermes#
root@1a810f0dfc56:/opt/hermes# hermes -p sophie config get platforms.webhook
enabled: true
extra:
host: 0.0.0.0
port: 8644
root@1a810f0dfc56:/opt/hermes#
root@1a810f0dfc56:/opt/hermes# cat /opt/data/profiles/sophie/webhook_subscriptions.json
{
"magma-inquiry": {
"description": "Agent-created subscription: magma-inquiry",
"events": [],
"secret": "test123",
"prompt": "고객 문의입니다. magma-support 스킬을 열어 정책 확인 후 문의 유형 분류하고 정중한 1차 답변 초안 작성. 불확실하면 담당자 확인 필요로 표시. 문의: {inquiry.message}",
"skills": [
"magma-support"
],
"deliver": "slack",
"created_at": "2026-08-18T11:00:31Z"
}
}root@1a810f0dfc56:/opt/hermes#
root@1a810f0dfc56:/opt/hermes# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
root@1a810f0dfc56:/opt/hermes# exit
exit
root@srv1840967:~# docker exec -it hermes-agent-yx1l-hermes-agent-1 bash
root@1a810f0dfc56:/opt/hermes# exit
exit
root@srv1840967:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a810f0dfc56 ghcr.io/hostinger/hvps-hermes-agent:latest "/entrypoint.sh" 3 weeks ago Up 19 minutes 0.0.0.0:32778->4860/tcp, [::]:32778->4860/tcp hermes-agent-yx1l-hermes-agent-1
80495237f982 traefik:latest "/entrypoint.sh --ap…" 4 weeks ago Up 4 weeks traefik-traefik-1
root@srv1840967:~#
================
回答 2
0
[해결 공유 + 추가 질문] Hostinger VPS에서 webhook Invalid signature 원인 = 프로필 불일치였습니다. Gateway를 특정 프로필로 띄우는 방법 문의
어제 올린 webhook "Invalid signature" 문제, 원인을 찾았습니다. 공유드리고 다음 단계를 여쭙니다.
원인: gateway가 도는 프로필과 제가 설정한 프로필이 달랐습니다.
이 Hostinger 이미지는
hermes gateway run을 프로필 지정 없이 실행하고, gateway 로그에Active profile: ethan으로 뜹니다. 즉 default가 ethan입니다.그런데 저는 대시보드에서 sophie로 전환해 webhook enable, 구독 생성, secret 설정을 모두 sophie 프로필에 했습니다.
그래서 sophie에 설정한 secret으로 요청을 보내면, 실제 요청을 받는 ethan gateway는 그 secret을 몰라 "Invalid signature"를 냈습니다.
ethan 프로필의 실제 secret(
X-Gitlab-Token헤더)으로 요청하니{"status":"accepted"}로 통과했고, ethan이 웹훅으로 깨어나 13초 만에 응답을 생성했습니다. webhook 파이프라인 자체는 정상 작동 확인했습니다.
(참고: hot-reload는 이 환경에서 동작하지 않아, 구독/설정 변경 시 docker restart로 컨테이너를 재시작해야 반영되는 것도 확인했습니다.)
질문 1 — Gateway를 특정 프로필(sophie)로 띄우려면?
실제로는 sophie 프로필에 magma-support 스킬을 붙여뒀는데, gateway가 ethan default로 도니 그 스킬이 로드되지 않습니다. Hostinger 이미지에서 gateway를 sophie 프로필로 실행하게 하려면 어떻게 해야 하나요? default 프로필을 sophie로 바꾸는 설정이 있는지, 아니면 entrypoint/환경변수(HERMES_PROFILE 등)로 지정하는지 궁금합니다.
질문 2 — 여러 프로필의 webhook을 동시에 운영할 수 있나요?
ethan과 sophie 둘 다 webhook을 쓰려면, gateway가 프로필별로 따로 떠야 하나요, 아니면 하나의 gateway가 여러 프로필 구독을 로드할 수 있나요? (8644 포트를 공유하는지 등)
질문 3 — webhook 플랫폼 터미널 도구 활성화
구독 prompt의 hermes kanban create가 실행되려면 webhook 플랫폼에 터미널을 켜야 하는데(hermes tools enable --platform webhook terminal), 이 VPS 환경에서 이게 프로필별로 적용되는지, 재시작이 필요한지 확인 부탁드립니다.
1
hdyong 님, 안녕하세요.
gateway 프로세스의 HERMES_HOME 기준입니다. gateway는 ethan으로 떠 있었으니 ethan 홈의 파일만 보고 있었고, sophie 파일을 아무리 바꿔도 mtime 변화가 감지될 리가 없었던 겁니다.
"재시작해야만 반영된다"고 느끼신 것도, 재시작 시점에 초기 로드가 한 번 일어나기 때문입니다.
두 가지만 기억하시면 될것 같아요.
- 재로드는 요청이 들어와야 일어납니다. CLI로 바꾸고 로그만 쳐다보면 Reloaded는 안 뜨는것이 정상입니다.
- 재로드 대상은 gateway가 실행 중인 프로필의 파일 하나뿐입니다.
질문 1 — gateway를 sophie 프로필로 띄우기
HERMES_PROFILE 환경변수로는 프로필이 바뀌지 않습니다. 이름 때문에 오해하기 쉬운데, 코드를 보면 이 변수는 칸반 작성자 라벨(created_by, author) 용도로만 쓰입니다.
프로필을 결정하는 것은 HERMES_HOME 디렉터리입니다.
프로필을 고르는 방법은 세 가지입니다.

Docker에서 권장하는 방식은 이겁니다.
hermes -p sophie gateway startgateway run(포그라운드, 터미널에 묶임) 대신 gateway start를 쓰시면 프로필별 서비스 슬롯으로 등록되고, 상태가 gateway_state.json에 running으로 기록됩니다.
질문 2 — 여러 프로필의 webhook 동시 운영
가능합니다. gateway를 여러 개 띄울 필요 없고, 8644 포트 하나를 공유합니다. 멀티플렉스 라우팅을 켜면 URL 접두사로 프로필이 갈립니다.
POST /p/sophie/webhooks/magma-inquiry → sophie
POST /webhooks/other-route → default(ethan)
아래 처럼 3단계로 진행해보세요.
1) gateway가 도는 프로필(=default, 지금은 ethan)에서 멀티플렉스 켜기
hermes config set gateway.multiplex_profiles true2) 구독에 profile 필드 추가
{
"magma-inquiry": {
"profile": "sophie", // ← 이 줄
"secret": "...",
...
}
}3) gateway 재시작 (multiplex_profiles는 기동 파라미터라 재시작 필요)
hermes -p <gateway프로필> gateway restart여기서 가장 헷갈리는 함정을 미리 말씀드립니다.
멀티플렉스를 켜도 구독 파일은 여전히 gateway 프로세스의 홈 한 곳에서만 읽힙니다. 그러니 profile: "sophie" 구독은 sophie 홈이 아니라 gateway가 실행 중인 프로필의 webhook_subscriptions.json 에 넣으셔야 합니다. sophie 홈에 넣으면 아무도 안 읽습니다.
질문 3 — webhook 플랫폼 터미널 도구
프로필별로 적용되고, 재시작은 필요 없습니다.
--platform으로 지정한 도구 설정은 해당 프로필 config.yaml의 platform_toolsets 키에 저장됩니다. config.yaml은 프로필 홈에 있으니 자연히 프로필 스코프입니다.
hermes -p sophie tools enable --platform webhook terminal
hermes -p sophie config get platform_toolsets 여기서도 "어느 프로필이냐"가 관건입니다. 실제로 에이전트를 실행하는 프로필의 config여야 합니다. 멀티플렉스로 sophie에 라우팅한다면 sophie의 config에 넣으시면 되고, 아직 ethan gateway가 처리하고 있다면 ethan에 넣어야 합니다.
참고로 인증을 끄는 INSECURE_NO_AUTH 모드는 코드 레벨에서 loopback 호스트에서만 허용되고, 0.0.0.0 바인딩에서는 해당 라우트를 아예 건너뜁니다. 실수로 무인증 노출이 되는 건 막혀 있습니다.
Tally를 붙이실 때는, Tally 웹훅에 커스텀 헤더를 넣을 수 있으니 X-Gitlab-Token에 secret을 실어 보내시면 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. hdyong님.
VPS의 Hostinger Docker 환경에서 Gateway를 관리하는 방식과 관련해서는 아래 답변이 가장 유사합니다.
hostinger vps 사용중 질문입니다.
Hostinger에서 제공하는 Hermes 이미지는 공식 Docker 이미지와 실행 구조가 다를 수 있어, hermes gateway restart 명령으로 기존 Gateway 프로세스가 완전히 종료되지 않는 경우가 있습니다. 이때 기존 프로세스가 Slack 앱 토큰이나 Gateway 리소스를 점유해 재시작 및 설정 반영이 정상적으로 이루어지지 않을 수 있습니다.
기존 답변에서는 다음과 같이 안내하고 있습니다.
- Hostinger 환경에서는 Dashboard의 Gateway Restart보다 Docker 컨테이너 재시작이 안정적입니다.
- 컨테이너 재시작 시 기존 Gateway 프로세스와 락이 정리되고, entrypoint가 Gateway를 다시 실행합니다.
- 컨테이너 내부에서 Docker 명령을 실행할 수 없는 것은 일반적인 구조이며, Docker 컨테이너 자체의 관리는 VPS 호스트에서 수행해야 합니다.
--isolated대시보드나 별도의 Gateway 프로세스를 직접 포그라운드로 실행하기보다는, Hostinger 이미지의 entrypoint가 관리하는 기본 실행 구조를 사용하는 것이 적합합니다.
다만 질문하신 X-Gitlab-Token 검증 방식, 구독 hot-reload 동작 여부, 8644 포트의 외부 노출 및 Traefik 라우팅 설정은 위 답변에서 직접 다루지 않았습니다. 특히 localhost:8644는 컨테이너 내부 주소이므로 외부 서비스에서 접근하려면 컨테이너 포트 매핑 또는 Traefik 라우팅 설정이 추가로 필요할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
6:13 부근에서 끝나버립니다 그 다음 진행부터는 다음 진행창이 나오지 않아요
1
10
4
hermess agent 어떤것을 사용해야 하는지?
0
9
1
hermess agent 어떤것을 사용해야 하는지?
0
10
2
수강생 전용관 링크 부탁해요
0
10
2
별도로 llama3.2-3b-64k 모델을 만드신 이유가 궁금합니다.
0
9
0
Search를 들어가면 brave search가 없습니다.
0
18
2
텔레그램에 메세지 보내기
0
20
1
8.2 절 칸반보드 실행 결과에 대한 질문입니다.
0
34
2
isolated dashboard 관련 문의
0
39
2
8.1. 키움증권 연동하는 내용 잘문입니다.
0
42
2
혼자 이거저것하다보니..
0
44
2
wave 터미널, 마우스 우클릭 "File Browser" 없네요
0
32
2
Unit3.8-칸반 작업 관련
0
42
2
Unit 6.4. 영상에 있는 ethan에게 주는 블로그 콘텐츠 파이프라인 프롬프트는 어디있어요? 강의자료에서 찾기가 어려워요
0
35
2
섹션8 수업자료
0
39
1
DM에서 스레드로 답변이 오지 않습니다
0
40
2
unit 1.13 텔레그램 연동에서 그룹ID 부분
0
48
2
웹훅 설치 문의
0
50
2
칸바 교육 듣고 있는데 카드 추가할때 워크스페이스가 나와서 안되요
0
28
3
슬랙 연결 에러
0
42
2
코드 제공
0
34
2
부록1. 모델에서 LM studio와 custom endpoint 차이
0
40
2
hermes에서 클로드 쓰는법 있을까요?
0
59
2
manifest 여기 안에 소피.json 파일 넣는법
0
46
2

