엄마가 밤에 손톱깎고 아무데나 버리지 말랬지! 도플갱어 봇 만들기 (2)

혼자였으면 못 했을 Slack 봇 연결, AI한테 하나씩 물어보며 끝까지 해본 기록

한 줄 요약

Hermes/OpenClaw 스터디 1주차 과제를 하면서, WSL에 설치된 Hermes Agent를 Slack에 연결해 제 봇인 mile을 슬랙 채팅창에서 @mile로 호출할 수 있게 만들었습니다. 혼자 했다면 중간에 포기했을 것 같은 설정들을 Hermes에게 계속 물어보며 하나씩 확인했고, 마지막에는 Slack에서 실제로 @mile이 응답하는 상태까지 만들었습니다.

이런 분들께 도움돼요

  • Hermes/OpenClaw를 설치했는데 “이제 뭘 확인해야 하지?”에서 막힌 분

  • Slack 봇, manifest, OAuth token, Socket Mode, .env가 한꺼번에 나와서 헷갈리는 분

  • WSL을 쓰고 있는데 파일 탐색기에서 Linux 파일을 어디서 열어야 하는지 모르겠는 분

  • AI 에이전트를 터미널이 아니라 Slack에서 부르고 싶은 분

  • 설정값을 감으로 바꾸기보다 실제 명령어와 확인 결과로 검증하고 싶은 분

시작점: 저는 정말 초보자 모드였다

처음 목표는 거창하지 않았습니다.

Hermes/OpenClaw 기반 에이전트 스터디 1주차 과제를 하면서, 먼저 제 컴퓨터에 뭐가 설치되어 있는지 확인하고 싶었습니다.

처음 Hermes에게 물어본 것도 이런 내용이었습니다.

내 목표는 Hermes/OpenClaw 기반 에이전트 스터디 1주차 과제를 하는 것이다.
먼저 내 현재 환경을 확인해 줘.

확인할 것:
1. Hermes 또는 OpenClaw가 설치되어 있는지
2. Claude Code 또는 Codex가 설치되어 있는지
3. 현재 작업 폴더가 어디인지
4. 과제 파일을 저장할 안전한 폴더를 어디로 잡으면 좋을지

주의:
- 추측하지 말고 실제 명령어와 파일 확인 결과를 기준으로 말해 줘.
- 토큰, API 키, .env 내용은 출력하지 마.

이때부터 제가 계속 붙잡고 간 원칙은 하나였습니다.

추측하지 말고, 실제 확인 결과를 보고 다음 단계로 가기

Hermes는 제 환경을 실제 명령어로 확인해줬습니다.

  • Hermes CLI가 설치되어 있는지

  • 버전이 무엇인지

  • 설정 파일 경로가 어디인지

  • Python 환경이 정상인지

  • .env 파일이 있는지

  • profile 구조가 어떻게 되어 있는지

예를 들어 확인된 내용은 이런 식이었습니다.

Hermes Agent v0.14.0
config path: /home/user/.hermes/config.yaml
.env path: /home/user/.hermes/.env

저는 여기서부터 이미 “아, 이걸 혼자 했으면 공식 문서랑 터미널 사이에서 계속 헤맸겠다”는 생각이 들었습니다.

처음 만든 것은 Slack 봇이 아니라 mile 프로필이었다

처음부터 Slack 봇을 만든 건 아니었습니다.

먼저 Hermes 안에서 별도 프로필을 만들고 싶었습니다. 기본 Hermes와 분리된, 제 일상 기록과 Slack 연결을 맡을 별도 에이전트 느낌의 프로필이 필요했습니다.

그래서 mile 프로필을 만들고, 그 안에 역할 문서도 정리했습니다.

확인된 경로는 다음과 같습니다.

/home/user/.hermes/profiles/mile/SOUL.md
/home/user/.hermes/profiles/mile/AGENTS.md
/home/user/.hermes/profiles/mile/memories/MEMORY.md

