-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
399 lines (389 loc) · 24.9 KB
/
Copy pathdocker-compose.yml
File metadata and controls
399 lines (389 loc) · 24.9 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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
# 本番用。イメージは GitHub Actions(.github/workflows/ci.yml)が main への push で
# ビルドし GHCR へ公開する(amd64 / arm64)。本番ではビルドせず pull するだけ:
#
# docker compose pull && docker compose up -d
#
# 障害時は :latest ではなく :sha-xxxxxxx を指定すれば任意の時点に戻せる
# (CHIEZO_APP_IMAGE / CHIEZO_INGEST_IMAGE で上書き可)。
#
# このファイルは検索 API・MCP としての Chiezo だけ(chiezo-app + chiezo-trigger +
# chiezo-ingest)。足すものは上書きファイルを重ねる。どれも数行〜数十行で、
# 重ねる順は下の並びどおり(後のファイルが勝つ):
#
# docker-compose.build.yml 手元でビルドして :local タグで動かす(本番は pull)
# docker-compose.llm.yml 推論サーバ(chiezo-llm)
# docker-compose.llm.cuda.yml その推論を NVIDIA の GPU で動かす(llm に重ねる)
# docker-compose.comfyui.yml 絵と音の生成(ComfyUI)。これ自体が NVIDIA 前提
# docker-compose.lan.yml GPU の要るものを LAN の別ホストへ公開する
#
# ファイル名は中身のコンテナに合わせてある(profile も同じ名前)。
# 使い分けは docs/operations.md、「答える」層は docs/ai.md が正。
# 取り込み系コンテナ共通のリソース制限(YAML アンカー)。cpu_shares は「良き隣人」のための
# 相対ウェイト(既定 1024 の半分)。CPU が競合したときだけ他のコンテナへ譲り、空いていれば
# 全力で使える。ハード上限の cpus は使わない — CPU CFS スケジューラのバンド幅制御を
# 無効にしたカーネルではコンテナ作成自体が失敗するため。
# メモリの上限(mem_limit)はあえて課さない。取り込みは潤沢メモリのマシンで回す前提で、
# 逆に上限で締めると OOM killer が構築を殺してしまう(以前 1GiB で締めたら osm のノード座標
# インデックスが入りきらず落ちた)。「メモリが足りる環境でだけ実行する」判断は、コンテナ上限では
# なく ingest 側のプリフライト検査(main.py の require_build_memory / adapter.min_build_memory_gb)で
# 行う。足りなければ構築を始める前に明示的に SystemExit する。8GB 級の共有ホストでは重い取り込みは
# そもそも実行拒否され、成果物の .db は別マシンで焼いて配布する(docs/operations.md「別マシンでビルドして .db を配布する」参照)。
x-ingest-limits: &ingest-limits
cpu_shares: 512
services:
# data/ の下に corpus/・notes/・state/ を作り、所有者を実行ユーザーに合わせる
# ワンショット。corpus も chown する —— 取り込み側(trigger / ingest)が書くため。
# app が壊さない保証は所有者ではなく、app 側だけ corpus を read-only で重ねることで作る。
# バインドするホストのディレクトリは data/ 1つだけにして、
# 中の切り分けはこちらが持つ —— bind 先がホストに無いと Docker が root 所有で
# 作ってしまい、非 root で動く app がメモも設定も書けずに落ちる。
# app も ingest もこれの完了を待つので、いちばん先に置いてある。
# mkdir と chown だけなので、小さな汎用イメージを使う(手元ビルドの構成でも
# GHCR を引きに行かせないため)
chiezo-init:
image: alpine:3.24
user: root
entrypoint:
- sh
- -c
- mkdir -p /data/corpus /data/notes /data/state && chown -R "$$0" /data
- ${CHIEZO_UID:-10001}:${CHIEZO_GID:-10001}
volumes:
- ./data:/data
restart: "no"
chiezo-app:
image: ${CHIEZO_APP_IMAGE:-ghcr.io/rtcode337/chiezo-app:latest}
ports:
# host:container。8000 は他のアプリと衝突しやすいので避けている。
- "7010:7010"
volumes:
# バインドするホストのディレクトリは data/ 1つだけ。下が corpus/(取り込んだ
# 本体)・notes/(短期記憶)・state/(管理画面の設定)で、作るのは chiezo-init。
- ./data:/data
# corpus だけは読み取り専用で重ねる。 app は読むだけで、書くのは ingest 側
# (取り違えて壊さないための線引きを、同じ 1 本の置き場のまま保つ)
- ./data/corpus:/data/corpus:ro
# 実行ユーザー。既定は 10001 = ホストに実在しない番号(抜け出されてもホストの
# ユーザーのファイルには届かない)。data/ をホストから直接編集・書き戻ししたい
# ときだけ .env の CHIEZO_UID / CHIEZO_GID に `id -u` / `id -g` を入れる
user: "${CHIEZO_UID:-10001}:${CHIEZO_GID:-10001}"
environment:
# 走査するのは corpus/ だけ。 notes を同じ場所に置くと、メモを 1 件書くたびに
# jawiki 150 万件の COUNT が走る(app/main.py の data_dir_fingerprint 参照)
- CHIEZO_DATA_DIR=/data/corpus
# 「覚える」層(/v1/notes)。空にすると機能ごと無効になる。
- CHIEZO_NOTES_DIR=/data/notes
# 管理画面の初期化ボタンから叩く chiezo-trigger の内部 URL(ホストには公開しない)。
# 「集める」層(app/collect.py)にも要る —— 集めるのも焼くのも取り込みの中で
# 起きるので、取り込みを起こせない面では収集そのものが成り立たない
- CHIEZO_TRIGGER_URL=http://chiezo-trigger:8080
# 本体の調整(どれも既定のままなら書かなくてよい。空文字なら既定に倒れる)。
# /data の再走査間隔(秒)・ソースカタログのキャッシュ(秒)・/mcp の Host 検証。
- CHIEZO_RESCAN_INTERVAL=${CHIEZO_RESCAN_INTERVAL-}
- CHIEZO_CATALOG_TTL=${CHIEZO_CATALOG_TTL-}
- CHIEZO_MCP_ALLOWED_HOSTS=${CHIEZO_MCP_ALLOWED_HOSTS-}
# 「答える」層(/v1/ask・/ai/chat)。話す相手は管理画面(/admin)から on/off する ——
# 同居の推論サーバも Gemini も OpenRouter も CLI ブリッジも同じ扱いで、URL は
# app/providers.py に決め打ち。ユーザーが入れるのは API キーと on/off と
# モデルだけで、保存先が下の CHIEZO_STATE_DIR。
# 推論サーバのコンテナは docker-compose.llm.yml にある(検索エンジンはこのファイル)。
- CHIEZO_STATE_DIR=/data/state
# 推論サーバを別マシンで動かしている場合だけ、その URL を書く。
# 同居(chiezo-llm)なら書かなくてよい —— コンテナ名で辿り着けるので決め打ちが効く。
# これは「相手を増やす設定」ではなく、辿り着けない相手のための逃げ道。
- CHIEZO_LLM_URL=${CHIEZO_LLM_URL-}
- CHIEZO_ANSWER_TIMEOUT=${CHIEZO_ANSWER_TIMEOUT-}
- CHIEZO_ANSWER_DOCS=${CHIEZO_ANSWER_DOCS-}
- CHIEZO_ANSWER_MAX_CHARS=${CHIEZO_ANSWER_MAX_CHARS-}
# agent モード(mode=agent)の上限。既定のままなら書かなくてよい。
- CHIEZO_AGENT_MAX_STEPS=${CHIEZO_AGENT_MAX_STEPS-}
- CHIEZO_AGENT_TOOL_CHARS=${CHIEZO_AGENT_TOOL_CHARS-}
- CHIEZO_AGENT_TIMEOUT=${CHIEZO_AGENT_TIMEOUT-}
# 会話画面・API の既定(素の既定は rag + grounded=1。潤沢な環境なら agent + 0 に倒せる)。
- CHIEZO_ASK_DEFAULT_MODE=${CHIEZO_ASK_DEFAULT_MODE-}
- CHIEZO_ASK_DEFAULT_GROUNDED=${CHIEZO_ASK_DEFAULT_GROUNDED-}
# web 検索(既定では無効。URL を設定したときだけ agent の道具に加わる)。
# 画像生成(MCP の image_generate)。置き場が無ければ道具ごと出さない。
# 既定は状態ディレクトリの下(compose が既にマウントしている)なので、
# 通常は何も書かなくてよい。GPU が別マシンなら CHIEZO_IMAGE_URL でその ComfyUI を指す
- CHIEZO_MEDIA_DIR=${CHIEZO_MEDIA_DIR-}
- CHIEZO_MEDIA_KEEP_DAYS=${CHIEZO_MEDIA_KEEP_DAYS-}
- CHIEZO_IMAGE_URL=${CHIEZO_IMAGE_URL-}
- CHIEZO_IMAGE_TIMEOUT=${CHIEZO_IMAGE_TIMEOUT-}
- CHIEZO_WEB_SEARCH_URL=${CHIEZO_WEB_SEARCH_URL-}
- CHIEZO_WEB_SEARCH_PROVIDER=${CHIEZO_WEB_SEARCH_PROVIDER-}
- CHIEZO_WEB_SEARCH_API_KEY=${CHIEZO_WEB_SEARCH_API_KEY-}
- CHIEZO_WEB_SEARCH_RESULTS=${CHIEZO_WEB_SEARCH_RESULTS-}
- CHIEZO_WEB_SEARCH_TIMEOUT=${CHIEZO_WEB_SEARCH_TIMEOUT-}
# 「集める」層が 1 回で焼ける素材の大きさ(バイト。既定 192 MB)。
# **地図辞典から国ぶんの名簿を作るときだけ要る** —— 1 件は住所・電話・サイトまで
# 運ぶと 474 バイト(実測)あり、60 万件なら 280 MB を超える。超えると焼かずに
# 断るので、足りなければここを上げる(素材は 1 本の文字列で組むため、
# 上げたぶんはそのままメモリに載る)
- CHIEZO_COLLECT_MAX_MATERIAL_BYTES=${CHIEZO_COLLECT_MAX_MATERIAL_BYTES-}
depends_on:
# 置き場の用意(chiezo-init)が済んでから起動する。
# trigger には依存させない —— あれは長期記憶へ書き込むとき(初期化・再構築・固化)
# だけの相手で、読むだけなら要らない。ここに書くと、取り込みを一切しない使い方でも
# 立ち上げることになる。居なければ管理画面がそのぶんのボタンを押せなくする。
chiezo-init:
condition: service_completed_successfully
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fs", "http://localhost:7010/healthz"]
interval: 60s
# やること(タスク・ルール)。**外に出すのはこれだけ。**
#
# chiezo-app と同じイメージで、command だけ差し替えて別のアプリを起動する。
# 面をプロセスごと分けてあるのは、本体を公開すると サーバー側の鍵で AI を叩く口・
# 課金の走る生成の口・取り込みを起こせる管理画面・メモを消せる口まで一緒に外へ
# 出てしまうため(docs/tasks.md)。
#
# **GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET / ALLOWED_EMAIL を入れるまで
# /api は 401 を返し続ける。** 設定が無いときに素通しすると外に出した瞬間に
# 丸見えになるので、足りないときは閉じる側に倒してある。
chiezo-tasks:
image: ${CHIEZO_APP_IMAGE:-ghcr.io/rtcode337/chiezo-app:latest}
# --proxy-headers を付けるのは、リバースプロキシの後ろで client の IP と
# scheme を正しく見るため。**--forwarded-allow-ips に信頼できるプロキシを
# 指定すること** —— 既定(127.0.0.1)のままだと別コンテナのプロキシからの
# ヘッダが無視され、レート制限のキーがプロキシ 1 つに潰れる
command:
- uvicorn
- app.tasks_app:app
- --host
- "0.0.0.0"
- --port
- "7015"
- --proxy-headers
- --forwarded-allow-ips
- ${CHIEZO_TASKS_FORWARDED_ALLOW_IPS:-127.0.0.1}
ports:
- "7015:7015"
volumes:
# notes は本体と同じ実体を見る(WAL なので別プロセスから書ける)。
# corpus は要らない —— この面は知識ベースを引かない
- ./data:/data
user: "${CHIEZO_UID:-10001}:${CHIEZO_GID:-10001}"
environment:
- CHIEZO_NOTES_DIR=/data/notes
- CHIEZO_STATE_DIR=/data/state
# ログインを許す Google アカウント 1 件と、その資格情報。
# 3 つとも揃わないと /api は 401 のまま(素通しはしない)
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID-}
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET-}
- ALLOWED_EMAIL=${ALLOWED_EMAIL-}
# 公開 URL。リダイレクト URI をここから組む(最優先)。
# 設定しない場合は ALLOWED_REDIRECT_HOSTS でホストを許可リストにする
- PUBLIC_BASE_URL=${PUBLIC_BASE_URL-}
- ALLOWED_REDIRECT_HOSTS=${ALLOWED_REDIRECT_HOSTS-}
- LOGIN_RATE_LIMIT_PER_MINUTE=${LOGIN_RATE_LIMIT_PER_MINUTE-}
# 認証を通さない開発モード。**本番では絶対に立てない**(既定は false)
- CHIEZO_TASKS_DEV=${CHIEZO_TASKS_DEV-}
depends_on:
chiezo-init:
condition: service_completed_successfully
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fs", "http://localhost:7015/healthz"]
interval: 60s
# 管理画面からの「未初期化データの初期化」を受けて ingest を実行する内部専用トリガー。
# ingest イメージを流用し、CMD だけ server:app(FastAPI)起動に上書きする。
# ホストへポート公開せず、chiezo-app からのみ docker 内部ネットワーク経由で到達できる。
chiezo-trigger:
image: ${CHIEZO_INGEST_IMAGE:-ghcr.io/rtcode337/chiezo-ingest:latest}
command: ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]
depends_on:
chiezo-init:
condition: service_completed_successfully
volumes:
- ./data:/data
user: "${CHIEZO_UID:-10001}:${CHIEZO_GID:-10001}"
environment:
- CHIEZO_DATA_DIR=/data/corpus
# 固化(短期記憶 → 長期記憶)の素材を取りに行く先。**組み込みのソースなので
# 設定は要らない** —— サービス名で届くこの既定のまま使う。配信側を別ホストで
# 動かしている構成でだけ書き換える。
- CHIEZO_APP_URL=${CHIEZO_APP_URL:-http://chiezo-app:7010}
# 別コンテナのソースプラグインを使うときだけ、その URL をカンマ区切りで並べる
# (固化はプラグインではなく組み込みなので、ここに書く必要は無い)。
- CHIEZO_PLUGIN_SOURCES=${CHIEZO_PLUGIN_SOURCES-}
restart: unless-stopped
# トリガー経由の取り込みが暴走しても、OOM killer がホスト全体(同居する
# 他のコンテナ)を巻き込まないよう上限を設ける。取り込み本体と同じ *_LIMITS。
<<: *ingest-limits
healthcheck:
test: ["CMD", "curl", "-fs", "http://localhost:8080/healthz"]
interval: 60s
chiezo-ingest:
image: ${CHIEZO_INGEST_IMAGE:-ghcr.io/rtcode337/chiezo-ingest:latest}
profiles: ["ingest"]
depends_on:
chiezo-init:
condition: service_completed_successfully
volumes:
- ./data:/data
user: "${CHIEZO_UID:-10001}:${CHIEZO_GID:-10001}"
environment:
# 取り込むソース。`-e SOURCE=memory` にすると固化(短期記憶 → 長期記憶)が走る
- SOURCE=${SOURCE:-jawiki}
- CHIEZO_DATA_DIR=/data/corpus
# 固化の素材を取りに行く先(組み込みソースなので通常は既定のまま)
- CHIEZO_APP_URL=${CHIEZO_APP_URL:-http://chiezo-app:7010}
- CHIEZO_PLUGIN_SOURCES=${CHIEZO_PLUGIN_SOURCES-}
# 取り込みのメモリ上限。以前 jawiki 取り込みが対応表(リダイレクト/ページビュー/
# wikidata)を dict で数 GB 抱えてホストごと OOM で落ちたため、(1) それらを
# ディスク上の一時 SQLite に逃がした上で(ingest/lookup.py)、(2) 念のため
# コンテナ自体にも上限を課して、万一の暴走をコンテナ内で止める(道連れ防止)。
<<: *ingest-limits
# ---- CLI の AI と話す場合だけ、以下のコメントを外す ----
#
# これらは HTTP ではなく CLI なので、OpenAI 互換の口に見せるブリッジを挟む
# (bridge/。イメージは 1 つで、CHIEZO_BRIDGE_CLI で役割を決める)。
# イメージは 1 回 pull すればディスクは 1 つぶんで、コンテナを何個立てても増えるのは
# 書き込み層(数 KB)だけ —— なので CLI ごとに分けず 1 枚にまとめてある。
# サブスクの枠で使うためのもので、API キー経路は従量課金になるため使わない。
#
# ブリッジは Chiezo の MCP(/mcp)を CLI に繋ぐので、道具は CLI 自身が引く。
# CLI の組み込みの道具(シェル・ファイルの読み書き)は全部切ってある。
#
# 有効にするには (1) 下のブロックのコメントを外し、(2) `docker compose up -d` する。
# profile も追加の -f も要らない。認証情報は .env ではなく管理画面から登録する
# (ブリッジは Chiezo の設定 DB を読み取り専用でマウントして読む)。
# 立ち上げるまでは管理画面の on が押せない(到達確認に落ちるため)。
#
# ホストへポートは公開しない(chiezo-app からのみ到達すればよい)。
#
#chiezo-bridge-claude:
# image: ghcr.io/rtcode337/chiezo-bridge:latest
# volumes:
# # 認証情報は Chiezo の設定 DB から読む(管理画面から登録できるようにするため)。
# # 読み取り専用。ブリッジは書かない
# # **ブリッジは `/state/settings.db` を決め打ちで読む**(CHIEZO_BRIDGE_STATE_DB の
# # 既定)。app 側の置き場が data/ の下へ移っても、こちらのマウント先は /state のまま
# - ./data/state:/state:ro
# # **サインイン結果の置き場。** 登録を空にしてコンテナの中でサインインすると、
# # 枠(`/usage`)まで取れる —— 登録できる `claude setup-token` の長期トークンは
# # 推論だけに絞られていて、枠のパネルを出せない。ここが無いと、コンテナを
# # 作り直すたびにサインインが消える。名前付きボリュームにする理由は
# # antigravity のところに書いてある(非 root で動くため)
# - chiezo-claude-home:/srv/bridge/home
# environment:
# - CHIEZO_BRIDGE_CLI=claude
# - CHIEZO_BRIDGE_MCP_URL=http://chiezo-app:7010/mcp/knowledge/
# - CHIEZO_BRIDGE_TIMEOUT=${CHIEZO_BRIDGE_TIMEOUT:-840}
# restart: unless-stopped
# # CLI は待ち時間の長い相手なので、CPU が競合したら取り込みや推論へ譲る
# cpu_shares: 512
# healthcheck:
# test: ["CMD", "curl", "-fs", "http://localhost:7013/health"]
# interval: 60s
#
#chiezo-bridge-codex:
# image: ghcr.io/rtcode337/chiezo-bridge:latest
# volumes:
# # **ブリッジは `/state/settings.db` を決め打ちで読む**(CHIEZO_BRIDGE_STATE_DB の
# # 既定)。app 側の置き場が data/ の下へ移っても、こちらのマウント先は /state のまま
# - ./data/state:/state:ro
# # Codex は access token が切れると refresh token で更新をかけ、その結果を
# # $CODEX_HOME/auth.json へ書く。相手は更新のたびに refresh token を回転させて
# # 古いほうを無効にするので、ここを永続化しないとコンテナを作り直すたびに
# # 登録時のトークンへ戻り、使用済みのもので更新をかけて失効する
# # (`Your refresh token has already been used ...` でサインインし直しになる)。
# - chiezo-codex-home:/srv/bridge/.codex
# environment:
# - CHIEZO_BRIDGE_CLI=codex
# - CHIEZO_BRIDGE_MCP_URL=http://chiezo-app:7010/mcp/knowledge/
# - CHIEZO_BRIDGE_TIMEOUT=${CHIEZO_BRIDGE_TIMEOUT:-840}
# restart: unless-stopped
# cpu_shares: 512
# healthcheck:
# test: ["CMD", "curl", "-fs", "http://localhost:7013/health"]
# interval: 60s
#
# Antigravity は API キー方式を持たない。コンテナ内で 1 回サインインした結果を
# ホーム配下のキャッシュから読むので、設定の置き場ではなく書き込み可能なホームを
# 渡して永続化する。立ち上げたら
# docker compose exec chiezo-bridge-antigravity agy
# を 1 回だけ対話で実行し、表示される URL でサインインすること。
#
# ここはホストのディレクトリではなく名前付きボリュームにする。 ブリッジは
# 非 root(uid 10001)で動く(claude が権限確認を飛ばす指定を root では受け付けないため)
# のに、バインド先が無いと Docker は root 所有で作る —— サインインの保存が
# `permission denied` で落ちる(実際に踏んだ)。名前付きボリュームなら**イメージ側の
# 所有者(uid 10001)がそのまま入る**ので、ホスト側で chown して回らなくて済む。
# ホストのパスに置きたい場合は、先に `mkdir -p` して
# `sudo chown -R 10001:10001 <ディレクトリ>` してからバインドすること。
#chiezo-bridge-antigravity:
# image: ghcr.io/rtcode337/chiezo-bridge:latest
# volumes:
# - chiezo-antigravity-home:/srv/bridge/home
# environment:
# - CHIEZO_BRIDGE_CLI=antigravity
# - CHIEZO_BRIDGE_MCP_URL=http://chiezo-app:7010/mcp/knowledge/
# - CHIEZO_BRIDGE_TIMEOUT=${CHIEZO_BRIDGE_TIMEOUT:-840}
# restart: unless-stopped
# cpu_shares: 512
# healthcheck:
# test: ["CMD", "curl", "-fs", "http://localhost:7013/health"]
# interval: 60s
# agent モードの道具 `web_search` が引く検索エンジン。推論サーバとは独立して立てる ——
# ローカルの推論サーバでも Gemini でも、chiezo が agent ループを回す相手なら web 検索は
# 要るのに、以前は「答える」層の上書きに置いていたせいで「検索を使いたいだけ」で
# 数 GB の推論サーバまで立ち上げることになっていた。使うかどうかは chiezo-app 側の CHIEZO_WEB_SEARCH_URL
# (既定は空 = 使わない)で決まるので、立っているだけでは外へ検索を投げない。
# 要らない環境では `docker compose up -d chiezo-app chiezo-trigger` のように選んで起動する。
#
# 設定は下の configs で流し込む(このファイルの末尾)。中身は「既定値 + Chiezo から
# API として引くための 3 点」—— SearXNG の既定は html だけを返すので
# search.formats に json を足してある。
searxng:
# 素の SearXNG。設定は下の configs で流し込む(独自イメージもマウントも要らない)。
# 上流のタグは固定する(:latest にしない)—— 検索エンジンの実装は頻繁に変わり、
# 黙って壊れると「web 検索だけ効かない」という分かりにくい壊れ方をする。
image: ${CHIEZO_SEARXNG_IMAGE:-searxng/searxng:2026.7.31-057a77168}
configs:
- source: chiezo-searxng-settings
target: /etc/searxng/settings.yml
environment:
# 待ち受けを 7012 にする(既定は 8080)。chiezo-app の 7010・推論の 7011 と
# 揃えて、コンテナの内と外で番号が食い違わないようにするため。
# この image は uvicorn ではなく granian で動くので、効くのは GRANIAN_PORT
# (SearXNG 側の SEARXNG_PORT は設定ファイルの値で、待ち受けには使われない)。
- GRANIAN_PORT=7012
restart: unless-stopped
# 検索の中継なので軽いが、CPU が競合したときは取り込みや推論へ譲る
cpu_shares: 512
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:7012/healthz"]
interval: 60s
# SearXNG の設定。**イメージにもホストのファイルにも置かない** ——
# 上流のイメージは /etc/searxng を VOLUME 宣言しているので、焼き込んでも匿名ボリュームに
# 隠される(実際に空の settings.yml に隠されて起動しなくなっていた)。ホストのファイルを
# 重ねる形も、リポジトリを置けない環境(YAML を貼るだけの構成)では使えない。
# configs はボリュームより深いパスへ置かれるので、どちらの問題も起きない。
#
# 中身は既定値を土台に、Chiezo から API として引くために要る 3 点だけ
# (`use_default_settings: true`)。
configs:
chiezo-searxng-settings:
content: |
use_default_settings: true
server:
# 秘密の値ではない(LAN 内前提の既定)。プリファレンスの Cookie と画像プロキシの
# 署名に使う値で、Chiezo は JSON の検索しか叩かないため既定のままで動く。
secret_key: "${CHIEZO_WEB_SEARCH_SECRET:-chiezo-lan}"
# API として叩くので bot 判定を切る。LAN の外へ出すなら true に戻すこと
limiter: false
# 画像のプロキシは使わない(返すのはタイトル・要約・URL だけなので要らない)
image_proxy: false
search:
# この行が要。SearXNG の既定は html だけで、Chiezo は format=json で引くため、
# 足さないと HTML が返り「JSON ではない」というエラーとして扱われる。
formats: [html, json]
# サインイン結果の置き場(Antigravity)。ホストのディレクトリにしないのは、
# 無いときに Docker が root 所有で作ってしまい、非 root のブリッジが書けなくなるため。
volumes:
chiezo-antigravity-home:
chiezo-claude-home:
chiezo-codex-home: