Unraid - Volfieldd/deux-regards GitHub Wiki
Cette page est générée depuis
deploy/unraid/README.md, livré avec les fichiers de la pile. La modifier dans le dépôt, pas ici. Les marches à suivre ponctuelles sont regroupées dans Procédures.
Les marches à suivre ponctuelles (mise à jour, chiffrement DATA_KEY, disques chiffrés, deux facteurs, e-mails, app iPhone, demandes RGPD) sont regroupées dans le wiki : Procédures.
Ce dossier contient tout le nécessaire :
| Fichier | Rôle |
|---|---|
compose.yaml |
la pile complète : site, sauvegarde quotidienne, tunnel Cloudflare, traducteur LibreTranslate (méthode recommandée) |
env.example |
les réglages, à copier en .env de la pile |
modeles/*.xml |
les mêmes conteneurs en modèles Unraid (onglet Docker), si vous préférez ne pas utiliser Compose |
exporter-donnees.sh |
exporte les données d'une installation existante (serveur de test) pour les reprendre sur Unraid |
Internet ─HTTPS─► Cloudflare (www.nicephos.art ; autres adresses redirigées) ─tunnel─► nicephos-tunnel ─► nicephos:3000
│
/mnt/cache/appdata/nicephos/data ◄── /data ──────┘
nicephos-sauvegarde (chaque jour) ──► /mnt/user/backups/nicephos
Aucun port n'est ouvert sur votre box : le tunnel sort vers Cloudflare, qui fournit le HTTPS.
- Image Docker (une fois)
- Dossiers sur Unraid
- Zitadel : la connexion à l'admin
- Cloudflare : tunnel et domaines
- Lancer la pile
- Reprendre les données du serveur de test (facultatif)
- Premier accès, sauvegardes, mises à jour
L'image est construite par GitHub à chaque mise à jour de main (.github/workflows/image.yml) et publiée sur ghcr.io/volfieldd/deux-regards, avec deux étiquettes : latest (dernière version) et sha-xxxxxxx (version d'un commit, pour revenir en arrière). Elle ne contient aucune donnée : ni photos, ni base, ni logo.
Une seule fois, après la première publication : sur GitHub, Profil → Packages → deux-regards → Package settings → Change visibility → Public. Sinon, Unraid ne pourra pas la télécharger sans identifiants. Si vous préférez la garder privée : dans le terminal Unraid, docker login ghcr.io -u Volfieldd, avec comme mot de passe un jeton GitHub qui a le droit read:packages.
Dans le terminal Unraid (icône >_ en haut à droite) :
mkdir -p /mnt/cache/appdata/nicephos/data /mnt/user/backups/nicephos
chown -R 99:100 /mnt/cache/appdata/nicephos /mnt/user/backups/nicephos-
Données sur le pool cache, chemin direct (
/mnt/cache/…, pas/mnt/user/…). La base SQLite fonctionne mal à travers la couche FUSE de/mnt/user. Si votre pool porte un autre nom, remplacezcache. Avec Unraid 6.12 et plus, un partageappdata« exclusif » convient aussi. - Sauvegardes sur le tableau, donc sur d'autres disques que les données. Ajoutez-y une copie hors de la machine (plugin de sauvegarde, disque externe, cloud).
- Disques chiffrés (recommandé, RGPD) : la base contient des noms, des e-mails, des signatures. Voir « Chiffrer les données » plus bas.
-
99:100, c'est-à-dire
nobody:users: l'utilisateur standard des conteneurs Unraid. Les conteneurs tournent sous cet utilisateur, sans aucun privilège.
L'admin n'a pas de mot de passe à elle : on s'y connecte avec un compte Zitadel. L'offre gratuite de Zitadel Cloud suffit largement pour deux comptes. Zitadel peut aussi proposer « Continuer avec Google ». Tout se configure dans la console Zitadel, une seule fois, avant la mise en ligne.
- Allez sur https://zitadel.com → Sign up, et créez un compte.
- Créez une instance (offre gratuite) et choisissez la région Europe. Son adresse ressemble à
https://nicephos-xxxxxx.zitadel.cloud: c'estOIDC_ISSUER. - Ouvrez la console de l'instance (bouton « Console » ou
https://<instance>.zitadel.cloud/ui/console).
-
Organisation : en haut à gauche, l'organisation par défaut convient. Notez son identifiant : menu Organization, champ Resource Id (un long nombre). C'est
OIDC_ORG_ID. -
Projets → Create New Project, par exemple « Nicephos ». Dans le projet :
- ouvrez l'onglet General et notez son Resource Id : c'est
OIDC_PROJECT_ID; - dans Roles → New, créez le rôle avec la clé
admin(le nom affiché est libre, par exemple « Administrateur ») ; - dans les réglages du projet, cochez « Assert Roles on Authentication » et « Check authorization on Authentication ». Avec la seconde option, un compte sans rôle est refusé dès Zitadel.
- ouvrez l'onglet General et notez son Resource Id : c'est
-
Applications → New, dans le projet :
- nom : « Site Nicephos » ; type : Web ;
- méthode d'authentification : CODE (avec secret client) ;
-
Redirect URIs :
https://www.nicephos.art/auth/callback; -
Post Logout URIs :
https://www.nicephos.art/; - à la création, Zitadel affiche le Client ID (
OIDC_CLIENT_ID) et le Client Secret (OIDC_CLIENT_SECRET). Copiez le secret tout de suite : il n'est plus montré ensuite. En cas d'oubli, vous pouvez en générer un nouveau.
- Users → New, une fiche par personne, avec son e-mail. Zitadel envoie l'invitation et chacun choisit son mot de passe. Activez la double authentification si vous le souhaitez (réglages de connexion de l'organisation).
-
Donner le rôle : dans le projet, ouvrez Authorizations → New, choisissez l'utilisateur, puis cochez
admin. - Empêcher les inscriptions libres : Settings → Login Behavior and Security de l'organisation, décochez Register allowed.
- Facultatif, Google : Settings → Identity Providers → Google. Il faut alors un client OAuth créé dans Google Cloud Console, avec l'URI de retour que Zitadel affiche.
OIDC_ISSUER=https://nicephos-xxxxxx.zitadel.cloud
OIDC_CLIENT_ID=…
OIDC_CLIENT_SECRET=…
OIDC_PROJECT_ID=…
OIDC_ORG_ID=…
OIDC_ADMIN_ROLE=adminVérifier : ouvrez https://www.nicephos.art/admin. Vous êtes renvoyé vers Zitadel, vous vous connectez, puis vous arrivez sur le tableau de bord. Un compte sans le rôle voit « Accès refusé », et aucune session n'est créée. En cas d'erreur, consultez les journaux du conteneur nicephos : le message indique l'étape en cause.
Lier chaque compte à son auteur (pour que l'import propose le bon auteur) : le tableau de bord affiche l'identifiant sub du compte connecté. Copiez-le dans Auteurs → fiche de l'auteur → Compte de connexion.
Le site n'a qu'une adresse : https://www.nicephos.art (PUBLIC_URL). Toutes les autres (nicephos.art sans www, autres sous-domaines, http://) y sont redirigées par Cloudflare. Une seule adresse garde cohérents la connexion à l'admin, les liens de partage, Instagram et les mentions de droits des images.
- Ajoutez nicephos.art à votre compte Cloudflare, puis changez les serveurs DNS chez le registraire, comme Cloudflare l'indique.
-
Tunnel : Zero Trust → Networks → Tunnels → Create a tunnel (type Cloudflared), nommé par exemple « nicephos ». Copiez le jeton affiché dans
TUNNEL_TOKEN. Inutile d'installer cloudflared à la main : c'est le conteneurnicephos-tunnel. - Dans le tunnel, Public Hostname → Add :
www.nicephos.art, service HTTP, URLnicephos:3000. Cloudflare crée l'enregistrement DNSwww. -
DNS des autres adresses (zone nicephos.art) : enregistrement
A@→192.0.2.1, etA*→192.0.2.1pour les autres sous-domaines, tous deux proxifiés (nuage orange). L'adresse n'est jamais jointe : la redirection intervient avant. -
Redirection : Rules → Redirect Rules → Create rule :
-
If incoming requests match… : Custom filter expression,
(http.host ne "www.nicephos.art"); -
Then : type Dynamic,
concat("https://www.nicephos.art", http.request.uri.path); - code 301, Preserve query string coché.
-
If incoming requests match… : Custom filter expression,
-
SSL/TLS → Edge Certificates → Always Use HTTPS : activé (pour
http://www.nicephos.art).
Pièges :
- Le champ Value n'attend qu'un nom de domaine (
www.nicephos.art), avec Field Hostname et Operator does not equal : l'aperçu doit afficher exactement(http.host ne "www.nicephos.art"). Une expression collée dans Value, ou Field laissé sur URI Full, donne soit aucune redirection, soit une boucle surwww.nicephos.art(site inaccessible) : désactivez alors la règle, corrigez-la, et testez en 302 avant de repasser en 301. Détails : Déploiement. - Le certificat gratuit (Universal SSL) couvre
nicephos.artet*.nicephos.art, soit un seul niveau de sous-domaine :a.b.nicephos.artdonne une erreur de certificat avant toute redirection. - Un autre domaine (par exemple
nicephos.com) se redirige de la même façon : zone ajoutée à Cloudflare, enregistrements@et*proxifiés, même règle dans cette zone.
Vérifier : curl -sI "https://nicephos.art/serie/rue?x=1" répond 301 vers https://www.nicephos.art/serie/rue?x=1.
Méthode recommandée : plugin « Docker Compose Manager » (Apps → rechercher « Compose Manager »).
- Docker → en bas, Add New Stack, nommée
nicephos. -
Edit Stack → Compose File : collez le contenu de
compose.yaml. -
Edit Stack → ENV File : collez
env.example, puis remplissezPUBLIC_URL=https://www.nicephos.art,COOKIE_SECRET(openssl rand -base64 32dans le terminal), la partie Zitadel etTUNNEL_TOKEN. -
Compose Up. Les quatre conteneurs apparaissent dans l'onglet Docker :
nicephos,nicephos-sauvegarde,nicephos-tunneletnicephos-traduction.
Au premier lancement sans données reprises, le site part d'une base vide : pas de photos, pas d'auteurs. Créez d'abord les auteurs dans l'admin.
Autre méthode : modèles Unraid (sans plugin).
- Créez le réseau commun, une fois, dans le terminal :
docker network create nicephos. - Copiez les trois fichiers de
modeles/dans/boot/config/plugins/dockerMan/templates-user/. - Docker → Add Container → Template →
nicephos. Remplissez les champs (mêmes valeurs queenv.example), puis Apply. Faites de même pournicephos-sauvegarde(mêmes dossiers) et pournicephos-tunnel.
Sur le serveur de test, dans le dossier du dépôt :
deploy/unraid/exporter-donnees.sh # → nicephos-donnees-AAAA-MM-JJ.tar.gz
scp nicephos-donnees-*.tar.gz root@unraid:/mnt/cache/appdata/nicephos/Sur Unraid, avant le premier Compose Up (ou après avoir arrêté la pile) :
cd /mnt/cache/appdata/nicephos
tar -xzf nicephos-donnees-*.tar.gz -C data
chown -R 99:100 dataL'archive contient :
- la base, dans un instantané cohérent pris pendant que le site tourne ;
- les originaux, les preuves d'antériorité, les logos et la marque.
Les images servies ne sont pas dans l'archive : elles sont recalculées au démarrage, ce qui prend quelques minutes, et le site reste en ligne pendant ce temps. Si l'adresse publique change, les mentions de droits inscrites dans les images suivent PUBLIC_URL (ici https://www.nicephos.art/droits).
-
Contrôle local :
http://<ip-unraid>:3080/. Le site s'affiche ; l'admin, elle, ne fonctionne que par le domaine en HTTPS. -
En ligne :
https://www.nicephos.art/ethttps://www.nicephos.art/admin. -
Santé : l'onglet Docker affiche
healthypournicephos.
nicephos-sauvegarde fait une sauvegarde au démarrage, puis toutes les 24 h, dans /mnt/user/backups/nicephos :
-
db/: instantanés de la base, les 14 derniers ; -
files/: originaux, logos et marque. Un original supprimé dans l'admin y reste récupérable 90 jours, puis il est effacé (droit à l'effacement ;BACKUP_DELETED_DAYSpour changer ce délai). Si le dossier des originaux est vide (montage raté), rien n'est effacé ; -
last.json: compte rendu de la dernière sauvegarde.
Restaurer : arrêtez la pile et gardez une copie de data/. Copiez db/site-<date>.db en data/site.db et supprimez data/site.db-wal et data/site.db-shm s'ils existent ; recopiez files/* dans data/, puis chown -R 99:100 data et relancez la pile. Les images servies se recalculent au démarrage.
Pour publier automatiquement sur Instagram : compte professionnel, application Meta, puis INSTAGRAM_APP_ID et INSTAGRAM_APP_SECRET dans le .env de la pile. Le pas à pas complet est dans l’aide de l’admin (Aide → Instagram) et dans le wiki (Instagram). L’adresse de retour à déclarer chez Meta est https://www.nicephos.art/admin/instagram/callback. Sans INSTAGRAM_TOKEN_KEY, le jeton est chiffré avec COOKIE_SECRET : changer ce secret impose de reconnecter le compte.
Le conteneur nicephos-traduction (LibreTranslate, logiciel libre) propose les traductions anglaises et allemandes dans l'admin (bouton Proposer une traduction sous chaque champ « en anglais et en allemand »). Tout se passe sur le serveur : aucun texte ne part sur Internet, aucun compte, 0 €.
-
Premier lancement : il télécharge une seule fois ses modèles français, anglais et allemand (environ 300 Mo, gardés dans le volume
nicephos_traduction-modeles) ; comptez quelques minutes avant que le bouton réponde. Ensuite il fonctionne hors ligne. - Ressources : environ 1 Go de mémoire (limite 2 Go), une seconde par texte, sans carte graphique.
-
Réseau : aucun port publié ; seul le site le joint (
TRANSLATE_URL=http://libretranslate:5000, réglé par défaut dans la pile). - Qualité : une base à relire (« Six heures » peut devenir « Six hours »), jamais publiée sans vous.
-
Ne pas l'utiliser : mettez
TRANSLATE_URL=(vide) dans le.env: le bouton disparaît. Vous pouvez alors supprimer le conteneur. -
Modèles Unraid (sans Compose) : ajoutez le conteneur
libretranslate/libretranslate:v1.9.6(variablesLT_LOAD_ONLY=fr,en,deetLT_DISABLE_WEB_UI=true, dossier/home/libretranslate/.localà garder) sur le même réseau que le site, puisTRANSLATE_URLvers lui.
Dans Compose Manager : Update Stack (ou Compose Pull, puis Compose Up). Pour revenir à une version précise : IMAGE=ghcr.io/volfieldd/deux-regards:sha-xxxxxxx dans le .env de la pile (une migration de base déjà appliquée n'est pas défaite : restaurez alors aussi la base). Les données ne bougent pas : elles sont dans data/, jamais dans l'image. Une mise à jour qui modifie la base l'applique toute seule au démarrage. Prenez quand même l'habitude de vérifier la date de last.json avant.
La base contient des données personnelles (noms, e-mails, signatures, photos de repère) : les ranger sur des disques chiffrés protège contre le vol du serveur ou un disque revendu. Unraid sait le faire (chiffrement LUKS) :
- Pool chiffré pour les données : Main → Add Pool (ou un pool existant vidé), système de fichiers « xfs - encrypted » ou « btrfs - encrypted », puis formatez. Unraid demande une phrase de passe (ou un fichier clé) au démarrage du tableau.
-
Déplacez les données pile arrêtée :
rsync -a /mnt/cache/appdata/nicephos/ /mnt/<pool-chiffré>/appdata/nicephos/, puis changezDATA_DIRdans le.envde la pile et relancez. - Sauvegardes : sur des disques du tableau eux aussi chiffrés (même choix de format, disque par disque), ou une copie hors de la machine déjà chiffrée.
- La clé : avec une phrase de passe tapée à chaque démarrage, un disque volé ne révèle rien ; mais après une coupure de courant, le site attend que vous déverrouilliez le tableau. Un fichier clé posé sur la clé USB d'Unraid démarre tout seul, mais protège moins (la clé USB voyage avec le serveur).
-
Chiffrement dans la base, en plus des disques : ajoutez
DATA_KEYau.envde la pile (openssl rand -base64 32, une seule fois) et gardez-en une copie dans un gestionnaire de mots de passe. Au redémarrage, les noms, e-mails, signatures, photos de repère et messages déjà enregistrés sont chiffrés ; Droits & confidentialité affiche « actif ». Clé perdue = données illisibles, sauvegardes comprises ; ne la changez pas sans aide. - Une fois fait, cochez Droits & confidentialité → « Les données et les sauvegardes sont sur des disques chiffrés » : la page
/confidentialitel'annonce.
Pensez aussi à l'authentification à deux facteurs dans Zitadel (Settings → Login Behavior and Access → Multifactor, ou l'obligation par organisation) pour vos deux comptes, puis cochez la case correspondante dans Droits & confidentialité.
-
Montage oublié : le site refuse de démarrer si
/datan'est pas un dossier monté. - Dossier absent : Compose refuse de démarrer au lieu d'en créer un vide.
- Conteneurs : système de fichiers en lecture seule, sans privilège, utilisateur 99:100.
-
Connexion de test : jamais en ligne ; le serveur refuse
LOCAL_AUTH_TOKENen production. -
Adresse des visiteurs : réseau Docker dédié ; le site ne croit
X-Forwarded-Forque venant du tunnel (TRUST_PROXY=TUNNEL_IP), pas d'un poste du réseau local.