-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdocker-compose.yml
286 lines (277 loc) · 10.5 KB
/
docker-compose.yml
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
version: "3.8"
# ネットワークの作成
networks:
# 内部ネットワーク
# バックエンドとlogtoコンテナのみ接続
app-logto-network:
# バックエンドとそれに対応するデータベースのみ接続
app-db-network:
# バックエンドとminioのみ接続
app-minio-network:
# logtoとそれに対応するデータベースのみ接続
logto-db-network:
# リバースプロキシで公開するネットワーク
traefik-public:
name: traefik-public
# データベースのデータを格納するボリューム
volumes:
# バックエンドのデータベースデータを格納するボリューム
app-db-vol:
# logtoのデータベースデータを格納するボリューム
logto-db-vol:
# minioのデータを格納するボリューム
minio-data:
services:
# バックエンド用のデータベース
db-app:
container_name: db-app
# ポスグレの最新イメージを使用
image: postgres:latest
# ポスグレの環境変数を読み込む
env_file: ${POSTGRES_ENV}
# ポスグレのデータを格納するボリュームを指定
volumes:
- type: volume
source: app-db-vol
# ポスグレのデータを格納するボリュームのマウント先を指定
target: /var/lib/postgresql/data
# 内部ネットワークに接続
networks:
- app-db-network
# コンテナが停止したら再起動
restart: on-failure
minio:
container_name: minio
# 画像ストレージ
build:
context: .
dockerfile: packages/infra/Dockerfiles/Minio-Dockerfile
volumes:
- type: volume
source: minio-data
target: /data
environment:
- MINIO_ROOT_USER=${MINIO_ROOT_USER}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
# バックエンドのminioのバケット名を指定
- MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME}
networks:
- app-minio-network
- traefik-public
labels:
# traefikで公開する
- "traefik.enable=true"
# ホスト名を指定
# 元オリジンのホスト名を指定
- "traefik.http.routers.minio.rule=Host(`${HOSTNAME}`) && PathPrefix(`/${MINIO_BUCKET_NAME}/`)"
- "traefik.http.routers.minio.service=minio"
# 9000番ポートを指定
- "traefik.http.services.minio.loadbalancer.server.port=9000"
# SSLを有効化
- "traefik.http.routers.minio.entrypoints=websecure"
- "traefik.http.routers.minio.tls.certresolver=letsencrypt"
# ホスト名を指定
# minioadminサブドメインを指定
- "traefik.http.routers.minio-admin.rule=Host(`minioadmin.${HOSTNAME}`)"
- "traefik.http.routers.minio-admin.service=minio-admin"
# 9001番ポートを指定
- "traefik.http.services.minio-admin.loadbalancer.server.port=9001"
# SSLを有効化
- "traefik.http.routers.minio-admin.entrypoints=websecure"
- "traefik.http.routers.minio-admin.tls.certresolver=letsencrypt"
# コンテナが停止したら再起動
restart: on-failure
# logto用のデータベース
db-logto:
container_name: db-logto
# ポスグレの最新イメージを使用
image: postgres:latest
# ポスグレの環境変数を読み込む
env_file: ${POSTGRES_ENV}
# ポスグレのデータを格納するボリュームを指定
volumes:
- type: volume
source: logto-db-vol
# ポスグレのデータを格納するボリュームのマウント先を指定
target: /var/lib/postgresql/data
# 内部ネットワークに接続
networks:
- logto-db-network
# コンテナが停止したら再起動
restart: on-failure
# logtoコンテナ
logto:
container_name: logto
image: svhd/logto:latest
entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"]
env_file: ${LOGTO_ENV}
environment:
# logtoコンテナのエンドポイントを指定
- ENDPOINT=${LOGTO_ENDPOINT}
- ADMIN_ENDPOINT=${LOGTO_ADMIN_ENDPOINT}
# 内部ネットワークに接続
networks:
- app-logto-network
- logto-db-network
- traefik-public
labels:
# traefikで公開する
- "traefik.enable=true"
# ホスト名を指定
# authサブドメインを指定
- "traefik.http.routers.logto_auth.rule=Host(`auth.${HOSTNAME}`)"
- "traefik.http.routers.logto_auth.service=logto_auth"
# 3001番ポートを指定
- "traefik.http.services.logto_auth.loadbalancer.server.port=3001"
# SSLを有効化
- "traefik.http.routers.logto_auth.entrypoints=websecure"
- "traefik.http.routers.logto_auth.tls.certresolver=letsencrypt"
# ホスト名を指定
# authadminサブドメインを指定
- "traefik.http.routers.logto_admin.rule=Host(`authadmin.${HOSTNAME}`)"
- "traefik.http.routers.logto_admin.service=logto_admin"
# 3002番ポートを指定
- "traefik.http.services.logto_admin.loadbalancer.server.port=3002"
# SSLを有効化
- "traefik.http.routers.logto_admin.entrypoints=websecure"
- "traefik.http.routers.logto_admin.tls.certresolver=letsencrypt"
# コンテナが停止したら再起動
restart: on-failure
backend:
container_name: backend
# バックエンドのDockerfileを指定
build:
context: .
dockerfile: packages/infra/Dockerfiles/Backend-Dockerfile
args:
# バックエンドのディレクトリを指定
PACKAGE_PATH: ${BACKDIR}
# ビルド時のスキーマのパスを指定
SCHEMA_PATH: ${SCHEMA_PATH}
# バックエンドの環境変数を読み込む
env_file: ${BACK_ENV}
# スキーマのパスを指定
environment:
# スキーマのパスを指定
- SCHEMA_PATH=${SCHEMA_PATH}
# バックエンドのminioのユーザー名とパスワードを指定
- MINIO_ROOT_USER=${MINIO_ROOT_USER}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
# バックエンドのminioのバケット名を指定
- MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME}
# logtoコンテナのエンドポイントを指定
- LOGTO_ENDPOINT=${LOGTO_ENDPOINT}
# オーディエンスを指定
- LOGTO_AUDIENCE=${LOGTO_AUDIENCE}
# logtoのwebhookシークレットを指定
- LOGTO_WEBHOOK_SECRET=${LOGTO_WEBHOOK_SECRET}
# NODE_ENVをproductionに指定
- NODE_ENV=production
# 内部ネットワークに接続
networks:
- app-logto-network
- app-db-network
- app-minio-network
- traefik-public
labels:
# traefikで公開する
- "traefik.enable=true"
# ホスト名を指定
# apiディレクトリを指定
- "traefik.http.routers.backend.rule=Host(`${HOSTNAME}`) && PathPrefix(`/api/`)"
# 6173番ポートを指定
- "traefik.http.services.backend.loadbalancer.server.port=6173"
# SSLを有効化
- "traefik.http.routers.backend.entrypoints=websecure"
- "traefik.http.routers.backend.tls.certresolver=letsencrypt"
# コンテナが停止したら再起動
restart: on-failure
frontend:
container_name: frontend
build:
context: .
# フロントエンドのDockerfileを指定
dockerfile: packages/infra/Dockerfiles/Frontend-Dockerfile
args:
# vite側で必要な環境変数ここから
# フロントエンドのディレクトリを指定
PACKAGE_PATH: ${FRONTDIR}
# ビルド時のスキーマのパスを指定
SCHEMA_PATH: ${SCHEMA_PATH}
# オペレーションの環境変数を指定
# OPERATION_PATH: ${OPERATION_PATH}
# logtoコンテナのエンドポイントを指定
VITE_LOGTO_ENDPOINT: ${LOGTO_ENDPOINT}
# logtoのアプリケーションIDを指定
VITE_LOGTO_APPID: ${LOGTO_APPID}
# logtoのアプリケーションIDを指定
VITE_LOGTO_API_RESOURCE: ${LOGTO_API_RESOURCE}
# viteとnginx両方で利用する環境変数ここから
# ホスト名を指定
VITE_HOSTNAME: ${HOSTNAME}
# インフラの環境変数を指定
INFRADIR: ${INFRADIR}
environment:
# ホストネームを指定
- HOSTNAME=${HOSTNAME}
networks:
- traefik-public
labels:
# traefikで公開する
- "traefik.enable=true"
# ホスト名を指定
# ホームディレクトリを指定
- "traefik.http.routers.frontend.rule=Host(`${HOSTNAME}`) && PathPrefix(`/`)"
# 6000番ポートを指定
- "traefik.http.services.frontend.loadbalancer.server.port=6000"
# SSLを有効化
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
depends_on:
- backend
# コンテナが停止したら再起動
restart: on-failure
# リバースプロキシコンテナ
traefik:
container_name: traefik
# traefikの最新イメージを使用
image: traefik:latest
# traefikの環境変数を読み込む
command:
# traefikのdockerプロバイダを有効化
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
# 80番ポートを指定
- "--entrypoints.web.address=:80"
# 443番ポートを指定
- "--entrypoints.websecure.address=:443"
# letsencryptを有効化
# httpチャレンジを有効化
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
# 環境変数より取得したメールアドレスを指定
- "--certificatesresolvers.letsencrypt.acme.email=${CERTBOT_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/etc/letsencrypt/acme.json"
# ネットワークを指定
- "--providers.docker.network=traefik-public"
volumes:
# ホストのdockerソケットをマウント
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
# 読み取り専用でマウント
read_only: true
# ホストのletsencryptディレクトリをマウント
- type: bind
source: /etc/letsencrypt
target: /etc/letsencrypt
# traefikの設定ファイルを指定
# ポートを指定
ports:
- "80:80"
- "443:443"
# ネットワークに接続
networks:
- traefik-public
# コンテナが停止したら再起動
restart: on-failure