-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.standalone.example.yml
More file actions
178 lines (168 loc) · 10.5 KB
/
Copy pathdocker-compose.standalone.example.yml
File metadata and controls
178 lines (168 loc) · 10.5 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
# リポジトリのクローンができない実行環境向けの単体定義。
# (NAS のコンテナマネージャー等、管理画面に YAML を貼り付けて起動するタイプの環境を想定)
#
# docker-compose.yml との違いは2点だけ:
# 1. `${...}` を使わず、値を YAML に直接書く(シェルの環境変数も `.env` も無い前提)
# 2. `docker-compose.build.yml` を重ねられない(ソースが手元に無いので GHCR から pull するだけ)
#
# これは雛形。実値を入れたものは .gitignore してあるので、手元でコピーして作る:
#
# cp docker-compose.standalone.example.yml docker-compose.standalone.yml
#
# 使い方:
# 1. コピーした側の先頭の「ここだけ編集」を書き換える
# (必須はデータの置き場のホスト絶対パスだけ)
# 2. その内容をそのまま管理画面に貼り付ける
# 3. 起動して http://<ホスト>:7020/ を開く
#
# 通常の(リポジトリを配置できる)環境では docker-compose.yml を使う
# —— こちらは値の直書きぶん古くなりやすい。docker-compose.yml を変えたらこの雛形も追従させること。
name: tech-antenna
# ---- ここだけ編集: データの置き場(そのホストの絶対パス) ----
# 名前付きボリュームではなくホストのディレクトリに置く(data ごとコピーすればバックアップ
# になる)。無ければ Docker が作るが、先に作っておくのが確実。
# postgres 側は中身の所有者をエントリポイントが揃えるので、ホスト側の準備は要らない
# **`host:container` を丸ごと書く短い形にしてある** —— `type: bind` の長い形は、
# 古い Docker だとホスト側のディレクトリを自動で作らない。
# **バインドするのはこの1つだけ**で、下の postgres/ と keys/ は init が作る
x-data-volume: &data-volume "/path/to/tech-antenna/data:/data"
# ---- ここだけ編集(必要なときだけ): 実行ユーザー ----
# **イメージ内の既定は 10001:10001** で、ホストに実在しない番号にしてある
# (万一コンテナから抜け出されても、ホストのユーザーのファイルには届かない)。
# data/ をホストから直接編集・書き戻ししたいときだけ `id -u`:`id -g` に書き換える
x-run-as: &run-as "10001:10001"
# ---- ここだけ編集(任意): Chiezo(LAN 内の知識サーバー)の URL ----
# 入れると LLM の相手を画面から選べる(設定 → 外部連携の一番上)。鍵は Chiezo が持っている。
# 使わないなら空文字("")にする —— 同梱の Claude Code CLI / Anthropic API で動く。
#
# 書くのは chiezo-app のルート URL。`/v1` は付けない
# (こちらが `/v1/ai/...` を足すので、付けると `/v1/v1/...` になって 404)。
# 値は「このコンテナから chiezo に届くアドレス」—— 別のホストで動いているなら
# そのホストの IP、同じホストなら LAN の IP(`localhost` はコンテナ自身を指すので不可)。
#
# 届くかどうかの確かめ方(このイメージには curl も wget も入っていないので、
# 同じネットワーク名前空間に curl のコンテナを差し込んで叩く):
# docker run --rm --network container:<このコンテナ名> curlimages/curl:8.11.1 \
# -s -m 5 http://<IP>:7010/v1/ai/backends
# 応答が返らない(タイムアウトする)ときは、下の app の「同じホストなのに届かないとき」を見ること
x-chiezo-url: &chiezo-url "http://192.168.1.10:7010"
# ---- ここだけ編集(任意): 通知をタップして開く URL ----
# 今日のサマリーの ntfy 通知。接続先(URL・トピック・トークン)は画面から設定するが、
# タップで開く URL だけは「この環境の公開 URL」というデプロイ側の事実なのでここに書く
# (例 "http://192.168.1.20:7020")。使わないなら空のままでよい
x-ntfy-click-url: &ntfy-click-url ""
services:
# data/ の下に postgres/ と keys/ を作り、keys/ を app の実行ユーザー(非 root)が
# 書けるようにする。ホストのディレクトリは作成者の所有になるため、そのままでは書き出せない。
# postgres 側は chown しない —— エントリポイントが root で起動して自分で揃える。
# **db も app もこれの完了を待つ**ので、いちばん先に置いてある。
# mkdir と chown だけなので、アプリのイメージではなく小さい汎用イメージを使う
init:
image: alpine:3.24
user: root
entrypoint:
- sh
- -c
- mkdir -p /data/postgres /data/keys && chown -R "$$0" /data/keys
- *run-as
volumes:
- *data-volume
restart: "no"
db:
image: postgres:18-alpine
depends_on:
init:
condition: service_completed_successfully
environment:
POSTGRES_USER: techantenna
# 変えるなら初回起動の前に。**app の接続文字列(下)と同じ値に揃えること** ——
# 片方だけ直すと静かに壊れる(app は DB に繋がらないとメモリ上のストアで起動し、
# 再起動のたびにデータが消える)。置き場を作った後で変えても DB 側は変わらない
POSTGRES_PASSWORD: techantenna
POSTGRES_DB: techantenna
TZ: Asia/Tokyo
# 既定の 5432 ではなく 7020 番台に寄せる(接続文字列の Port= と同じ値にすること)。
# PGPORT はサーバーもクライアントも読むので healthcheck に -p は要らない
PGPORT: 7021
# バインドは data/ 1本なので、PGDATA を data/ の下へ移す。ホスト側の位置
# (data/postgres/18/docker)は今までと同じで、データの移動は要らない
PGDATA: /data/postgres/18/docker
volumes:
- *data-volume
# postgres:18 が宣言する VOLUME に何もマウントしないと、起動のたびに空の匿名
# ボリュームが溜まる。実データは PGDATA(data/ 配下)なので tmpfs で抑える
tmpfs:
- /var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U techantenna -d techantenna"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
app:
# :latest ではなく :sha-xxxxxxx を指定すれば特定のイメージを指せる
# (GHCR に残るのは直近 10 版。.github/workflows/build-and-push-image.yml)
image: ghcr.io/rtcode337/tech-antenna:latest
depends_on:
# 起動時にマイグレーションを当てるため、DB が受け付けられるまで待つ
db:
condition: service_healthy
init:
condition: service_completed_successfully
environment:
# DB への接続。**上の db の POSTGRES_PASSWORD と同じ値に揃えること**
ConnectionStrings__Default: "Host=db;Port=7021;Database=techantenna;Username=techantenna;Password=techantenna"
TZ: Asia/Tokyo
Chiezo__BaseUrl: *chiezo-url
Ntfy__ClickUrl: *ntfy-click-url
# リバースプロキシ配下で X-Forwarded-* を信頼するときだけ true にする
ASPNETCORE_FORWARDEDHEADERS_ENABLED: "false"
# ---- 同じホストで chiezo が動いているのに届かないとき ----
# コンテナからホストの LAN IP に張った公開ポートへ戻る経路は、環境によっては塞がれている
# (NAS のファイアウォール等。症状は画面の「Chiezo(…)が時間内に応答しなかった」=パケットが
# 落とされている。届いていれば「繋がらない」や HTTP エラーになるので、そこで見分けられる)。
#
# その場合は chiezo のネットワークに相乗りする(ホストのポートを経由しない)。
# 下の app サービスに networks を足し、URL をサービス名に変える:
#
# services:
# app:
# networks: [default, chiezo] # ← default も必ず並べる
# networks:
# chiezo:
# external: true
# name: chiezo_default # ← chiezo 側の実際のネットワーク名
#
# そのうえで Chiezo__BaseUrl を "http://chiezo-app:7010" にする
# (chiezo-app は chiezo 側のサービス名で、standalone ではコンテナ名も同じ。
# どちらも同じネットワーク内での別名になるので、相手のプロジェクト名が何でもこの名前で引ける)。
#
# 注意:
# - `networks:` を書くと既定のネットワークに自動で入らなくなる。`default` を並べ忘れると
# app が db に繋がらなくなる(DB が無いときの挙動=メモリ上のストアで
# 起動し、再起動のたびにデータが消える形になるので気づきにくい)
# - ネットワーク名は環境で変わる。`<プロジェクト名>_default` で、プロジェクト名は
# compose の `name:` か、NAS の管理画面で付けたスタック名。`docker network ls` で実物を確認する
# - `external: true` はそのネットワークが既に在ることが前提。chiezo を同じホストで
# 動かしていない環境でこれを書くと、app が起動できなくなる(だから既定では書いていない)
ports:
# host:container。コンテナ内は 7020 固定なので、変えるのは左だけ
- "7020:7020"
# default も必ず並べる。networks を書くと既定のネットワークに自動で入らなくなり、
# 並べ忘れると app が db にも bridge にも繋がらない(DB 無しと同じ挙動で静かに壊れる)
# networks: [default, chiezo]
volumes:
# バインドはこの1本だけ。下が postgres/(DB の実体)と keys/(antiforgery と
# Blazor が使う Data Protection の鍵。コンテナを作り直しても引き継げるように
# する —— 消えると開いていたページの操作が一度エラーになる)
- *data-volume
user: *run-as
restart: unless-stopped
# chiezo のネットワーク(既に在るものへ相乗りする)。名前は環境で変わる ——
# `<プロジェクト名>_default` で、NAS の管理画面で付けたスタック名がプロジェクト名になる。
# `docker network ls | grep chiezo` で実物を確かめてから貼ること
# (違っていると app が「network ... not found」で起動できない)
#networks:
# chiezo:
# external: true
# name: chiezo_default