Wallabag es una aplicación autoalojada para guardar artículos web y leerlos más tarde sin anuncios: extrae el contenido de la página, lo almacena en tu servidor y lo sincroniza con la extensión del navegador y las apps móviles. Es la alternativa natural a servicios como Pocket, que cerró en 2025. En esta guía desplegarás Wallabag con Docker Compose y MariaDB en Ubuntu 24.04, lo publicarás con Nginx y HTTPS y lo conectarás a tus clientes.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • Docker Engine y el plugin Docker Compose instalados desde el repositorio oficial de Docker.
  • Un subdominio, por ejemplo leer.tu_dominio.com, con un registro DNS A apuntando a la IP pública del servidor.
  • Los puertos 80 y 443 accesibles desde Internet.

Sustituye leer.tu_dominio.com por tu subdominio real en todos los pasos.

Paso 1: Preparar el directorio y los secretos

Crea el directorio del despliegue:

sudo mkdir -p /opt/wallabag
cd /opt/wallabag

Genera tres valores aleatorios: la contraseña de root de MariaDB, la del usuario de Wallabag y el secreto de la aplicación Symfony:

openssl rand -hex 24
openssl rand -hex 24
openssl rand -hex 32

Guárdalos en un archivo .env:

sudo nano /opt/wallabag/.env
DB_ROOT_PASSWORD=primer_valor_generado
DB_PASSWORD=segundo_valor_generado
APP_SECRET=tercer_valor_generado
DOMAIN=https://leer.tu_dominio.com
sudo chmod 600 /opt/wallabag/.env

Paso 2: Crear el archivo de Docker Compose

El despliegue usa la imagen oficial wallabag/wallabag y MariaDB para los datos. En su primer arranque, el contenedor de Wallabag crea la base de datos y el usuario con la contraseña de root que le pases.

sudo nano /opt/wallabag/docker-compose.yml
services:
  wallabag:
    image: wallabag/wallabag:latest
    container_name: wallabag
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      SYMFONY__ENV__DATABASE_DRIVER: pdo_mysql
      SYMFONY__ENV__DATABASE_HOST: db
      SYMFONY__ENV__DATABASE_PORT: "3306"
      SYMFONY__ENV__DATABASE_NAME: wallabag
      SYMFONY__ENV__DATABASE_USER: wallabag
      SYMFONY__ENV__DATABASE_PASSWORD: ${DB_PASSWORD}
      SYMFONY__ENV__DATABASE_CHARSET: utf8mb4
      SYMFONY__ENV__SECRET: ${APP_SECRET}
      SYMFONY__ENV__DOMAIN_NAME: ${DOMAIN}
      SYMFONY__ENV__SERVER_NAME: "Wallabag"
      SYMFONY__ENV__FOSUSER_REGISTRATION: "false"
      SYMFONY__ENV__FROM_EMAIL: wallabag@tu_dominio.com
      SYMFONY__ENV__MAILER_DSN: "null://null"
    volumes:
      - ./images:/var/www/wallabag/web/assets/images
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mariadb:11.4
    container_name: wallabag-db
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - ./mysql:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      start_period: 30s
      timeout: 5s
      retries: 10

Notas sobre la configuración:

  • SYMFONY__ENV__DOMAIN_NAME debe ser la URL pública con https://. Wallabag la usa para generar enlaces, imágenes y feeds.
  • SYMFONY__ENV__FOSUSER_REGISTRATION: "false" desactiva el registro público; las cuentas se crean desde el panel de administración.
  • MAILER_DSN con null://null desactiva el correo. Si quieres enviar correos, usa un DSN SMTP como smtp://usuario:contraseñ[email protected]_proveedor.com:587.
  • El puerto se publica solo en 127.0.0.1, porque el acceso público pasará por Nginx.

Paso 3: Arrancar Wallabag

sudo docker compose up -d

El primer arranque tarda algo más porque el contenedor crea el esquema de la base de datos. Sigue los logs hasta que se detengan los mensajes de instalación y aparezca el arranque del servidor web:

sudo docker compose logs -f wallabag

Pulsa Ctrl+C para salir y comprueba el estado de los servicios:

sudo docker compose ps
NAME             IMAGE                      STATUS
wallabag         wallabag/wallabag:latest   Up 1 minute
wallabag-db      mariadb:11.4               Up 1 minute (healthy)

El endpoint /api/info es público y devuelve la versión instalada:

curl -s http://127.0.0.1:8080/api/info
{"appname":"wallabag","version":"2.6.13","allowed_registration":false}

El número de versión dependerá de la imagen descargada.

Paso 4: Publicar Wallabag con Nginx y HTTPS

Instala Nginx y Certbot:

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

Crea el bloque de servidor:

sudo nano /etc/nginx/sites-available/wallabag
server {
    listen 80;
    listen [::]:80;
    server_name leer.tu_dominio.com;

    # Permite importar archivos de exportación grandes
    client_max_body_size 50M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 120s;
    }
}

Activa el sitio y recarga Nginx:

sudo ln -s /etc/nginx/sites-available/wallabag /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Si usas UFW, permite SSH y el tráfico web:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

Obtén el certificado:

sudo certbot --nginx -d leer.tu_dominio.com

Verifica el acceso por HTTPS:

curl -s https://leer.tu_dominio.com/api/info
{"appname":"wallabag","version":"2.6.13","allowed_registration":false}

Paso 5: Cambiar la contraseña por defecto

