uVersion
Italiano
Scarica →

Wiki

Distribuire con Docker

Il server uVersion e PostgreSQL in container, chiavi in mano: scaricare l'immagine, caricarla, configurare .env, avviare. Posizione di dati e database configurabile.

Un'alternativa al pacchetto .deb: il server uVersion e il suo database PostgreSQL girano in container, avviati da un solo docker compose up. Ideale se preferisci un deployment containerizzato, o per provarlo rapidamente.

Prerequisiti: Docker Engine 20.10+ con il plugin Compose v2 (docker compose version) e una chiave di licenza uVersion. Il server si rifiuta di avviarsi senza una chiave valida e firmata: recuperala dal tuo account (oppure richiedine una dalla pagina di registrazione).

Funziona anche Podman Sostituisci docker con podman in tutti i comandi di questa pagina: podman compose pull, podman load -i, podman compose up -d. Il docker-compose.yml fornito etichetta già i suoi mount per SELinux (il controllo degli accessi attivo per impostazione predefinita su Red Hat, Rocky, Alma e Fedora), con il suffisso :z. Senza questa etichetta, al container viene negato l'accesso alle directory montate, e il messaggio somiglia più a un database corrotto che a un problema di permessi.

Installare

1. Recuperare il compose e il modello di ambiente

Due file, in una cartella nuova che diventerà quella dello stack: il docker-compose.yml e il modello .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. Recuperare l'immagine

Online, il registry basta:

docker compose pull

Senza accesso a Internet (rete isolata), scarica invece l'archivio e caricalo: porta lo stesso nome di immagine del compose, quindi l'avvio la trova senza scaricare nulla.

wget -N https://uversion.io/downloads/server/docker/uversion-server_latest_docker.tar.gz
docker load -i uversion-server_latest_docker.tar.gz

3. Compilare .env

Due valori sono obbligatori: UVERSION_LICENCE__KEY (la tua chiave di licenza, la lunga stringa firmata ricevuta via e-mail) e POSTGRES_PASSWORD (una password robusta per il database incluso).

nano .env

Il segreto che firma le sessioni viene generato al primo avvio e conservato nella directory dei dati. Non devi inserire nulla. Fa parte del backup: se sparisce, ognuno dovrà riconnettersi una volta, non si perde nulla. Se preferisci fissare il tuo (minimo 32 caratteri), compila UVERSION_SECURITY__JWT_SECRET in .env: viene effettivamente passato al container, che allora lo usa invece di generarne uno.

Scegli questa password una volta per tutte POSTGRES_PASSWORD viene applicata solo alla creazione del database, quando la sua directory è vuota. Modificarla in seguito in .env non cambia nulla dal lato PostgreSQL, che tiene la vecchia, mentre il server presenta la nuova: la connessione si rompe senza che il messaggio lo spieghi. Per cambiarla davvero, cambiala da entrambi i lati:
# 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
Esegui il backup di .env insieme ai tuoi dati Contiene la chiave di licenza e la password del database, e vive accanto al docker-compose.yml, non nei volumi. Perdere la macchina conservando i dischi dei dati lascia un database che nessuno può indirizzare e una licenza da richiedere di nuovo: il codice di attivazione ricevuto alla registrazione è monouso e già consumato, solo la chiave di licenza che ha prodotto è riutilizzabile, ed è quella che si trova qui. Tratta questo file come un segreto: chmod 600, e nello stesso backup del database e dei chunk (i frammenti di file, ciò che occupa lo spazio).

4. Avviare lo stack

docker compose up -d

Il server è allora raggiungibile su https://YOUR-HOST:8443. Non è richiesto alcun dominio né certificato Let’s Encrypt: se ne occupa il modello TOFU, ossia la fiducia al primo contatto, come SSH quando ti fa convalidare l'impronta di una macchina la prima volta.

5. Rilevare l'impronta del server

Viene riscritta nei registri a ogni avvio:

# L'empreinte du serveur, reecrite dans les journaux a chaque demarrage
docker compose logs server | grep -i "TLS fingerprint"

È l'impronta del server (SHA-256 del suo certificato): il server serve HTTPS autofirmato sulla porta 8443, e ogni client la conferma alla prima connessione. Condividila con il tuo team (vedi Impronta TLS). Non confonderla con una somma di controllo, che serve a verificare un file scaricato: questa identifica il tuo server.

6. Rilevare la password amministratore iniziale

Accedi come admin con questa password, poi cambiala. Il file viene eliminato non appena la cambi.

# Le mot de passe admin initial (le fichier disparait des que vous le changez)
docker compose exec server cat /data/initial-admin-password

