EventSlide selbst hosten

EventSlide ist freie Software: Sie können es auf Ihrem eigenen Rechner betreiben, und Ihre Fotos verlassen ihn nie. Diese Seite richtet sich an alle, die sich mit einem Server auskennen. Wenn das nicht auf Sie zutrifft: Der gehostete Zugang existiert, und Sie müssen nichts installieren.

Befehle ansehen Quellcode auf GitHub

  • Lizenz AGPL-3.0
  • Signiertes Docker-Image
  • linux/amd64 und arm64
  • Ihre Fotos bleiben bei Ihnen

Warum selbst hosten

Die meisten Foto-Tools für Feiern verlangen eines von beidem: dass Ihre Gäste eine App installieren oder dass Sie Hunderte Familienfotos einer Firma anvertrauen, die Sie nicht kennen. EventSlide verlangt keines von beidem.

  • Die Fotos bleiben bei Ihnen

    EventSlide läuft auf einem einzigen Rechner: einem Laptop, einem Mini-PC, einem Raspberry Pi unter dem Beamer. Nichts verlässt ihn.

  • Sie behalten die Kontrolle

    Sie bestimmen, wie lange das Album aufbewahrt wird, Sie sichern es, wann Sie wollen, und löschen es, wann Sie wollen. Nichts davon hängt von mir ab.

  • Code, den man lesen kann

    Der Code ist öffentlich: Sie können prüfen, was die Software tut, sie ändern und weitergeben. Das veröffentlichte Image wird bei jeder Version signiert und geprüft.

  • Es hält den ganzen Abend durch

    Auf einem Rechner im Saal werden Uploads in eine Warteschlange gestellt, und die Fotowand läuft weiter, wenn das Netz ausfällt. Einen Abend von acht Stunden kann sie allein durchhalten.

Was Sie brauchen

  • Einen Rechner

    Einen Laptop, einen Mini-PC oder einen Raspberry Pi. Das Image gibt es für linux/amd64 und linux/arm64.

  • Docker

    Mit docker compose. Bei Ihnen wird nichts kompiliert: Das veröffentlichte Image wird einfach heruntergeladen.

  • Eine https-Adresse, die die Handys erreichen

    Es ist die Adresse, die der QR-Code enthält (PUBLIC_URL). Niemals localhost: Ein QR-Code, der auf localhost zeigt, ist der häufigste Grund, warum eine Installation noch am Abend der Feier scheitert. Scannen Sie Ihren eigenen QR-Code mit dem Handy, bevor die Gäste eintreffen.

  • Einen Proxy für die Verschlüsselung (TLS)

    EventSlide spricht einfaches http und verschlüsselt nicht selbst. Davor muss etwas stehen: Caddy, nginx oder Traefik, was Sie ohnehin nutzen. Mit Caddy ist es eine einzige Konfigurationszeile.

  • Node, um zwei geheime Schlüssel zu erzeugen

    Die Befehle unten nutzen es, um zwei zufällige geheime Schlüssel zu erzeugen. Mit Docker verlangt sonst nichts danach.

Ein Veranstaltungsort ohne Domainnamen?

Dieser Fall ist heute nicht abgedeckt. Ein Rechner in einem lokalen Netz, ohne DNS und ohne Zertifikat, kann kein https ausliefern, dem das Handy eines Gasts vertraut, und EventSlide läuft im Produktivbetrieb nicht über einfaches http. Die heutige Antwort: ein echter Domainname, der auf den Rechner zeigt (das funktioniert über das WLAN des Orts, solange die Handys einen Weg dorthin haben), oder ein Proxy mit --network host und einem Zertifikat, das Sie schon besitzen. Für eine komplett offline laufende Fotowand melden Sie sich im Issue-Tracker des Repositorys.

Installation mit dem signierten Docker-Image

Das Image ist unter ghcr.io/irony42/eventslide veröffentlicht, für linux/amd64 und linux/arm64. Es wird bei jeder Version signiert und geprüft. Die Befehle unten stammen aus der README des Repositorys (Version 3.6.0), einschließlich ihrer englischen Kommentare. Im Zweifel gilt das Repository.

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, with a generated password.
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

