You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
1 week ago | |
|---|---|---|
| deploy | 1 week ago | |
| internal | 2 weeks ago | |
| .env.example | 2 weeks ago | |
| .gitignore | 2 weeks ago | |
| CLAUDE.md | 2 weeks ago | |
| Dockerfile | 2 weeks ago | |
| Jenkinsfile | 1 week ago | |
| Makefile | 2 weeks ago | |
| README.md | 2 weeks ago | |
| docker-compose.yml | 2 weeks ago | |
| go.mod | 2 weeks ago | |
| go.sum | 2 weeks ago | |
| main.go | 2 weeks ago | |
README.md
slack-notifier
Gitea webhook · Notion webhook 알림을 받아 담당자에게 Slack 개인 DM으로 보내는 중계 서버.
- 담당자 매핑: 이메일 자동 매칭(Gitea/Notion 이메일 → Slack
users.lookupByEmail) + 수동 매핑 보강(관리 페이지) - 스택: Go + Gin (저사양 환경 대응, 단일 정적 바이너리), 관리 UI는 html/template + HTMX
[Gitea] ──webhook──┐
├─▶ slack-notifier ─▶ (매핑 해석) ─▶ users.lookupByEmail ─▶ chat.postMessage(DM)
[Notion] ─webhook──┘ (서명검증) 자동+수동 이메일→Slack ID
빠른 시작 (로컬)
Go는 mise로 관리합니다 (mise use go@1.26).
cd slack-notifier
cp .env.example .env # 값 채우기
go run . # 기본 :8000
- 헬스체크:
curl localhost:8000/health - 관리 페이지: 브라우저로
http://localhost:8000/admin/mappings - 테스트:
go test ./... - 빌드:
go build -o slack-notifier .
Docker:
docker compose up --build # distroless 기반 경량 이미지
엔드포인트
| 메서드 | 경로 | 설명 |
|---|---|---|
| GET | /health |
헬스체크 |
| POST | /webhooks/gitea |
Gitea webhook 수신 |
| POST | /webhooks/notion |
Notion webhook 수신 (+ 최초 검증 핸드셰이크) |
| GET | /admin/mappings |
유저 매핑 관리 페이지 |
| POST | /admin/mappings |
매핑 추가 (HTMX) |
| DELETE | /admin/mappings/:source |
매핑 삭제 (HTMX) |
담당자 매핑
- 자동(이메일): Gitea/Notion 이벤트의 이메일을 그대로 Slack에서 조회.
- 수동(오버라이드):
/admin/mappings에서소스(이메일 또는 로그인) → Slack 이메일을 등록. 시스템 간 이메일이 다르거나 자동 조회가 안 될 때 보강.data/mappings.json에 저장됨. - 그래도 못 찾으면
DEFAULT_SLACK_CHANNEL로 fallback(설정 시), 없으면 skip.
Slack 앱 준비
- https://api.slack.com/apps 에서 앱 생성 → Bot Token Scopes:
chat:write,users:read.email,im:write - 워크스페이스에 설치 후 Bot User OAuth Token(
xoxb-...)을SLACK_BOT_TOKEN에 설정
Gitea 설정
저장소/조직 → Settings → Webhooks → Add Webhook (Gitea)
- Target URL:
https://<배포주소>/webhooks/gitea - Secret:
GITEA_WEBHOOK_SECRET와 동일하게 입력 (HMAC-SHA256 서명 검증)
처리하는 이벤트 → 담당자:
| 이벤트 | 알림 대상 |
|---|---|
PR assigned / opened / reopened |
담당자(assignees) |
PR review_requested |
리뷰어 |
PR closed(merged) |
PR 작성자 |
| PR review 등록 | PR 작성자 |
이슈 assigned |
담당자 |
| 이슈/PR 댓글 | 담당자 + 작성자 (댓글 단 본인 제외) |
그 외 이벤트(예: push)는 기본 무시. 필요하면
internal/gitea/gitea.go에 핸들러를 추가하세요.
Notion 설정
- Integration 생성 →
NOTION_API_TOKEN설정, 대상 DB/페이지에 integration 연결(공유) - Notion Webhook subscription 생성 → endpoint
https://<배포주소>/webhooks/notion - 최초 구독 시 Notion이
verification_token을 POST → 서버 로그에 출력됨 →NOTION_VERIFICATION_TOKEN에 넣고 재시작 - 담당자는 페이지의 People 속성(이름은
NOTION_ASSIGNEE_PROPERTY, 기본담당자)에서 읽어 이메일로 매핑
저사양 배포 메모
- 단일 정적 바이너리(distroless 이미지 ~10MB대), idle 메모리 수십 MB 수준.
- 메모리가 빠듯하면
GOMEMLIMIT=200MiB등으로 상한을 줄 수 있음(README/.env.example참고). - webhook 수신을 위해 외부 접근 가능한 HTTPS 엔드포인트 필요. 로컬 테스트는
ngrok http 8000같은 터널 사용.