Instalación de Wallabag: Leer Más Tarde Self-Hosted

Wallabag es una aplicación de guardado de artículos para leer más tarde que funciona como alternativa self-hosted a Pocket, Instapaper o Readwise. Con extensiones de navegador, aplicaciones móviles nativas, anotaciones, etiquetas, importación desde otros servicios y soporte para RSS, Wallabag te permite archivar contenido web sin depender de servicios externos. Esta guía cubre la instalación completa de Wallabag en Linux.

Requisitos Previos

  • Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • PHP 8.1+ con extensiones curl, gd, intl, mbstring, xml, tidy, bcmath, zip
  • MySQL/MariaDB o PostgreSQL (recomendado para producción)
  • Composer para instalación manual
  • Mínimo 512 MB de RAM
  • Docker para instalación containerizada

Instalación con Docker

# Crear directorio de instalación
mkdir -p ~/wallabag && cd ~/wallabag

# Crear docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3'

services:
  wallabag:
    image: wallabag/wallabag:latest
    container_name: wallabag
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=contrasena-root
      - 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=contrasena-db
      - SYMFONY__ENV__DATABASE_CHARSET=utf8mb4
      - SYMFONY__ENV__MAILER_HOST=127.0.0.1
      - SYMFONY__ENV__MAILER_USER=~
      - SYMFONY__ENV__MAILER_PASSWORD=~
      - [email protected]
      - SYMFONY__ENV__DOMAIN_NAME=https://leer.tu-dominio.com
      - SYMFONY__ENV__SERVER_NAME="Wallabag - Mis artículos"
    ports:
      - 8080:80
    volumes:
      - ./data:/var/www/wallabag/data
      - ./images:/var/www/wallabag/web/assets/images
    depends_on:
      - db

  db:
    image: mariadb:10.11
    container_name: wallabag-db
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=contrasena-root
      - MYSQL_DATABASE=wallabag
      - MYSQL_USER=wallabag
      - MYSQL_PASSWORD=contrasena-db
    volumes:
      - ./mysql:/var/lib/mysql
EOF

# Crear directorios necesarios
mkdir -p ~/wallabag/{data,images,mysql}

# Iniciar los servicios
docker compose up -d

# Esperar a que Wallabag inicialice (puede tardar varios minutos la primera vez)
docker compose logs -f wallabag

Crear el usuario administrador inicial:

# Crear usuario administrador dentro del contenedor
docker exec -it wallabag /var/www/wallabag/bin/console wallabag:install --env=prod

# O crear usuario adicional directamente
docker exec -it wallabag /var/www/wallabag/bin/console fos:user:create \
  --env=prod admin [email protected] contrasena-segura

# Promover a superadmin
docker exec -it wallabag /var/www/wallabag/bin/console fos:user:promote \
  --env=prod admin --super

Instalación Manual con PHP

# Instalar dependencias del sistema
sudo apt install -y \
  php php-fpm php-mysql php-curl php-gd php-intl \
  php-mbstring php-xml php-tidy php-bcmath php-zip \
  composer nginx git

# Descargar Wallabag
cd /var/www
sudo git clone https://github.com/wallabag/wallabag.git
cd wallabag

# Instalar dependencias de PHP
sudo composer install --no-dev --optimize-autoloader

# Configurar Wallabag
sudo cp app/config/parameters.yml.dist app/config/parameters.yml
sudo nano app/config/parameters.yml
# Parámetros básicos en parameters.yml
parameters:
    database_driver: pdo_mysql
    database_host: 127.0.0.1
    database_port: 3306
    database_name: wallabag
    database_user: wallabag
    database_password: contrasena-db
    database_charset: utf8mb4
    
    mailer_transport: smtp
    mailer_host: localhost
    mailer_user: null
    mailer_password: null
    
    locale: es
    secret: CLAVE_SECRETA_ALEATORIA
    
    domain_name: https://leer.tu-dominio.com
# Crear la base de datos y las tablas
sudo -u www-data php bin/console wallabag:install --env=prod

# Ajustar permisos
sudo chown -R www-data:www-data /var/www/wallabag/
sudo chmod -R 755 /var/www/wallabag/
sudo chmod -R 777 /var/www/wallabag/var/cache /var/www/wallabag/var/logs

Configuración de la Aplicación

Acceder a http://TU-SERVIDOR:8080 y configurar las opciones principales:

Panel > Configuración > RSS:

  • Activar feeds RSS personales
  • Configurar el número de artículos por feed

Panel > Configuración > Usuario:

  • Idioma: Español
  • Zona horaria: Europe/Madrid
  • Descargar imágenes: Sí (para lectura offline)

Configurar SMTP para emails:

# Editar el docker-compose.yml con los datos SMTP reales
environment:
  - SYMFONY__ENV__MAILER_HOST=smtp.tu-proveedor.com
  - SYMFONY__ENV__MAILER_PORT=587
  - [email protected]
  - SYMFONY__ENV__MAILER_PASSWORD=contrasena-smtp
  - SYMFONY__ENV__MAILER_ENCRYPTION=tls

# Reiniciar para aplicar cambios
docker compose down && docker compose up -d

Extensión de Navegador

Instalar la extensión oficial de Wallabag:

Configuración de la extensión:

  1. Clic derecho en la extensión > Opciones
  2. URL de Wallabag: https://leer.tu-dominio.com
  3. Usuario y contraseña de Wallabag
  4. Guardar y probar la conexión
# La extensión usa la API de Wallabag
# Verificar que la API está funcionando
curl -X POST https://leer.tu-dominio.com/oauth/v2/token \
  -d "grant_type=password" \
  -d "client_id=1_TU_CLIENT_ID" \
  -d "client_secret=TU_CLIENT_SECRET" \
  -d "username=admin" \
  -d "password=contrasena"

# Las credenciales OAuth se crean en:
# Panel > Configuración de API > Crear nuevo cliente

Aplicaciones Móviles

Wallabag tiene aplicaciones oficiales y de terceros:

  • Android: Wallabag (oficial), Lire para Android
  • iOS: Wallabag (oficial, en App Store)
  • Kindle: Exportar artículos en formato EPUB/MOBI

Configuración de la app:

  • URL del servidor: https://leer.tu-dominio.com
  • Usuario y contraseña
  • La app descarga artículos para lectura offline

Etiquetas y Anotaciones

# Crear etiquetas via API
# Primero obtener un token de acceso
ACCESS_TOKEN=$(curl -s -X POST https://leer.tu-dominio.com/oauth/v2/token \
  -d "grant_type=password&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&username=admin&password=pass" | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")

# Listar entradas guardadas
curl -s "https://leer.tu-dominio.com/api/entries.json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" | python3 -m json.tool | head -50

# Agregar etiqueta a una entrada
curl -s -X POST "https://leer.tu-dominio.com/api/entries/1/tags.json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tags": "tecnologia, linux"}'

# Agregar una anotación (destacado de texto)
curl -s -X POST "https://leer.tu-dominio.com/api/annotations/1.json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Este párrafo es importante para recordar",
    "quote": "Texto citado del artículo original"
  }'

Feeds RSS de Wallabag

Wallabag genera feeds RSS personales para acceder a los artículos guardados:

# URLs de feeds RSS disponibles:
# Todos los artículos sin leer:
# https://leer.tu-dominio.com/feed/admin/TOKEN/unread

# Artículos con estrella:
# https://leer.tu-dominio.com/feed/admin/TOKEN/starred

# Artículos con etiqueta específica:
# https://leer.tu-dominio.com/feed/admin/TOKEN/tags/tecnologia

# Obtener el token RSS desde el panel:
# Configuración > RSS > Ver el token RSS

Importación y Exportación

# Importar desde Pocket
# Panel > Importar > Pocket > Descargar datos de Pocket primero
# (https://getpocket.com/export)

# Importar desde Instapaper
# Panel > Importar > Instapaper

# Importar desde Pinboard
# Panel > Importar > Pinboard

# Exportar en diferentes formatos
# Panel > Exportar artículos > EPUB / PDF / CSV / JSON

# Exportar via API
curl -s "https://leer.tu-dominio.com/api/entries/export.json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -o wallabag-export-$(date +%Y%m%d).json

# Importar desde archivo JSON de otra instancia
curl -s -X POST "https://leer.tu-dominio.com/api/entries/lists.json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @wallabag-export.json

Proxy Inverso con Nginx

# Obtener certificado SSL
sudo certbot --nginx -d leer.tu-dominio.com

# Configuración de Nginx para Wallabag
sudo tee /etc/nginx/sites-available/wallabag << 'EOF'
server {
    listen 443 ssl http2;
    server_name leer.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/leer.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/leer.tu-dominio.com/privkey.pem;

    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 https;
        proxy_read_timeout 60s;
    }
}
EOF

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

Solución de Problemas

Error al guardar artículos:

# Ver logs del servidor
docker compose logs wallabag --tail 50

# Probar que el artículo es accesible desde el servidor
docker exec wallabag curl -I https://ejemplo.com/articulo-de-prueba

# El problema puede ser de accesibilidad de la URL o de parsing HTML
# Wallabag usa mercury-parser o readability para extraer el contenido

La extensión del navegador no conecta:

# Verificar que la API está habilitada
curl https://leer.tu-dominio.com/api/version
# Debe devolver la versión de Wallabag en JSON

# Regenerar las credenciales de API en el panel:
# Configuración > API > Crear nuevo cliente > Copiar client_id y client_secret

Error 500 en la instalación manual:

# Ver logs de PHP-FPM y Nginx
sudo journalctl -u php8.1-fpm -f
sudo tail -f /var/log/nginx/error.log

# Limpiar caché de Symfony
sudo -u www-data php /var/www/wallabag/bin/console cache:clear --env=prod

# Verificar permisos de escritura
ls -la /var/www/wallabag/var/cache/
ls -la /var/www/wallabag/var/logs/

Conclusión

Wallabag es una solución completa y madura para guardar artículos y leerlos más tarde, sin anuncios ni seguimiento. Su API REST bien documentada y la variedad de aplicaciones cliente disponibles garantizan una experiencia fluida en todos los dispositivos, mientras que las funciones de anotación y etiquetado facilitan construir una biblioteca de conocimiento organizada y privada.