Was diese Befehle tun und was Ihnen bleibt

  1. Code holen und Konfiguration schreiben

    Die node-Befehle erzeugen zwei zufällige geheime Schlüssel (SESSION_SECRET, GUEST_TOKEN_SECRET), danach tragen Sie die Adresse ein, die die Handys erreichen werden (PUBLIC_URL). Die beiden BOOTSTRAP_OWNER-Zeilen legen Ihr Konto beim ersten Start an: Es gibt weder einen Standard-Administrator noch eine Einrichtungsseite. Auch das Passwort wird erzeugt, denn das Passwort aus einer Anleitung ist das, was alle zuerst probieren würden.

  2. Zuerst im Vordergrund starten

    Das erste up lädt das veröffentlichte Image in der Version herunter, die Sie ausgecheckt haben. Bei einer fehlenden oder fehlerhaften Variablen zeigt der Server alle Probleme auf einmal an und beendet sich. Im Hintergrund startet der Container von selbst neu, und die Liste scrollt aus dem Bild. Läuft alles sauber an, ist -d der richtige Weg, es laufen zu lassen.

  3. https davorschalten

    Das Login-Cookie ist als Secure markiert: Ein Browser sendet es über einfaches http nie zurück. EventSlide weigert sich daher, ohne https zu starten, statt Ihnen ein Anmeldeformular zu geben, das Sie nie anmeldet. compose.yaml bindet den Port an 127.0.0.1, damit der Proxy ihn erreicht, und setzt dazu passend TRUST_PROXY_HOPS=1. Ist Ihr Proxy ein Container im selben Docker-Netz, entfernen Sie den Block ports: und lassen ihn auf eventslide:4300 zeigen.

    Mit Caddy genügt für den ganzen Proxy eine einzige Zeile
    photos.example.com {
      reverse_proxy 127.0.0.1:4300
    }

    In einer Datei Caddyfile neben der Compose-Datei. Caddy und Traefik reichen von selbst weiter, was der Server braucht. Fügen Sie bei nginx proxy_set_header X-Forwarded-Proto $scheme; und proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; hinzu. Ohne die erste Zeile wird das Login-Cookie nie gesendet; ohne die zweite teilen sich alle Ihre Gäste dieselbe Adresse für die Ratenbegrenzung.

  4. Öffnen und anmelden

    Sobald der Proxy steht, öffnen Sie PUBLIC_URL/login mit der E-Mail-Adresse und dem erzeugten Passwort (grep BOOTSTRAP_OWNER .env zeigt es an). Bei der ersten Anmeldung werden Sie gebeten, ein eigenes zu wählen: mindestens 12 Zeichen und kein gängiges Passwort. Löschen Sie danach beide BOOTSTRAP_OWNER-Zeilen oder behalten Sie beide: Eine allein wird abgelehnt.

Das Image selbst bauen (geänderte Kopie, noch nicht veröffentlichte Version)

Aus dem ausgecheckten Repository, statt das Image herunterzuladen:

docker compose -f compose.yaml -f compose.build.yaml up --build

Ohne Docker

Sie brauchen Node 24 oder neuer und dann die npm-Befehle aus dem Abschnitt „Install“ der README. Hinter Ihrem https-Proxy ist TRUST_PROXY_HOPS=1 unerlässlich: Ohne es akzeptiert das Anmeldeformular Ihr Passwort, und Sie bleiben trotzdem abgemeldet.

Die Signatur des Images prüfen

Die Datei docs/IMAGE-SOURCES.md sagt, was das Image enthält, wo der Quellcode jedes Teils liegt und wie man die Signatur prüft. Auf Ihrem Rechner wird nichts kompiliert: Was Sie ausführen, ist das veröffentlichte Image, das signierte.

Datensicherung

Machen Sie eine vor der Feier und eine am Morgen danach. Der Server läuft während der Sicherung weiter. Der Schritt, den alle auslassen, ist der wichtigste: das Archiv vom Rechner wegbringen. Die Befehle unten stammen aus docs/OPERATING.md des Repositorys (Version 3.6.0).

# 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"
  • Ein Archiv, dem Sie vertrauen können

    Das Archiv ist ein Ordner: ein konsistenter Schnappschuss der Datenbank, alle Fotos und ein Verzeichnis der Dateien mit ihren Prüfsummen. Der Befehl liest alles, was er gerade geschrieben hat, noch einmal ein, bevor er „OK“ sagt.

  • Es muss den Rechner verlassen

    Eine Kopie auf derselben Festplatte wie das Album übersteht den Ausfall dieser Festplatte nicht. Von einer Sicherung spricht man, sobald eine Kopie auf einem anderen Rechner liegt oder auf einer Platte, die Sie abziehen können.

  • Wiederherstellen bei gestopptem Server

    Stoppen Sie den Server immer vor dem Wiederherstellen: Der Befehl restore ersetzt die Datenbankdatei, und bei laufendem Server ergibt das eine Fotowand, die weder den alten noch den neuen Abend ausliefert. Er prüft das gesamte Archiv, bevor er etwas anrührt, und weigert sich, eine Installation ohne --force zu überschreiben.

  • Sichern Sie auch Ihre .env

    Die geheimen Schlüssel sind nicht im Archiv. Wer Fotos mit neuen Schlüsseln wiederherstellt, meldet alle Gastgeber ab.

