Laboratorio · Self-hosting
Pulsa una pieza para ver su paso.
- Navegador / app · paso 5 cliente HTTPS
- Caddy · paso 4 contenedor :80 y :443
- Audiobookshelf · paso 2 127.0.0.1:13378
- Biblioteca · paso 1 directorios bind mount
- Feeds RSS · paso 6 podcasts externos
Despliega Audiobookshelf v2.37.1 con Docker Compose y Caddy 2.11.7 como proxy inverso con HTTPS, usuarios, suscripciones RSS a podcasts y copias de seguridad.
Qué vas a montar y por qué
Vas a montar un servidor de audiolibros y podcasts propio con Audiobookshelf: biblioteca multiusuario con progreso por usuario sincronizado entre dispositivos, descarga automática de episodios de podcast mediante suscripción RSS y copias de seguridad programadas. Sirve para organizar contenido legal: tus propios audiolibros, podcasts y música que ya tengas.
Delante pondrás Caddy como proxy inverso con HTTPS gestionado automáticamente. Audiobookshelf exige conexión websocket, así que el proxy es un punto a comprobar y no un adorno. Todo queda en un solo compose.yaml con versiones fijadas, y la aplicación solo escucha en 127.0.0.1: el único punto de entrada desde fuera es Caddy.
Esto son instrucciones, no un informe de ejecución: los bloques de salida son ilustrativos y pueden diferir en tu máquina.

