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 DNSAapuntando 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_NAMEdebe ser la URL pública conhttps://. 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_DSNconnull://nulldesactiva el correo. Si quieres enviar correos, usa un DSN SMTP comosmtp://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:
- Abre
https://leer.tu_dominio.come inicia sesión conwallabag/wallabag. - Ve a Configuración > Contraseña y define una contraseña robusta.
- 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:
- URL de Wallabag:
https://leer.tu_dominio.com. - ID de cliente y secreto de cliente del cliente de API del Paso 6 (puedes crear uno específico para la extensión).
- 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.