Fotobücher (PDF) und Videoschnitte sind nicht in der Sicherung: Sie werden auf Anfrage von der Seite der Veranstaltung aus neu erstellt. Die Einzelheiten und was die Prüfungen erfassen oder nicht, stehen in docs/SECURITY.md, Abschnitt 11. Die schrittweise Wiederherstellung steht in docs/OPERATING.md, Abschnitt „Backups“.

Updates

Betreiben Sie eine veröffentlichte Version, nicht die Spitze des Hauptzweigs (auf der Sie nach git clone landen). Machen Sie vorher eine Sicherung: Die Migrationen, die eine neue Version beim Start anwendet, gehen nur vorwärts, und die Sicherung ist der einzige Rückweg.

git fetch --tags && git checkout vX.Y.Z
docker compose pull
docker compose up -d

Ersetzen Sie vX.Y.Z durch die gewünschte Version. Was eine Hauptversion kaputt machen kann, wie ein Bruch angekündigt wird und wie man zurückgeht, steht in docs/UPGRADING.md.

Die Lizenz AGPL-3.0, einfach erklärt

Hier die Zusammenfassung in einfachen Worten. Es ist keine Rechtsberatung: Maßgeblich ist der Lizenztext.

Sie dürfen

  • es betreiben, für sich oder für andere
  • es von vorn bis hinten lesen
  • es verändern
  • es an andere weitergeben

Nur eine zusätzliche Pflicht

Wenn Sie EventSlide verändern und andere Personen Ihre Version über das Netz nutzen, müssen Sie ihnen den Quellcode Ihrer Version anbieten, unter derselben Lizenz. Eine unveränderte Kopie zu betreiben, bringt nichts Zusätzliches mit sich.

Der Link ist schon vorgesehen

Jeder Bildschirm für Gäste und Gastgeber trägt einen Link „Quellcode (AGPL-3.0)“. Sie können die Adresse ändern, auf die er zeigt (SOURCE_CODE_URL), etwa bei einer veränderten Version. Keine Einstellung blendet ihn aus.

Was vorher war

Version 3.0.0 ist die erste unter AGPL-3.0, „nur“ diese Fassung: ohne die Klausel „oder jede spätere Version“. Version 2.1.0 ist die letzte unter GPL-3.0, und alles, was davor veröffentlicht wurde, bleibt für immer unter GPL-3.0.

Was die Lizenz von jemandem verlangt, der die Software betreibt, verändert oder weiterentwickelt: docs/LICENSING-FAQ.md.

Quellcode und Mitarbeit

Alles liegt auf github.com/Irony42/EventSlide. Hier können Sie anfangen. Die Dokumente sind auf Englisch.

Sie möchten helfen? Sehen Sie sich CONTRIBUTING.md an oder lesen Sie wie Sie das Projekt unterstützen können.

Häufige Fragen

Muss man Entwickler sein?

Nein, aber Sie sollten sich mit Terminal, Docker und einem Domainnamen wohlfühlen. Sonst gibt es die gehostete Instanz: fordern Sie einen Zugang an.

Was kostet es?

Die Software ist frei und kostenlos. Es bleiben ein Rechner, ein Domainname und ein wenig Zeit.

Darf ich es für andere Personen betreiben?

Ja. Eine unveränderte Kopie für andere zu betreiben, bringt keine zusätzliche Pflicht mit sich. Nur eine veränderte Version, die über das Netz angeboten wird, löst das Angebot des Quellcodes aus. Die Einzelheiten stehen in den Lizenz-FAQ.

Und wenn der Saal kein Netz hat?

Auf Ihrem eigenen Rechner läuft die Fotowand weiter, wenn das Netz ausfällt, und die Uploads werden in eine Warteschlange gestellt. Für https brauchen Sie allerdings einen echten Domainnamen: Sehen Sie sich oben den Fall „Veranstaltungsort ohne Domainnamen“ an. Eine Fotowand, die von einem Hoster ausgeliefert wird, hängt dagegen von der Verbindung des Saals ab.

Sie möchten lieber nichts installieren?

Fragen Sie einen Zugang zur gehosteten Instanz auf app.eventslide.fr an: kostenlos, nur auf Einladung. Sie müssen nichts installieren.

Zugang anfordern