Héberger EventSlide chez vous

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

  • Licence AGPL-3.0
  • Image Docker signée
  • linux/amd64 et arm64
  • Vos photos restent chez vous

Pourquoi l’héberger soi-même

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.

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

  • Vous gardez la main

    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.

  • Un code qu’on peut lire

    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.

  • Il tient la soirée

    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.

Ce qu’il vous faut

  • Une machine

    Un ordinateur portable, un mini-PC ou un Raspberry Pi. L’image existe pour linux/amd64 et linux/arm64.

  • Docker

    Avec docker compose. Rien n’est compilé chez vous : l’image publiée est simplement téléchargée.

  • Une adresse https joignable par les téléphones

    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.

  • Un proxy qui gère le chiffrement (TLS)

    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.

  • Node, pour tirer deux secrets

    Les commandes ci-dessous s’en servent pour fabriquer deux secrets au hasard. Rien d’autre ne l’exige avec Docker.

Un lieu sans nom de domaine ?

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.

Installation avec l’image Docker signée

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 cleanly

Ce que font ces commandes, et ce qui reste à faire

  1. Récupérer le code et écrire la configuration

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

  2. Lancer d’abord au premier plan

    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.

  3. Mettre https devant

    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.

    Avec Caddy, tout le proxy tient en une ligne utile
    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.

  4. Ouvrir et se connecter

    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.

Construire l’image vous-même (copie modifiée, version pas encore publié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 --build

Sans Docker

Il 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é.

Vérifier la signature de l’image

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.

Sauvegardes

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"
  • Une archive de confiance

    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.

  • Elle doit quitter la machine

    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.

  • Restaurer, serveur arrêté

    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.

  • Gardez aussi votre .env

    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.

Mises à jour

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 -d

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

La licence AGPL-3.0, expliquée simplement

Voici le résumé en mots simples. Ce n’est pas un conseil juridique : le texte de la licence fait foi.

Vous pouvez

  • le faire tourner, pour vous ou pour d’autres
  • le lire, d’un bout à l’autre
  • le modifier
  • le transmettre à quelqu’un d’autre

Une seule obligation de plus

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.

Le lien est déjà prévu

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.

Ce qui était avant

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.

Code source et contributions

Tout est sur github.com/Irony42/EventSlide. Voici où commencer. Les documents sont en anglais.

Vous voulez aider ? Voyez CONTRIBUTING.md, ou la page soutenir le projet.

Questions fréquentes

Faut-il être développeur ?

Non, mais il faut être à l’aise avec un terminal, Docker et un nom de domaine. Sinon, l’instance hébergée existe : demandez un accès.

Combien cela coûte-t-il ?

Le logiciel est libre et gratuit. Il vous reste la machine, un nom de domaine et un peu de temps.

Puis-je le faire tourner pour d’autres personnes ?

Oui. Faire tourner une copie non modifiée pour d’autres n’ajoute aucune obligation. Seule une version modifiée, proposée par le réseau, déclenche l’offre du code source. Le détail est dans la FAQ de licence.

Et si la salle n’a pas de réseau ?

Sur votre propre machine, le mur continue de passer quand le réseau tombe et les envois sont remis en file. En revanche, https demande un vrai nom de domaine : voyez le cas « lieu sans nom de domaine » plus haut. Un mur servi depuis un hébergeur dépend, lui, de la connexion de la salle.

Vous préférez ne rien installer ?

Demandez un accès à l’instance hébergée sur app.eventslide.fr : gratuite, sur invitation. Vous n’avez rien à installer.

Demander un accès