Table of Contents
Installation Production
Prérequis
- Serveur Linux avec Docker 24+ et Docker Compose V2
- Domaine DNS pointant vers le serveur (
goutailler-olivier.com) - Ports 80, 443 et 2222 ouverts en entrée
1. Réseau Docker partagé
Tous les services communiquent via un réseau externe proxy. À créer une seule fois :
docker network create proxy
2. Traefik
Traefik est le point d'entrée unique : il gère le TLS (Let's Encrypt) et route les requêtes vers chaque service.
cd traefik/
docker compose up -d
Le dashboard est exposé sur https://traefik.goutailler-olivier.com (accès restreint par défaut).
3. Keycloak
Keycloak gère l'authentification SSO pour toute l'infrastructure.
cd keycloak/
cp .env.example .env
# Éditer .env avec des mots de passe sécurisés
docker compose up -d
Variables à définir dans .env :
| Variable | Description |
|---|---|
POSTGRES_PASSWORD |
Mot de passe de la base PostgreSQL |
KEYCLOAK_ADMIN |
Login administrateur (défaut : admin) |
KEYCLOAK_ADMIN_PASSWORD |
Mot de passe administrateur |
Configuration post-démarrage :
- Se connecter à
https://auth.goutailler-olivier.com/admin - Créer le realm
bonsai - Créer le client
bonsai-webapp(type OpenID Connect, flux Authorization Code) - Configurer les Valid redirect URIs :
https://bonsai.goutailler-olivier.com/*
4. Gitea
Gitea est la forge Git avec le runner CI/CD intégré.
cd gitea/
cp .env.example .env
# Éditer .env avec des valeurs sécurisées
docker compose up -d
Variables à définir dans .env :
| Variable | Description |
|---|---|
GITEA_POSTGRES_PASSWORD |
Mot de passe de la base PostgreSQL |
GITEA_RUNNER_REGISTRATION_TOKEN |
Token d'enregistrement du runner Actions |
Configuration post-démarrage :
- Accéder à
https://git.goutailler-olivier.comet terminer l'installation via l'interface web - Créer l'organisation
bonsai - Récupérer le token d'enregistrement du runner dans Administration du site → Actions → Runners → Créer un runner
- Mettre à jour
GITEA_RUNNER_REGISTRATION_TOKENdans.env, puis redémarrer le service :docker compose restart act_runner
Le runner est configuré avec le label ubuntu-latest mappé sur ubuntu:22.04.
5. Bonsai API
L'image est construite par la CI Gitea et poussée sur le registre git.goutailler-olivier.com/bonsai/bonsai-api:latest.
Le registre Gitea requiert une authentification. Se connecter une première fois avec son compte Gitea :
docker login git.goutailler-olivier.com -u <utilisateur>
Note : par défaut, Docker stocke le mot de passe en clair dans
~/.docker/config.json. Pour éviter cela, configurer un credential helper.
cd bonsai-api/
cp .env.example .env
# Éditer .env avec un mot de passe sécurisé
docker compose up -d
Variables d'environnement :
| Variable | Description |
|---|---|
POSTGRES_PASSWORD |
Mot de passe PostgreSQL (injecté via .env) |
DATASOURCE_URL |
jdbc:postgresql://db:5432/bonsai (défaut réseau interne) |
KEYCLOAK_JWKS_URI |
https://auth.goutailler-olivier.com/realms/bonsai/protocol/openid-connect/certs |
CORS_ALLOWED_ORIGIN_PROD |
https://bonsai.goutailler-olivier.com |
Flyway applique automatiquement les migrations SQL au démarrage.
Documentation API (Swagger UI) :
| Environnement | URL |
|---|---|
| Production | https://bonsai.goutailler-olivier.com/api/swagger-ui.html |
| Développement local | http://localhost:8080/swagger-ui.html |
La définition OpenAPI brute est disponible sur /v3/api-docs.
6. Bonsai Webapp
cd bonsai-webapp/
docker compose up -d
L'image git.goutailler-olivier.com/bonsai/bonsai-webapp:latest est également construite par la CI. Aucune variable d'environnement spécifique n'est requise.
Secrets Gitea à configurer au niveau de l'organisation bonsai :
| Secret | Description |
|---|---|
RELEASE_TOKEN |
Token Gitea avec droits write:packages et write:repository |
WATCHTOWER_TOKEN |
Token HTTP de l'API Watchtower pour déclencher le redéploiement (voir section 11) |
7. Luz
Luz est déployé en deux environnements, chacun servant à la fois la webapp Angular et le backend Spring Boot sur un même domaine (routing par chemin Traefik) :
| Env. | Dossier | Domaine | Backend | Base de données |
|---|---|---|---|---|
| Production | luz/ |
luz.goutailler-olivier.com |
/api |
persistante (~/Applications/data/luz/db_data) |
| Test | dev-luz/ |
dev-luz.goutailler-olivier.com |
/api |
réinitialisée à chaque boot (profil Spring dev + seed.sql) |
Chaque stack contient trois services : db (PostgreSQL 17), backend (localhost/luz-backend) et webapp (localhost/luz-webapp, nginx).
Déploiement par script (SSH direct, sans registre). Contrairement aux autres services, les images Luz ne transitent pas par le registre Gitea / Watchtower : elles sont buildées en local puis chargées sur le serveur par SSH via Luz/script/deploy.sh (voir Mise à jour des applications).
# Depuis le repo Luz, en local :
cp deploy/deploy.env.example deploy/deploy.env # renseigner SSH_HOST / SSH_USER
./script/deploy.sh prod # build + envoi + démarrage (prod)
./script/deploy.sh dev # idem sur l'environnement de test
Au premier déploiement, le script crée le dossier distant (~/luz ou ~/dev-luz), y copie le docker-compose.yml et génère un .env avec des secrets forts (jamais écrasé ensuite).
Variables du .env (générées automatiquement, ou à définir pour un démarrage manuel) :
| Variable | Description |
|---|---|
DB_PASSWORD |
Mot de passe PostgreSQL — openssl rand -hex 16 |
JWT_SECRET |
Secret de signature JWT — openssl rand -base64 32. Obligatoire : ne jamais réutiliser le défaut de développement de application.yml sur un domaine public. |
Prérequis DNS : enregistrements A luz et dev-luz pointant sur le serveur (indispensables au challenge HTTP-01 de Let's Encrypt).
Flyway applique les migrations au démarrage du backend. En prod, la base est persistante ; en test (profil dev), elle est réinitialisée avec les données de seed à chaque redémarrage.
8. Olhar
Le dossier olhar/ regroupe les trois services de l'application : la base PostgreSQL, l'API Spring Boot et la PWA Angular. Les images sont construites par la CI Gitea.
cd olhar/
cp .env.example .env
# Éditer .env avec des valeurs sécurisées
docker compose up -d
Variables à définir dans .env :
| Variable | Description |
|---|---|
POSTGRES_PASSWORD |
Mot de passe PostgreSQL partagé entre db et api |
JWT_SECRET |
Secret de signature JWT — générer avec openssl rand -hex 32 |
Variables d'environnement codées en dur dans le compose :
| Variable | Valeur |
|---|---|
DATASOURCE_URL |
jdbc:postgresql://db:5432/olhar (réseau interne olhar-net) |
CORS_ALLOWED_ORIGIN_PROD |
https://olhar.goutailler-olivier.com |
PHOTOS_STORAGE_PATH |
/app/uploads (monté sur ~/Applications/data/olhar/uploads) |
Flyway applique automatiquement les migrations SQL au démarrage de l'API.
Migration depuis l'ancien dossier olhar-api/ (si des données existent déjà en production) :
# Arrêter les anciens containers
cd olhar-api/ && docker compose down
# Déplacer les données vers le nouveau chemin
mkdir -p ~/Applications/data/olhar
mv ~/Applications/data/olhar-api/db_data ~/Applications/data/olhar/db_data
mv ~/Applications/data/olhar-api/uploads ~/Applications/data/olhar/uploads
rmdir ~/Applications/data/olhar-api
# Démarrer le nouveau stack
cd ../olhar/
cp .env.example .env # copier les mêmes valeurs que dans l'ancien .env
docker compose up -d
Secrets Gitea à configurer au niveau de l'organisation gato :
| Secret | Description |
|---|---|
RELEASE_TOKEN |
Token Gitea avec droits write:packages et write:repository |
WATCHTOWER_TOKEN |
Token HTTP de l'API Watchtower pour déclencher le redéploiement (voir section 11) |
SERVER_HOST |
Adresse IP ou hostname du serveur de production |
SERVER_SSH_KEY |
Clé SSH privée pour accéder au serveur |
10. Nextcloud
cd nextcloud/
cp .env.example .env
# Éditer .env avec des valeurs sécurisées avant le premier démarrage
docker compose up -d
Variables à définir dans .env :
| Variable | Description |
|---|---|
POSTGRES_PASSWORD |
Mot de passe PostgreSQL |
NEXTCLOUD_ADMIN_USER |
Compte administrateur Nextcloud (créé au premier démarrage uniquement) |
NEXTCLOUD_ADMIN_PASSWORD |
Mot de passe administrateur |
PGADMIN_DEFAULT_EMAIL |
Email de connexion pgAdmin |
PGADMIN_DEFAULT_PASSWORD |
Mot de passe pgAdmin |
11. Trilium
cd trilium/
docker compose up -d
Les données sont persistées dans /home/gato/Applications/Trilium/data sur l'hôte. S'assurer que ce chemin existe avant le démarrage :
mkdir -p /home/gato/Applications/Trilium/data
12. Watchtower
Watchtower surveille les conteneurs Docker et les redémarre automatiquement lorsqu'une nouvelle image est disponible. Il est déclenché par les pipelines CI/CD via son API HTTP sécurisée par un token.
Génération du token
Générer une valeur aléatoire forte :
openssl rand -hex 32
Conserver cette valeur — elle sera utilisée dans les deux étapes suivantes.
Configuration sur le serveur
cd watchtower/
cp .env.example .env
# Remplacer la valeur par le token généré
echo "WATCHTOWER_TOKEN=<token_généré>" > .env
docker compose up -d
Variable requise dans .env :
| Variable | Description |
|---|---|
WATCHTOWER_TOKEN |
Token secret pour l'API HTTP de Watchtower |
Secrets Gitea à configurer
Le même token doit être ajouté comme secret WATCHTOWER_TOKEN dans les paramètres de chaque organisation Gitea. Les dépôts héritent automatiquement des secrets de leur organisation — aucune configuration par dépôt n'est nécessaire.
| Organisation | Chemin dans Gitea | Dépôts concernés |
|---|---|---|
gato |
Settings → Secrets → New Secret | Luz, Olhar, Olhar API |
bonsai |
Settings → Secrets → New Secret | Bonsai-webapp |
Important : la valeur du secret Gitea doit être identique à celle définie dans le
.envserveur.
Ordre de démarrage recommandé
1. Réseau proxy (une seule fois)
2. Traefik
3. Keycloak
4. Gitea
5. Bonsai API
6. Bonsai Webapp
7. Luz
8. Olhar (db + api + pwa)
9. Nextcloud
10. Trilium
11. Watchtower
Vérifications
# État de tous les conteneurs
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Logs d'un service
docker logs <nom_conteneur> --tail 50 -f
# Certificats TLS Traefik
docker logs traefik 2>&1 | grep -i "certificate\|acme"