Déploiement Docker¶
Drovio Server peut être déployé en conteneur Docker. Nous fournissons pour cela deux images distinctes :
- Tout-en-un : destinée avant tout à l'essai et à la préproduction. Elle contient les fonctionnalités essentielles de Drovio Server. Toutes les dépendances sont embarquées et configurées automatiquement au démarrage du conteneur.
- Production : réservée aux environnements de production. Drovio Server s'appuie sur une base gérée par Docker ou externe, et sur le magasin de sessions interne ou sur un magasin Redis géré par Docker ou externe.
| Image Docker | Tout-en-un | Production |
|---|---|---|
| Usage | Test et préproduction | Production |
| Base | Debian 13 (Trixie) slim | Debian 13 (Trixie) slim |
| Base PostgreSQL | Base PostgreSQL interne | Base PostgreSQL gérée par Docker ou externe, 14 et supérieur |
| Magasin de sessions | Magasin interne | Magasin interne, ou magasin Redis géré par Docker ou externe |
| Tourne sous | root |
drovio, uid 1000 |
Composants gérés par Docker ou externes
Le terme géré par Docker désigne un composant de Drovio Server piloté par
le plugin docker compose et vivant sur le même réseau Docker. Les composants
externes sont au contraire totalement indépendants : vous devez alors
fournir leurs informations de connexion par les
variables d'environnement correspondantes.
Les deux images sont multi-architectures : linux/amd64 et linux/arm64 sont
servies sous le même nom, et Docker retient celle qui correspond à votre machine.
Il n'y a aucune option --platform à passer, ni de nom d'image propre à une
architecture.
Prérequis¶
- Docker Engine 20.10 ou supérieur, pour la prise en charge des images multi-architectures.
- Le plugin
docker compose2.20 ou supérieur pour l'image de production, qui utilise les profils et les dépendances facultatives.
Obtenir les images¶
Les images sont publiées sur notre registre privé. Demandez les identifiants de votre organisation à support@drovio.com : vous recevrez un nom d'utilisateur et un jeton, tous deux propres à vous et révocables.
| Image | Référence |
|---|---|
| Tout-en-un | registry.gitlab.com/drovio/drovio-server-aio |
| Production | registry.gitlab.com/drovio/drovio-server |
docker login registry.gitlab.com -u <username> -p <token>
docker pull registry.gitlab.com/drovio/drovio-server:3.6.6
Quelle étiquette utiliser¶
| Étiquette | Désigne |
|---|---|
3.6.6 |
cette version exacte, et ne bouge jamais |
3.6 |
le dernier correctif de la série 3.6 |
latest, stable |
la dernière version publiée |
Figez une version complète en production. Les étiquettes mouvantes rendent
service pour un essai, mais elles font qu'un docker compose pull peut amener une
nouvelle version mineure sans que vous l'ayez décidé.
Accès réseau sortant
Votre pare-feu doit autoriser registry.gitlab.com ainsi que le domaine de
stockage objet d'où les couches d'image sont téléchargées. Un docker login
qui réussit suivi d'un docker pull qui s'enlise vient presque toujours de
là.
Installation hors ligne¶
Si vos serveurs n'ont aucun accès sortant, nous livrons également chaque version sous forme d'archive, une par architecture. Demandez-la au support puis chargez-la sur la machine cible :
L'image ainsi chargée porte les mêmes nom et étiquette que celle du registre : la suite de cette page s'applique donc telle quelle.
Gestion des données persistantes¶
Conformément aux principes de Docker, les données stockées dans un conteneur sont éphémères et ne survivent pas à sa destruction. Il existe toutefois des mécanismes pour les données persistantes, dont les montages liés, qui projettent un fichier ou un dossier du système hôte à l'intérieur du conteneur.
Nos images Docker s'appuient sur des montages liés pour trois types de données persistantes :
| Données | Chemin dans le conteneur | Concerne |
|---|---|---|
| Fichiers de configuration | /etc/drovio-server |
les deux images |
| Fichiers de journal | /var/log/drovio-server |
les deux images |
| Données de la base | /opt/drovio-server/data |
l'image tout-en-un |
L'image de production n'embarque aucune base. Elle n'a besoin que des deux
premiers. L'emplacement de ses données relève de la base vers laquelle vous la
pointez, qu'il s'agisse de celle que docker compose démarre pour vous ou de
votre propre serveur.
Propriétaire des dossiers, image de production¶
L'image de production tourne sous l'utilisateur non privilégié drovio, uid et
gid 1000. Les deux dossiers dans lesquels elle écrit doivent lui appartenir :
Sans cela le conteneur refuse de démarrer, en indiquant quel dossier corriger.
Ne faites jamais cela sur le dossier de la base
data/postgresql appartient au conteneur de base de données, qui tourne sous
son propre utilisateur. Le confier à l'uid 1000 empêche PostgreSQL de démarrer,
sur une erreur de permission portant sur ses propres fichiers.
Montée depuis la 3.6.5 ou antérieure
Les versions précédentes de cette image tournaient sous root. Les dossiers
qu'elles ont créés sur votre hôte appartiennent donc à root. Lancez la
commande chown ci-dessus sur vos dossiers config et logs existants avant
de démarrer la nouvelle image.
Rien n'est écrit en dehors de ces deux chemins et du dossier de travail de Vert.x
sous /tmp. Le conteneur peut d'ailleurs tourner avec un système de fichiers
racine en lecture seule :
Déployer l'image tout-en-un¶
Créez un dossier drovio-server et placez-vous dedans :
Créez un volume pour la base embarquée, puis lancez le conteneur :
docker volume create drovio-data
docker run --hostname drovio.example.com \
-p 8090:8090 \
-v "./config:/etc/drovio-server" \
-v "./logs:/var/log/drovio-server" \
-v "drovio-data:/opt/drovio-server/data" \
--rm -it "registry.gitlab.com/drovio/drovio-server-aio:3.6.6"
Utilisez un volume pour la base, pas un montage lié
PostgreSQL vérifie que son dossier de données appartient à l'utilisateur
postgres. Or Docker Desktop, sous macOS comme sous Windows, présente tout ce
qui se trouve dans un montage lié comme appartenant à root, quoi que vous
fassiez. Le conteneur ne peut pas démarrer ainsi. Un volume nommé n'a pas cette
limite, et c'est de toute façon la manière recommandée de conserver des données
de base. La configuration et les journaux ne sont pas concernés et peuvent
rester en montages liés.
| Option | Description |
|---|---|
--hostname |
Fixe un nom d'hôte précis. Vous devrez ensuite nous le communiquer pour que nous générions vos licences. Conservez toujours le même, les licences y étant liées. |
-p <hôte>:<conteneur> |
Publie le port du conteneur sur le port de l'hôte. Le port 8090 est utilisé ici, Drovio Server n'activant pas TLS et tout le trafic HTTP passant par ce port par défaut. |
-v "<hôte>:<conteneur>" |
Montages liés pour les données persistantes décrites plus haut. |
--rm |
Supprime automatiquement le conteneur à son arrêt. |
-it |
Alloue un pseudo-terminal relié à l'entrée standard du conteneur. |
Le nom d'hôte n'est écrit qu'une fois
À son tout premier démarrage, le serveur inscrit dans sa configuration sa
propre URL, construite à partir du nom d'hôte que vous lui donnez. Elle n'est
pas recalculée ensuite, et vos licences y sont liées. Un conteneur démarré sans
--hostname refuserait de fonctionner.
Renseignez plutôt APP_URL si l'URL par laquelle vos
utilisateurs accèdent au serveur diffère du nom d'hôte du conteneur, derrière
un proxy inverse par exemple.
Déployer l'image de production¶
L'image de production se déploie avec le plugin docker compose, l'outil qui sert
à définir et à lancer des applications Docker multi-conteneurs.
Récupérer les fichiers de déploiement¶
Tout ce dont vous avez besoin pour déployer se trouve dans l'image elle-même. Extrayez-le à l'endroit où vous voulez faire tourner le serveur, avec les identifiants qui vous ont servi à la récupérer :
id=$(docker create registry.gitlab.com/drovio/drovio-server:3.6.6)
docker cp "$id:/opt/drovio-server/bundle/." ./drovio-server
docker rm "$id"
cd drovio-server
Vous obtenez trois fichiers, tous accordés à la version que vous venez de récupérer :
| Fichier | Ce que c'est |
|---|---|
docker-compose.yml |
le déploiement, avec ou sans base et magasin de sessions gérés |
env.example |
les réglages que vous devez renseigner |
drovio-server.sql |
le schéma de la base, utilisé à sa création et lors des mises à jour |
Sa ligne image: désigne déjà la version exacte dont vous l'avez extrait.
Réglages¶
Copiez env.example en .env et renseignez-le. Deux valeurs sont
obligatoires :
Générez les mots de passe plutôt que d'en réutiliser un, par exemple avec
openssl rand -base64 24. DROVIO_HOSTNAME suit la même règle que --hostname
plus haut : il n'est inscrit dans l'URL du serveur qu'au premier démarrage.
Composants gérés par Docker ou externes¶
Le choix entre une base et un magasin de sessions gérés ici ou fournis par vous se
fait au démarrage, par les profils. Le même docker-compose.yml couvre les trois
cas :
| Commande | Ce que cela lance |
|---|---|
docker compose --profile bundled-db up |
PostgreSQL géré par docker compose, magasin de sessions interne |
docker compose --profile bundled-db --profile redis up |
idem, avec un magasin de sessions Redis géré par docker compose |
docker compose up |
base externe, renseignez DB_HOST et les variables associées dans .env |
Avec le profil redis, décommentez également SS_TYPE,
SS_REDIS_CONNECTION_STRINGS, SS_REDIS_MASTER_NAME et SS_REDIS_PASSWORD dans
votre .env.
- Composants gérés par Docker : pilotés par le plugin
docker compose. Tous les conteneurs suivent le même cycle de vie et partagent le même réseau Docker. - Composants externes : ils ne sont pas déclarés dans le fichier
docker-compose. Leurs informations de connexion doivent être transmises par les variables d'environnement prévues à cet effet. Au premier démarrage, le fichier de configuration de Drovio Server n'existe pas et est créé avec des valeurs par défaut. Ces variables servent alors à en remplacer certaines, ce qui permet un premier démarrage réussi.
Vérifier que le serveur répond¶
Les deux images exposent un point de contrôle de santé et déclarent un
HEALTHCHECK Docker qui s'en sert. docker ps affiche le conteneur comme
healthy dès que le serveur répond.
Variables d'environnement¶
| Variable d'environnement | Champ de configuration |
|---|---|
APP_URL |
.http.url |
SS_TYPE |
.http.session_store.type |
SS_REDIS_CONNECTION_STRINGS |
.http.session_store.redis.connections |
SS_REDIS_MASTER_NAME |
.http.session_store.redis.master |
SS_REDIS_PASSWORD |
.http.session_store.redis.password |
DB_HOST |
.database.host |
DB_PORT |
.database.port |
DB_NAME |
.database.database |
DB_USER |
.database.user |
DB_PASSWORD |
.database.password |
DB_MAIN_POOL_SIZE |
.database.pool_options.main.max_size |
DB_LICENSING_POOL_SIZE |
.database.pool_options.licensing.max_size |
DB_MAIN_IDLE_TIMEOUT |
.database.pool_options.main.idle_timeout |
DB_LICENSING_IDLE_TIMEOUT |
.database.pool_options.licensing.idle_timeout |
DB_MAIN_CONNECT_TIMEOUT |
.database.pool_options.main.connect_timeout |
DB_LICENSING_CONNECT_TIMEOUT |
.database.pool_options.licensing.connect_timeout |
DB_POOL_SIZE (deprecated) |
.database.pool_options.main.max_size |
DB_NV_POOL_SIZE (deprecated) |
.database.pool_options.licensing.max_size |
DB_IDLE_TIMEOUT (deprecated) |
.database.pool_options.main.idle_timeout |
Les variables d'environnement l'emportent toujours
Ces variables écrasent systématiquement les valeurs du fichier de
configuration de Drovio Server au démarrage. Si vous modifiez dans les fichiers
de configuration une valeur associée à l'une d'elles, vous devez aussi retirer
cette variable du fichier docker-compose ou mettre sa valeur à jour avant de
redémarrer Drovio Server.
Mettre à jour¶
Récupérez la version voulue, puis recréez les conteneurs. Votre configuration, vos journaux et votre base vivent dans les montages liés et ne sont pas touchés.
Le schéma de la base de données¶
Une nouvelle version peut ajouter des tables ou des colonnes. Les deux images ne traitent pas ce point de la même façon.
| Image | Ce qui applique les évolutions de schéma |
|---|---|
| Tout-en-un | le conteneur lui-même, à chaque démarrage. Rien à faire. |
| Production | vous, avant de démarrer la nouvelle image. |
L'image de production ne touche jamais à votre schéma. drovio-server.sql n'est
exécuté qu'à la création de la base, par le conteneur de base de docker compose à
son tout premier démarrage, ou par vous sur votre propre serveur. Il n'est pas
rejoué ensuite.
Lors d'une montée de version de l'image de production :
-
Extrayez
drovio-server.sqlde l'image vers laquelle vous montez, comme pour une première installation. Le script livré dans une image est toujours celui que cette image attend. -
Appliquez-le à votre base, les conteneurs Drovio Server étant arrêtés.
-
Démarrez la nouvelle image.
Le script est écrit pour être rejoué : il crée ce qui manque et laisse le reste en place, si bien que l'appliquer à une base déjà à jour ne change rien.
Sauvegardez d'abord
Faites une sauvegarde de la base avant d'appliquer un script de schéma, quel que soit l'écart de version. C'est la seule étape de cette procédure qui ne se rattrape pas.
Tout-en-un et versions majeures de PostgreSQL
L'image tout-en-un ne met pas à niveau son cluster de base de données sur
place. Si une nouvelle version embarque une version majeure de PostgreSQL plus
récente, le conteneur s'arrête au démarrage avec un message explicatif. Exportez
vos données depuis l'image précédente avec pg_dumpall, puis restaurez-les dans
un volume neuf avec la nouvelle.