inflearn logo
강의

Course

Instructor

[Dante Labs] Build Your Own AI Virtual Office with Hermes × Codex (8-Week Master Course)

Unit 4.1 — Webhooks - The outside world calls the company

VPS 환경에서 webhook 구성시 차이점.

Resolved

21

hdyong

1 asked

0

뭔가 VPS 환경에서는 다르게 해야하는 것은 아닌가 싶어서 문의드려봅니다.

질문 요약 사항은 ,

구체적인 사항은 아래처럼,

질문 1 — 웹훅 secret 검증이 안 통합니다.

"대시보드에서 웹훅 ENABLE하고 magma-inquiry 구독을 만들었는데, hermes webhook testcurl도 계속 {"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 --porthermes 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:~#

================

인공지능(ai) ai-agent

Answer 2

0

hdyong

[해결 공유 + 추가 질문] 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

dantelabs

hdyong 님, 안녕하세요.

gateway 프로세스의 HERMES_HOME 기준입니다. gateway는 ethan으로 떠 있었으니 ethan 홈의 파일만 보고 있었고, sophie 파일을 아무리 바꿔도 mtime 변화가 감지될 리가 없었던 겁니다.

"재시작해야만 반영된다"고 느끼신 것도, 재시작 시점에 초기 로드가 한 번 일어나기 때문입니다.

두 가지만 기억하시면 될것 같아요.

- 재로드는 요청이 들어와야 일어납니다. CLI로 바꾸고 로그만 쳐다보면 Reloaded는 안 뜨는것이 정상입니다.

- 재로드 대상은 gateway가 실행 중인 프로필의 파일 하나뿐입니다.


질문 1 — gateway를 sophie 프로필로 띄우기

HERMES_PROFILE 환경변수로는 프로필이 바뀌지 않습니다. 이름 때문에 오해하기 쉬운데, 코드를 보면 이 변수는 칸반 작성자 라벨(created_by, author) 용도로만 쓰입니다.

프로필을 결정하는 것은 HERMES_HOME 디렉터리입니다.

프로필을 고르는 방법은 세 가지입니다.

image.png

Docker에서 권장하는 방식은 이겁니다.

hermes -p sophie gateway start

gateway 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 true

2) 구독에 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

communityai8509

안녕하세요, 인프런 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

11

4

hermess agent 어떤것을 사용해야 하는지?

0

9

1

hermess agent 어떤것을 사용해야 하는지?

0

10

2

수강생 전용관 링크 부탁해요

0

13

2

별도로 llama3.2-3b-64k 모델을 만드신 이유가 궁금합니다.

0

13

1

Search를 들어가면 brave search가 없습니다.

0

20

2

텔레그램에 메세지 보내기

0

23

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