Wiki
Déployer avec Docker
Serveur uVersion + PostgreSQL en conteneurs, clé en main : télécharger l’image, la charger, configurer .env, démarrer. Emplacement des données et de la base configurable.
Une alternative au paquet .deb : le serveur uVersion et sa base
PostgreSQL tournent en conteneurs, lancés par un seul docker compose up.
Idéal si vous préférez un déploiement conteneurisé, ou pour tester rapidement.
Prérequis : Docker Engine 20.10+ avec le plugin Compose v2
(docker compose version), et une clé de licence uVersion. Le serveur
refuse de démarrer sans clé valide et signée : récupérez-la sur
votre compte (ou obtenez-en une depuis
la page d’inscription).
docker par podman dans toutes les commandes de
cette page : podman compose pull, podman load -i,
podman compose up -d. Le docker-compose.yml fourni étiquette
déjà ses montages pour SELinux (le contrôle d’accès activé par défaut sur Red Hat,
Rocky, Alma et Fedora), avec le suffixe :z. Sans cette étiquette, le
conteneur se voit refuser l’accès aux répertoires montés, et le message ressemble à une
base corrompue plutôt qu’à un problème de droits.
Installer
1. Récupérer le compose et le modèle d’environnement
Deux fichiers, dans un dossier neuf qui deviendra celui de la pile : le
docker-compose.yml et le modèle .env.
mkdir uversion && cd uversion
wget -N -O docker-compose.yml https://uversion.io/downloads/server/docker/docker-compose.yml
wget -N -O .env https://uversion.io/downloads/server/docker/env.example
2. Récupérer l’image
En ligne, le registre suffit :
docker compose pull
Sans accès Internet (réseau isolé), téléchargez plutôt l’archive et chargez-la : elle porte le même nom d’image que le compose, donc le démarrage la trouve sans rien télécharger.
wget -N https://uversion.io/downloads/server/docker/uversion-server_latest_docker.tar.gz
docker load -i uversion-server_latest_docker.tar.gz
3. Renseigner .env
Deux valeurs sont obligatoires : UVERSION_LICENCE__KEY
(votre clé de licence, la longue chaîne signée reçue par courriel) et
POSTGRES_PASSWORD (un mot de passe fort pour la base fournie).
nano .env
Le secret qui signe les sessions est généré au premier démarrage et
conservé dans le répertoire de données. Vous n’avez rien à saisir. Il fait partie de la
sauvegarde : s’il disparaît, chacun devra se reconnecter une fois, rien n’est perdu. Si
vous préférez fixer le vôtre (32 caractères minimum), renseignez
UVERSION_SECURITY__JWT_SECRET dans .env : il est bien transmis
au conteneur, qui l’utilise alors au lieu d’en générer un.
POSTGRES_PASSWORD n’est appliqué qu’à la création de la base, quand son
répertoire est vide. Le modifier ensuite dans .env ne change rien côté
PostgreSQL, qui garde l’ancien, pendant que le serveur présente le nouveau : la
connexion casse sans que le message l’explique. Pour le changer réellement, changez-le
des deux côtés :
# Changer reellement le mot de passe de la base
docker compose exec db psql -U uversion -c "ALTER USER uversion PASSWORD 'nouveau-mot-de-passe'"
# Puis reporter la MEME valeur dans POSTGRES_PASSWORD (.env) et relancer
docker compose up -d
.env avec vos données
Il contient la clé de licence et le mot de passe de la base, et il vit à côté du
docker-compose.yml, pas dans les volumes. Perdre la machine en gardant les
disques de données laisse une base que personne ne peut adresser et une licence à
re-demander : le code d’activation reçu à l’inscription est à usage unique et
déjà consommé, seule la clé de licence qu’il a produite est réutilisable, et
c’est elle qui est ici. Traitez ce fichier comme un secret : chmod 600, et
dans la même sauvegarde que la base et les chunks (les morceaux de fichiers, ce qui
occupe la place).
4. Démarrer la pile
docker compose up -d
Le serveur est alors joignable sur https://VOTRE-HOTE:8443. Aucun
domaine ni certificat Let’s Encrypt n’est requis : le modèle TOFU s’en charge, c’est-à-dire
la confiance au premier contact, comme SSH quand il vous fait valider l’empreinte d’une
machine la première fois.
5. Relever l’empreinte du serveur
Elle est réécrite dans les journaux à chaque démarrage :
# L'empreinte du serveur, reecrite dans les journaux a chaque demarrage
docker compose logs server | grep -i "TLS fingerprint"
C’est l’empreinte du serveur (SHA-256 de son certificat) : le serveur sert du HTTPS auto-signé sur le port 8443, et chaque client la confirme à la première connexion. Partagez-la avec votre équipe (voir Empreinte TLS). Ne la confondez pas avec une somme de contrôle, qui sert à vérifier un fichier téléchargé : celle-ci identifie votre serveur.
6. Relever le mot de passe admin initial
Connectez-vous en admin avec ce mot de passe, puis changez-le. Le fichier
est supprimé dès le changement.
# Le mot de passe admin initial (le fichier disparait des que vous le changez)
docker compose exec server cat /data/initial-admin-password
Pour suivre le démarrage en direct, docker compose logs -f server convient,
mais ne le mettez pas au milieu d’une suite de commandes : le -f suit les
journaux indéfiniment et ne rend jamais la main (Ctrl + C pour
sortir).
Données et base
Tout l’état du serveur (store de chunks, certificat TLS et donc l’empreinte,
identité du serveur) vit dans un répertoire hôte, et la base PostgreSQL dans un
autre. Les deux se règlent dans .env :
# Dans .env : placer les donnees et la base sur un disque large et sauvegarde
UVERSION_DATA_DIR=/srv/uversion/data # chunks, cert TLS, identite serveur
UVERSION_DB_DIR=/srv/uversion/db # PostgreSQL fourni
Pour un vrai déploiement, pointez UVERSION_DATA_DIR vers un disque
large et sauvegardé : les chunks binaires d’un projet Unreal peuvent être volumineux.
Le conteneur ajuste tout seul les droits du répertoire monté (il démarre en root le
temps de corriger la propriété, puis redescend vers un utilisateur non privilégié),
donc vous n’avez rien à chown au préalable.
Pour utiliser un PostgreSQL externe déjà en place, renseignez
UVERSION_DATABASE__URL dans .env, puis supprimez le service
db et le bloc depends_on dans docker-compose.yml.
# Dans .env : brancher un PostgreSQL existant
UVERSION_DATABASE__URL=postgres://user:motdepasse@db.interne:5432/uversion
Déplacer les données et la base
Le cas le plus simple est de poser les deux variables avant le premier
up : rien n’existe encore, il n’y a rien à copier. Si la pile tourne
déjà, il faut l’arrêter et copier les répertoires à la main, en préservant les
propriétaires.
1. Arrêter la pile
Rien ne doit écrire pendant la copie :
docker compose down
2. Copier les deux répertoires
C’est le -a qui préserve propriétaires et droits :
sudo rsync -a ./data/server/ /srv/uversion/data/
sudo rsync -a ./data/db/ /srv/uversion/db/
3. Pointer .env vers le nouvel emplacement
# Dans .env, LES DEUX lignes, pas une seule
UVERSION_DATA_DIR=/srv/uversion/data
UVERSION_DB_DIR=/srv/uversion/db
4. Redémarrer
docker compose up -d
UVERSION_DB_DIR qui pointe vers un répertoire vide donne
une base vierge : PostgreSQL l’initialise sans broncher, et vous obtenez un magasin de
chunks plein associé à une base sans aucune métadonnée.
Trois pièges de chemin, tous rencontrés :
- Un chemin relatif est résolu par rapport au fichier compose, pas par
rapport au répertoire d’où vous lancez la commande.
./data/serverdésigne toujours le voisin dudocker-compose.yml. - Un partage réseau (NFS, CIFS, un partage Windows) refuse en général le
chownque le conteneur effectue au démarrage. Le conteneur sort alors immédiatement, sur une erreur de droits qui ne mentionne ni uVersion ni le stockage. Utilisez un disque local ou un volume de bloc. rsync -aest ce qui préserve propriétaires et droits. Une copie faite aveccpsans option, ou depuis un explorateur de fichiers, remet tout au compte courant, et PostgreSQL refuse alors de démarrer sur son propre répertoire.
Exploitation
Sauvegarder : la base
Elle porte les métadonnées : fichiers, révisions, utilisateurs, verrous.
docker compose exec db pg_dump -U uversion uversion > uversion-db.sql
Sauvegarder : les données du serveur
C’est le répertoire hôte désigné par UVERSION_DATA_DIR. Les deux
sauvegardes comptent : l’une sans l’autre ne remonte rien.
# .env n'est pas charge dans votre shell, chargez-le pour reutiliser la variable
set -a; . ./.env; set +a
DATA_DIR="$UVERSION_DATA_DIR"
[ -n "$DATA_DIR" ] || DATA_DIR=./data/server # valeur par defaut
tar czf uversion-data.tar.gz -C "$DATA_DIR" .
Mettre à jour
Les données et la base ne sont pas touchées, les migrations s’appliquent au démarrage.
docker compose pull
docker compose up -d # les migrations s'appliquent au demarrage
Sur un réseau isolé, rechargez une archive plus récente à la place :
wget -N https://uversion.io/downloads/server/docker/uversion-server_latest_docker.tar.gz
docker load -i uversion-server_latest_docker.tar.gz
docker compose up -d
Arrêter
docker compose stop arrête les conteneurs,
docker compose down les retire. Dans les deux cas vos données restent en
place.
down -v n’efface rien ici
Le compose publié n’utilise aucun volume nommé : vos données et votre base sont dans les
deux répertoires hôtes désignés par .env. Ni down ni
down -v ne les touche. Pour repartir vraiment de zéro, il faut supprimer ces
répertoires vous-même. C’est important à savoir : le réflexe, après un échec
d’authentification, est de lancer down -v puis up, et cela
reboucle exactement sur la même erreur, avec la même base et le même mot de passe.