수업 #14 — 이 고양이, 밖에서도 일합니다

Source: bbojjak-viewer.vercel.app/lessons/lesson-14 Type: article By: 뽀짝이 / 뽀짝이의 서재 (지피터스 AI스터디) Valid as of: 2026-04-28

Key Insight

Gateway = 단일 장수명 프로세스. 포트 하나에서 Slack·텔레그램·웹훅·크론잡을 전부 멀티플렉싱으로 처리하며, 채널별 세션 생성·분배의 실제 주체다. Tailscale이 loopback 바인딩된 Gateway를 인터넷에서 안전하게 접근 가능하게 한다.

핵심 Takeaway

  • Gateway = 단일 장수명 프로세스: “모든 메시징 표면을 소유”하는 데몬. 포트 하나(기본 18789)에서 WebSocket·HTTP API·웹훅·WebChat·크론잡 전부 멀티플렉싱. 채널별 세션 생성·분배의 실제 주체 (출처: “Gateway가 뭔데?” 섹션)
  • 멀티채널 라우팅 구현체: 수업 6에서 배운 “세션이 채널별로 만들어진다”가 Gateway가 담당. Slack 메시지 → Slack 세션 / 텔레그램 → 텔레그램 세션 분배 (출처: “Gateway가 뭔데?” 섹션)
  • Tailscale Serve/Funnel: loopback 바인딩된 Gateway를 외부 접근 가능하게 함. Serve = tailnet 전용·신분증 인증·비밀번호 불필요, Funnel = 인터넷 공개·비밀번호 필수. openclaw.json tailscale.mode: "funnel" 설정으로 재시작 후에도 자동 유지 (출처: “Tailscale” / “Funnel 삽질기” 섹션)
  • 보안 4중 잠금: HTTPS(TLS 자동관리) + 인증 토큰 + 에이전트 ID 제한 + 세션 키 프리픽스 제한 (출처: “Tailscale” 섹션)
  • 포트 불일치 함정 교훈: Funnel 포트(18789)가 실제 Gateway 포트(44350)와 달라 웹훅이 허공에 사라짐. 수동 삽질 전 설정 파일 먼저 확인. --bg Funnel은 재시작 후 사라짐 → openclaw.json으로 해결 (출처: “Funnel 삽질기” 섹션)

상세 요약

Gateway 아키텍처

Gateway는 macOS launchd가 관리하는 데몬 프로세스. 충돌 시 자동 재시작. 365일 24시간 대기.

외부 채널들
  Slack ──────┐
  텔레그램 ───┤
  웹훅 ───────┼──→ Gateway (포트 18789) ──→ 에이전트 → 응답
  WebChat ────┤      멀티플렉싱
  크론잡 ─────┘

“포트 하나, 프로세스 하나” 원칙. Slack용·텔레그램용 서버를 따로 운영하는 게 아니다.

채널톡 CS 파이프라인 진화

이전: 고객 → 채널톡 → n8n 처리 → Slack 알림
이후: 고객 → 채널톡 → n8n → Gateway /hooks/agent → 에이전트 직접 처리

Gateway의 /hooks/agent 엔드포인트가 외부 POST를 받아 에이전트에게 전달하는 우체통 역할.

Tailscale 통합 구조

인터넷 (n8n 클라우드)
    ↓ HTTPS POST
Tailscale Funnel (공개 URL)
    ↓ HTTPS 터널
Mac mini 로컬호스트
    ↓ HTTP (내부)
Gateway (포트 44350)
    ↓
에이전트

Gateway는 인터넷에 직접 노출되지 않음. Tailscale이 안전한 터널 역할.

openclaw.json 설정으로 Funnel 자동화

{
  "tailscale": {
    "mode": "funnel"
  }
}

이 한 줄로 Gateway 시작 시 Tailscale Funnel이 자동 실행됨. --bg 수동 실행의 “재시작 후 사라짐” 문제 해결.

집사(사용자) 접속 4가지 경로

접속 방식용도Tailscale 필요
Slack기본 대화, 어디서든❌ (별도 채널)
텔레그램모바일 빠른 지시❌ (별도 채널)
WebChat (로컬)로컬 브라우저 접속
WebChat (원격)카페·해외에서 HTTPS 접속✅ (Funnel/Serve)

연결되는 위키 페이지