Ospitare FreshRSS su un VPS gestito significa leggere, voi e il vostro team, i vostri feed RSS da una macchina tutta vostra, che i nostri team tengono aggiornata e supervisionano giorno e notte. FreshRSS è un software libero con licenza AGPL-3.0. Questa guida segue la sua documentazione ufficiale: l'installazione con Docker Compose, HTTPS, l'aggiornamento dei feed, gli account e l'accesso, l'API per le app mobili, il database, i backup e gli aggiornamenti.
Di Simon Vasconcelos Lee
Pubblicato l'11 novembre 2026Lettura: 13 minuti
data ed extensions, dietro un reverse proxy in HTTPS.CRON_MIN aggiorna i feed da sola: il progetto raccomanda circa due esecuzioni all'ora.data e, con PostgreSQL o MySQL, il database, poi aggiornate con docker compose pull.FreshRSS è un aggregatore di feed RSS self-hosted scritto in PHP. Il suo README lo descrive come leggero, facile da usare, potente e personalizzabile, tradotto in più di venti lingue. È un'applicazione multiutente, con una modalità di lettura anonima ed etichette personalizzate.
FreshRSS è sviluppato dalla sua comunità su GitHub, e il suo sito ufficiale è pubblicato dalla comunità FreshRSS. Le estensioni vivono in un repository separato, e la documentazione si rivolge a utenti, amministratori e sviluppatori.
FreshRSS è pubblicato con la GNU Affero General Public License, versione 3: il suo manifesto composer.json la dichiara come AGPL-3.0, e il suo README rimanda al testo della licenza. Quel testo afferma un'autorizzazione illimitata a eseguire il programma non modificato. Potete quindi usare l'immagine pubblicata dal progetto per la vostra azienda e il vostro team, senza alcuna licenza da acquistare.
L'articolo 13 aggiunge una condizione propria dell'AGPL: se modificate il programma, la vostra versione deve offrire a tutti coloro che la usano a distanza, tramite la rete, il modo di ottenerne gratuitamente il codice sorgente. Un'estensione di terzi aggiunta al volume extensions segue la propria licenza.
Il progetto pubblica le sue immagini ufficiali su Docker Hub, come freshrss/freshrss, insieme a un file Compose di esempio. Su un server in cui Docker è installato, create una cartella chiamata freshrss e collocatevi questo compose.yaml, tratto da quel file e dal README 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 si raggiunge solo tramite il reverse proxy, installato sullo stesso server. Il file di esempio del progetto pubblica la porta 8080 per un uso locale; qui l'indirizzo 127.0.0.1 la riserva al proxy.data contiene la configurazione, gli account e, con SQLite, il database di ogni utente. Il README ricorda che contiene tutti i dati personali. Docker Compose lo chiama con il nome della cartella: freshrss_data.extensions contiene le estensioni di terzi, se ne aggiungete.TZ prende il fuso orario del server, nel formato PHP; per impostazione predefinita vale UTC.TRUSTED_PROXY mantiene il valore del file di esempio: le reti private da cui provengono le richieste del proxy. Decide quale indirizzo finisce nei log, quello del visitatore o quello del proxy.cli/health.php a intervalli regolari, perché Docker sappia se l'istanza risponde.Il tag latest, quello predefinito, segue l'ultima versione numerata; edge segue la versione continua; un tag come 1.30.4 fissa una versione, e il suffisso -alpine dà lo stesso risultato su una base Alpine anziché Debian. La sezione sugli aggiornamenti torna su questa scelta.
Una volta al suo posto il reverse proxy, aprite il vostro indirizzo HTTPS: la procedura guidata chiede la lingua, verifica il server, propone la scelta del database, poi crea l'account amministratore, con la sua password e il metodo di accesso. SQLite funziona senza nulla da preparare. L'installazione si fa anche da riga di comando, con cli/do-install.php e cli/create-user.php, lanciati tramite docker exec --user www-data freshrss.
Quanto alle risorse, il README chiede un server leggero, con Linux o Windows, e segnala che FreshRSS gira perfino su un Raspberry Pi 1, con tempi di risposta inferiori al secondo, con 150 feed e 22.000 articoli. La taglia dipende dal numero di utenti, di feed e di articoli conservati. Su un VPS gestito, descrivetici il vostro uso e vi raccomandiamo la taglia adatta.
In produzione, il README Docker consiglia un reverse proxy sul server host, che fornisce HTTPS. Scegliete prima un nome di dominio o un sottodominio, come rss.example.com, che punta al server con record A e AAAA. Il progetto raccomanda Traefik e pubblica per esso un file Compose completo, con i certificati Let's Encrypt e il reindirizzamento da HTTP a HTTPS; fornisce anche esempi per Apache, Nginx e Caddy.
Caddy ottiene il certificato e attiva HTTPS da solo. Questo blocco segue l'esempio della documentazione per un sottodominio, puntato qui sulla porta pubblicata in locale:
rss.example.com {
reverse_proxy 127.0.0.1:8080
}
Questo blocco segue l'esempio Nginx del README Docker per la radice di un dominio, ridotto alla porta 80 per lasciare a Certbot l'attivazione di HTTPS. Le ultime due righe trasmettono l'intestazione Authorization, necessaria all'API 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 installa poi il certificato e si occupa di rinnovarlo:
sudo certbot --nginx
FreshRSS conserva il proprio indirizzo pubblico in base_url, nel file data/config.php. L'API e WebSub si basano su di esso: verificate che contenga il vostro indirizzo https. Il README Docker indica dove trovare questo file nel volume:
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 i nuovi articoli con il suo script app/actualize_script.php. L'immagine Docker include un'attività pianificata che lo esegue ai minuti indicati in CRON_MIN. Senza questa variabile, o con un valore vuoto, l'attività resta disattivata e i feed non si aggiornano più da soli.
13,43; funziona anche */20.base_url, e la procedura guidata lo attiva quando il server ne ha uno.Un altro metodo documentato: un'attività pianificata sul server host, che chiama lo script all'interno del container. In questo caso, togliete CRON_MIN da compose.yaml, per mantenere un solo metodo:
7,37 * * * * root docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Dalla versione 1.30.0, FreshRSS rifiuta per impostazione predefinita gli indirizzi della rete locale come 127.0.0.1, per proteggersi dalla falsificazione delle richieste lato server. Un servizio vicino che produce feed, come RSS-Bridge, si autorizza tramite la variabile INTERNAL_HOST_ALLOWLIST, nella forma rss-bridge:80, oppure nella configurazione di sistema. Il valore * toglie ogni controllo, e la documentazione lo giudica non sicuro.
Durante l'installazione, FreshRSS propone l'accesso tramite modulo, che richiede JavaScript. È il metodo predefinito, e si adatta alla maggior parte delle istanze. La documentazione ne descrive altri:
| Metodo | Che cosa fa | Dove si imposta |
|---|---|---|
| Modulo | Un nome utente e una password propri di FreshRSS | La procedura guidata di installazione |
| Autenticazione HTTP | Il server web controlla l'accesso, e i nuovi utenti vengono creati al loro primo accesso | Un file p/i/.htaccess montato nel container, con il suo .htpasswd |
| Autenticazione esterna | Il proxy trasmette l'utente connesso nell'intestazione Remote-User o X-WebAuth-User | TRUSTED_PROXY, che elenca i proxy fidati |
| OpenID Connect | L'accesso passa dal vostro provider di identità, tramite il modulo Apache mod_auth_openidc | OIDC_ENABLED e le variabili OIDC_*, nell'immagine Debian su x86_64 |
La documentazione avverte che FreshRSS si fida di qualsiasi indirizzo elencato in TRUSTED_PROXY: un proxy mal protetto permetterebbe a un malintenzionato di impostare l'intestazione e di ottenere l'accesso da amministratore. Qui la porta ascolta solo su 127.0.0.1, il che la riserva al proxy del server stesso. La documentazione sconsiglia inoltre qualsiasi istanza senza autenticazione non appena il server è raggiungibile dall'esterno della vostra rete.
mailer e smtp in data/config.php: la documentazione indica che l'invio tramite la funzione mail di PHP non è ancora supportato nelle immagini Docker ufficiali.Per un'istanza condivisa da più persone, la documentazione consiglia di aprire gli account a persone di fiducia e di tenere l'istanza dietro un proxy o un firewall che blocchi l'accesso alle reti di indirizzi interni.
FreshRSS funziona nel browser, su schermi grandi come su quelli piccoli, e in app per Android, iOS, Linux, Windows e macOS. Queste app usano una delle sue due API: Google Reader, che il README giudica la migliore, e Fever, con funzioni più limitate, meno efficiente e meno sicura.
https://rss.example.com/api/greader.php, oppure https://rss.example.com/api/fever.php per Fever, con il nome utente e quella password API.Per verificare, il link mostrato accanto alla password API, nel profilo, apre una pagina di prova: PASS sul controllo completo conferma che tutto funziona. L'immagine Docker imposta già Apache per accettare le barre codificate, che alcune app richiedono; con Nginx davanti, mantenete l'inoltro dell'intestazione Authorization.
Il README tiene una tabella delle app compatibili, con la loro piattaforma, la loro API e le loro funzioni: Capy Reader e Readrops su Android, FeedFlow su mobile e desktop, RSS Guard e NewsFlash su desktop, ReadKit e Reeder Classic su iOS e macOS, tra le altre.
FreshRSS integra SQLite, che il README Docker descrive come l'opzione più semplice, con buone prestazioni. La pagina dei requisiti raccomanda PostgreSQL 10 o successivo, e accetta anche MariaDB 10.6 e MySQL 8.0 o successivi. La scelta si fa nella procedura guidata di installazione.
| Database | Configurazione | Backup |
|---|---|---|
| SQLite | Nessuna: un file per utente, data/users/<user>/db.sqlite | Il volume data |
| PostgreSQL | Un servizio postgres nello stesso compose.yaml | pg_dump, oppure cli/db-backup.php |
| MySQL o MariaDB | Il vostro server di database, e il suo nome host nella procedura guidata | mysqldump, oppure cli/db-backup.php |
Per PostgreSQL, aggiungete questo servizio a compose.yaml, tratto dal file docker-compose-db.yml del progetto, e il volume db all'elenco dei volumi. La password va in un file .env, accanto 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'
Nella procedura guidata, scegliete PostgreSQL e indicate freshrss-db come host, con l'utente, la password e il database freshrss.
Potete tornare su questa scelta in seguito. La documentazione descrive il passaggio da un database all'altro, da MySQL a PostgreSQL per esempio, o verso una versione principale più recente di PostgreSQL: cli/db-backup.php copia il database di ogni utente in un file SQLite, poi cli/db-restore.php lo carica nel nuovo database.
Il README precisa che FreshRSS è fornito senza alcuna garanzia: sono i vostri backup a custodire i vostri abbonamenti, i vostri articoli e le vostre impostazioni. Ecco che cosa la documentazione chiede di salvare:
| Elemento | Che cosa conserva | Backup |
|---|---|---|
data/ | La configurazione, gli account, i log e, con SQLite, i database | Obbligatorio; cache/ si può escludere, FreshRSS la ricostruisce |
extensions/ | Le estensioni di terzi | Raccomandato, se ne usate |
| Il database esterno | Con PostgreSQL, MySQL o MariaDB, i dati degli utenti | Obbligatorio, a parte |
La documentazione ritiene più sicuro fermare il servizio durante le operazioni di manutenzione. I volumi Docker si copiano con un container temporaneo, il metodo descritto nella documentazione di 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
Dalla versione 1.29.1, FreshRSS sa esportare da solo il database di ogni utente in un file SQLite, qualunque sia il database che usate, e conservare solo i più recenti. Attivate questa esportazione in data/config.php:
'auto_sqlite_export' => [
'enabled' => true,
'retention' => 7,
],
Pianificate poi il comando sul server, qui ogni notte. Ogni esecuzione scrive data/users/<user>/sqlite-backups/<date>.sqlite ed elimina i file oltre gli ultimi sette:
20 2 * * * root docker exec --user www-data freshrss cli/export-sqlite-auto.php --quiet
Con PostgreSQL, aggiungete un'esportazione con lo strumento del database stesso, come nel README Docker. L'opzione -T toglie il terminale, che a un'attività pianificata non serve:
docker compose exec -T freshrss-db pg_dump -U freshrss freshrss | gzip -9 > freshrss-postgres-$(date +%F).sql.gz
L'esportazione OPML, dall'interfaccia, salva l'elenco dei vostri feed, senza alcune impostazioni proprie di FreshRSS come le credenziali o le regole di estrazione delle pagine. Per una copia completa, conservate le esportazioni SQLite: collocate sul disco del server, rientrano anche nei suoi backup notturni.
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, poi verificate che i vostri feed e i vostri articoli ci siano.Ripetete questo esercizio di tanto in tanto, su una copia: è così che verificate che un backup funzioni.
Il README Docker fornisce due comandi, dalla cartella del compose.yaml. I volumi restano al loro posto:
docker compose pull
docker compose up -d
FreshRSS pubblica su due canali. Le versioni numerate, tag latest, escono qualche volta all'anno, senza un calendario fisso, e le loro correzioni non vengono riportate sulle versioni precedenti. La versione continua, tag edge, riceve le novità e le correzioni man mano che arrivano: dalla versione 1.30.0, il progetto la raccomanda per avere più rapidamente le correzioni di sicurezza.
data/, delle estensioni e del database prima di ogni aggiornamento.1.29.1 rendono possibile questo percorso.Per seguire le nuove versioni, il progetto pubblica un feed Atom delle sue versioni: abbonatevi con la vostra stessa istanza FreshRSS.
Il self-hosting richiede di occuparsi del server oltre che dell'applicazione. Su un VPS gestito, i nostri team prendono in carico il server e seguono la vostra istanza in modo proattivo; FreshRSS resta il vostro software, con le sue impostazioni e i suoi dati.
| Argomento | I nostri team | Voi |
|---|---|---|
| Il server | Aggiornamenti del sistema e della sicurezza, interventi sul server compresi | Il momento più adatto alla vostra attività |
| La supervisione | Server seguito 24 ore su 24, 7 giorni su 7, con intervento senza attendere la vostra chiamata | La lettura dei log della vostra istanza |
| FreshRSS | Monitoraggio proattivo: errori, rallentamenti e spazio su disco individuati, correzione raccomandata | La sua installazione, i suoi aggiornamenti e le sue impostazioni, che applicate voi o il vostro assistente IA |
| Gli account e i feed | Il server che li ospita, sorvegliato e salvato | Gli utenti, gli abbonamenti, le estensioni e le password API |
| I backup | Ogni notte, cifrati e conservati fuori dalla macchina; ripristino compreso | Le esportazioni proprie di FreshRSS e la richiesta di ripristino, quando ne avete bisogno |
| La migrazione | Il vostro server attuale migrato, in omaggio | Il momento del passaggio |
Se preferite che i nostri team intervengano nell'applicazione stessa, questa prestazione si fattura a ore o a forfait, con un preventivo comunicato prima dell'intervento.
Con un VPS gestito Simafri, i nostri team tengono aggiornato il server della vostra istanza FreshRSS, lo sorvegliano giorno e notte e intervengono senza attendere la vostra chiamata; seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi o il vostro assistente IA. I backup sono cifrati ogni notte e conservati fuori dalla macchina, il loro ripristino è compreso e la migrazione del vostro server attuale è in omaggio.
Sì. FreshRSS ha licenza AGPL-3.0: potete farlo girare in azienda senza alcuna licenza da acquistare. Se lo modificate, la vostra versione deve offrire il proprio codice sorgente a chi la usa tramite la rete. Resta il costo del server che lo fa girare.
Create un compose.yaml con l'immagine freshrss/freshrss, i volumi data ed extensions e la porta pubblicata su 127.0.0.1, poi lanciate docker compose up -d. Collocate quindi davanti un reverse proxy in HTTPS, aprite il vostro indirizzo e seguite la procedura guidata di installazione.
Con l'immagine Docker, indicate in CRON_MIN i minuti di esecuzione, per esempio 13,43: il progetto raccomanda circa due esecuzioni all'ora. Senza CRON_MIN, l'attività integrata resta disattivata. Un'attività pianificata sul server che esegue app/actualize_script.php nel container svolge lo stesso lavoro.
SQLite è integrato e non richiede alcuna preparazione; il README Docker lo descrive come il più semplice, con buone prestazioni. La pagina dei requisiti raccomanda PostgreSQL 10 o successivo, e accetta MariaDB 10.6 e MySQL 8.0. I comandi db-backup e db-restore permettono di cambiare database in seguito.
Attivate l'accesso tramite API nella sezione Autenticazione, poi scegliete una password API nel vostro profilo. In un'app compatibile, inserite l'indirizzo api/greader.php della vostra istanza, poiché l'API Google Reader è la migliore secondo il README, oppure api/fever.php.
Non per impostazione predefinita: la configurazione limita gli account a quello dell'amministratore. Gli altri si creano in Amministrazione, Gestione utenti, oppure si aumenta il numero di account nella configurazione di sistema per mostrare il modulo di registrazione.
Copiate i volumi data ed extensions a servizio fermo. Attivate anche auto_sqlite_export e pianificate cli/export-sqlite-auto.php, che ogni notte esporta in SQLite il database di ogni utente. Con PostgreSQL, aggiungete un pg_dump. Provate regolarmente il ripristino.
Un VPS gestito copre il server: sistema, sicurezza, supervisione e backup. I nostri team seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi. Un intervento nell'applicazione si fattura a ore o a forfait.
Simafri
Parliamo del vostro progetto
Diteci in due parole ciò che vi serve: vi rispondiamo rapidamente.
Grazie! La tua richiesta è stata inviata. Ti risponderemo a breve.
Preferite l'email? Scriveteci a support@simafri.com.