-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
331 lines (306 loc) · 12.3 KB
/
Copy pathdocker-compose.yml
File metadata and controls
331 lines (306 loc) · 12.3 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
####
# DEV ENV MONO REPO
####
services:
#########
# TRAEFIK PROXY
#########
# ---------------------------------------------------------------------------
# HTTPS EN DEV SANS AVERTISSEMENT NAVIGATEUR — mini tuto
# ---------------------------------------------------------------------------
# Probleme : les domaines de dev sont en `.localhost`. Let's Encrypt ne peut
# PAS les signer (TLD reserve, aucune validation ACME possible). Sans rien,
# Traefik sert son certificat auto-signe par defaut, regenere a chaque
# redemarrage -> Chrome/Firefox rale a chaque fois.
#
# Solution : mkcert cree une autorite de certification (CA) LOCALE, l'installe
# dans le magasin de confiance du systeme ET dans ceux de Firefox/Chrome, puis
# signe un certificat pour nos domaines. Les navigateurs font confiance a cette
# CA -> plus aucun avertissement, definitivement.
#
# ETAPE 1 — installer mkcert et sa CA (UNE SEULE FOIS par machine de dev) :
#
# sudo apt install libnss3-tools mkcert # requis pour Firefox/Chrome
# mkcert -install # installe la CA locale
#
# ETAPE 2 — generer le certificat, a la racine du projet (commande sur UNE
# seule ligne, et GUILLEMETS SIMPLES obligatoires autour du wildcard) :
#
# mkdir -p certs
# mkcert -cert-file certs/dev.pem -key-file certs/dev-key.pem 'tibillet.localhost' '*.tibillet.localhost'
#
# ETAPE 2bis — VERIFIER, avant meme d'ouvrir le navigateur :
#
# openssl x509 -in certs/dev.pem -noout -ext subjectAltName
#
# La sortie DOIT contenir les deux entrees :
# DNS:tibillet.localhost, DNS:*.tibillet.localhost
#
# PIEGE (deja rencontre) : si le `*` perd ses guillemets, le shell l'avale et
# mkcert genere un certificat SANS le wildcard, EN SILENCE — aucune erreur.
# Chrome affiche alors ERR_CERT_COMMON_NAME_INVALID sur lespass.tibillet.
# localhost, ce qui ressemble a un probleme de CA alors que la CA est bonne.
# Ne pas debugger le trust store : verifier d'abord les SAN ci-dessus.
#
# Un wildcard ne couvre QU'UN SEUL niveau : `*.tibillet.localhost` ne couvre
# pas `bis.domainbis.localhost`. Tout domaine supplementaire (cf.
# ADDITIONAL_DOMAINS dans le .env) doit etre ajoute explicitement a la
# commande, avec son propre wildcard.
#
# ETAPE 3 — declarer le nom du certificat dans le .env (cf. env_example) :
#
# TLS_CERT_NAME='dev' # -> certs/dev.pem + certs/dev-key.pem
#
# ETAPE 4 — `docker compose up -d traefik`. C'est tout, la conf est ci-dessous.
#
# SI TU SAUTES CES ETAPES : `docker compose up` REFUSE de demarrer et affiche
# un message renvoyant vers ce tuto (garde-fou `${TLS_CERT_NAME:?...}` dans le
# bloc `configs:` en bas de fichier). C'est volontaire : sans certificat,
# Traefik ne sert plus aucun certificat du tout et le HTTPS tombe — mieux vaut
# un echec net et explicite qu'une stack a moitie cassee.
#
# NE JAMAIS COMMITER certs/ : il contient une cle privee. Chaque dev genere sa
# propre CA avec sa propre cle (cf. .gitignore).
#
# PIEGE connu : les appels HTTPS conteneur -> conteneur (Fedow -> Lespass via
# extra_hosts) ne connaissent pas cette CA. Si un tel appel echoue en
# "certificate verify failed", monter $(mkcert -CAROOT)/rootCA.pem dans
# /usr/local/share/ca-certificates/ de l'image concernee puis lancer
# update-ca-certificates.
# ---------------------------------------------------------------------------
traefik:
image: "traefik:latest"
container_name: "traefik"
hostname: "traefik"
command:
- "--log.level=INFO"
- "--providers.docker=true"
- "--providers.docker.network=frontend"
- "--providers.docker.exposedbydefault=false"
# Provider "file" : le certificat par defaut ne peut PAS etre declare via
# des labels Docker, seulement par fichier. Ce fichier est genere par
# Docker depuis le bloc `configs:` en bas de ce docker-compose.yml.
- "--providers.file.filename=/etc/traefik/dynamic.yml"
- "--entrypoints.entrypoints-https.address=:443"
- "--entrypoints.entrypoints-http.address=:80"
- "--entrypoints.entrypoints-http.http.redirections.entryPoint.to=entrypoints-https"
- "--entrypoints.entrypoints-http.http.redirections.entryPoint.scheme=https"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# Les certificats generes par mkcert a l'etape 2.
- "./certs:/certs:ro"
configs:
- source: traefik_tls_dynamic
target: /etc/traefik/dynamic.yml
restart: unless-stopped
networks:
- frontend
#### FEDOW ####
fedow_memcached:
image: memcached:1.6
container_name: fedow_memcached
hostname: fedow_memcached
restart: always
networks:
- backend
fedow_django:
image: tibillet/fedow:latest
container_name: fedow_django
hostname: fedow_django
restart: unless-stopped
env_file: .env
user: fedow
environment:
# Override DOMAIN pour LaBoutik : sous-domaine du service, pas le wildcard tenant.
# Resolu par compose via le .env (DOMAIN=tibillet.localhost) -> laboutik.tibillet.localhost.
DOMAIN: fedow.$DOMAIN
links:
- fedow_memcached:memcached
volumes:
- fedow_database:/home/fedow/Fedow/database
# Bind-mount du code source Fedow pour le dev (comme ../LaBoutik cote Laboutik).
- ../Fedow:/home/fedow/Fedow
networks:
- backend
command: "bash start.sh"
# command: "bash start_dev.sh"
extra_hosts:
- fedow.tibillet.localhost:172.17.0.1
- lespass.tibillet.localhost:172.17.0.1
- laboutik.tibillet.localhost:172.17.0.1
- laboutik2.tibillet.localhost:172.17.0.1
fedow_nginx:
image: nginx
restart: unless-stopped
container_name: fedow_nginx
hostname: fedow_nginx
volumes:
- ./nginx/fedow_nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./logs:/logs
depends_on:
- fedow_django
links:
- fedow_django:fedow_django
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.fedow_nginx.tls=true
- traefik.http.routers.fedow_nginx.rule=Host(`fedow.$DOMAIN`)
- traefik.http.services.fedow_nginx.loadbalancer.server.port=80
- traefik.http.routers.fedow_nginx.priority=100
networks:
- frontend
- backend
#########
# TIBILLET MONOREPO
#########
lespass_postgres:
image: postgres:13-bookworm
restart: unless-stopped
container_name: lespass_postgres
hostname: lespass_postgres
volumes:
- lespass_dev_db:/var/lib/postgresql/data
env_file: .env
networks:
- backend
lespass_memcached:
image : memcached:1.6
container_name: lespass_memcached
hostname: lespass_memcached
restart: unless-stopped
# Limite item portee a 8 Mo (defaut 1 Mo) : l'agregat SEO AGGREGATE_EVENTS
# (~687 o/event) approche 1 Mo vers ~1500 events futurs ; au-dela le set L1
# echoue. -m 256 : memoire totale 256 Mo (defaut 64) pour accueillir ces gros
# items sans evictions. A ajuster selon la RAM dispo. cf. TECH_DOC SEO CHANTIER-08.
# / Item size raised to 8 MB (default 1 MB): SEO AGGREGATE_EVENTS nears 1 MB
# around ~1500 future events. -m 256: 256 MB total to avoid evictions.
command: ["memcached", "-m", "256", "-I", "8m"]
networks:
- backend
lespass_redis:
container_name: lespass_redis
hostname: lespass_redis
image: redis:7.2.3-bookworm
restart: unless-stopped
networks:
- backend
lespass_django:
build: .
# image: tibillet/lespass:latest
restart: unless-stopped
container_name: lespass_django
hostname: lespass_django
volumes:
- ./:/DjangoFiles
env_file: .env
depends_on:
- lespass_postgres
- lespass_redis
- lespass_memcached
links:
- lespass_postgres:postgres
- lespass_redis:redis
- lespass_memcached:memcached
networks:
- backend
extra_hosts:
- fedow.tibillet.localhost:172.17.0.1
- lespass.tibillet.localhost:172.17.0.1
- laboutik.tibillet.localhost:172.17.0.1
- laboutik2.tibillet.localhost:172.17.0.1
command: 'bash start_dev.sh'
lespass_celery:
build: .
# image: tibillet/lespass:latest
container_name: lespass_celery
restart: unless-stopped
hostname: lespass_celery
env_file: .env
volumes:
- ./:/DjangoFiles
depends_on:
- lespass_postgres
- lespass_redis
- lespass_memcached
links:
- lespass_postgres:postgres
- lespass_redis:redis
- lespass_memcached:memcached
networks:
- backend
extra_hosts:
- fedow.tibillet.localhost:172.17.0.1
- lespass.tibillet.localhost:172.17.0.1
- laboutik.tibillet.localhost:172.17.0.1
- laboutik2.tibillet.localhost:172.17.0.1
command: "poetry run celery -A TiBillet worker -l INFO -B --concurrency=6"
lespass_nginx:
image: nginx:latest
container_name: lespass_nginx
restart: unless-stopped
hostname: lespass_nginx
links:
- lespass_django:lespass_django
volumes:
- ./nginx/lespass_dev.conf:/etc/nginx/conf.d/default.conf:ro
- ./www:/www
- ./logs:/logs
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.lespass_nginx.tls=true
# - traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || Host(`www.$DOMAIN`) || Host(`agenda.$DOMAIN`) || Host(`lespass.$DOMAIN`) || Host(`linterupteur.$DOMAIN`) || Host(`demo.$DOMAIN`) || Host(`bis.domainbis.localhost`) || Host(`domainbis.localhost`) || Host(`festival.$DOMAIN`) || Host(`la-lowcow-motiv.$DOMAIN`)
- traefik.http.routers.lespass_nginx.rule=Host(`$DOMAIN`) || HostRegexp(`${DOMAIN_REGEX}`)
- traefik.http.services.lespass_nginx.loadbalancer.server.port=80
networks:
- backend
- frontend
networks:
frontend:
external: true
backend:
volumes:
lespass_dev_db:
fedow_database:
fedow_dev_db:
# -----------------------------------------------------------------------------
# CONFIGURATION DYNAMIQUE TRAEFIK — ecrite ici, pas dans un fichier separe.
# -----------------------------------------------------------------------------
# `content:` permet a Docker Compose de materialiser le contenu ci-dessous en
# fichier dans le conteneur (monte sur /etc/traefik/dynamic.yml, cf. le service
# traefik). Tout reste donc dans ce seul docker-compose.yml.
#
# Ce qu'on declare : le certificat par DEFAUT du store TLS. Tous les routers qui
# ont `tls=true` (lespass_nginx, fedow_nginx...) l'utilisent automatiquement,
# sans avoir a modifier leurs labels.
#
# Les chemins pointent vers ./certs monte en lecture seule dans le conteneur.
# Ces deux fichiers sont produits par la commande mkcert de l'ETAPE 2 (voir le
# tuto en haut de ce fichier, au-dessus du service traefik).
#
# GARDE-FOU : `${VAR:?message}` fait echouer `docker compose up` AVANT tout
# demarrage si TLS_CERT_NAME n'est pas defini dans le .env, en affichant le
# message ci-dessous. Sans ce garde-fou, la stack demarrerait puis Traefik
# echouerait sur "failed to find any PEM data in certificate input" et ne
# servirait plus AUCUN certificat — HTTPS casse, avec un message obscur.
# / Fails fast with an explicit message instead of a cryptic Traefik TLS error.
configs:
traefik_tls_dynamic:
content: |
tls:
stores:
default:
defaultCertificate:
certFile: /certs/${TLS_CERT_NAME:?Certificat HTTPS de dev absent. Lire le tuto en tete du docker-compose.yml (au-dessus du service traefik) - resume - 1) mkcert -install 2) mkcert -cert-file certs/dev.pem -key-file certs/dev-key.pem '$DOMAIN' '*.$DOMAIN' 3) ajouter TLS_CERT_NAME=dev dans le .env (cf. env_example)}.pem
keyFile: /certs/${TLS_CERT_NAME}-key.pem
# Pour test stripe :
# stripe listen --forward-to https://fedow.tibillet.localhost/api/webhook_stripe/ --skip-verify
# stripe listen --forward-to https://tibillet.localhost/api/webhook_stripe/ --skip-verify
# poetry shell
# django-admin makemessages -l fr && django-admin makemessages -l en
# django-admin compilemessages
# docker build -t lespass . && docker tag lespass tibillet/lespass:latest && docker tag lespass tibillet/lespass:0.10.5 && docker push tibillet/lespass:latest && docker push tibillet/lespass:0.10.5