Le foto restano da te
EventSlide gira su un solo computer: un portatile, un mini PC, un Raspberry Pi sotto il proiettore. Niente ne esce.
EventSlide è software libero: puoi farlo girare sul tuo computer e le tue foto non ne escono mai. Questa pagina è pensata per chi ha dimestichezza con un server. Se non è il tuo caso, esiste l’accesso ospitato e non c’è niente da installare.
Vedi i comandi Codice sorgente su GitHub
La maggior parte degli strumenti per le foto di una festa chiede una di queste due cose: che i tuoi invitati installino un’app, oppure che tu affidi centinaia di foto di famiglia a un’azienda che non conosci. EventSlide non chiede né l’una né l’altra.
EventSlide gira su un solo computer: un portatile, un mini PC, un Raspberry Pi sotto il proiettore. Niente ne esce.
Scegli per quanto tempo conservare l’album, ne fai il backup quando vuoi, lo elimini quando vuoi. Niente di tutto questo dipende da me.
Il codice è pubblico: puoi verificare cosa fa il software, modificarlo, passarlo ad altri. L’immagine pubblicata è firmata e analizzata a ogni versione.
Su un computer installato in sala, gli invii vengono rimessi in coda e il muro continua a scorrere se la rete cade. Può funzionare da solo per una serata di otto ore.
Un portatile, un mini PC o un Raspberry Pi. L’immagine esiste per linux/amd64 e linux/arm64.
Con docker compose. Sul tuo computer non si compila nulla: l’immagine pubblicata viene semplicemente scaricata.
È l’indirizzo contenuto nel QR code (PUBLIC_URL). Mai localhost: un QR code che punta a localhost è il modo più comune di sbagliare un’installazione la sera stessa. Inquadra il tuo QR code con il telefono prima dell’arrivo degli invitati.
EventSlide parla in semplice http e non cifra da solo. Qualcosa deve mettersi davanti: Caddy, nginx o Traefik, quello che usi già. Con Caddy basta una sola riga di configurazione.
I comandi qui sotto lo usano per generare due segreti casuali. Con Docker non serve ad altro.
Questo caso oggi non è coperto. Un computer su una rete locale, senza DNS né certificato, non può servire un https di cui il telefono di un invitato si fidi, e EventSlide non funziona in semplice http in produzione. La risposta attuale: un vero nome di dominio che punti al computer (funziona sul Wi-Fi del locale finché i telefoni hanno una strada per raggiungerlo), oppure un proxy in --network host con un certificato che hai già. Per un muro completamente offline, scrivilo sul tracker delle segnalazioni del repository.
L’immagine è pubblicata come ghcr.io/irony42/eventslide, per linux/amd64 e linux/arm64. È firmata e analizzata a ogni versione. I comandi qui sotto vengono dal README del repository (versione 3.6.0), con i loro commenti in inglese. In caso di dubbio, fa fede il 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 cleanlyI comandi node generano due segreti casuali (SESSION_SECRET, GUEST_TOKEN_SECRET), poi annoti l’indirizzo che i telefoni raggiungeranno (PUBLIC_URL). Le due righe BOOTSTRAP_OWNER servono a creare il tuo account al primo avvio: non ci sono né un amministratore predefinito né una pagina di installazione. Anche la password è generata, perché quella scritta in un tutorial è la prima che proverebbero tutti.
Il primo comando up scarica l’immagine pubblicata, alla versione che hai scaricato. Una variabile mancante o scritta male fa mostrare tutti i problemi in un colpo solo, poi il server si ferma. In background il contenitore si riavvia da solo e l’elenco scorre fuori dallo schermo. Quando parte senza problemi, -d è il modo giusto per lasciarlo acceso.
Il cookie di accesso è marcato Secure: un browser non lo rimanda mai in semplice http. Per questo EventSlide si rifiuta di avviarsi senza https, invece di darti un modulo che non ti fa mai entrare. compose.yaml collega la porta a 127.0.0.1 perché il proxy la raggiunga e imposta di conseguenza TRUST_PROXY_HOPS=1. Se il tuo proxy è un contenitore sulla stessa rete Docker, elimina il blocco ports: e puntalo su eventslide:4300.
photos.example.com {
reverse_proxy 127.0.0.1:4300
}In un file Caddyfile, accanto al file compose. Caddy e Traefik trasmettono da soli al server ciò che serve. Con nginx, aggiungi proxy_set_header X-Forwarded-Proto $scheme; e proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. Senza la prima, il cookie di accesso non viene mai inviato; senza la seconda, tutti i tuoi invitati condividono lo stesso indirizzo per il limitatore di richieste.
Quando il proxy è a posto, apri PUBLIC_URL/login con l’e-mail e la password generata (grep BOOTSTRAP_OWNER .env la mostra). Al primo accesso ti viene chiesto di sceglierne una tua: almeno 12 caratteri, e non una password comune. Dopo, elimina le due righe BOOTSTRAP_OWNER oppure tienile tutte e due: una sola viene rifiutata.
Dal repository scaricato, invece di scaricare l’immagine:
docker compose -f compose.yaml -f compose.build.yaml up --buildServe Node 24 o più recente, poi i comandi npm descritti nella sezione «Install» del README. Dietro il tuo proxy https, TRUST_PROXY_HOPS=1 è indispensabile: senza, il modulo di accesso accetta la tua password e tu resti disconnesso.
Il file docs/IMAGE-SOURCES.md dice cosa contiene l’immagine, dove si trova il codice sorgente di ogni parte e come verificare la firma. Sul tuo computer non si compila nulla: quello che esegui è l’immagine pubblicata, quella firmata.
Fanne uno prima della festa e uno la mattina dopo. Il server resta acceso durante il backup. Il passaggio che tutti saltano è il più importante: portare l’archivio fuori dal computer. I comandi qui sotto vengono da docs/OPERATING.md del repository (versione 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"L’archivio è una cartella: un’istantanea coerente del database, tutte le foto e un inventario dei file con le loro impronte. Il comando rilegge tutto ciò che ha appena scritto prima di dire OK.
Una copia sullo stesso disco dell’album non sopravvive al guasto di quel disco. È un backup quando una copia sta su un altro computer, o su un disco che puoi scollegare.
Ferma sempre il server prima di ripristinare: il comando restore sostituisce il file del database, e farlo con il server acceso dà un muro che non serve né la vecchia serata né la nuova. Il comando verifica tutto l’archivio prima di toccare qualsiasi cosa e si rifiuta di sovrascrivere un’installazione senza --force.
I segreti non sono nell’archivio. Ripristinare le foto con nuovi segreti disconnette tutti gli organizzatori.
I libri fotografici (PDF) e i montaggi video non sono nel backup: si rifanno su richiesta dalla pagina dell’evento. I dettagli, e ciò che i controlli intercettano o no, sono in docs/SECURITY.md, sezione 11. Il ripristino passo per passo è in docs/OPERATING.md, sezione «Backups».
Usa una versione pubblicata, non la punta del ramo principale (quello su cui ti lascia git clone). Fai prima un backup: le migrazioni che una nuova versione applica all’avvio vanno solo in avanti, e il backup è l’unica strada per tornare indietro.
git fetch --tags && git checkout vX.Y.Z
docker compose pull
docker compose up -dSostituisci vX.Y.Z con la versione che vuoi. Cosa può rompere una versione maggiore, come viene annunciata una rottura e come tornare indietro sono spiegati in docs/UPGRADING.md.
Ecco il riassunto in parole semplici. Non è una consulenza legale: fa fede il testo della licenza.
Se modifichi EventSlide e altre persone lo usano tramite la rete, devi offrire loro il codice sorgente della tua versione, con la stessa licenza. Far girare una copia non modificata non aggiunge nulla.
Ogni schermata per gli invitati e per l’organizzatore riporta un link «Codice sorgente (AGPL-3.0)». Puoi cambiare l’indirizzo a cui punta (SOURCE_CODE_URL), per esempio per una versione modificata. Nessuna impostazione lo nasconde.
La versione 3.0.0 è la prima sotto AGPL-3.0, «solamente»: senza la clausola «o qualsiasi versione successiva». La 2.1.0 è l’ultima sotto GPL-3.0, e tutto ciò che è stato pubblicato prima resta sotto GPL-3.0 per sempre.
Cosa chiede la licenza a chi lo esegue, lo modifica o lo riprende: docs/LICENSING-FAQ.md.
Tutto è su github.com/Irony42/EventSlide. Ecco da dove cominciare. I documenti sono in inglese.
Il codice, le versioni pubblicate e il tracker delle issue su GitHub.
Cosa fa EventSlide, l’installazione, i backup, gli aggiornamenti.
Il modello delle minacce, scritto attorno a chi c’è davvero in sala.
Cosa chiede la licenza a chi lo esegue, lo modifica o lo riprende.
Cosa può rompere una versione maggiore, e come tornare indietro.
Di cosa è fatta l’immagine, e come verificarne la firma.
Vuoi dare una mano? Guarda CONTRIBUTING.md, o la pagina sostieni il progetto.
Richiedi l’accesso all’istanza ospitata su app.eventslide.fr: gratuita, su invito. Non devi installare niente.