Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
178 lines (164 loc) · 9.09 KB
/
Copy pathdocker-compose.yml
File metadata and controls
178 lines (164 loc) · 9.09 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
services:
# --- Base de données MariaDB ---
mariadb:
image: mariadb:10.11
container_name: kesh-mariadb
restart: unless-stopped
environment:
# Mots de passe OBLIGATOIRES (`:?`) : sans eux dans `.env`, Compose refuse
# de démarrer en nommant la variable. MariaDB ne les lit qu'à la CRÉATION
# de la base : les changer ensuite dans `.env` ne change pas le mot de
# passe enregistré (manuel d'administration, § Passer à la 0.13.0).
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD:?à poser dans .env. Installation existante, reprendre la valeur avec laquelle la base a été créée, jamais une neuve (manuel d'administration, Passer à la 0.13.0)}
MARIADB_DATABASE: ${MARIADB_DATABASE:-kesh}
MARIADB_USER: ${MARIADB_USER:-kesh}
MARIADB_PASSWORD: ${MARIADB_PASSWORD:?à poser dans .env. Installation existante, reprendre la valeur avec laquelle la base a été créée, jamais une neuve (manuel d'administration, Passer à la 0.13.0)}
# Port 3306 NON publié : Kesh atteint MariaDB par le réseau interne
# `kesh-network` (hôte `mariadb`). Un port publié par Docker contourne le
# pare-feu de l'hôte (UFW) et ouvrirait la base à tout le réseau.
# Accès à la base : `docker compose exec mariadb mariadb -u kesh -p`.
# Dépannage ponctuel SEULEMENT — décommenter, lié au loopback, jamais sans
# adresse, puis recommenter :
# ports:
# - "127.0.0.1:3306:3306"
volumes:
- kesh-mariadb-data:/var/lib/mysql
networks:
- kesh-network
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
command:
- --default-authentication-plugin=mysql_native_password
- --max_connections=100
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
# --- API Kesh (Rust + Frontend statique) ---
kesh-api:
# Image publiée : `docker compose up -d` la TIRE (ce fichier s'installe seul,
# sans les sources). Depuis un clone du dépôt, `docker compose up -d --build`
# construit depuis les sources — et ÉTIQUETTE ce build `gcorbaz/kesh:latest`,
# que les `up -d` suivants emploient sans tirer ; pour revenir à l'image
# publiée : `docker compose pull kesh-api`.
image: gcorbaz/kesh:latest
build:
context: .
dockerfile: Dockerfile
container_name: kesh-api
restart: unless-stopped
depends_on:
mariadb:
condition: service_healthy
environment:
# ⚠️ Seules les variables listées ici atteignent Kesh : Compose lit `.env`
# pour remplir les `${…}` de ce fichier, sans le transmettre au conteneur.
# Une variable ajoutée au code doit l'être ici — test `configuration_transmise`.
# Après une modification de `.env` : `docker compose up -d` (un `restart`
# ne relit pas `.env`).
#
# Base de données — correspond au service mariadb ci-dessus
DATABASE_URL: mysql://${MARIADB_USER:-kesh}:${MARIADB_PASSWORD:?à poser dans .env. Installation existante, reprendre la valeur avec laquelle la base a été créée, jamais une neuve (manuel d'administration, Passer à la 0.13.0)}@mariadb:3306/${MARIADB_DATABASE:-kesh}
# Application
KESH_PORT: ${KESH_PORT:-80}
KESH_HOST: ${KESH_HOST:-0.0.0.0} # 0.0.0.0 en docker-compose (reverse proxy fronts)
# Admin initial — optionnel : vide → onboarding `/setup` au premier accès.
# Si posé : ≥ 12 caractères, ni `changeme`, ni placeholder du gabarit.
KESH_ADMIN_USERNAME: ${KESH_ADMIN_USERNAME:-admin}
KESH_ADMIN_PASSWORD: ${KESH_ADMIN_PASSWORD:-}
# Authentification
KESH_JWT_SECRET: ${KESH_JWT_SECRET:-change-me-32-bytes-minimum-secret-generate-with-openssl-rand-hex-32}
KESH_JWT_EXPIRY_MINUTES: ${KESH_JWT_EXPIRY_MINUTES:-15}
KESH_REFRESH_TOKEN_MAX_LIFETIME_DAYS: ${KESH_REFRESH_TOKEN_MAX_LIFETIME_DAYS:-30}
# Flag Secure des cookies de session. true (défaut) = sécurisé, EXIGE HTTPS.
# ⚠️ Accès en HTTP simple (LAN/NAS sans reverse proxy TLS) : le navigateur
# refuse un cookie Secure → login impossible. Mettre KESH_COOKIE_SECURE=false
# dans .env pour ce cas (ou, mieux, servir en HTTPS via reverse proxy).
KESH_COOKIE_SECURE: ${KESH_COOKIE_SECURE:-true}
# Session & Rate Limiting
KESH_REFRESH_INACTIVITY_MINUTES: ${KESH_REFRESH_INACTIVITY_MINUTES:-15}
KESH_RATE_LIMIT_WINDOW_MINUTES: ${KESH_RATE_LIMIT_WINDOW_MINUTES:-15}
KESH_RATE_LIMIT_MAX_ATTEMPTS: ${KESH_RATE_LIMIT_MAX_ATTEMPTS:-5}
KESH_RATE_LIMIT_BLOCK_MINUTES: ${KESH_RATE_LIMIT_BLOCK_MINUTES:-30}
# Logging — stdout (docker logs) + fichier avec rotation (Story v011-1).
RUST_LOG: ${RUST_LOG:-info}
# Écrit AUSSI les logs dans un fichier /var/log/kesh/kesh.log (bind-monté
# sur l'hôte, cf. volumes) avec rotation. Opt-out : une ligne
# `KESH_LOG_FILE_PATH=` VIDE dans .env → stdout uniquement. Tiret SANS
# deux-points : le défaut ne vaut que pour une variable absente de .env.
KESH_LOG_FILE_PATH: ${KESH_LOG_FILE_PATH-/var/log/kesh/kesh.log}
KESH_LOG_FILE_ROTATION: ${KESH_LOG_FILE_ROTATION:-daily}
KESH_LOG_FILE_MAX_FILES: ${KESH_LOG_FILE_MAX_FILES:-7}
KESH_LOG_FILE_FORMAT: ${KESH_LOG_FILE_FORMAT:-pretty}
# Import de factures depuis un dossier (Story 12-5, #194)
KESH_DOCUMENTS_DIR: ${KESH_DOCUMENTS_DIR:-/data/documents}
KESH_INBOX_DIR: ${KESH_INBOX_DIR:-/data/inbox}
KESH_INBOX_MAX_FILE_BYTES: ${KESH_INBOX_MAX_FILE_BYTES:-26214400}
KESH_INBOX_MAX_FILES_PER_RUN: ${KESH_INBOX_MAX_FILES_PER_RUN:-200}
KESH_INBOX_MAX_PDF_PAGES: ${KESH_INBOX_MAX_PDF_PAGES:-20}
# Les variables ci-dessous, en `${NOM:-}`, arrivent vides quand `.env` ne les
# pose pas ou les laisse vides : vide (ou blanc) = défaut du code, sans
# avertissement (manuel d'administration, § Variables d'environnement).
# Localisation, politique de mot de passe, import bancaire
KESH_LANG: ${KESH_LANG:-}
KESH_PASSWORD_MIN_LENGTH: ${KESH_PASSWORD_MIN_LENGTH:-}
KESH_BANK_IMPORT_MAX_MB: ${KESH_BANK_IMPORT_MAX_MB:-}
# E-mails sortants (envoi de factures) et mot de passe oublié par e-mail
KESH_SMTP_HOST: ${KESH_SMTP_HOST:-}
KESH_SMTP_PORT: ${KESH_SMTP_PORT:-}
KESH_SMTP_USER: ${KESH_SMTP_USER:-}
KESH_SMTP_PASSWORD: ${KESH_SMTP_PASSWORD:-}
KESH_SMTP_FROM: ${KESH_SMTP_FROM:-}
KESH_SMTP_TLS: ${KESH_SMTP_TLS:-}
KESH_PUBLIC_BASE_URL: ${KESH_PUBLIC_BASE_URL:-}
KESH_FEATURE_FORGOT_PASSWORD: ${KESH_FEATURE_FORGOT_PASSWORD:-}
# Sortie de la démonstration (réinitialisation d'une installation de démo)
KESH_PRODUCTION_RESET: ${KESH_PRODUCTION_RESET:-}
# Export / import d'installation (.keshbackup)
KESH_ADMIN_BACKUP_DIR: ${KESH_ADMIN_BACKUP_DIR:-}
KESH_ADMIN_EXPORT_INMEM_MB: ${KESH_ADMIN_EXPORT_INMEM_MB:-}
KESH_ADMIN_IMPORT_MAX_MB: ${KESH_ADMIN_IMPORT_MAX_MB:-}
ports:
- "80:80"
volumes:
# Logs fichier (Story v011-1) — répertoire host accessible (par défaut ./log).
# Sur NAS, pointe KESH_LOG_HOST_DIR vers un dossier partagé pour consulter
# les logs depuis le PC (ex. /volume1/kesh/log).
- ${KESH_LOG_HOST_DIR:-./log}:/var/log/kesh
# Import de factures (Story 12-5) — dossiers montés en BIND MOUNTS host pour
# être ACCESSIBLES DEPUIS TON PC (SMB direct ou Synology Drive).
#
# Synology : crée un dossier partagé DSM (ex. « kesh ») avec les sous-dossiers
# `inbox` et `documents`, puis renseigne dans .env les chemins ABSOLUS :
# KESH_INBOX_HOST_DIR=/volume1/kesh/inbox
# KESH_DOCUMENTS_HOST_DIR=/volume1/kesh/documents
# Enfin, active SMB (Panneau config → Services de fichiers) OU Synology Drive
# sur le dossier partagé → mappe/synchronise `inbox` sur le PC et dépose tes
# factures dedans. Kesh les lit dans /data/inbox (= le dossier bind-monté).
# Défauts (dev, sans .env) : sous-dossiers ./inbox et ./documents du projet.
- ${KESH_INBOX_HOST_DIR:-./inbox}:/data/inbox
- ${KESH_DOCUMENTS_HOST_DIR:-./documents}:/data/documents
# Sauvegarde de sécurité prise avant chaque import d'installation (#552) —
# défaut du code /data/backup, monté ici sur ./backup (montage fixe, sans
# variable d'hôte). SECRET (condensés des mots de passe, jetons de session) :
# fichiers en 0600. Dans le périmètre de sauvegarde du dossier du compose
# (Hyper Backup) ; à purger par l'exploitant (une sauvegarde par import).
- ./backup:/data/backup
networks:
- kesh-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 10s
timeout: 5s
retries: 5
volumes:
kesh-mariadb-data:
driver: local
# Story 12-5 (#194) : inbox + documents sont désormais des BIND MOUNTS host
# (cf. service kesh-api) pour être accessibles depuis le PC — plus de volumes
# nommés (un volume nommé vit dans le stockage interne Docker, non exposable
# via File Station / Synology Drive).
networks:
kesh-network:
driver: bridge