uVersion
Français
Télécharger →

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).

Podman fonctionne aussi Remplacez 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.

Choisissez ce mot de passe une bonne fois 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
Sauvegardez .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.

Premier démarrage plus long si SELinux est actif Le moteur ré-étiquette alors récursivement les répertoires montés, une seule fois. C’est instantané sur un déploiement neuf, mais comptez plusieurs minutes sur un dépôt déjà volumineux. Les démarrages suivants ne repaient pas ce coût.

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
Déplacez les deux, ou aucun La base ne contient pas vos fichiers : elle contient les métadonnées qui désignent les chunks (les morceaux de fichiers) par leur empreinte. Déplacer les données sans la base, ou l’inverse, laisse une base qui référence des chunks introuvables. Et un 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/server désigne toujours le voisin du docker-compose.yml.
  • Un partage réseau (NFS, CIFS, un partage Windows) refuse en général le chown que 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 -a est ce qui préserve propriétaires et droits. Une copie faite avec cp sans 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.