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):
- Seleccionar idioma: Español
- Configurar base de datos:
- SQLite (recomendado para uso personal)
- MySQL/PostgreSQL (para múltiples usuarios o grandes bibliotecas)
- Crear cuenta de administrador
- 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.