제가 직접 모든 구조를 외워서 만든 것은 아니고, Hermes에게 계속 물어봤습니다.

soul.md, agents.md, memory.md 파일 어디에 저장했는지 경로 알려줘.

이렇게 물으면 Hermes가 실제 파일을 찾아서 경로를 알려줬습니다.

이 과정이 좋았던 이유는, 제가 “대충 여기 있을 것 같은데?”라고 추측하지 않아도 됐기 때문입니다.

목표가 바뀌었다: 터미널 속 Hermes를 Slack에서 부르고 싶다

프로필을 만들고 나니 다음 욕심이 생겼습니다.

터미널에서만 쓰는 게 아니라 Slack에서 이렇게 부르고 싶었습니다.

@mile 안녕

처음엔 단순해 보였습니다.

“Slack 앱 하나 만들고 토큰 넣으면 되는 거 아닌가?”

그런데 실제로는 다음 개념들이 한꺼번에 나왔습니다.

  • Slack App

  • App Manifest

  • Bot User OAuth Token

  • App-Level Token

  • Socket Mode

  • OAuth scopes

  • Event Subscriptions

  • Hermes gateway

  • Hermes profile별 .env

  • systemd user service

저는 이 단어들이 한 번에 나오니까 꽤 막막했습니다.

그래서 다시 Hermes에게 말했습니다.

slack api 랑 cli 설정 해서 봇 토큰 생성 하고 워크스페이스에 설치까지 해줘

여기서부터는 거의 옆에서 튜터가 한 단계씩 잡아주는 느낌으로 진행했습니다.

1차 삽질: manifest는 만들었는데, 이걸 어디에 쓰는지 몰랐다

먼저 Hermes로 Slack manifest를 만들었습니다.

제가 입력한 명령은 이런 식이었습니다.

hermes --profile mile slack manifest --write

생성된 파일은 여기였습니다.

/home/user/.hermes/profiles/mile/slack-manifest.json

그다음 제가 한 말이 지금 보면 좀 초보자답습니다.

json 파일 복사하게 말해줘.

처음에는 “파일을 복사하는 명령어”가 필요한 줄 알았는데, 사실 제가 원한 건 Slack API 화면에 붙여넣을 JSON 내용이었습니다. 그래서 다시 말했습니다.

아니 텍스트를 복사할거야. 여기 채팅방에 알려줘.

결국 Hermes가 manifest 안에 어떤 내용이 들어 있는지 요약해줬습니다.

  • Slack 앱 이름은 처음에 Hermes로 들어가 있었음

  • /hermes, /new, /retry, /background, /goal 같은 slash command가 많이 포함되어 있었음

  • OAuth bot scopes가 들어 있었음

  • event subscription이 켜져 있었음

  • Socket Mode도 활성화되어 있었음

이때 알게 된 점은, Slack 앱 설정을 손으로 하나하나 누르는 대신 manifest가 앱 설정의 출발점 역할을 한다는 것이었습니다.

2차 삽질: .env 파일을 못 찾았다

Slack 앱에서 토큰을 만들고 나면 Hermes에 넣어야 합니다.

문제는 제가 .env 파일을 못 찾았다는 겁니다.

제가 실제로 물어본 말이 이거였습니다.

.env 파일 경로좀

Hermes가 확인해준 기본 .env 경로는 다음이었습니다.

/home/user/.hermes/.env

그런데 저는 파일 탐색기에서 이걸 못 찾았습니다.

그래서 다시 물어봤습니다.

못 찾겠어 ㅠㅠ slack bot token 어디다가 붙여넣으면 돼?

이 부분이 초보자 입장에서는 은근히 큰 벽이었습니다.

WSL에서는 Linux 경로가 /home/user/...처럼 보이지만, Windows 파일 탐색기에서는 일반적인 C드라이브 경로처럼 바로 보이지 않습니다. 게다가 .hermes처럼 앞에 점이 붙은 폴더는 숨김 폴더처럼 느껴져서 더 헷갈렸습니다.

