Instalación de FreshRSS: Lector de RSS Self-Hosted

FreshRSS es un agregador de noticias RSS/Atom autoalojado que permite seguir múltiples fuentes de contenido desde un único panel web rápido y ligero. Con soporte para extensiones, API compatible con Fever y Google Reader para aplicaciones móviles, múltiples usuarios y base de datos SQLite o MySQL/PostgreSQL, FreshRSS es la solución perfecta para reemplazar servicios como Feedly o Inoreader. Esta guía cubre la instalación completa de FreshRSS en Linux.

Requisitos Previos

  • Ubuntu 20.04+, Debian 11+, CentOS 8+ o Rocky Linux 8+
  • PHP 7.4+ con extensiones curl, xml, mbstring, zip
  • Servidor web Apache o Nginx
  • SQLite (incluido), MySQL/MariaDB o PostgreSQL
  • Mínimo 256 MB de RAM
  • Docker (si usas instalación containerizada)

Instalación con Docker

La forma más sencilla de instalar FreshRSS:

# Crear directorio para datos persistentes
mkdir -p ~/freshrss/data

# Ejecutar FreshRSS con Docker
docker run -d \
  --name freshrss \
  --restart unless-stopped \
  -e TZ=Europe/Madrid \
  -e CRON_MIN='2,32' \
  -v ~/freshrss/data:/var/www/FreshRSS/data \
  -v ~/freshrss/extensions:/var/www/FreshRSS/extensions \
  -p 8080:80 \
  freshrss/freshrss:latest

Con Docker Compose:

mkdir -p ~/freshrss && cd ~/freshrss

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

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    ports:
      - 8080:80
    environment:
      TZ: Europe/Madrid
      CRON_MIN: "2,32"
      FRESHRSS_ENV: production
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
EOF

docker compose up -d
docker compose logs -f freshrss

Instalación Manual con PHP

# Instalar dependencias en Ubuntu/Debian
sudo apt install -y \
  php php-fpm php-cli php-curl php-xml php-mbstring \
  php-zip php-gd php-mysql php-sqlite3 \
  nginx git

# Descargar FreshRSS
sudo git clone https://github.com/FreshRSS/FreshRSS.git /var/www/freshrss
cd /var/www/freshrss

# Usar la última versión estable
git checkout $(git tag -l | grep -v "rc\|beta\|alpha" | sort -V | tail -1)

# Ajustar permisos
sudo chown -R www-data:www-data /var/www/freshrss
sudo chmod -R 755 /var/www/freshrss

# Crear configuración de Nginx
sudo tee /etc/nginx/sites-available/freshrss << 'EOF'
server {
    listen 80;
    server_name rss.tu-dominio.com;

    root /var/www/freshrss/p;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Negar acceso a directorios de datos
    location ~ ^/(data|lib|tests)/ {
        deny all;
    }
}
EOF

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

# Configurar la tarea cron para actualizar los feeds
(crontab -u www-data -l 2>/dev/null; echo "*/30 * * * * php /var/www/freshrss/app/actualize_script.php > /tmp/freshrss.log 2>&1") | crontab -u www-data -

Configuración Inicial

Acceder al asistente de configuración en http://TU-SERVIDOR:8080 (Docker) o http://rss.tu-dominio.com (manual):

  1. Seleccionar idioma: Español
  2. Configurar base de datos:
    • SQLite (recomendado para uso personal)
    • MySQL/PostgreSQL (para múltiples usuarios o grandes bibliotecas)
  3. Crear cuenta de administrador
  4. Seleccionar el tema de la interfaz
# Para Docker, también se puede configurar via CLI
docker exec -it freshrss php ./cli/configure.php \
  --db-type sqlite \
  --base-url http://localhost:8080 \
  --admin-username admin \
  --admin-password contrasena-segura

# Crear usuario adicional via CLI
docker exec -it freshrss php ./cli/create-user.php \
  --user usuario2 \
  --password contrasena2 \
  --email [email protected]

Gestión de Fuentes RSS

# Agregar fuentes desde el panel web:
# + Suscripción > Introducir URL del feed RSS/Atom

# Importar fuentes desde un archivo OPML (formato estándar de exportación RSS)
# Configuración > Importar/Exportar > Importar OPML

# Exportar tus suscripciones para backup
# Configuración > Importar/Exportar > Exportar OPML

Actualización de feeds via CLI:

# Actualizar todos los feeds (Docker)
docker exec freshrss php ./app/actualize_script.php

# Actualizar instalación manual
sudo -u www-data php /var/www/freshrss/app/actualize_script.php

# Ver estadísticas de los feeds
docker exec freshrss php ./cli/list-feeds.php

Organizar fuentes en categorías:

  • Panel web > Menú lateral > Administrar > Categorías
  • Crear categorías: "Tecnología", "Noticias", "Ciencia", etc.
  • Asignar cada feed a una categoría durante la adición

Extensiones de FreshRSS

FreshRSS soporta extensiones para ampliar la funcionalidad:

# Ver extensiones disponibles
# https://github.com/FreshRSS/Extensions

