Les photos restent chez vous
EventSlide tourne sur une seule machine : un ordinateur portable, un mini-PC, un Raspberry Pi sous le projecteur. Rien n’en sort.
EventSlide est un logiciel libre : vous pouvez le faire tourner sur votre propre machine, et vos photos n’en sortent jamais. Cette page s’adresse aux personnes à l’aise avec un serveur. Si ce n’est pas votre cas, l’accès hébergé existe, et il n’y a rien à installer.
Voir les commandes Code source sur GitHub
La plupart des outils de photos de fête demandent l’une de deux choses : que vos invités installent une appli, ou que vous confiiez des centaines de photos de famille à une entreprise que vous ne connaissez pas. EventSlide n’en demande aucune.
EventSlide tourne sur une seule machine : un ordinateur portable, un mini-PC, un Raspberry Pi sous le projecteur. Rien n’en sort.
Vous choisissez combien de temps l’album est conservé, vous le sauvegardez quand vous voulez, vous le supprimez quand vous voulez. Rien de tout cela ne dépend de nous.
Le code est public : vous pouvez vérifier ce que fait le logiciel, le modifier, le transmettre. L’image publiée est signée et analysée à chaque version.
Sur une machine installée dans la salle, les envois sont remis en file et le mur continue de passer quand le réseau tombe. Il peut tourner seul pendant une soirée de huit heures.
Un ordinateur portable, un mini-PC ou un Raspberry Pi. L’image existe pour linux/amd64 et linux/arm64.
Avec docker compose. Rien n’est compilé chez vous : l’image publiée est simplement téléchargée.
C’est l’adresse que le QR code contient (PUBLIC_URL). Jamais localhost : un QR code qui pointe vers localhost est la façon la plus courante de rater une installation le soir même. Scannez votre propre QR code avec votre téléphone avant l’arrivée des invités.
EventSlide parle en http simple et ne chiffre pas lui-même. Quelque chose doit se placer devant : Caddy, nginx ou Traefik, celui que vous utilisez déjà. Avec Caddy, c’est une seule ligne de configuration.
Les commandes ci-dessous s’en servent pour fabriquer deux secrets au hasard. Rien d’autre ne l’exige avec Docker.
Ce cas n’est pas couvert aujourd’hui. Une machine sur un réseau local, sans DNS ni certificat, ne peut pas servir un https qu’un téléphone d’invité acceptera, et EventSlide ne fonctionne pas en http simple en production. La réponse actuelle : un vrai nom de domaine qui pointe vers la machine (cela marche sur le Wi-Fi du lieu tant que les téléphones ont un chemin jusqu’à elle), ou un proxy en --network host avec un certificat que vous possédez déjà. Pour un mur entièrement hors ligne, dites-le sur le suivi des problèmes du dépôt.
L’image est publiée sous ghcr.io/irony42/eventslide, pour linux/amd64 et linux/arm64. Elle est signée et analysée à chaque version. Les commandes ci-dessous sont celles du README du dépôt, mot pour mot, y compris ses commentaires en anglais. En cas de doute, le dépôt fait foi.
git clone https://github.com/Irony42/EventSlide.git
cd EventSlide
# Two secrets, and the address your guests' phones will reach.
node -e "console.log('SESSION_SECRET='+require('crypto').randomBytes(48).toString('base64url'))" >> .env
node -e "console.log('GUEST_TOKEN_SECRET='+require('crypto').randomBytes(48).toString('base64url'))" >> .env
echo "PUBLIC_URL=https://photos.example.com" >> .env
# Your own account, created on the first boot. The password is generated too, because
# one typed into a README is one everybody who read it could sign in with first.
echo "BOOTSTRAP_OWNER_EMAIL=you@example.com" >> .env
node -e "console.log('BOOTSTRAP_OWNER_PASSWORD='+require('crypto').randomBytes(18).toString('base64url'))" >> .env
docker compose up # the first time, and read what it says
docker compose up -d # once it has booted cleanlyLes commandes node tirent deux secrets au hasard (SESSION_SECRET, GUEST_TOKEN_SECRET), puis vous notez l’adresse que les téléphones atteindront (PUBLIC_URL). Les deux lignes BOOTSTRAP_OWNER servent à créer votre compte à la première mise en route : il n’y a ni administrateur par défaut, ni page d’installation. Le mot de passe est généré lui aussi, parce que celui qu’on écrit dans un tutoriel est celui que tout le monde essaierait en premier.
La première commande up télécharge l’image publiée, à la version que vous avez récupérée. Une variable manquante ou mal formée fait afficher tous les problèmes d’un coup, puis le serveur s’arrête. En arrière-plan, le conteneur redémarre tout seul et la liste défile hors de l’écran. Quand tout démarre proprement, -d est la bonne façon de le laisser tourner.
Le cookie de connexion est marqué Secure : un navigateur ne le renvoie jamais en http simple. EventSlide refuse donc de démarrer sans https plutôt que de vous donner un formulaire qui ne vous connecte jamais. compose.yaml lie le port à 127.0.0.1 pour que le proxy l’atteigne et règle TRUST_PROXY_HOPS=1 en conséquence. Si votre proxy est un conteneur sur le même réseau Docker, supprimez le bloc ports: et pointez-le vers eventslide:4300.
photos.example.com {
reverse_proxy 127.0.0.1:4300
}Dans un fichier Caddyfile, à côté du fichier compose. Caddy et Traefik transmettent seuls ce qu’il faut au serveur. Avec nginx, ajoutez proxy_set_header X-Forwarded-Proto $scheme; et proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. Sans le premier, le cookie de connexion n’est jamais envoyé ; sans le second, tous vos invités partagent la même adresse pour le limiteur de débit.
Une fois le proxy en place, ouvrez PUBLIC_URL/login avec l’e-mail et le mot de passe généré (grep BOOTSTRAP_OWNER .env l’affiche). La première connexion vous demande d’en choisir un : au moins 12 caractères, et pas un mot de passe courant. Ensuite, supprimez les deux lignes BOOTSTRAP_OWNER ou gardez-les toutes les deux : une seule est refusée.
Depuis le dépôt récupéré, au lieu de télécharger l’image :
docker compose -f compose.yaml -f compose.build.yaml up --buildIl faut Node 24 ou plus récent, puis les commandes npm décrites dans la section « Install » du README. Derrière votre proxy https, TRUST_PROXY_HOPS=1 est indispensable : sans lui, le formulaire de connexion accepte votre mot de passe et vous reste déconnecté.
Le fichier docs/IMAGE-SOURCES.md dit ce que contient l’image, où se trouve le code source de chaque partie et comment vérifier la signature. Rien n’est compilé sur votre machine : ce que vous exécutez est l’image publiée, celle qui est signée.
Faites-en une avant la fête et une le lendemain matin. Le serveur reste en marche pendant la sauvegarde. L’étape que tout le monde saute est la plus importante : sortir l’archive de la machine.
# 1. Take it. It prints the name, e.g. /data/backups/eventslide-2026-09-12T08-00-00Z
docker compose exec eventslide node dist/ops/scripts/backup.js
# 2. Take it off the volume, check the copy, and only then delete it there. Until it is
# off the machine it is on the same disk as the photographs, and the command says so.
A=eventslide-2026-09-12T08-00-00Z
docker compose cp "eventslide:/data/backups/$A" . &&
docker compose run --rm -v "$PWD/$A:/restore:ro" eventslide \
node dist/ops/scripts/backup.js --verify /restore &&
docker compose exec eventslide rm -r "/data/backups/$A"L’archive est un dossier : un instantané cohérent de la base, toutes les photos, et un inventaire des fichiers avec leurs empreintes. La commande relit tout ce qu’elle vient d’écrire avant de dire OK.
Une copie sur le même disque que l’album ne résiste pas à la panne de ce disque. C’est une sauvegarde quand une copie est sur une autre machine, ou sur un disque que vous pouvez débrancher.
Arrêtez toujours le serveur avant de restaurer : la commande restore remplace le fichier de base de données, et le faire sous un serveur en marche donne un mur qui ne sert ni l’ancienne soirée ni la nouvelle. Elle vérifie toute l’archive avant de toucher à quoi que ce soit, et refuse d’écraser une installation sans --force.
Les secrets ne sont pas dans l’archive. Restaurer des photos avec de nouveaux secrets déconnecte tous les hôtes.
Les détails, et ce que les vérifications attrapent ou non, sont dans docs/SECURITY.md, section 11. La restauration pas à pas est dans la section « Backups » du README.
Faites tourner une version publiée, pas la pointe de la branche principale (celle sur laquelle git clone vous laisse). Faites une sauvegarde avant : les migrations qu’une nouvelle version applique au démarrage ne vont que vers l’avant, et la sauvegarde est le seul chemin de retour.
git fetch --tags && git checkout vX.Y.Z
docker compose pull
docker compose up -dRemplacez vX.Y.Z par la version que vous voulez. Ce qu’une version majeure peut casser, comment une casse est annoncée et comment revenir en arrière sont expliqués dans docs/UPGRADING.md.
Voici le résumé en mots simples. Ce n’est pas un conseil juridique : le texte de la licence fait foi.
Si vous modifiez EventSlide et que d’autres personnes l’utilisent par le réseau, vous devez leur proposer le code source de votre version, sous la même licence. Faire tourner une copie non modifiée n’ajoute rien.
Chaque écran d’invité et d’hôte porte un lien « Code source (AGPL-3.0) ». Vous pouvez changer l’adresse vers laquelle il pointe (SOURCE_CODE_URL), pour une version modifiée par exemple. Aucun réglage ne le cache.
La version 3.0.0 est la première sous AGPL-3.0, « seulement » : sans la clause « ou toute version ultérieure ». La 2.1.0 est la dernière sous GPL-3.0, et ce qui a été publié avant reste sous GPL-3.0 pour toujours.
Ce que la licence demande à quelqu’un qui l’exécute, la modifie ou la reprend : docs/LICENSING-FAQ.md.
Tout est sur github.com/Irony42/EventSlide. Voici où commencer. Les documents sont en anglais.
Le code, les versions publiées et le suivi des problèmes.
Ce que fait EventSlide, l’installation, les sauvegardes, les mises à jour.
Le modèle de menaces, écrit autour de qui est vraiment dans la salle.
Ce que la licence demande à qui l’exécute, le modifie ou le reprend.
Ce qu’une version majeure peut casser, et comment revenir en arrière.
De quoi l’image est faite, et comment vérifier sa signature.
Vous voulez aider ? Voyez CONTRIBUTING.md, ou la page soutenir le projet.
Demandez un accès à l’instance hébergée sur app.eventslide.fr : gratuite, sur invitation. Vous n’avez rien à installer.