나중에 정리된 파일 탐색기 접근 경로는 이런 식이었습니다.

\\wsl.localhost\Ubuntu\home\user\.hermes\profiles\mile\.env

이걸 알고 나니 “아, WSL 안의 파일도 파일 탐색기에서 열 수 있구나”가 이해됐습니다.

3차 삽질: default .env와 profile .env가 달랐다

처음에는 기본 Hermes의 .env만 보고 있었습니다.

하지만 Slack에 연결하려는 건 mile 프로필이었습니다.

그래서 실제로 토큰을 넣어야 하는 곳은 여기가 되어야 했습니다.

/home/user/.hermes/profiles/mile/.env

이 차이가 중요했습니다.

Hermes는 profile별로 독립된 home처럼 동작합니다. 그래서 default의 .env에 토큰이 있어도, mile 프로필의 .env에 없으면 mile gateway에서는 Slack이 설정되지 않은 것으로 보일 수 있습니다.

실제로 한때 확인 결과가 이렇게 나왔습니다.

Slack: not configured
SLACK_BOT_TOKEN: 없음
SLACK_APP_TOKEN: 없음

이때 결론은 명확했습니다.

Slack 앱 쪽 설정은 했지만,
Hermes mile 프로필의 .env 파일에는 아직 Slack 토큰이 없다.

혼자였다면 여기서 “왜 Slack에서 설치했는데 Hermes는 모른다고 하지?” 하고 꽤 오래 헤맸을 것 같습니다.

토큰은 이렇게 들어갔다

공개 글이라 실제 토큰은 절대 쓰지 않겠습니다.

구조만 보면 .env에는 이런 식으로 들어갑니다.

SLACK_BOT_TOKEN=xoxb-[REDACTED]
SLACK_APP_TOKEN=xapp-[REDACTED]
SLACK_ALLOWED_USERS=U...[REDACTED]

여기서 역할도 처음엔 헷갈렸습니다.

  • SLACK_BOT_TOKEN: Slack Web API를 호출하는 봇 토큰

  • SLACK_APP_TOKEN: Socket Mode 연결을 위한 app-level token

  • SLACK_ALLOWED_USERS: Slack에서 Hermes를 사용할 수 있는 사용자 제한

그리고 이때부터 토큰에 대한 원칙도 생겼습니다.

토큰은 채팅창에 붙여넣지 않는다.
.env 파일에만 넣는다.
공개 글에는 [REDACTED]로만 남긴다.

사실 중간에 한 번 토큰을 대화에 붙여넣는 실수를 했습니다. 그래서 Slack에서 Revoke All OAuth Tokens를 눌러 기존 토큰을 폐기하고, 새 토큰을 다시 받아 넣었습니다.

그 실수 덕분에 오히려 확실히 배웠습니다.

Revoke All OAuth Tokens는 앱을 지우는 버튼이 아니라, 기존 OAuth 토큰을 무효화하는 버튼입니다. 누르면 기존 xoxb-... 토큰은 더 이상 작동하지 않고, 새 토큰을 다시 받아 .env에 넣어야 합니다.

4차 삽질: 봇 이름을 바꿨는데도 계속 Hermes로 보였다

Slack 앱 설정 화면에서 봇 이름을 이렇게 바꿨습니다.

  • Display Name (Bot Name): Mile

  • Default username: mile

그리고 OAuth & Permissions에서 재설치도 했습니다.

그런데 Hermes가 Slack API로 확인해보니 한동안 계속 이렇게 나왔습니다.

auth.test user: hermes
users.info real_name: Hermes
bots.info name: Hermes

설정 화면에서는 Mile/mile로 보이는데, 실제 워크스페이스에 설치된 봇 유저는 여전히 Hermes/hermes였던 겁니다.

이때 정말 헷갈렸습니다.

제가 보기에는 분명히 바꿨는데, 확인 결과는 안 바뀌어 있었기 때문입니다.

결국 새 토큰 발급과 재설치 과정을 거친 뒤에야 Slack API 결과가 바뀌었습니다.

최종 확인은 이렇게 나왔습니다.

auth.test user: mile2
users.info name: mile2
users.info real_name: Mile
bots.info name: Mile

여기서 또 한 번 헷갈렸습니다.

API에는 mile2라고 나오는데, 실제 Slack에서는 @mile로 호출이 됐기 때문입니다.

결론은 이렇습니다.

Slack API 내부 username: mile2
Slack에서 실제 호출: @mile
봇 표시 이름: Mile

Slack이 내부 username 충돌을 피하려고 mile2를 붙였지만, UI에서는 @mile 멘션이 정상 매칭되는 상태로 보입니다.

gateway 재시작과 최종 확인

토큰을 바꾼 뒤에는 gateway를 재시작해야 했습니다.

systemctl --user restart hermes-gateway-mile.service

그리고 mile 프로필 기준으로 gateway 상태를 확인했습니다.

hermes --profile mile gateway list

정상 상태는 이렇게 보였습니다.

Gateways:
  ✗ default                  — not running
  ✓ mile (current)           — PID ...

여기서도 배운 점이 있습니다.

그냥 hermes gateway list를 치면 default 프로필 기준으로 보여서 헷갈릴 수 있습니다. mile 프로필을 확인하려면 꼭 이렇게 봐야 했습니다.

hermes --profile mile gateway list

이 작은 차이가 디버깅 시간을 꽤 줄여줬습니다.

최종 결과

결국 최종 상태는 이렇게 정리됐습니다.

  • Hermes 프로필: mile

  • gateway 서비스: hermes-gateway-mile.service

  • Slack workspace: Nile

  • Slack 봇 표시 이름: Mile

  • Slack 실제 호출: @mile

  • Slack API 내부 username: mile2

  • gateway 상태: 정상 실행 중

Slack에서는 이렇게 호출할 수 있게 됐습니다.

두 사람의 대화 스크린샷

처음에는 터미널 안에서만 쓰던 Hermes가, 이제 Slack에서 부르면 응답하는 개인 에이전트처럼 느껴졌습니다.

Before vs After

Before:

  • Hermes가 설치되어 있는지는 알겠는데 어디까지 설정된 건지 불명확했음

  • Slack 앱, token, manifest, .env, gateway가 서로 어떻게 이어지는지 몰랐음

  • WSL 파일을 Windows 파일 탐색기에서 어떻게 열어야 하는지도 헷갈렸음

  • Slack 설정 화면에서 이름을 바꿨는데 실제 봇 이름이 왜 안 바뀌는지 몰랐음

  • 오류가 나면 “내가 뭘 잘못했지?”부터 생각했음

After:

  • mile 프로필의 Slack gateway를 systemd 서비스로 실행할 수 있게 됨

  • Slack에서 @mile로 Hermes를 호출할 수 있게 됨

  • profile별 .env가 따로 있다는 걸 이해함

  • Slack API 결과로 실제 봇 identity를 검증하는 방법을 알게 됨

  • 토큰은 반드시 .env에만 넣고, 채팅/문서에는 남기지 않는 습관이 생김

  • 문제가 생기면 서비스 상태 → 프로필 기준 확인 → 토큰 존재 여부 → Slack API identity → Slack UI 호출 순서로 점검할 수 있게 됨

제가 실제로 배운 것

1. AI에게 “다 해줘”보다 “확인해줘”가 더 중요했다

이번 작업에서 제일 도움이 됐던 건 Hermes가 대신 명령어를 알려준 것보다, 매 단계마다 실제 상태를 확인해준 점이었습니다.

예를 들면 이런 식입니다.

Slack이 연결됐는지 확인해줘.
.env 파일 경로 알려줘.
지금 gateway가 어떤 profile로 떠 있는지 확인해줘.
이 token이 어떤 봇을 가리키는지 확인해줘.

