Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
154 lines (146 loc) · 7.56 KB
/
Copy pathdocker-compose.yml
File metadata and controls
154 lines (146 loc) · 7.56 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
services:
nextcloud_db:
# Version : POSTGRES_TAG du .env. Ne JAMAIS la changer a la main : une image
# plus recente cree une base vide a cote -> make pg-upgrade PG_CIBLE=19
image: postgres:${POSTGRES_TAG:?POSTGRES_TAG doit etre renseigne dans .env}-bookworm
hostname: nextcloud_db
restart: always
volumes:
# PG >= 18 : /var/lib/postgresql (donnees dans database/18/docker).
# PG <= 17 : POSTGRES_MOUNT=/var/lib/postgresql/data dans le .env.
- ./database:${POSTGRES_MOUNT:-/var/lib/postgresql}
# Seulement ces trois variables (pas env_file: .env) : le conteneur ne
# recoit pas les autres secrets (JWT_SECRET...), et une modification du
# .env sans rapport (NEXTCLOUD_TAG...) ne le recree plus.
environment:
POSTGRES_DB: ${POSTGRES_DB:?POSTGRES_DB doit etre renseigne dans .env}
POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER doit etre renseigne dans .env}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD doit etre renseigne dans .env}
# "Pret" = accepte les connexions : Nextcloud attend ce feu vert pour
# demarrer (sa migration d'une montee de version echouerait sur une base
# qui redemarre encore).
# -h 127.0.0.1 : en TCP. Pendant l'initialisation d'une base neuve, le
# serveur temporaire ne repond que sur la socket Unix.
# start_period long (verifie toutes les 2 s, donc sans attente inutile) :
# apres une coupure brutale, la recuperation peut durer, et un "unhealthy"
# empecherait make up de demarrer Nextcloud.
healthcheck:
test: ["CMD-SHELL", "pg_isready -q -h 127.0.0.1 -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\""]
interval: 10s
timeout: 5s
retries: 6
start_period: 300s
start_interval: 2s
# Arret propre (checkpoint) au lieu d'un SIGKILL au bout de 10 s.
stop_grace_period: 60s
networks:
- nextcloud_db
nextcloud_redis:
hostname: nextcloud_redis
image: redis:7.4
restart: always
networks:
- nextcloud_db
nextcloud_app:
hostname: nextcloud_app
# Version : NEXTCLOUD_TAG du .env (une majeure : suit ses correctifs).
# Majeure suivante : make upgrade (une a la fois, apps verifiees).
image: nextcloud:${NEXTCLOUD_TAG:?NEXTCLOUD_TAG doit etre renseigne dans .env}
restart: always
depends_on:
nextcloud_db:
condition: service_healthy
nextcloud_redis:
condition: service_started
volumes:
- ./data/www/html:/var/www/html
environment:
# Pas de fichiers d'exemple dans le dossier des nouveaux utilisateurs
- NC_skeletondirectory=
networks:
- nextcloud_db
- frontend
# Option (repris de nextcloud32) : si le serveur ne sait pas se joindre par
# sa propre IP publique (NAT sans hairpin), faire pointer les noms vers la
# passerelle du reseau frontend (docker network inspect frontend).
# A mettre plutot dans docker-compose.override.yml (propre au serveur,
# ignore par git) : voir le README.
# extra_hosts:
# - "nuage.$DOMAIN:172.18.0.1"
# - "onlyoffice.$DOMAIN:172.18.0.1"
labels:
- "traefik.enable=true"
- "traefik.docker.network=frontend"
# Noms de routeurs, services et middlewares suffixes par ROUTER_NAME (.env) :
# plusieurs instances peuvent partager le meme Traefik sans collision.
- "traefik.http.routers.nextcloud_${ROUTER_NAME:?ROUTER_NAME doit etre renseigne dans .env}.tls.certresolver=myresolver"
- "traefik.http.routers.nextcloud_${ROUTER_NAME}.rule=Host(`nuage.$DOMAIN`)"
- "traefik.http.services.nextcloud_${ROUTER_NAME}.loadbalancer.server.port=80"
# Une seule ligne : deux labels "middlewares" sur le meme router, le second ecrase le premier.
- "traefik.http.routers.nextcloud_${ROUTER_NAME}.middlewares=nextcloud_custom_header_${ROUTER_NAME}, nextcloud_redirectregex_${ROUTER_NAME}, crowdsec@file"
# HSTS uniquement. Pas de contentSecurityPolicy ici : Traefik REMPLACERAIT
# la CSP complete de Nextcloud (qui gere deja frame-ancestors et le
# frame-src d'OnlyOffice).
- "traefik.http.middlewares.nextcloud_custom_header_${ROUTER_NAME}.headers.customResponseHeaders.Strict-Transport-Security=max-age=15552000; includeSubDomains; preload;"
# redirection nécéssaire au desktop client et autres webdav
- "traefik.http.middlewares.nextcloud_redirectregex_${ROUTER_NAME}.redirectregex.permanent=true"
- "traefik.http.middlewares.nextcloud_redirectregex_${ROUTER_NAME}.redirectregex.regex=https://(.*)/.well-known/(?:card|cal)dav"
- "traefik.http.middlewares.nextcloud_redirectregex_${ROUTER_NAME}.redirectregex.replacement=https://$${1}/remote.php/dav"
onlyoffice:
hostname: onlyoffice
# Version : ONLYOFFICE_TAG du .env (10.0 : suit les correctifs 10.0.x).
# Avant de passer en 10.1 ou 11, verifier que le connecteur (app onlyoffice
# de Nextcloud) la supporte, puis : make update OO_CONFIRME=1
image: onlyoffice/documentserver:${ONLYOFFICE_TAG:?ONLYOFFICE_TAG doit etre renseigne dans .env}
restart: always
networks:
- frontend
# Option (repris de nextcloud32) : si le serveur ne sait pas se joindre par
# sa propre IP publique (NAT sans hairpin), faire pointer les noms vers la
# passerelle du reseau frontend (docker network inspect frontend).
# A mettre plutot dans docker-compose.override.yml (propre au serveur,
# ignore par git) : voir le README.
# extra_hosts:
# - "nuage.$DOMAIN:172.18.0.1"
# - "onlyoffice.$DOMAIN:172.18.0.1"
environment:
# Cle partagee avec Nextcloud : la meme valeur est poussee dans l'app
# onlyoffice par scripts/onlyoffice_connect.sh (make onlyoffice).
JWT_ENABLED: "true"
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET doit etre renseigne dans .env}
JWT_HEADER: Authorization
ENABLE_SSL: true
volumes:
# Volumes nommes : survivent a un `docker compose down` (les anonymes non).
- onlyoffice_data:/var/www/onlyoffice/Data
- onlyoffice_lib:/var/lib/onlyoffice
- onlyoffice_logs:/var/log/onlyoffice
- onlyoffice_fonts:/usr/share/fonts/truetype/custom
expose:
- '80'
- '443'
labels:
- "traefik.enable=true"
- "traefik.docker.network=frontend"
- "traefik.http.routers.onlyoffice_${ROUTER_NAME}.tls.certresolver=myresolver"
- "traefik.http.routers.onlyoffice_${ROUTER_NAME}.rule=Host(`onlyoffice.$DOMAIN`)"
- "traefik.http.services.onlyoffice_${ROUTER_NAME}.loadbalancer.server.port=80"
- "traefik.http.routers.onlyoffice_${ROUTER_NAME}.entrypoints=websecure"
# Une seule ligne middlewares (l'ancienne redirection https etait ecrasee
# par la suivante, et inutile : l'entrypoint web redirige deja vers websecure).
- "traefik.http.routers.onlyoffice_${ROUTER_NAME}.middlewares=onlyoffice_custom_header_${ROUTER_NAME}"
- "traefik.http.middlewares.onlyoffice_custom_header_${ROUTER_NAME}.headers.customResponseHeaders.Strict-Transport-Security=max-age=15552000; includeSubDomains; preload;"
- "traefik.http.middlewares.onlyoffice_custom_header_${ROUTER_NAME}.headers.referrerPolicy=no-referrer"
- "traefik.http.middlewares.onlyoffice_custom_header_${ROUTER_NAME}.headers.forceSTSHeader=true"
- "traefik.http.middlewares.onlyoffice_custom_header_${ROUTER_NAME}.headers.browserXssFilter=true"
- "traefik.http.middlewares.onlyoffice_custom_header_${ROUTER_NAME}.headers.customRequestHeaders.X-Forwarded-Proto=https"
networks:
frontend:
external: true
nextcloud_db:
internal: true
volumes:
onlyoffice_data:
onlyoffice_lib:
onlyoffice_logs:
onlyoffice_fonts: