Aloja EventSlide por tu cuenta

EventSlide es software libre: puedes ejecutarlo en tu propio equipo y tus fotos no salen nunca de él. Esta página está pensada para quien se maneja con un servidor. Si no es tu caso, existe el acceso alojado, y no hay nada que instalar.

Ver los comandos Código fuente en GitHub

  • Licencia AGPL-3.0
  • Imagen Docker firmada
  • linux/amd64 y arm64
  • Tus fotos se quedan contigo

Por qué alojarlo por tu cuenta

La mayoría de las herramientas de fotos para fiestas te piden una de dos cosas: que tus invitados instalen una app, o que confíes cientos de fotos de familia a una empresa que no conoces. EventSlide no te pide ninguna de las dos.

  • Las fotos se quedan contigo

    EventSlide funciona en un solo equipo: un portátil, un miniPC, una Raspberry Pi bajo el proyector. Nada sale de ahí.

  • Tú tienes el control

    Tú decides cuánto tiempo se conserva el álbum, haces la copia de seguridad cuando quieres y lo eliminas cuando quieres. Nada de esto depende de mí.

  • Un código que se puede leer

    El código es público: puedes comprobar qué hace el software, modificarlo y compartirlo. La imagen publicada va firmada y se analiza en cada versión.

  • Aguanta toda la fiesta

    En un equipo instalado en la sala, los envíos se vuelven a poner en cola y el muro sigue pasando fotos cuando se cae la red. Puede funcionar solo durante una fiesta de ocho horas.

Lo que necesitas

  • Un equipo

    Un portátil, un miniPC o una Raspberry Pi. La imagen existe para linux/amd64 y linux/arm64.

  • Docker

    Con docker compose. No se compila nada en tu equipo: simplemente se descarga la imagen publicada.

  • Una dirección https accesible desde los móviles

    Es la dirección que contiene el código QR (PUBLIC_URL). Nunca localhost: un código QR que apunta a localhost es la forma más habitual de que la instalación falle la noche de la fiesta. Escanea tu propio código QR con el móvil antes de que lleguen los invitados.

  • Un proxy que se encargue del cifrado (TLS)

    EventSlide habla en http simple y no cifra por sí mismo. Algo tiene que ponerse delante: Caddy, nginx o Traefik, el que ya uses. Con Caddy, basta una sola línea de configuración.

  • Node, para generar dos secretos

    Los comandos de más abajo lo usan para fabricar dos secretos al azar. Con Docker, no hace falta para nada más.

¿Un local sin nombre de dominio?

Este caso hoy no está cubierto. Un equipo en una red local, sin DNS ni certificado, no puede servir un https que el móvil de un invitado acepte, y EventSlide no funciona en http simple en producción. La respuesta actual: un nombre de dominio real que apunte al equipo (funciona con el wifi del local siempre que los móviles tengan un camino hasta él), o un proxy en --network host con un certificado que ya tengas. Para un muro totalmente sin conexión, cuéntalo en el seguimiento de incidencias del repositorio.

Instalación con la imagen Docker firmada

La imagen se publica como ghcr.io/irony42/eventslide, para linux/amd64 y linux/arm64. Va firmada y se analiza en cada versión. Los comandos de más abajo proceden del README del repositorio (versión 3.6.0), incluidos sus comentarios en inglés. En caso de duda, manda el repositorio.

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

Qué hacen estos comandos y qué te queda por hacer

  1. Descargar el código y escribir la configuración

    Los comandos node generan dos secretos al azar (SESSION_SECRET, GUEST_TOKEN_SECRET), y después anotas la dirección a la que llegarán los móviles (PUBLIC_URL). Las dos líneas BOOTSTRAP_OWNER sirven para crear tu cuenta en el primer arranque: no hay administrador por defecto ni página de instalación. La contraseña también se genera, porque la que se escribe en un tutorial es la que todo el mundo probaría primero.

  2. Ejecutarlo primero en primer plano

    El primer comando up descarga la imagen publicada, en la versión que has descargado. Si falta una variable o está mal formada, el servidor muestra todos los problemas de golpe y se detiene. En segundo plano, el contenedor se reinicia solo y la lista se pierde de vista. Cuando todo arranca bien, -d es la forma adecuada de dejarlo funcionando.

  3. Poner https delante

    La cookie de inicio de sesión lleva la marca Secure: un navegador nunca la devuelve por http simple. Por eso EventSlide se niega a arrancar sin https, en lugar de darte un formulario que nunca te deja entrar. compose.yaml enlaza el puerto a 127.0.0.1 para que el proxy llegue a él y ajusta TRUST_PROXY_HOPS=1 en consecuencia. Si tu proxy es un contenedor de la misma red Docker, elimina el bloque ports: y apúntalo a eventslide:4300.

    Con Caddy, todo el proxy cabe en una línea útil
    photos.example.com {
      reverse_proxy 127.0.0.1:4300
    }

    En un archivo Caddyfile, junto al archivo compose. Caddy y Traefik transmiten por sí solos lo que necesita el servidor. Con nginx, añade proxy_set_header X-Forwarded-Proto $scheme; y proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. Sin el primero, la cookie de inicio de sesión no se envía nunca; sin el segundo, todos tus invitados comparten la misma dirección para el limitador de frecuencia.

  4. Abrirlo e iniciar sesión

    Con el proxy ya en su sitio, abre PUBLIC_URL/login con el correo electrónico y la contraseña generada (grep BOOTSTRAP_OWNER .env la muestra). En el primer inicio de sesión te pide elegir una propia: al menos 12 caracteres y que no sea una contraseña común. Después, elimina las dos líneas BOOTSTRAP_OWNER o conserva las dos: con una sola no arranca.

Construir la imagen por tu cuenta (copia modificada, versión aún no publicada)

Desde el repositorio descargado, en lugar de descargar la imagen:

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

Sin Docker

Hace falta Node 24 o posterior, y después los comandos npm descritos en la sección «Install» del README. Detrás de tu proxy https, TRUST_PROXY_HOPS=1 es imprescindible: sin él, el formulario de inicio de sesión acepta tu contraseña y sigues sin sesión.

Comprobar la firma de la imagen

El archivo docs/IMAGE-SOURCES.md explica qué contiene la imagen, dónde está el código fuente de cada parte y cómo comprobar la firma. No se compila nada en tu equipo: lo que ejecutas es la imagen publicada, la que está firmada.

Copias de seguridad

Haz una antes de la fiesta y otra a la mañana siguiente. El servidor sigue funcionando durante la copia. El paso que todo el mundo se salta es el más importante: sacar el archivo del equipo. Los comandos de más abajo proceden de docs/OPERATING.md del repositorio (versión 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"
  • Un archivo de fiar

    El archivo es una carpeta: una instantánea coherente de la base de datos, todas las fotos y un inventario de los ficheros con sus huellas. El comando vuelve a leer todo lo que acaba de escribir antes de decir OK.

  • Tiene que salir del equipo

    Una copia en el mismo disco que el álbum no sobrevive a una avería de ese disco. Es una copia de seguridad cuando hay una copia en otro equipo, o en un disco que puedas desconectar.

  • Restaurar con el servidor parado

    Detén siempre el servidor antes de restaurar: el comando restore sustituye el archivo de la base de datos, y hacerlo con el servidor en marcha deja un muro que no sirve ni la fiesta antigua ni la nueva. El comando comprueba todo el archivo antes de tocar nada y se niega a sobrescribir una instalación sin --force.

  • Guarda también tu .env

    Los secretos no están en el archivo. Restaurar fotos con secretos nuevos cierra la sesión de todos los anfitriones.

Los libros de fotos (PDF) y los montajes de vídeo no están en la copia de seguridad: se vuelven a generar cuando se piden desde la página del evento. Los detalles, y lo que las comprobaciones detectan o no, están en docs/SECURITY.md, sección 11. La restauración paso a paso está en docs/OPERATING.md, sección «Backups».

Actualizaciones

Ejecuta una versión publicada, no la punta de la rama principal (en la que te deja git clone). Haz antes una copia de seguridad: las migraciones que aplica una versión nueva al arrancar solo van hacia delante, y la copia es el único camino de vuelta.

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

Sustituye vX.Y.Z por la versión que quieras. Lo que puede romper una versión mayor, cómo se anuncia una ruptura y cómo volver atrás se explica en docs/UPGRADING.md.

La licencia AGPL-3.0, explicada sin complicaciones

Este es el resumen en palabras sencillas. No es asesoramiento jurídico: lo que vale es el texto de la licencia.

Puedes

  • ejecutarlo, para ti o para otras personas
  • leerlo, de principio a fin
  • modificarlo
  • compartirlo o distribuirlo con otras personas

Una sola obligación más

Si modificas EventSlide y otras personas usan tu versión a través de la red, debes ofrecerles el código fuente de tu versión, con la misma licencia. Ejecutar una copia sin modificar no añade nada.

El enlace ya está previsto

Cada pantalla de invitado y de anfitrión lleva un enlace «Código fuente (AGPL-3.0)». Puedes cambiar la dirección a la que apunta (SOURCE_CODE_URL), por ejemplo para una versión modificada. Ningún ajuste lo oculta.

Lo que había antes

La versión 3.0.0 es la primera con AGPL-3.0, «solamente»: sin la cláusula «o cualquier versión posterior». La 2.1.0 es la última con GPL-3.0, y lo publicado antes seguirá con GPL-3.0 para siempre.

Lo que la licencia exige a quien ejecuta, modifica o retoma el programa: docs/LICENSING-FAQ.md.

Código fuente y contribuciones

Todo está en github.com/Irony42/EventSlide. Aquí tienes por dónde empezar. Los documentos están en inglés.

¿Quieres ayudar? Mira CONTRIBUTING.md, o la página apoyar el proyecto.

Preguntas frecuentes

¿Hay que ser desarrollador?

No, pero sí hay que manejarse con un terminal, Docker y un nombre de dominio. Si no, existe la instancia alojada: solicita acceso.

¿Cuánto cuesta?

El software es libre y gratuito. Te quedan el equipo, un nombre de dominio y un poco de tiempo.

¿Puedo ejecutarlo para otras personas?

Sí. Ejecutar para otros una copia sin modificar no añade ninguna obligación. Solo una versión modificada, ofrecida a través de la red, activa la oferta del código fuente. El detalle está en las preguntas frecuentes sobre la licencia.

¿Y si en la sala no hay red?

En tu propio equipo, el muro sigue pasando fotos cuando se cae la red y los envíos se vuelven a poner en cola. Eso sí, https exige un nombre de dominio real: mira el caso «local sin nombre de dominio» más arriba. Un muro servido desde un proveedor de alojamiento depende, en cambio, de la conexión de la sala.

¿Prefieres no instalar nada?

Solicita acceso a la instancia alojada en app.eventslide.fr: gratis, con invitación. No tienes nada que instalar.

Solicitar acceso