혼자였다면 Slack 화면에서 바뀐 것처럼 보이는 값을 믿고 넘어갔을 것 같습니다. 그런데 실제 API 결과를 보니 아직 예전 봇으로 남아 있는 경우가 있었습니다.

2. 초보자에게 파일 경로는 생각보다 큰 장벽이다

/home/user/.hermes/.env라는 경로를 들으면 개발자에게는 익숙할 수 있지만, 저는 파일 탐색기에서 어디를 열어야 하는지부터 막혔습니다.

WSL 경로와 Windows 파일 탐색기 경로가 다르게 보인다는 것도 이번에 체감했습니다.

이런 경로를 알게 된 게 실전적으로 도움이 됐습니다.

\\wsl.localhost\Ubuntu\home\user\.hermes\profiles\mile\.env

3. profile을 쓰면 설정도 profile별로 봐야 한다

mile 프로필로 gateway를 실행한다면, default Hermes가 아니라 mile 프로필의 설정과 .env를 봐야 합니다.

앞으로도 Hermes에서 여러 프로필을 쓴다면 이 원칙은 계속 중요할 것 같습니다.

프로필이 다르면 config도, .env도, memory도, gateway도 따로 본다.

4. 토큰은 한 번 노출되면 폐기하는 게 맞다

중간에 토큰을 잘못 붙여넣은 건 아찔했습니다.

하지만 그 덕분에 revoke의 의미도 확실히 알게 됐습니다.

  • Revoke All OAuth Tokens는 앱 삭제가 아님

  • 기존 OAuth 토큰을 무효화하는 것

  • 새 토큰을 다시 받아 .env에 넣어야 함

  • gateway 재시작이 필요함

앞으로는 토큰을 절대 채팅창에 붙여넣지 않을 생각입니다.

다음에 같은 작업을 한다면 이렇게 할 것 같다

다음에 또 Slack 봇을 연결한다면, 저는 처음부터 이렇게 진행할 것 같습니다.

  1. 먼저 Hermes profile을 정한다.

  2. 해당 profile의 .env 경로를 확인한다.

  3. Slack manifest를 만들고 앱 설정에 반영한다.

  4. Bot User OAuth Token과 App-Level Token을 만든다.

  5. 토큰은 채팅에 쓰지 말고 .env에 직접 넣는다.

  6. gateway를 재시작한다.

  7. hermes --profile [프로필명] gateway list로 확인한다.

  8. Slack API에서 실제 bot name과 username을 확인한다.

  9. 마지막으로 Slack UI에서 직접 @봇이름을 입력해본다.

마무리

이번 작업은 단순히 Slack 봇 하나 연결한 일이 아니었습니다.

저에게는 “AI 에이전트와 같이 환경 설정을 해본 경험”에 가까웠습니다.

혼자였다면 아마 여기저기 문서를 열어놓고, Slack 설정 화면과 WSL 경로와 터미널 명령어 사이에서 많이 헤맸을 것 같습니다. 특히 .env 파일을 못 찾았던 순간, manifest JSON을 어디에 붙여넣는지 헷갈렸던 순간, 봇 이름을 바꿨는데도 계속 Hermes로 보이던 순간은 혼자였으면 꽤 막막했을 것 같습니다.

그런데 이번에는 막힐 때마다 이렇게 물었습니다.

이거 어디에 넣어?
지금 연결된 거 맞아?
왜 아직 Hermes로 보여?
재시작해줘.
다시 확인해줘.

그리고 Hermes는 매번 실제 명령어와 API 확인 결과를 기준으로 다음 단계를 잡아줬습니다.

결과적으로 지금은 Slack에서 @mile을 부르면 제 WSL 안의 Hermes Agent가 응답합니다.

작은 연결 하나지만, 저한테는 “아, 이제 진짜 에이전트를 내 작업 환경에 붙일 수 있겠구나”라는 느낌을 준 실습이었습니다.

1
1개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.