Requisitos
Paso a paso
Prepara los directorios de datos
Separa la biblioteca de la configuración. Así puedes copiar o mover cada parte por separado y el contenedor se puede recrear sin perder nada. Audiobookshelf da importancia a la estructura de carpetas, por lo que conviene un directorio por tipo de contenido.
mkdir -p ~/abs/{audiobooks,podcasts,music,config,metadata,caddy-data,caddy-config} cd ~/absEscribe el Compose completo
El archivo define los dos servicios con tags exactos. Audiobookshelf se publica solo en
127.0.0.1:13378para que nadie llegue a él sin pasar por Caddy. El Caddy monta./Caddyfilecomo archivo, por eso ese archivo debe existir antes de arrancar Caddy: si no, Docker crearía un directorio con ese nombre y Caddy fallaría. Lo creamos en el paso 4 y hasta entonces solo levantaremos Audiobookshelf.Cambia
CHANGE_ME_ZONApor tu zona horaria, por ejemploEurope/Madrid. Dentro del contenedor, la aplicación usa/configpara la base de datos y/metadatapara portadas, caché y copias.Fichero
compose.yamlservices: audiobookshelf: image: ghcr.io/advplyr/audiobookshelf:2.37.1 restart: unless-stopped ports: - "127.0.0.1:13378:80" environment: - TZ=CHANGE_ME_ZONA volumes: - ./audiobooks:/audiobooks - ./podcasts:/podcasts - ./music:/music - ./config:/config - ./metadata:/metadata caddy: image: caddy:2.11.7 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - ./caddy-data:/data - ./caddy-config:/config depends_on: - audiobookshelfSustituye cada valor CHANGE_ME_… por uno tuyo antes de arrancar: no dejes contraseñas ni claves de ejemplo.
Levanta solo Audiobookshelf y crea el usuario root
Arrancamos únicamente el servicio de la aplicación porque el Caddyfile aún no existe. Descargar primero la imagen deja claro si el tag se resuelve antes de crear nada.
Abre
http://127.0.0.1:13378desde la propia máquina (o con un túnel SSH si es remota). La primera vez te pide crear el usuario administrador: elige una contraseña larga y única en lugar de una por defecto.docker compose pull audiobookshelf docker compose up -d audiobookshelf docker compose ps docker compose logs --tail 20 audiobookshelfSalida esperada
# Salida ilustrativa: el formato exacto puede variar NAME IMAGE SERVICE STATUS abs-audiobookshelf-1 ghcr.io/advplyr/audiobookshelf:2.37.1 audiobookshelf UpAñade Caddy con HTTPS
Caddy obtiene y renueva certificados automáticamente para un nombre de dominio público que apunte a tu servidor, con los puertos 80 y 443 accesibles desde Internet. Sustituye
CHANGE_ME_DOMINIOpor tu dominio real.El Caddyfile mínimo usa
reverse_proxyhacia el servicio por su nombre de Compose. Audiobookshelf necesita websocket, así que no des el paso por bueno hasta pasar la verificación de más abajo (el login y el progreso en vivo dependen de ello). Si tu instalación no funcionase con la configuración mínima, consulta la documentación de proxy inverso del proyecto, que es la referencia para este punto.Con el archivo ya creado, arranca Caddy.
Fichero
CaddyfileCHANGE_ME_DOMINIO { reverse_proxy audiobookshelf:80 }Sustituye cada valor CHANGE_ME_… por uno tuyo antes de arrancar: no dejes contraseñas ni claves de ejemplo.
docker compose up -d docker compose ps docker compose logs --tail 30 caddyCrea las bibliotecas y los usuarios
Entra en
https://CHANGE_ME_DOMINIOcon el usuario root. En los ajustes crea una biblioteca por tipo, apuntando a las rutas del contenedor (/audiobooks,/podcasts,/music), no a las del host.Crea después un usuario por persona con permisos personalizados. Es mejor no usar la cuenta root para el uso diario: así el progreso de escucha queda por usuario y limitas el daño si una sesión se compromete.
Coloca tus audiolibros como
audiobooks/Autor/Título/*.m4b. La estructura de carpetas influye en cómo se detectan los metadatos; consulta la documentación de bibliotecas del proyecto.Suscríbete a podcasts por RSS
En la biblioteca de tipo podcast, usa la búsqueda para añadir un podcast o pega la URL de su feed RSS. Activa la descarga automática de episodios para que el servidor los traiga sin intervención. Descargar al servidor evita depender de que el feed original siga disponible y permite escuchar sin conexión desde la app complementaria.
Audiobookshelf también puede abrir feeds RSS propios de audiobooks y episodios, útil para escucharlos en un reproductor de podcasts. Protege esos feeds como cualquier otro acceso: quien tenga la URL puede escuchar.
Configura las copias de seguridad
En los ajustes de la aplicación activa la copia programada: guarda la base de datos y los metadatos en
/metadata/backups. Fíjate en el alcance: esto protege la configuración, los usuarios y el progreso, no tu biblioteca de audio.Una copia que vive en la misma máquina no es una copia completa. Duplica
~/abs/metadata/backupsy tus carpetas de contenido en otro disco o equipo con la herramienta que ya uses.ls -lh ~/abs/metadata/backups
Comprueba que funciona
Contenedores en marcha
Ambos servicios deben aparecer como activos.
docker compose psHTTPS responde
Comprueba que el dominio contesta por HTTPS. La respuesta exacta depende de la versión y del estado de la sesión: un 200 o una redirección (301/302) son razonables en la raíz; lo que no debe aparecer es un error de certificado o de conexión.
curl -sI https://CHANGE_ME_DOMINIOLa aplicación solo escucha en local
Verifica que el puerto 13378 está ligado a 127.0.0.1 y no a todas las interfaces. La salida concreta varía según tu sistema; busca la dirección 127.0.0.1.
ss -tln | grep 13378Websocket y reproducción
Inicia sesión desde el navegador a través de tu dominio, reproduce un audio y comprueba que el progreso se guarda y se actualiza en una segunda sesión. Si el login funciona pero el estado no se sincroniza, revisa el proxy.
Si algo falla
Caddy no arranca o aparece un directorio llamado Caddyfile
Se arrancó Caddy antes de crear el archivo y Docker creó un directorio. Detén todo, elimina ese directorio, crea el archivo Caddyfile y vuelve a lanzar.
docker compose down
rm -rf ./Caddyfile
# vuelve a crear el archivo Caddyfile del paso 4
docker compose up -dCaddy no consigue el certificado
Revisa que el DNS del dominio apunte a la IP pública del servidor y que los puertos 80 y 443 lleguen al host (cortafuegos y reenvío del router). Lee los registros de Caddy para ver el motivo exacto.
docker compose logs --tail 50 caddyEl login funciona pero la interfaz no se actualiza o falla la reproducción en vivo
Audiobookshelf requiere una conexión websocket. Si usas un proxy distinto o una capa intermedia (CDN, otro proxy delante), comprueba que permite websockets. Consulta la documentación de proxy inverso del proyecto.
La biblioteca aparece vacía
Comprueba que las rutas de la biblioteca son las del contenedor (/audiobooks, etc.), que los archivos existen en el host y que el usuario del contenedor puede leerlos. Revisa los registros de la aplicación.
docker compose logs --tail 50 audiobookshelfEndurece la instalación
Mantén la app solo en loopback
El mapeo 127.0.0.1:13378:80 evita que alguien llegue a la aplicación saltándose HTTPS. No lo cambies a 0.0.0.0.
Usuarios con privilegios mínimos
Usa root solo para administrar. Crea cuentas normales con permisos personalizados y contraseñas únicas (sustituye cualquier valor de ejemplo por el tuyo).
Actualiza con tags fijos y lee las notas
Sube de versión cambiando el tag en compose.yaml tras leer las notas de versión: la v2.26.0 introdujo un nuevo sistema de autenticación y la v2.37.0 actualizó Node.js a 24. Haz una copia antes de cada cambio.
docker compose pull
docker compose up -dCopias fuera de la máquina
Replica los backups de metadata/backups y tu biblioteca en otro disco o equipo.
Limpieza: deshacer el laboratorio
Elimina el laboratorio
Esto borra contenedores, y con el último comando también tus datos y la biblioteca. Copia antes lo que quieras conservar.
cd ~/abs
docker compose down
cd ~
rm -rf ~/absQué está verificado
- Sintaxis de compose.yaml (parser YAML y estructura de Compose)
- Caddyfile: sin validador automático, revísalo a mano
- Sintaxis de 12 bloque(s) de comandos (bash -n en un contenedor aislado, sin ejecutarlos)
- Versiones (4), opciones (1) y claves de configuración (8) contrastadas con 17 páginas de documentación oficial
- Arranque real del laboratorio: no ejecutado
Comprobaciones automáticas del 10 de octubre de 2026. Lo marcado con «·» no se ha ejecutado: revísalo en tu entorno.
Fuentes
- Introducción a Audiobookshelf audiobookshelf.org
- Versiones de Audiobookshelf github.com
- Repositorio de Audiobookshelf github.com
- El Caddyfile caddyserver.com
- Versiones de Caddy github.com
- docker compose up docs.docker.com
¿Te ha funcionado este laboratorio?
Puntúalo de 1 a 5 estrellas. Un voto por persona; puedes cambiarlo cuando quieras.
Elaborado con apoyo de IA y revisado por la redacción


Comentarios
Publicar un comentario