La imagen de Docker crea un usuario inicial llamado wallabag con la contraseña wallabag. Cámbiala antes de nada:

  1. Abre https://leer.tu_dominio.com e inicia sesión con wallabag / wallabag.
  2. Ve a Configuración > Contraseña y define una contraseña robusta.
  3. En Configuración > Información del usuario cambia el correo, y en Configuración > Ajustes selecciona el idioma Español.

Este usuario es administrador. Desde Gestión de usuarios (menú lateral) puedes crear cuentas para otras personas, ya que el registro público está desactivado.

Prueba a guardar un artículo con el botón + de la barra superior pegando la URL de cualquier página. En unos segundos aparecerá en Sin leer con el texto extraído y las imágenes descargadas en el servidor.

Paso 6: Crear un cliente de API y probarlo

La extensión del navegador, las apps y cualquier script se autentican con OAuth2. Crea un cliente en Gestión de clientes API (menú del usuario), pulsa Crear un nuevo cliente, dale un nombre y copia el ID de cliente y el secreto de cliente.

Pide un token de acceso con tus credenciales:

curl -s -X POST https://leer.tu_dominio.com/oauth/v2/token \
  -d grant_type=password \
  -d client_id='tu_client_id' \
  -d client_secret='tu_client_secret' \
  -d username='tu_usuario' \
  -d password='tu_contraseña'
{"access_token":"ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MjgxNz...","expires_in":3600,"token_type":"bearer","scope":null,"refresh_token":"..."}

Guarda el access_token en una variable y úsalo para añadir un artículo por la API:

export WALLABAG_TOKEN='valor_de_access_token'
curl -s -X POST https://leer.tu_dominio.com/api/entries.json \
  -H "Authorization: Bearer $WALLABAG_TOKEN" \
  -d url='https://www.debian.org/intro/about'

La respuesta es el artículo guardado en JSON, con su id, título y contenido. El token caduca en una hora; para renovarlo se usa grant_type=refresh_token con el refresh_token recibido.

Paso 7: Conectar la extensión del navegador y la app móvil

La extensión wallabagger está disponible para Firefox y para navegadores basados en Chromium. Tras instalarla, abre sus opciones y configura:

  1. URL de Wallabag: https://leer.tu_dominio.com.
  2. ID de cliente y secreto de cliente del cliente de API del Paso 6 (puedes crear uno específico para la extensión).
  3. Tu usuario y contraseña. Pulsa Obtener token y comprueba que la conexión se marca como correcta.

Desde ese momento, al pulsar el icono de la extensión, la página actual se guarda en tu instancia.

Las apps oficiales de wallabag para Android e iOS piden la URL del servidor, el usuario y la contraseña, y descargan los artículos para leerlos sin conexión.

Paso 8: Feeds, importación y copias de seguridad

Feeds. En Configuración > Feeds genera un token para obtener feeds Atom privados de tus artículos sin leer, destacados o archivados, que puedes seguir desde cualquier lector RSS.

Importar. El menú Importar admite, entre otros, exportaciones de otra instancia de wallabag, Instapaper, Pinboard y marcadores de Firefox o Chrome.

Exportar. Cada lista de artículos (sin leer, destacados, una etiqueta) se puede exportar en EPUB, PDF, CSV, JSON, TXT o XML desde el icono de exportación.

Copias de seguridad. Los datos están en MariaDB y en /opt/wallabag/images. Vuelca la base de datos:

cd /opt/wallabag
source <(sudo grep DB_ROOT_PASSWORD .env)
sudo docker compose exec -T db mariadb-dump -uroot -p"$DB_ROOT_PASSWORD" wallabag | sudo tee /opt/wallabag/wallabag.sql > /dev/null
ls -lh /opt/wallabag/wallabag.sql

Copia wallabag.sql y el directorio images a un almacenamiento externo.

Paso 9: Actualizar Wallabag

Descarga la imagen nueva, recrea el contenedor y aplica las migraciones de base de datos que traiga la versión:

cd /opt/wallabag
sudo docker compose pull
sudo docker compose up -d
sudo docker compose exec wallabag /var/www/wallabag/bin/console doctrine:migrations:migrate --env=prod --no-interaction

Solución de problemas

Las imágenes o los enlaces apuntan a http:// o a 127.0.0.1:8080. SYMFONY__ENV__DOMAIN_NAME no coincide con la URL pública. Corrige DOMAIN en .env, recrea el contenedor con sudo docker compose up -d y limpia la caché:

sudo docker compose exec wallabag /var/www/wallabag/bin/console cache:clear --env=prod

Algunos artículos se guardan vacíos o sin texto. Wallabag descarga la página desde el servidor, así que las webs con muro de pago, que requieren JavaScript o que bloquean peticiones automatizadas no se pueden extraer. Comprueba que el servidor alcanza la web con curl -I https://sitio-del-articulo y, si responde bien, el problema es la extracción de esa web en concreto.

La extensión devuelve un error al obtener el token. Revisa que el ID y el secreto de cliente son los del Paso 6, que la URL empieza por https:// sin barra final y que curl -s https://leer.tu_dominio.com/api/info responde desde tu equipo.

Conclusión

Tienes Wallabag funcionando con MariaDB, publicado con HTTPS y conectado a la extensión del navegador y a la app móvil. Como siguientes pasos, configura un MAILER_DSN real para poder restablecer contraseñas, activa la autenticación en dos pasos en Configuración y programa el volcado del Paso 8 con un temporizador de systemd.