-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
114 lines (110 loc) · 6.75 KB
/
Copy pathdocker-compose.yml
File metadata and controls
114 lines (110 loc) · 6.75 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
name: travel-log
services:
# 本体より先に、データの置き場(data/)の下へ必要なディレクトリを作り、
# 所有者を実行ユーザーに合わせるワンショット。bindマウント先がホストに無いと
# Dockerがそれをroot所有で作ってしまい、非rootで動くappが写真とエクスポートを
# 書けずに落ちるため。appと同じイメージを使うのでpullは増えない。
# db/ はchownしない —— postgresのエントリポイントがrootで起動して自分で揃える
init:
image: ghcr.io/rtcode337/travel-log:latest
user: root
volumes:
- ./data:/data
entrypoint:
- sh
- -c
- mkdir -p /data/db /data/photos /data/exports && chown -R "$$0" /data/photos /data/exports
- ${TRAVEL_LOG_UID:-10001}:${TRAVEL_LOG_GID:-10001}
restart: "no"
db:
image: postgres:18-alpine
depends_on:
init:
condition: service_completed_successfully
environment:
POSTGRES_USER: travel_log
POSTGRES_PASSWORD: travel_log
POSTGRES_DB: travel_log
# データの置き場をdata/1つにまとめ、その下をdb/photos/exportsに切っている。
# 既定(/var/lib/postgresql/18/docker)のままだとマウント直下に18/が来て
# photos・exportsと同じ段に並ぶので、db/の下へ寄せる
# 他のサービスと同じ /data にマウントするため、既定の位置からも移している
PGDATA: /data/db/18/docker
volumes:
# db/initはマウントしない。スキーマ本体(01_schema.sql)はinitサービスが流す
# (git管理下のdb/initをコンテナに触らせるとホスト側のパーミッションが変わり、
# スキーマを更新したときにgit pullが失敗するようになるため)
# 所有者はpostgresのエントリポイント(rootで起動して自分で揃える)が調整する
- ./data:/data
# postgres:18は VOLUME /var/lib/postgresql を宣言しており、そこに何もマウント
# しないと起動のたびに空の匿名ボリュームが作られて溜まっていく。実データは上の
# PGDATA(=/data配下)に置くのでここは使わない —— 使い捨てのtmpfsを当てて抑止する
tmpfs:
- /var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U travel_log"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
app:
# mainへのpushでGitHub Actions(.github/workflows/docker-publish.yml)がビルド・公開
# するイメージ。本番ではビルドせず、更新は docker compose pull && docker compose up -d
# だけでよい(README「本番運用」参照)。
# 起動時にまず未適用のマイグレーションを当て、失敗したら待ち受けに進まない
# (scripts/migrate.mjs。かつては専用イメージのinitサービスが担っていた)
image: ghcr.io/rtcode337/travel-log:latest
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://travel_log:travel_log@db:5432/travel_log
SESSION_SECRET: ${SESSION_SECRET:?SESSION_SECRET is required (openssl rand -base64 32)}
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-}
# 公開URL(任意)。リバースプロキシがX-Forwarded-Proto/Hostを送らない構成では
# これを設定しないとGoogleログインのリダイレクトURIがhttp://で組まれる
# (lib/auth/request-url.ts)。例: https://travel.example.com
PUBLIC_BASE_URL: ${PUBLIC_BASE_URL:-}
# 周辺のAI探索(任意)。知識サーバー chiezo の場所と、中継先で使う相手。
# 未設定なら機能そのものが出ない(.env.example の説明参照)
CHIEZO_BASE_URL: ${CHIEZO_BASE_URL:-}
CHIEZO_AI_BACKEND: ${CHIEZO_AI_BACKEND:-}
CHIEZO_AI_TIMEOUT_SECONDS: ${CHIEZO_AI_TIMEOUT_SECONDS:-}
# 同じホストで chiezo が動いているのに届かない(「時間内に応答しなかった」になる)
# ときは、コンテナからホストの公開ポートへ戻る経路が塞がれている可能性がある
# (NASのファイアウォール等)。その場合は chiezo のネットワークに相乗りして
# コンテナ名で呼ぶ —— 下の app の `networks:` とファイル末尾の `networks:` の
# コメントを外し、CHIEZO_BASE_URL を http://chiezo-app:7010 にする
# (chiezo-app はコンテナ名なので、相手のプロジェクト名が何でもこの名前で引ける)
NODE_ENV: production
# 訪問記録の写真置き場(lib/photoStorage.ts)。DBには相対パスのみ保存される
PHOTOS_DIR: /data/photos
# エクスポートのZIP置き場(lib/exportStorage.ts)。写真と分けてあるのは寿命が
# 違うため —— こちらは作り直せる使い捨てで、同じユーザーの最新1件だけ残る
EXPORTS_DIR: /data/exports
volumes:
# 置き場ごとマウントして、中のどれを使うかは上のPHOTOS_DIR/EXPORTS_DIRで決める。
# db/も見えるが、postgresがPGDATAを0700で作るのでappのユーザーからは読めない
- ./data:/data
# data/に書かれるファイルをホストのユーザー所有にする。イメージの既定は
# 実行ユーザー。既定は 10001 = ホストに実在しない番号(抜け出されてもホストの
# ユーザーのファイルに届かない)。そのぶん data/ はホストから見て「知らない
# ユーザー」の持ち物になるので、手元で直接編集・書き戻ししたいホストでは
# .env の TRAVEL_LOG_UID/GID に `id -u`/`id -g` を入れる
user: "${TRAVEL_LOG_UID:-10001}:${TRAVEL_LOG_GID:-10001}"
# chiezo がホストの公開ポート経由で届かないときだけ、次の1行と
# ファイル末尾の networks: を有効にする(default も必ず並べる)
#networks: [default, chiezo]
ports:
- "7040:7040"
restart: unless-stopped
# chiezo のネットワークに相乗りするときだけ有効にする(上の app の networks: と対で使う)。
# `external: true` はそのネットワークが既に在ることが前提なので、chiezo を同じホストで
# 動かしていない環境で有効にすると本体が起動できなくなる。`networks:` を書くと既定の
# ネットワークに自動で入らなくなるため、app 側には default も必ず並べる(忘れると db に
# 繋がらない)。name は環境で変わる(`<プロジェクト名>_default`)ので docker network ls で確かめること
#networks:
# chiezo:
# external: true
# name: chiezo_default