-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
121 lines (118 loc) · 7.58 KB
/
Copy pathdocker-compose.yml
File metadata and controls
121 lines (118 loc) · 7.58 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
# 本番用。この定義自体はイメージをビルドせず、GHCR に置いたイメージを pull して動かす:
#
# docker compose pull && docker compose up -d
#
# イメージは main への push で GitHub Actions がビルドして GHCR へ公開する。
# デプロイ先でその場からビルドしたいときは docker-compose.build.yml を重ねる:
#
# docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
#
# 特定のイメージを指定したいときは TECH_ANTENNA_IMAGE(:sha-xxxxxxx 等)を使う。
# 設定値は .env(.env.example をコピーして作る)から渡す。
# リポジトリを置けない環境向けには docker-compose.standalone.example.yml を用意している。
name: tech-antenna
services:
# data/ の下に必要なディレクトリを作り、app の実行ユーザー(非 root)が
# 書けるように所有者を合わせる。ホストのディレクトリは作成者(ホストのユーザー)の
# 所有になるため、そのままでは Data Protection の鍵を書き出せない。
# **postgres の側は chown しない** —— あちらはエントリポイントが root で起動して
# 自分で揃えるので、こちらが触ると却って食い違う。
# mkdir と chown だけなので、アプリのイメージではなく小さい汎用イメージを使う
# (アプリ側を :local でビルドする構成でも GHCR を引きに行かずに済む)
init:
image: alpine:3.24
user: root
entrypoint:
- sh
- -c
- mkdir -p /data/postgres /data/keys && chown -R "$$0" /data/keys
- ${TECH_ANTENNA_UID:-10001}:${TECH_ANTENNA_GID:-10001}
volumes:
- ./data:/data
restart: "no"
db:
image: postgres:18-alpine
depends_on:
init:
condition: service_completed_successfully
environment:
POSTGRES_USER: ${POSTGRES_USER:-techantenna}
# .env で変えるなら初回起動の前に(data/postgres を作るときにしか効かず、
# 後から変えても DB 側は変わらないまま接続文字列だけがずれる)
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-techantenna}
POSTGRES_DB: ${POSTGRES_DB:-techantenna}
TZ: ${TZ:-Asia/Tokyo}
# 既定の 5432 ではなく、このアプリに割り当てた 7020 番台に寄せる。
# PGPORT はサーバー(postgres)とクライアント(pg_isready/psql)の両方が読むので、
# 下の healthcheck や `compose exec db psql` に -p を足す必要はない
PGPORT: 7021
# **バインドするのは data/ 1本**なので、PGDATA を data/ の下へ移す。
# ホスト側の位置(data/postgres/18/docker)は今までと同じなので、
# 既に動いているホストでもデータの移動は要らない
PGDATA: /data/postgres/18/docker
volumes:
# 名前付きボリュームではなくホストのディレクトリに置いてある —— data/ を丸ごと
# コピーすればバックアップになり、Docker の中を覗きに行かなくて済む。
# 中身の所有者調整は postgres のエントリポイントが root で起動時に済ませる
- ./data:/data
# postgres:18 は VOLUME /var/lib/postgresql を宣言していて、そこに何も
# マウントしないと起動のたびに空の匿名ボリュームが作られて溜まる。
# 実データは上の PGDATA(data/ 配下)に置くので、使い捨ての tmpfs を当てて抑える
tmpfs:
- /var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-techantenna} -d ${POSTGRES_DB:-techantenna}"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
app:
image: ${TECH_ANTENNA_IMAGE:-ghcr.io/rtcode337/tech-antenna:latest}
depends_on:
# 起動時にマイグレーションを当てるため、DB が受け付けられるまで待つ
db:
condition: service_healthy
init:
condition: service_completed_successfully
environment:
# 未設定だとメモリ上のストアで動いてしまい再起動でデータが消えるため、必ず渡す
ConnectionStrings__Default: Host=db;Port=7021;Database=${POSTGRES_DB:-techantenna};Username=${POSTGRES_USER:-techantenna};Password=${POSTGRES_PASSWORD:-techantenna}
TZ: ${TZ:-Asia/Tokyo}
# 定期実行のオン/オフは画面(設定)から切り替える(既定はすべて無効)
# 外部 API のキーはここでは渡せない(画面の「設定 → 外部連携」から入れる。
# 暗号化して DB に保存され、再起動なしで効く)。渡すのはキー以外の設定だけ
# 既定は appsettings.json と同じ。コストを抑えるなら claude-haiku-4-5 を指定する
Anthropic__Model: ${ANTHROPIC_MODEL:-claude-opus-5}
# 既定は appsettings と同じ claude-sonnet-5(空文字を渡すと appsettings を上書きして CLI 既定 = 重いモデルに戻るため)
ClaudeCode__Model: ${CLAUDE_CODE_MODEL:-claude-sonnet-5}
# Chiezo(LAN 内の知識サーバー)の URL。入れると LLM の相手を画面から選べる
# (設定 → AI)。Gemini・Claude Code・推論サーバ…の鍵は Chiezo が持っているので、
# こちらは相手を選ぶだけでよい。空でも同梱の Claude Code CLI と Anthropic API は
# 画面から選べる。
# 値は .env の CHIEZO_URL(例 http://192.168.1.10:7010。`/v1` は付けない)。
# 同じホストで chiezo が動いているのに時間内に応答しないときは、コンテナから
# ホストの公開ポートへ戻る経路が塞がれている(NAS のファイアウォール等)。
# その場合は chiezo のネットワークに相乗りする —— 手順と注意点は
# docker-compose.standalone.example.yml の「同じホストで chiezo が動いているのに
# 届かないとき」に書いてある(CHIEZO_URL は http://chiezo-app:7010 になる)
Chiezo__BaseUrl: ${CHIEZO_URL:-}
# 今日のサマリーの ntfy 通知。接続先(URL・トピック・トークン)は画面から設定する。
# タップで開く URL だけは「この環境の公開 URL」というデプロイ側の事実なのでここに残す
Ntfy__ClickUrl: ${NTFY_CLICK_URL:-}
# リバースプロキシ配下で X-Forwarded-* を信頼するときだけ true にする
ASPNETCORE_FORWARDEDHEADERS_ENABLED: ${FORWARDED_HEADERS_ENABLED:-false}
ports:
# host:container。コンテナ内は 7020 固定(Dockerfile の EXPOSE と同じ)で、
# ホスト側も既定は同じ 7020(開発の dotnet run と同じ番号。同時起動はできない)
- "${PORT:-7020}:7020"
volumes:
# **バインドはこの1本だけ**。下が postgres/(DB の実体)と keys/
# (antiforgery と Blazor が使う Data Protection の鍵。コンテナを作り直しても
# 鍵を引き継げるようにする —— 消えると開いていたページの操作が一度エラーになる)
- ./data:/data
# 実行ユーザー。既定は 10001 = ホストに実在しない番号(抜け出されてもホストの
# ユーザーのファイルには届かない)。そのぶん data/ はホストから見て「知らない
# ユーザー」の持ち物になるので、手元で直接編集・書き戻しをしたいホストでは
# .env の TECH_ANTENNA_UID / TECH_ANTENNA_GID に `id -u` / `id -g` を入れる
user: "${TECH_ANTENNA_UID:-10001}:${TECH_ANTENNA_GID:-10001}"
restart: unless-stopped