# Instalar una extensión manualmente
# 1. Descargar la extensión
wget https://github.com/FreshRSS/Extensions/releases/download/latest/extensions.zip
unzip extensions.zip -d ~/freshrss-ext/

# 2. Copiar al directorio de extensiones
# Docker:
docker cp xExtension-CustomCSS freshrss:/var/www/FreshRSS/extensions/
# Manual:
sudo cp -r xExtension-CustomCSS /var/www/freshrss/extensions/
sudo chown -R www-data:www-data /var/www/freshrss/extensions/

# 3. Activar desde el panel web:
# Configuración > Extensiones > Activar la extensión deseada

Extensiones populares:

  • xExtension-CustomCSS: CSS personalizado para la interfaz
  • xExtension-Reddit: Soporte mejorado para Reddit RSS
  • xExtension-PocketAction: Integración con Pocket
  • xExtension-YouTubeChannel: Soporte para canales de YouTube

API para Aplicaciones Móviles

FreshRSS implementa la API de Google Reader y Fever para compatibilidad con apps:

# Habilitar la API en el panel:
# Configuración > Autenticación > Habilitar API

# URL de la API de Google Reader:
# https://rss.tu-dominio.com/api/greader.php

# Para Fever API, la URL es:
# https://rss.tu-dominio.com/api/fever.php

# Establecer una contraseña de API específica (diferente a la del panel):
# Configuración > Mi cuenta > Clave de API

# Probar la API
curl -s "https://rss.tu-dominio.com/api/greader.php/accounts/ClientLogin" \
  -d "Email=admin&Passwd=contrasena-api" | head -5

Aplicaciones compatibles:

  • Android: FeedMe, Read You, News+, EasyRSS
  • iOS: Reeder, NetNewsWire, Unread
  • Escritorio: Fluent Reader, NewsFlash

Configuración en la app:

  • Servidor: https://rss.tu-dominio.com
  • API: Google Reader o Fever
  • Usuario y contraseña API

Gestión de Usuarios

# Crear usuarios adicionales (hasta el límite configurado)
# Panel > Configuración > Gestión de usuarios > Agregar usuario

# Via CLI (Docker):
docker exec -it freshrss php ./cli/create-user.php \
  --user lector1 \
  --password pass123 \
  --email [email protected] \
  --language es

# Listar usuarios
docker exec freshrss php ./cli/list-users.php

# Eliminar usuario
docker exec -it freshrss php ./cli/delete-user.php --user lector1

# Limitar el número de usuarios (en panel > Configuración > Sistema)
# Máximo de usuarios registrados: 5 (para uso familiar)

Optimización de la Base de Datos

# Para instalaciones con muchos feeds y artículos, usar MySQL/PostgreSQL

# Configurar MySQL como backend (Docker Compose con MySQL)
cat >> ~/freshrss/docker-compose.yml << 'EOF'

  mysql:
    image: mysql:8.0
    container_name: freshrss-mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: freshrss
      MYSQL_USER: freshrss
      MYSQL_PASSWORD: contrasena-mysql
      MYSQL_ROOT_PASSWORD: contrasena-root-mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
EOF

# Actualizar la configuración de FreshRSS para usar MySQL
# data/config.php o a través del asistente de instalación

# Limpiar artículos antiguos
# Panel > Configuración > Archivado
# Purgar artículos con más de 60 días leídos
docker exec freshrss php ./cli/purge-feed-history.php --max-age 60

# Ver estadísticas de la base de datos
docker exec freshrss php ./cli/stats.php

Proxy Inverso con Nginx

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

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

    ssl_certificate /etc/letsencrypt/live/rss.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/rss.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;
    }
}
EOF

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

Solución de Problemas

Los feeds no se actualizan:

# Verificar que el cron está configurado
crontab -u www-data -l  # Instalación manual
docker exec freshrss crontab -l  # Docker

# Ejecutar la actualización manualmente
docker exec freshrss php ./app/actualize_script.php

# Ver errores de actualización en el log
docker exec freshrss tail -f /var/www/FreshRSS/data/log.txt

Error de acceso a la API:

# Verificar que la API está habilitada
# Configuración > Autenticación > API debe estar habilitada

# Probar autenticación
curl -X POST "https://rss.tu-dominio.com/api/greader.php/accounts/ClientLogin" \
  -d "Email=admin&Passwd=TU-CLAVE-API"

# La respuesta debe incluir "Auth=SID=..."

Interfaz lenta con muchos artículos:

# Reducir el número de artículos mostrados por página
# Configuración > Visualización > Artículos por página: 50 (en lugar de 100+)

# Limpiar historial antiguo
docker exec freshrss php ./cli/purge-feed-history.php --max-age 30

Conclusión

FreshRSS es un lector RSS extremadamente eficiente que puede gestionar cientos de fuentes con mínimos recursos. Su compatibilidad con múltiples APIs garantiza acceso desde cualquier aplicación RSS popular, y su arquitectura ligera lo hace ideal para correr en el mismo servidor junto a otros servicios self-hosted sin impacto notable en el rendimiento.