-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
97 lines (91 loc) · 3.89 KB
/
Copy pathdocker-compose.yml
File metadata and controls
97 lines (91 loc) · 3.89 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
# Plusieurs instances Ghost peuvent cohabiter sur le meme serveur : chaque stack
# a son dossier, son COMPOSE_PROJECT_NAME et son DOMAIN (voir README).
# D'ou l'absence de container_name : Docker nomme les conteneurs d'apres le projet.
services:
ghost:
image: ghost:6-alpine
restart: unless-stopped
volumes:
- ./ghost:/var/lib/ghost/content
environment:
NODE_ENV: production
url: https://${DOMAIN:?DOMAIN doit etre renseigne dans .env}
database__client: mysql
database__connection__host: ghost-mysql
database__connection__user: ${MYSQL_USER:-ghost}
database__connection__password: ${MYSQL_PASSWORD:?MYSQL_PASSWORD doit etre renseigne dans .env}
database__connection__database: ghost
# Sans SMTP : plus de connexion staff, d'invitation ni de reset de mot de passe.
mail__transport: SMTP
mail__options__host: ${MAIL_HOST:?MAIL_HOST doit etre renseigne dans .env}
mail__options__port: ${MAIL_PORT:-465}
mail__options__secure: ${MAIL_SECURE:-true}
mail__options__auth__user: ${MAIL_USER:?MAIL_USER doit etre renseigne dans .env}
mail__options__auth__pass: ${MAIL_PASSWORD:?MAIL_PASSWORD doit etre renseigne dans .env}
mail__from: ${MAIL_FROM:?MAIL_FROM doit etre renseigne dans .env}
healthcheck:
# On ne suit pas les redirections : Ghost renvoie un 301 vers https://$DOMAIN
# sur une requete locale en http. Tout code < 500 signifie "Ghost repond".
test: ["CMD", "node", "-e", "require('http').get({host:'127.0.0.1',port:2368,path:'/ghost/api/admin/site/'},r=>process.exit(r.statusCode<500?0:1)).on('error',()=>process.exit(1))"]
interval: 30s
timeout: 10s
# Au premier demarrage, Ghost joue ses migrations de schema : plusieurs
# minutes sur un disque lent. On lui laisse le temps.
retries: 10
start_period: 90s
labels:
# Les noms de routers/services Traefik sont globaux : on les derive du nom
# de projet pour que deux Ghost sur le meme serveur ne se marchent pas dessus.
# A defaut de COMPOSE_PROJECT_NAME dans .env, compose prend le nom du dossier.
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.certresolver=myresolver
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`$DOMAIN`)
- traefik.http.services.${COMPOSE_PROJECT_NAME}.loadbalancer.server.port=2368
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
- frontend
- backend
depends_on:
ghost-mysql:
condition: service_healthy
ghost-mysql:
image: mysql:8.0
restart: unless-stopped
expose:
- 3306
volumes:
- ./db:/var/lib/mysql
environment:
# Ces trois mots de passe ne doivent plus jamais changer une fois la base initialisee.
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?MYSQL_ROOT_PASSWORD doit etre renseigne dans .env}
MYSQL_USER: ${MYSQL_USER:-ghost}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:?MYSQL_PASSWORD doit etre renseigne dans .env}
MYSQL_DATABASE: ghost
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
interval: 10s
timeout: 5s
# La toute PREMIERE initialisation de la base peut prendre plusieurs minutes
# sur un disque lent. Trop peu de retries ici et Ghost abandonne son
# depends_on avant que MySQL soit pret. Une fois la base initialisee, le
# demarrage prend ~5s : cette tolerance ne coute rien.
retries: 30
start_period: 60s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
- backend
networks:
# Reseau partage avec Traefik, deja cree sur le serveur.
frontend:
external: true
# Reseau prive Ghost <-> MySQL : la base n'est pas joignable depuis frontend.
backend: