Depot d'extensions

← Documentation

Installer et exploiter le dépôt

Le dépôt est une application Python servie par un conteneur Docker, publiée en HTTPS derrière Nginx Proxy Manager. Il écoute sur le port 8090 de l'hôte.

Installation

cd /opt/extensions
cp .env.example .env
$EDITOR .env
docker compose up -d --build

Variables d'environnement

Variable Rôle
PUBLIC_BASE_URL URL publique en HTTPS, sans slash final. Elle est écrite telle quelle dans les manifestes et les stratégies : une valeur erronée rend les mises à jour injoignables.
SECRET_KEY Signature des cookies de session. À générer avec openssl rand -hex 32.
BOOTSTRAP_ADMIN_USER / _PASSWORD Compte créé au tout premier démarrage, ignoré ensuite.
TIMEZONE Fuseau d'affichage des dates. Elles restent stockées en UTC.
MAX_UPLOAD_MB Taille maximale d'un paquet déposé (défaut 100).
SESSION_HOURS Durée d'une session (défaut 12).

Après toute modification de .env : docker compose up -d.

Publication derrière Nginx Proxy Manager

Créer un Proxy Host :

client_max_body_size 128m;

Reporter ensuite le domaine dans PUBLIC_BASE_URL.

Le HTTPS n'est pas optionnel : Firefox refuse un update_url en clair et Chrome refuse les mises à jour non chiffrées.

Sauvegarde

Tout l'état tient dans data/ : base SQLite, paquets publiés et clés privées de signature. C'est le seul répertoire à sauvegarder, et le plus précieux — la perte d'une clé interdit définitivement toute mise à jour de l'extension correspondante.

cd /opt/extensions
docker compose stop
tar czf /sauvegardes/extensions-$(date +%F).tar.gz data .env
docker compose start

L'arrêt du service garantit une base SQLite cohérente. Pour une sauvegarde à chaud, préférer :

sqlite3 data/repo.sqlite3 ".backup /sauvegardes/repo-$(date +%F).sqlite3"
tar czf /sauvegardes/paquets-$(date +%F).tar.gz data/packages data/keys

Restauration

cd /opt/extensions
docker compose down
tar xzf /sauvegardes/extensions-AAAA-MM-JJ.tar.gz
docker compose up -d

Les URL publiées étant construites à partir de PUBLIC_BASE_URL, une restauration sur un autre domaine ne demande que d'ajuster cette variable — mais les stratégies déjà déployées sur les postes pointeront toujours vers l'ancien domaine.

Mise à jour du service

cd /opt/extensions
docker compose up -d --build

Les données vivent dans le volume data/ et ne sont pas touchées par une reconstruction.

Comptes

Comptes → Nouveau compte. Tous les comptes disposent des mêmes droits. Il n'existe pas d'inscription libre : un compte ne peut être créé que par un utilisateur déjà connecté.

Changer un mot de passe ou désactiver un compte ferme immédiatement toutes ses sessions ouvertes. Le dépôt refuse de supprimer ou désactiver le dernier compte actif.

Le mot de passe initial figure en clair dans .env : le changer depuis l'interface après la première connexion.

Journal

Journal conserve les 300 dernières opérations : créations, dépôts de version, épinglages, suppressions, exports de clé et changements de comptes, avec l'auteur et l'horodatage.

Retirer une extension du périmètre

Décocher Publiée sur sa fiche : elle disparaît des manifestes et ses fichiers cessent d'être servis, sans perte d'historique. Les postes déjà équipés conservent l'extension mais ne reçoivent plus de mise à jour.

Pour la désinstaller réellement du parc, retirer la ligne correspondante de la stratégie de groupe : une extension installée de force est désinstallée dès qu'elle quitte la liste.

Diagnostic

docker compose ps                       # état et santé du conteneur
docker compose logs --tail=50           # journal applicatif
curl -s localhost:8090/healthz          # service vivant sur l'hôte
curl -sI https://extensions.kernelpanics.fr/healthz   # chaîne complète avec le proxy
Symptôme Piste
Le conteneur redémarre en boucle SECRET_KEY absent ou laissé à sa valeur d'exemple.
Les manifestes annoncent localhost PUBLIC_BASE_URL non renseigné ; corriger puis docker compose up -d.
Dépôt de paquet en échec sans message client_max_body_size trop bas dans Nginx Proxy Manager.
Dates décalées TIMEZONE absent de .env.
Déconnexion à chaque page PUBLIC_BASE_URL en https alors que l'accès se fait en http : le cookie de session est refusé.

Autres documents : Publier une extension pour la première fois · Mettre à jour une extension Chrome, Edge ou Brave · Mettre à jour une extension Firefox ·