Saltar al contenido
ES EN

Monta Audiobookshelf con Caddy y HTTPS en Docker Compose

Laboratorio · Self-hosting

45 min nivel medio configuración validada

Arquitectura del laboratorioComponentes: Navegador / app, Caddy, Audiobookshelf, Biblioteca, Feeds RSS.HTTPSHTTP + websocketlectura/escrituradescarga episodiosNavegador / app: paso 5Navegador / appcliente HTTPSCaddy: paso 4Caddycontenedor :80 y :443Audiobookshelf: paso 2Audiobookshelf127.0.0.1:13378Biblioteca: paso 1Bibliotecadirectorios bind mountFeeds RSS: paso 6Feeds RSSpodcasts externos
  1. Navegador / app · paso 5 cliente HTTPS
  2. Caddy · paso 4 contenedor :80 y :443
  3. Audiobookshelf · paso 2 127.0.0.1:13378
  4. Biblioteca · paso 1 directorios bind mount
  5. 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.

Laboratorio: Monta Audiobookshelf con Caddy y HTTPS en Docker Compose

Requisitos

SistemaLinux (Debian 12 / Ubuntu 24.04) con Docker Engine
Docker Engine28.5.2
Docker Compose5.6.0
Audiobookshelf2.37.1
Caddy2.11.7
RAM2 GB
Disco20 GB + tu biblioteca

Paso a paso

  1. 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 ~/abs
  2. Escribe el Compose completo

    El archivo define los dos servicios con tags exactos. Audiobookshelf se publica solo en 127.0.0.1:13378 para que nadie llegue a él sin pasar por Caddy. El Caddy monta ./Caddyfile como 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_ZONA por tu zona horaria, por ejemplo Europe/Madrid. Dentro del contenedor, la aplicación usa /config para la base de datos y /metadata para portadas, caché y copias.

    Fichero compose.yaml

    services:
      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:
          - audiobookshelf

    Sustituye cada valor CHANGE_ME_… por uno tuyo antes de arrancar: no dejes contraseñas ni claves de ejemplo.

  3. 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:13378 desde 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 audiobookshelf

    Salida esperada

    # Salida ilustrativa: el formato exacto puede variar
    NAME                     IMAGE                                   SERVICE          STATUS
    abs-audiobookshelf-1     ghcr.io/advplyr/audiobookshelf:2.37.1   audiobookshelf   Up
  4. Añ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_DOMINIO por tu dominio real.

    El Caddyfile mínimo usa reverse_proxy hacia 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 Caddyfile

    CHANGE_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 caddy
  5. Crea las bibliotecas y los usuarios

    Entra en https://CHANGE_ME_DOMINIO con 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.

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

  7. 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/backups y tus carpetas de contenido en otro disco o equipo con la herramienta que ya uses.

    ls -lh ~/abs/metadata/backups

Comprueba que funciona

  1. Contenedores en marcha

    Ambos servicios deben aparecer como activos.

    docker compose ps
  2. HTTPS 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_DOMINIO
  3. La 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 13378
  4. Websocket 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 -d

Caddy 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 caddy

El 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 audiobookshelf
Endurece 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 -d

Copias 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 ~/abs

Qué 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

Elaborado con apoyo de IA y revisado por la redacción

Kernel

· Dirección de tecnología · España

«Fijar la versión y leer las notas antes de actualizar es lo que separa un servidor doméstico estable de una sorpresa un domingo.»

Comentarios

Publicar un comentario