Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
120 lines (115 loc) · 4.87 KB
/
Copy pathdocker-compose.yml
File metadata and controls
120 lines (115 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Raven — Docker Compose (4 진입점 일괄, one command).
# v0.7.16+: 'version' 키 제거 (Docker Compose v2 deprecated).
# v0.7.36+: 이미지 태그를 GIT SHA로 핀 (코드 변경 후 stale 캐시로 인한
# `templates/system/AGENTS.md` 등 옛 리소스를 컨테이너가 참조하는 사고 차단).
#
# 사용법:
# docker compose build --build-arg GIT_SHA=$(git rev-parse --short HEAD)
# docker compose up -d # 위 build 결과의 새 이미지로만 기동
# docker compose down # stop + remove containers
# docker compose logs -f api # 로그 follow
#
# 외부 접속 (.env에서 HOST=0.0.0.0 권장):
#
# 인증 (Issue #14/#24/#26/#67): API와 MCP(mcp-http)는 **모든 출처**(컨테이너 안 loopback 포함)에
# Bearer 토큰을 요구한다. 포트 매핑을 거친 호스트 요청, dashboard 컨테이너, 같은 망의 다른
# 컨테이너 모두 토큰이 필요하다.
# 1) 토큰 발급: docker compose exec api python -m raven.cli mcp token add <이름>
# 2) 브라우저: http://<host>:5173 → 로그인 화면에 토큰 입력 (HttpOnly 쿠키로 보관,
# dashboard 프록시가 /api 요청마다 Bearer로 실어 보낸다)
# 3) 그 외 클라이언트(모바일, MCP 클라이언트 등): Authorization: Bearer <token>
# (MCP 클라이언트 설정의 "headers" 또는 `claude mcp add ... --header`)
# healthcheck는 토큰이 필요 없는 `GET /healthz`(본문 `{"ok":true}` 고정, vault·토큰 정보 없음)를
# `curl -f`로 부른다 — 401/403/500은 실패로 친다. 인증된 API 접근과는 별개다(#67).
# http://<host>:8765 # API
# http://<host>:8766/mcp # MCP HTTP
# http://<host>:5173 # Dashboard
#
# MCP stdio는 docker exec -it raven-api / docker-entrypoint.sh mcp-stdio
x-raven-image: &raven_image
build:
context: .
dockerfile: Dockerfile
args:
GIT_SHA: ${GIT_SHA:-latest}
# v0.7.36+: 이미지 태그를 GIT SHA로 핀. 코드 변경 후 stale 캐시로 인한
# `templates/system/AGENTS.md` 등 옛 리소스를 컨테이너가 참조하는 사고 차단.
# 병렬 빌드 시 동일 태그 충돌 회피는 README의 sequential build 절차로 해결.
image: raven:${GIT_SHA:-latest}
services:
api:
<<: *raven_image
container_name: raven-api
command: ["api"]
env_file:
- .env
# v0.7.20+: WIKI_VAULTS_DIR 환경변수 명시 (registry.py가 읽는 이름)
# - 컨테이너 안에서는 mount target (/vaults) 사용해야 함
# - RAVEN_VAULTS_DIR은 호스트 경로 (mount source)
environment:
- WIKI_VAULTS_DIR=/vaults
# Issue #14: 컨테이너 안의 0.0.0.0 bind를 명시적으로 허용한다 (포트 매핑이 닿으려면
# 필요). 노출 범위는 아래 ports가 정하고, 토큰 게이트는 그대로 적용된다.
- RAVEN_ALLOW_REMOTE=1
ports:
- "${PORT_API}:8765"
volumes:
# ──────────────────────────────────────────────────────────────
# v0.7.14+: vault 영속성 보장 (bind mount, 컨테이너 down/up 안전)
# ──────────────────────────────────────────────────────────────
# 1) 사용자 vault 외부 경로 ~/Raven → 컨테이너 /vaults
# → content/ + .vault.json + wiki.db + .mcp/ + backups/ + logs/
# → 마운트된 호스트 디렉토리에 영속. 컨테이너 재시작해도 보존.
# 2) 다른 PC에서도 호스트의 동일 경로를 mount하면 동일하게 동작.
- ${RAVEN_VAULTS_DIR}:/vaults
working_dir: /vaults
networks:
- raven-net
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8765/healthz"]
interval: 30s
timeout: 5s
retries: 3
mcp-http:
<<: *raven_image
container_name: raven-mcp-http
command: ["mcp-http"]
env_file:
- .env
# v0.7.20+: WIKI_VAULTS_DIR 명시 (mount target /vaults)
environment:
- WIKI_VAULTS_DIR=/vaults
ports:
- "${PORT_MCP_HTTP}:8766"
volumes:
# v0.7.14+: vault 영속성 (api 서비스와 동일 mount)
- ${RAVEN_VAULTS_DIR}:/vaults
working_dir: /vaults
networks:
- raven-net
depends_on:
- api
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8766/healthz"]
interval: 30s
timeout: 5s
retries: 3
dashboard:
<<: *raven_image
container_name: raven-dashboard
command: ["dashboard"]
env_file:
- .env
ports:
- "${PORT_DASHBOARD}:5173"
networks:
- raven-net
depends_on:
- api
- mcp-http
restart: unless-stopped
networks:
raven-net:
driver: bridge