Alojar FreshRSS en un VPS administrado significa que usted y su equipo leen sus feeds RSS desde una máquina propia, que nuestros equipos mantienen actualizada y supervisan día y noche. FreshRSS es software libre con licencia AGPL-3.0. Esta guía sigue su documentación oficial: la instalación con Docker Compose, HTTPS, la actualización de los feeds, las cuentas y el inicio de sesión, la API para las aplicaciones móviles, la base de datos, las copias de seguridad y las actualizaciones.
Por Simon Vasconcelos Lee
Publicado el 11 de noviembre de 202613 minutos de lectura
data y extensions, detrás de un proxy inverso en HTTPS.CRON_MIN actualiza los feeds por sí sola: el proyecto recomienda unas dos ejecuciones por hora.data y, con PostgreSQL o MySQL, de la base de datos, y actualice con docker compose pull.FreshRSS es un agregador de feeds RSS autoalojado, escrito en PHP. Su README lo describe como ligero, fácil de usar, potente y personalizable, traducido a más de veinte idiomas. Es una aplicación multiusuario, con un modo de lectura anónimo y etiquetas personalizadas.
FreshRSS lo desarrolla su comunidad en GitHub, y su sitio oficial lo publica la comunidad FreshRSS. Las extensiones viven en un repositorio aparte, y la documentación se dirige a usuarios, administradores y desarrolladores.
FreshRSS se publica bajo la GNU Affero General Public License, versión 3: su manifiesto composer.json la declara como AGPL-3.0, y su README enlaza al texto de la licencia. Ese texto afirma un permiso ilimitado para ejecutar el programa sin modificar. Puede, por tanto, usar la imagen publicada por el proyecto para su empresa y su equipo, sin ninguna licencia que comprar.
El artículo 13 añade una condición propia de la AGPL: si modifica el programa, su versión debe ofrecer a todos los que la usan a distancia, por la red, el modo de obtener gratuitamente su código fuente. Una extensión de terceros añadida al volumen extensions sigue su propia licencia.
El proyecto publica sus imágenes oficiales en Docker Hub, con el nombre freshrss/freshrss, junto con un archivo Compose de ejemplo. En un servidor con Docker instalado, cree una carpeta llamada freshrss y coloque en ella este compose.yaml, tomado de ese archivo y del README de Docker:
volumes:
data:
extensions:
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
hostname: freshrss
restart: unless-stopped
logging:
options:
max-size: 10m
volumes:
- data:/var/www/FreshRSS/data
- extensions:/var/www/FreshRSS/extensions
ports:
- 127.0.0.1:8080:80
environment:
TZ: UTC
CRON_MIN: '3,33'
TRUSTED_PROXY: 172.16.0.1/12 192.168.0.1/16
healthcheck:
test: ["CMD", "cli/health.php"]
timeout: 10s
start_period: 60s
start_interval: 11s
interval: 75s
retries: 3
docker compose up -d
127.0.0.1: FreshRSS solo es accesible a través del proxy inverso, colocado en el mismo servidor. El archivo de ejemplo del proyecto publica el puerto 8080 para un uso local; aquí, la dirección 127.0.0.1 lo reserva al proxy.data guarda la configuración, las cuentas y, con SQLite, la base de datos de cada usuario. El README señala que contiene todos los datos personales. Docker Compose lo nombra a partir de la carpeta: freshrss_data.extensions guarda las extensiones de terceros, si añade alguna.TZ recibe la zona horaria del servidor, en formato PHP; su valor por defecto es UTC.TRUSTED_PROXY conserva el valor del archivo de ejemplo: los rangos privados de los que llegan las peticiones del proxy. Decide qué dirección se anota en los registros, la del visitante o la del proxy.cli/health.php a intervalos regulares, para que Docker sepa si la instancia responde.La etiqueta latest, la predeterminada, sigue la última versión numerada; edge sigue la versión continua; una etiqueta como 1.30.4 fija una versión, y el sufijo -alpine ofrece lo mismo sobre una base Alpine en lugar de Debian. La sección de actualizaciones vuelve sobre esta elección.
Una vez instalado el proxy inverso, abra su dirección HTTPS: el asistente de instalación pregunta el idioma, comprueba el servidor, propone la elección de la base de datos y crea después la cuenta de administrador, con su contraseña y el método de inicio de sesión. SQLite funciona sin nada que preparar. La instalación se hace también desde la línea de comandos, con cli/do-install.php y cli/create-user.php, ejecutados mediante docker exec --user www-data freshrss.
En cuanto a recursos, el README pide un servidor ligero, con Linux o Windows, y señala que FreshRSS funciona incluso en una Raspberry Pi 1, con tiempos de respuesta inferiores a un segundo, con 150 feeds y 22.000 artículos. El tamaño depende del número de usuarios, de feeds y de artículos conservados. En un VPS administrado, descríbanos su uso y le recomendamos el tamaño adecuado.
Para producción, el README de Docker aconseja un proxy inverso en el servidor anfitrión, que se encarga de HTTPS. Elija primero un nombre de dominio o un subdominio, como rss.example.com, que apunte al servidor con registros A y AAAA. El proyecto recomienda Traefik y publica para él un archivo Compose completo, con los certificados de Let’s Encrypt y la redirección de HTTP a HTTPS; también da ejemplos para Apache, Nginx y Caddy.
Caddy obtiene el certificado y activa HTTPS por sí mismo. Este bloque sigue el ejemplo de la documentación para un subdominio, dirigido aquí al puerto publicado en local:
rss.example.com {
reverse_proxy 127.0.0.1:8080
}
Este bloque sigue el ejemplo de Nginx del README de Docker para la raíz de un dominio, reducido al puerto 80 para que Certbot pueda instalar HTTPS. Las dos últimas líneas transmiten la cabecera Authorization, que necesita la API de Google Reader:
upstream freshrss {
server 127.0.0.1:8080;
keepalive 64;
}
server {
listen 80;
listen [::]:80;
server_name rss.example.com;
location / {
proxy_pass http://freshrss/;
proxy_redirect off;
proxy_buffering off;
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_set_header X-Forwarded-Port $server_port;
proxy_read_timeout 90;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
}
}
Certbot instala después el certificado y se encarga de renovarlo:
sudo certbot --nginx
FreshRSS guarda su dirección pública en base_url, en el archivo data/config.php. La API y WebSub dependen de ella: compruebe que contiene su dirección en https. El README de Docker muestra dónde encontrar este archivo en el volumen:
docker volume inspect freshrss_data
sudo nano /var/lib/docker/volumes/freshrss_data/_data/config.php
docker compose restart freshrss
'base_url' => 'https://rss.example.com/',
FreshRSS recupera los nuevos artículos con su script app/actualize_script.php. La imagen Docker incluye una tarea programada que lo ejecuta en los minutos indicados en CRON_MIN. Sin esta variable, o con un valor vacío, la tarea queda desactivada y los feeds dejan de actualizarse por sí solos.
13,43; */20 también sirve.base_url, y el asistente de instalación lo activa cuando el servidor dispone de una.Otro método documentado: una tarea programada en el servidor anfitrión, que llama al script dentro del contenedor. En ese caso, quite CRON_MIN de compose.yaml, para conservar un único método:
7,37 * * * * root docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Desde la versión 1.30.0, FreshRSS rechaza por defecto las direcciones de la red local, como 127.0.0.1, para protegerse de la falsificación de peticiones del lado del servidor. Un servicio vecino que produce feeds, como RSS-Bridge, se autoriza mediante la variable INTERNAL_HOST_ALLOWLIST, con la forma rss-bridge:80, o en la configuración del sistema. El valor * elimina toda comprobación, y la documentación lo considera inseguro.
Durante la instalación, FreshRSS propone el inicio de sesión por formulario, que requiere JavaScript. Es el método por defecto y conviene a la mayoría de las instancias. La documentación describe otros:
| Método | Lo que hace | Dónde se ajusta |
|---|---|---|
| Formulario | Un nombre de usuario y una contraseña propios de FreshRSS | El asistente de instalación |
| Autenticación HTTP | El servidor web controla el acceso, y los nuevos usuarios se crean en su primer inicio de sesión | Un archivo p/i/.htaccess montado en el contenedor, con su .htpasswd |
| Autenticación externa | El proxy transmite el usuario conectado en la cabecera Remote-User o X-WebAuth-User | TRUSTED_PROXY, que enumera los proxies de confianza |
| OpenID Connect | El inicio de sesión pasa por su proveedor de identidad, con el módulo de Apache mod_auth_openidc | OIDC_ENABLED y las variables OIDC_*, en la imagen Debian sobre x86_64 |
La documentación advierte de que FreshRSS confía en cualquier dirección indicada en TRUSTED_PROXY: un proxy mal protegido permitiría a un atacante fijar la cabecera y obtener un acceso de administrador. Aquí, el puerto solo escucha en 127.0.0.1, lo que lo reserva al proxy del propio servidor. La documentación desaconseja también cualquier instancia sin autenticación en cuanto el servidor es accesible desde fuera de su red.
mailer y smtp en data/config.php: la documentación indica que el envío mediante la función mail de PHP aún no está disponible dentro de las imágenes Docker oficiales.Para una instancia compartida entre varias personas, la documentación aconseja abrir las cuentas a personas de confianza y mantener la instancia detrás de un proxy o un cortafuegos que bloquee el acceso a los rangos de direcciones internos.
FreshRSS funciona en el navegador, tanto en pantallas grandes como pequeñas, y en aplicaciones para Android, iOS, Linux, Windows y macOS. Estas aplicaciones usan una de sus dos API: Google Reader, que el README considera la mejor, y Fever, con funciones más limitadas, menos eficaz y menos segura.
https://rss.example.com/api/greader.php, o https://rss.example.com/api/fever.php para Fever, con el nombre de usuario y esa contraseña de API.Para comprobarlo, el enlace que aparece junto a la contraseña de API, en el perfil, abre una página de prueba: PASS en la comprobación completa confirma que todo funciona. La imagen Docker ya configura Apache para aceptar las barras codificadas, que algunas aplicaciones necesitan; con Nginx delante, conserve la transmisión de la cabecera Authorization.
El README mantiene una tabla de aplicaciones compatibles, con su plataforma, su API y sus funciones: Capy Reader y Readrops en Android, FeedFlow en móvil y escritorio, RSS Guard y NewsFlash en escritorio, ReadKit y Reeder Classic en iOS y macOS, entre otras.
FreshRSS incluye SQLite, que el README de Docker describe como la opción más sencilla, con buen rendimiento. La página de requisitos recomienda PostgreSQL 10 o posterior, y acepta también MariaDB 10.6 y MySQL 8.0 o posterior. La elección se hace en el asistente de instalación.
| Base | Puesta en marcha | Copia de seguridad |
|---|---|---|
| SQLite | Ninguna: un archivo por usuario, data/users/<user>/db.sqlite | El volumen data |
| PostgreSQL | Un servicio postgres en el mismo compose.yaml | pg_dump, o cli/db-backup.php |
| MySQL o MariaDB | Su servidor de base de datos, y su nombre de host en el asistente | mysqldump, o cli/db-backup.php |
Para PostgreSQL, añada este servicio a compose.yaml, tomado del archivo docker-compose-db.yml del proyecto, y el volumen db a la lista de volúmenes. La contraseña va en un archivo .env, junto a compose.yaml:
freshrss-db:
image: postgres:18
container_name: freshrss-db
hostname: freshrss-db
restart: unless-stopped
logging:
options:
max-size: 10m
volumes:
- db:/var/lib/postgresql
environment:
POSTGRES_DB: freshrss
POSTGRES_USER: freshrss
POSTGRES_PASSWORD: ${DB_PASSWORD}
DB_PASSWORD='a-long-unique-password'
En el asistente, elija PostgreSQL e indique freshrss-db como host, con el usuario, la contraseña y la base freshrss.
Puede revisar esta elección más adelante. La documentación describe el paso de una base de datos a otra, de MySQL a PostgreSQL por ejemplo, o a una versión mayor más reciente de PostgreSQL: cli/db-backup.php copia la base de cada usuario en un archivo SQLite, y cli/db-restore.php la carga después en la nueva base.
El README precisa que FreshRSS se ofrece sin ninguna garantía: sus copias de seguridad conservan sus suscripciones, sus artículos y sus ajustes. Esto es lo que la documentación pide copiar:
| Elemento | Lo que guarda | Copia de seguridad |
|---|---|---|
data/ | La configuración, las cuentas, los registros y, con SQLite, las bases de datos | Obligatoria; cache/ puede omitirse, FreshRSS lo reconstruye |
extensions/ | Las extensiones de terceros | Recomendada, si usa alguna |
| La base de datos externa | Con PostgreSQL, MySQL o MariaDB, los datos de los usuarios | Obligatoria, aparte |
La documentación considera más seguro detener el servicio durante las operaciones de mantenimiento. Los volúmenes Docker se copian con un contenedor temporal, el método que describe la documentación de Docker:
docker compose stop freshrss
docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -czf /backup/freshrss-$(date +%F).tgz --exclude=data/cache -C /var/www/FreshRSS data extensions
docker compose start freshrss
Desde la versión 1.29.1, FreshRSS sabe exportar él mismo la base de cada usuario a un archivo SQLite, sea cual sea la base de datos que use, y conservar solo las más recientes. Active esta exportación en data/config.php:
'auto_sqlite_export' => [
'enabled' => true,
'retention' => 7,
],
Programe después el comando en el servidor, aquí cada noche. Cada ejecución escribe data/users/<user>/sqlite-backups/<date>.sqlite y elimina los archivos que superan los siete últimos:
20 2 * * * root docker exec --user www-data freshrss cli/export-sqlite-auto.php --quiet
Con PostgreSQL, añada una exportación con la herramienta propia de la base, como en el README de Docker. La opción -T prescinde del terminal, que una tarea programada no necesita:
docker compose exec -T freshrss-db pg_dump -U freshrss freshrss | gzip -9 > freshrss-postgres-$(date +%F).sql.gz
La exportación OPML, desde la interfaz, guarda su lista de feeds, sin algunos ajustes propios de FreshRSS, como los accesos o las reglas de extracción de páginas. Para una copia completa, conserve las exportaciones SQLite: colocadas en el disco del servidor, entran también en sus copias de seguridad nocturnas.
docker compose stop freshrss.docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -xzf /backup/freshrss-YYYY-MM-DD.tgz -C /var/www/FreshRSS.cli/db-restore.php --delete-backup --force-overwrite.docker compose start freshrss y compruebe después que sus feeds y sus artículos están ahí.Repita este ejercicio de vez en cuando, sobre una copia: así comprueba que una copia de seguridad funciona.
El README de Docker da dos comandos, desde la carpeta del compose.yaml. Los volúmenes se quedan en su sitio:
docker compose pull
docker compose up -d
FreshRSS publica en dos canales. Las versiones numeradas, etiqueta latest, salen algunas veces al año, sin calendario fijo, y sus correcciones no se trasladan a las versiones anteriores. La versión continua, etiqueta edge, recibe las nuevas funciones y las correcciones a medida que llegan: desde la versión 1.30.0, el proyecto la recomienda para obtener antes los parches de seguridad.
data/, de las extensiones y de la base de datos antes de cada actualización.1.29.1 hacen posible este recorrido.Para seguir las nuevas versiones, el proyecto publica un feed Atom de sus versiones: suscriba a él su propia instancia de FreshRSS.
El autoalojamiento exige mantener el servidor además de la aplicación. En un VPS administrado, nuestros equipos se encargan del servidor y siguen su instancia de forma proactiva; FreshRSS sigue siendo su software, con sus ajustes y sus datos.
| Tema | Nuestros equipos | Usted |
|---|---|---|
| El servidor | Actualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidas | El momento que mejor convenga a su actividad |
| La supervisión | Servidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamada | La lectura de los registros de su instancia |
| FreshRSS | Seguimiento proactivo: errores, lentitud y espacio en disco detectados, corrección recomendada | Su instalación, sus actualizaciones y sus ajustes, que aplica usted o su asistente de IA |
| Las cuentas y los feeds | El servidor que los soporta, vigilado y con copias de seguridad | Los usuarios, las suscripciones, las extensiones y las contraseñas de API |
| Las copias de seguridad | Cada noche, cifradas y guardadas fuera de la máquina; restauración incluida | Las exportaciones propias de FreshRSS, y la petición de restauración, cuando la necesite |
| La migración | Su servidor actual migrado, gratis | El momento del cambio |
Si prefiere que nuestros equipos intervengan en la propia aplicación, ese servicio se factura por horas o a precio cerrado, con un presupuesto comunicado antes de la intervención.
Con un VPS administrado de Simafri, nuestros equipos mantienen actualizado el servidor de su instancia de FreshRSS, lo vigilan día y noche e intervienen sin esperar su llamada; también siguen su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted o su asistente de IA. Las copias de seguridad se cifran cada noche y se guardan fuera de la máquina, su restauración está incluida, y la migración de su servidor actual es gratuita.
Sí. FreshRSS tiene licencia AGPL-3.0: puede ejecutarlo en su empresa sin ninguna licencia que comprar. Si lo modifica, su versión debe ofrecer su código fuente a quienes la usan por la red. Queda el coste del servidor que lo ejecuta.
Cree un compose.yaml con la imagen freshrss/freshrss, los volúmenes data y extensions y el puerto publicado en 127.0.0.1, y ejecute docker compose up -d. Coloque después delante un proxy inverso en HTTPS, abra su dirección y siga el asistente de instalación.
Con la imagen Docker, indique en CRON_MIN los minutos de ejecución, por ejemplo 13,43: el proyecto recomienda unas dos ejecuciones por hora. Sin CRON_MIN, la tarea integrada queda desactivada. Una tarea programada en el servidor que ejecute app/actualize_script.php dentro del contenedor hace el mismo trabajo.
SQLite viene incluida y no necesita ninguna preparación; el README de Docker la describe como la más sencilla, con buen rendimiento. La página de requisitos recomienda PostgreSQL 10 o posterior, y acepta MariaDB 10.6 y MySQL 8.0. Los comandos db-backup y db-restore permiten cambiar de base más adelante.
Active el acceso a la API en la sección Autenticación y defina después una contraseña de API en su perfil. En una aplicación compatible, introduzca la dirección api/greader.php de su instancia, ya que la API de Google Reader es la mejor según el README, o api/fever.php.
No por defecto: la configuración limita las cuentas a la del administrador. Las demás se crean en Administración, Gestión de usuarios, o se aumenta el número de cuentas en la configuración del sistema para mostrar el formulario de registro.
Copie los volúmenes data y extensions con el servicio detenido. Active también auto_sqlite_export y programe cli/export-sqlite-auto.php, que exporta cada noche a SQLite la base de cada usuario. Con PostgreSQL, añada un pg_dump. Pruebe la restauración con regularidad.
Un VPS administrado cubre el servidor: sistema, seguridad, supervisión y copias de seguridad. Nuestros equipos siguen también su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted. Una intervención en la aplicación se factura por horas o a precio cerrado.
Simafri
Hablemos de su proyecto
Díganos en pocas palabras lo que necesita: le respondemos rápidamente.
¡Gracias! Su solicitud ha sido enviada. Le responderemos en breve.
¿Prefiere el correo? Escríbanos a support@simafri.com.