12
Installation Production
Gato edited this page 2026-07-05 10:49:34 +02:00

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 :

  1. Se connecter à https://auth.goutailler-olivier.com/admin
  2. Créer le realm bonsai
  3. Créer le client bonsai-webapp (type OpenID Connect, flux Authorization Code)
  4. 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 :

  1. Accéder à https://git.goutailler-olivier.com et terminer l'installation via l'interface web
  2. Créer l'organisation bonsai
  3. Récupérer le token d'enregistrement du runner dans Administration du site → Actions → Runners → Créer un runner
  4. Mettre à jour GITEA_RUNNER_REGISTRATION_TOKEN dans .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 .env serveur.


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"