Per seguire l'avvio in diretta, docker compose logs -f server va bene, ma non metterlo in mezzo a una sequenza di comandi: il -f segue i registri indefinitamente e non restituisce mai il controllo (Ctrl + C per uscire).

Dati e database

Tutto lo stato del server (store dei chunk, certificato TLS e quindi l'impronta, identità del server) vive in una directory dell'host, e il database PostgreSQL in un'altra. Entrambi si impostano in .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

Per un deployment vero, punta UVERSION_DATA_DIR verso un disco ampio e con backup: i chunk binari di un progetto Unreal possono essere voluminosi. Il container regola da solo i permessi della directory montata (parte come root giusto il tempo di correggere la proprietà, poi scende a un utente non privilegiato), quindi non devi fare alcun chown in anticipo.

Primo avvio più lungo se SELinux è attivo Il motore rietichetta allora ricorsivamente le directory montate, una volta sola. È istantaneo su un deployment nuovo, ma metti in conto diversi minuti su un repository già voluminoso. Gli avvii successivi non pagano di nuovo questo costo.

Per usare un PostgreSQL esterno già in essere, compila UVERSION_DATABASE__URL in .env, poi rimuovi il servizio db e il blocco depends_on nel docker-compose.yml.

# Dans .env : brancher un PostgreSQL existant
UVERSION_DATABASE__URL=postgres://user:motdepasse@db.interne:5432/uversion

Spostare dati e database

Il caso più semplice è impostare le due variabili prima del primo up: non esiste ancora nulla, non c'è niente da copiare. Se lo stack è già in esecuzione, bisogna fermarlo e copiare le directory a mano, preservando i proprietari.

1. Fermare lo stack

Nulla deve scrivere durante la copia:

docker compose down

2. Copiare le due directory

È il -a a preservare proprietari e permessi:

sudo rsync -a ./data/server/ /srv/uversion/data/
sudo rsync -a ./data/db/     /srv/uversion/db/

3. Puntare .env alla nuova posizione

# Dans .env, LES DEUX lignes, pas une seule
UVERSION_DATA_DIR=/srv/uversion/data
UVERSION_DB_DIR=/srv/uversion/db

4. Riavviare

docker compose up -d
Sposta entrambi, o nessuno Il database non contiene i tuoi file: contiene i metadati che designano i chunk (i frammenti di file) tramite la loro impronta. Spostare i dati senza il database, o viceversa, lascia un database che referenzia chunk introvabili. E un UVERSION_DB_DIR che punta a una directory vuota dà un database vergine: PostgreSQL lo inizializza senza battere ciglio, e ottieni uno store di chunk pieno associato a un database senza alcun metadato.

Tre trappole di percorso, tutte incontrate:

  • Un percorso relativo è risolto rispetto al file compose, non rispetto alla directory da cui lanci il comando. ./data/server designa sempre il vicino del docker-compose.yml.
  • Una condivisione di rete (NFS, CIFS, una condivisione Windows) rifiuta in genere il chown che il container effettua all'avvio. Il container esce allora immediatamente, con un errore di permessi che non menziona né uVersion né lo storage. Usa un disco locale o un volume a blocchi.
  • rsync -a è ciò che preserva proprietari e permessi. Una copia fatta con cp senza opzioni, o da un file manager, riporta tutto all'account corrente, e PostgreSQL si rifiuta allora di avviarsi sulla propria directory.

Operatività

Backup: il database

Porta i metadati: file, revisioni, utenti, blocchi.

docker compose exec db pg_dump -U uversion uversion > uversion-db.sql

Backup: i dati del server

È la directory dell'host designata da UVERSION_DATA_DIR. Entrambi i backup contano: l'uno senza l'altro non ripristina nulla.

# .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" .

Aggiornare

I dati e il database non vengono toccati, le migrazioni si applicano all'avvio.

docker compose pull
docker compose up -d   # les migrations s'appliquent au demarrage

Su una rete isolata, carica invece un archivio più recente:

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

Fermare

docker compose stop ferma i container, docker compose down li rimuove. In entrambi i casi i tuoi dati restano al loro posto.

down -v qui non cancella nulla Il compose pubblicato non usa alcun volume con nome: i tuoi dati e il tuo database sono nelle due directory dell'host designate da .env. Né downdown -v le tocca. Per ripartire davvero da zero, devi eliminare tu stesso queste directory. È importante saperlo: il riflesso, dopo un fallimento di autenticazione, è lanciare down -v e poi up, e ciò riporta esattamente allo stesso errore, con lo stesso database e la stessa password.