Alojar FreshRSS en un VPS administrado: sus feeds RSS en su propio servidor

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.

Simon Vasconcelos Lee Por Publicado el 11 de noviembre de 202613 minutos de lectura

Todas las guías

Lo esencial

  1. La licencia AGPL-3.0 permite ejecutar FreshRSS libremente, en una empresa o en cualquier otro ámbito; si lo modifica, ofrece el código fuente de su versión a quienes la usan.
  2. Instálelo con Docker Compose: una imagen, un puerto publicado en local y dos volúmenes, data y extensions, detrás de un proxy inverso en HTTPS.
  3. La variable CRON_MIN actualiza los feeds por sí sola: el proyecto recomienda unas dos ejecuciones por hora.
  4. Los registros están cerrados por defecto. Para las aplicaciones móviles, active la API y cada usuario define después una contraseña de API.
  5. Haga copia del volumen data y, con PostgreSQL o MySQL, de la base de datos, y actualice con docker compose pull.

Qué hace FreshRSS

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.

Lo que permite la licencia AGPL-3.0

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.

La instalación con Docker Compose

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:

compose.yaml
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
Terminal, en la carpeta freshrss
docker compose up -d

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.

Terminar la instalació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.

HTTPS: el proxy inverso

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.

Con 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:

Caddyfile
rss.example.com {
  reverse_proxy 127.0.0.1:8080
}

Con Nginx y Certbot

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:

Bloque Nginx
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:

Terminal
sudo certbot --nginx

La dirección pública: base_url

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:

Terminal
docker volume inspect freshrss_data
sudo nano /var/lib/docker/volumes/freshrss_data/_data/config.php
docker compose restart freshrss
data/config.php
'base_url' => 'https://rss.example.com/',

La actualización de los feeds: CRON_MIN

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.

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:

/etc/cron.d/FreshRSS
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.

Las cuentas y el inicio de sesión

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étodoLo que haceDónde se ajusta
FormularioUn nombre de usuario y una contraseña propios de FreshRSSEl asistente de instalación
Autenticación HTTPEl servidor web controla el acceso, y los nuevos usuarios se crean en su primer inicio de sesiónUn archivo p/i/.htaccess montado en el contenedor, con su .htpasswd
Autenticación externaEl proxy transmite el usuario conectado en la cabecera Remote-User o X-WebAuth-UserTRUSTED_PROXY, que enumera los proxies de confianza
OpenID ConnectEl inicio de sesión pasa por su proveedor de identidad, con el módulo de Apache mod_auth_openidcOIDC_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.

Los registros y los usuarios

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.

Las aplicaciones móviles: las API de Google Reader y Fever

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.

  1. Como administrador, en la sección Autenticación, active la opción que permite el acceso a la API.
  2. Cada usuario define una contraseña de API en su perfil. Es distinta de la contraseña principal, da acceso a menos cosas y está pensada para las situaciones menos seguras.
  3. En la aplicación, introduzca la dirección 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.

SQLite, PostgreSQL, MySQL o MariaDB

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.

BasePuesta en marchaCopia de seguridad
SQLiteNinguna: un archivo por usuario, data/users/<user>/db.sqliteEl volumen data
PostgreSQLUn servicio postgres en el mismo compose.yamlpg_dump, o cli/db-backup.php
MySQL o MariaDBSu servidor de base de datos, y su nombre de host en el asistentemysqldump, 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:

compose.yaml, dentro de services
  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}
.env
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.

Las copias de seguridad

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:

ElementoLo que guardaCopia de seguridad
data/La configuración, las cuentas, los registros y, con SQLite, las bases de datosObligatoria; cache/ puede omitirse, FreshRSS lo reconstruye
extensions/Las extensiones de tercerosRecomendada, si usa alguna
La base de datos externaCon PostgreSQL, MySQL o MariaDB, los datos de los usuariosObligatoria, aparte

Los volúmenes, con el servicio detenido

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:

Terminal, en la carpeta freshrss
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

Las bases de datos, con el servicio en marcha

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:

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:

/etc/cron.d/freshrss-export
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:

Terminal, en la carpeta freshrss
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.

Restaurar

  1. Detenga FreshRSS con docker compose stop freshrss.
  2. Vuelva a cargar el archivo en los volúmenes: docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -xzf /backup/freshrss-YYYY-MM-DD.tgz -C /var/www/FreshRSS.
  3. Con una base de datos externa, restáurela a partir de su exportación, o de los archivos SQLite con cli/db-restore.php --delete-backup --force-overwrite.
  4. Vuelva a arrancar con 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.

Las actualizaciones

El README de Docker da dos comandos, desde la carpeta del compose.yaml. Los volúmenes se quedan en su sitio:

Terminal
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.

Para seguir las nuevas versiones, el proyecto publica un feed Atom de sus versiones: suscriba a él su propia instancia de FreshRSS.

Quién hace qué en un VPS administrado

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.

TemaNuestros equiposUsted
El servidorActualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidasEl momento que mejor convenga a su actividad
La supervisiónServidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamadaLa lectura de los registros de su instancia
FreshRSSSeguimiento proactivo: errores, lentitud y espacio en disco detectados, corrección recomendadaSu instalación, sus actualizaciones y sus ajustes, que aplica usted o su asistente de IA
Las cuentas y los feedsEl servidor que los soporta, vigilado y con copias de seguridadLos usuarios, las suscripciones, las extensiones y las contraseñas de API
Las copias de seguridadCada noche, cifradas y guardadas fuera de la máquina; restauración incluidaLas exportaciones propias de FreshRSS, y la petición de restauración, cuando la necesite
La migraciónSu servidor actual migrado, gratisEl 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.

FreshRSS, en un servidor que cuidamos por usted

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.

Descubrir los VPS administrados

Preguntas frecuentes

¿FreshRSS es gratuito para una empresa?

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.

¿Cómo instalar FreshRSS con Docker Compose?

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.

¿Cómo actualizar los feeds automáticamente en FreshRSS?

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.

¿Qué base de datos elegir para FreshRSS?

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.

¿Cómo leer FreshRSS en el móvil?

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.

¿Los registros están abiertos en FreshRSS?

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.

¿Cómo hacer copia de seguridad de FreshRSS?

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 FreshRSS?

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.

Fuentes y documentación oficial

Contáctenos