Confronto tra file manager self-hosted
Confronto tra FileBrowser, Filestash, SFTPGo e Cloud Commander: permessi, link condivisi, storage, autenticazione e avvio sicuro senza esporre i file.
Che cos’è un file manager self-hosted e che cosa non è
Un file manager self-hosted è una pagina web che presenta l’albero delle directory già presente sul tuo VPS (virtual private server). Effettui l’accesso e visualizzi /srv/files esattamente come si trova sul disco; puoi caricare, rinominare o scaricare file oppure condividere un link. Non viene copiata alcuna informazione in un secondo sistema. Di conseguenza, un file che trascini nel browser è già visibile in ls un secondo dopo.
I risultati delle ricerche spesso confondono questa funzione con software che svolge attività diverse. Gli strumenti di sincronizzazione mantengono una copia di ogni file su ogni dispositivo: è questo lo scopo di un’alternativa self-hosted a Dropbox. Lo storage a oggetti non usa alcun albero di directory, ma bucket e un’API. Per questo eseguire MinIO per lo storage a oggetti compatibile con S3 risponde a un’esigenza diversa. I pannelli di amministrazione dei server gestiscono la macchina, non i file. Questo è invece il caso di un confronto tra Cockpit e Webmin.
Un file manager è utile quando un collega deve scaricare dal server un archivio da 300 MB oppure quando vuoi correggere dal telefono un errore di battitura in un file di configurazione. Il compito è limitato e anche gli strumenti sono semplici.
Tieni presente un fatto mentre leggi. Si tratta di un’applicazione web con accesso in lettura e scrittura al filesystem, in ascolto su una porta. Ogni scelta descritta di seguito riguarda realmente la quantità di disco che quel processo può raggiungere.
FileBrowser è archiviato: leggi queste informazioni prima di installarlo
FileBrowser, il progetto filebrowser/filebrowser, è ancora la risposta indicata dalla maggior parte delle guide. Il README ora inizia con questo avviso:
File Browser è archiviato dal 2026-09-01. L'ultima release prevista è già stata rilasciata. Non saranno disponibili altre release, correzioni di bug o correzioni di sicurezza.
Il codice con licenza Apache 2.0 continua a funzionare. Le correzioni di sicurezza invece terminano. Questo è più importante per questa categoria di software che per la maggior parte delle altre, perché lo scopo principale del software è fornire accesso in scrittura a un filesystem tramite HTTP.
I manutentori hanno documentato come continuare a eseguirlo. Le indicazioni sono valide indipendentemente dallo strumento scelto: non esporlo direttamente a Internet, posizionarlo dietro un reverse proxy che termina TLS (transport layer security) ed esegue la propria autenticazione, mantenere disabilitato il command runner ed eseguirlo senza privilegi in un container, montandovi soltanto la directory che si intende pubblicare.
Una riga di quel README è più importante delle altre. Le sessioni sono JWT (JSON web tokens) autonomi, non identificatori gestiti dal server, quindi non possono essere revocati. Un token di sessione esposto rimane valido fino alla scadenza e la modifica della password non lo invalida. Se continui a usare FileBrowser, il livello di autenticazione che lo precede svolge il lavoro effettivamente importante.
FileBrowser Quantum: il fork ancora in sviluppo
Lo sviluppo attivo è passato a un fork, FileBrowser Quantum (gtsteffaniak/filebrowser), pubblicato come immagine gtstef/filebrowser. La configurazione è stata ricostruita attorno a un unico config.yaml, invece della combinazione precedente di opzioni della riga di comando e impostazioni del database. La procedura rapida documentata è:
docker run -d \
-v $(pwd):/srv \
-p 80:80 \
gtstef/filebrowser:betaIl comando pubblica la directory corrente su http://localhost. Il primo accesso usa admin / admin. Modifica queste credenziali prima che il container sia raggiungibile da qualsiasi macchina diversa dalla tua.
Per un'istanza permanente, usa Compose, monta la directory dei dati invece di un singolo file di database e associa la porta a localhost:
services:
filebrowser:
image: gtstef/filebrowser:beta
user: "1000:1000"
volumes:
- /srv/files:/folder
- ./data:/home/filebrowser/data
ports:
- 127.0.0.1:8080:80
restart: unless-stoppedLa configurazione si trova in /home/filebrowser/data/config.yaml e il database in /home/filebrowser/data/filebrowser.sqlite. La versione 2.0.0 ha modificato il formato del database ed esegue una migrazione una tantum. Per questo la documentazione richiede il mount di una directory: il mount di un singolo file non lascia spazio per il nuovo file. I percorsi indicati in config.yaml sono percorsi del container. Di conseguenza, una sorgente nella configurazione legge /folder, non /srv/files. Se si invertono questi percorsi, l'elenco dei file risulta vuoto senza alcun errore, perché la directory non esiste realmente.
Il progetto pubblica latest e stable, di circa 60 MB, con FFmpeg incluso per le miniature dei video, e stable-slim, di circa 15 MB, con il solo core. Questi sono i valori riportati nella pagina di installazione ad agosto 2026. Fissa il tag scelto. latest cambia senza avvisare e un file manager che modifica il formato della configurazione mentre il container è in esecuzione crea problemi operativi.
Per questo impiego è lo strumento più completo tra quelli di piccole dimensioni. Pubblica più sorgenti con regole di inclusione ed esclusione, quindi una singola istanza può esporre /srv/media e /srv/docs con ambiti diversi. Le condivisioni hanno una scadenza e possono essere anonime oppure limitate a un utente. L'autenticazione supporta OIDC (OpenID Connect), LDAP (lightweight directory access protocol), password con autenticazione a due fattori e una modalità basata sugli header del proxy. Questa modalità consente di eseguirlo dietro il single sign-on (SSO) fornito da un server Authentik self-hosted, invece di mantenere un secondo elenco di utenti.
Filestash: un'unica interfaccia per lo storage già disponibile
Filestash ha un'architettura diversa. È un front end che si connette a un backend, e l'elenco dei backend supportati è lungo: FTP, SFTP (protocollo di trasferimento file SSH), S3, SMB, WebDAV, IPFS e circa altri venti. È adatto quando i file non si trovano sul server che esegue l'interfaccia.
mkdir -p /srv/filestash && cd /srv/filestash
curl -O https://downloads.filestash.app/latest/docker-compose.yml
docker compose up -dL'immagine è machines/filestash:latest. Aprire http://your_domain:8334: nella prima schermata viene richiesta la password amministrativa. Impostarla immediatamente, perché fino a quel momento la console di amministrazione è accessibile a chiunque trovi la porta.
Prima di basare l'implementazione su Filestash, è necessario comprenderne il modello delle identità. Filestash non mantiene un database degli utenti nel senso tradizionale. Le credenziali vengono memorizzate nel browser tramite cookie crittografati, autenticati e con attributo HTTP only; sul server non viene conservato nulla, a meno di usare la funzione di condivisione. In quel caso, Filestash conserva una versione persistente e crittografata delle credenziali. Gli "utenti" sono account di storage: l'identità risiede nel backend, nell'account SFTP o nella chiave S3, non in Filestash.
Questo design è semplice, ma comporta un costo. A pagina dei prezzi indica il piano self-hosted gratuito come AGPL v3 (GNU Affero General Public License), con un massimo di 3 utenti, e include SSO (SAML, OIDC e LDAP) e il controllo degli accessi basato sui ruoli nel piano self-hosted a pagamento, a partire da $50 al mese, ad agosto 2026. Se il piano era "Filestash davanti al SSO aziendale, gratis", consultare quella pagina prima di progettare l'architettura.
SFTPGo: un server di protocolli con anche un'interfaccia web
SFTPGo è il software più completo tra quelli descritti e quello che viene consigliato più spesso per il motivo sbagliato. Fornisce SFTP, HTTP/S, FTP/S e WebDAV su filesystem locale, filesystem locale cifrato, object storage compatibile con S3, Google Cloud Storage, Azure Blob Storage o un altro server SFTP.
Sono disponibili i binari, i pacchetti per Debian e Ubuntu e un'immagine container. La riga del repository APT corrente e la relativa chiave di firma sono riportate nella pagina di installazione della documentazione di SFTPGo. Il metodo basato sui container è il più rapido per avviare il servizio: sostituire tag con la versione desiderata:
docker run --name some-sftpgo -p 8080:8080 -p 2022:2022 -d "drakkan/sftpgo:tag"SFTP è in ascolto sulla porta 2022 e le interfacce web sulle porte 8080. Montare /srv/sftpgo come volume. In caso contrario, gli account e i relativi file scompaiono quando il container viene ricreato, perché le home directory degli utenti sono impostate per impostazione predefinita su /srv/sftpgo/data/<username>.
Sono disponibili due interfacce web. La differenza è l'aspetto che la maggior parte delle guide lascia implicito. WebAdmin, all'indirizzo /web/admin, è l'interfaccia amministrativa: qui si creano utenti, gruppi, cartelle virtuali e regole degli eventi, oltre a impostare quote, limiti di banda e restrizioni sugli orari di accesso. WebClient, all'indirizzo /web/client, è l'interfaccia per gli utenti finali. Qui un utente può sfogliare i file, modificare le proprie credenziali, configurare l'autenticazione a due fattori e creare condivisioni.
Le condivisioni sono il punto di forza di SFTPGo in questo confronto. Un utente può creare link HTTP/S per condividere file e directory, limitare il numero di download e upload, proteggere la condivisione con una password, limitare l'accesso in base all'indirizzo IP di origine e impostare una data di scadenza automatica.
Perché, quindi, è necessaria cautela? Il modello degli account e il server di protocolli sono il centro del prodotto, non l'esperienza di navigazione dei file. Scegliere SFTPGo quando altre persone hanno bisogno di account reali con quote, quando gli upload arrivano tramite SFTP o FTPS da un sistema non sotto il proprio controllo oppure quando un unico bucket deve comparire nelle home directory di più utenti. Le cartelle virtuali svolgono quest'ultima funzione: una cartella basata su disco locale, S3, GCS, Azure Blob, SFTP o HTTP viene montata in più account, con una quota separata per ogni utente su una cartella condivisa. Se l'unica esigenza era una pagina navigabile sopra /srv/files, SFTPGo mette a disposizione una quantità eccessiva di componenti.
Vale la pena considerare anche altri due aspetti. L'edizione Community è rilasciata con licenza AGPL-3.0-only e termini aggiuntivi, mentre l'edizione Enterprise è distribuita con licenza commerciale. Il login OIDC è incluso nella build open source e associa gli utenti del provider di identità agli amministratori e agli utenti SFTPGo per entrambe le interfacce web. È inoltre possibile disattivare globalmente l'interfaccia client con enable_web_client nella configurazione httpd oppure disattivarla per un singolo utente aggiungendo HTTP ai protocolli negati di quell'utente. In questo modo il file manager può essere disponibile per una sola persona senza renderlo disponibile a tutti.
Cloud Commander: due pannelli e un terminale, per uso personale
Cloud Commander è un file manager Node.js distribuito con licenza MIT, organizzato in due pannelli e dotato di editor integrato, console e terminale. Installalo globalmente con npm i cloudcmd -g oppure avvia il container pubblicato:
docker run -it --rm -v ~:/root -v /:/mnt/fs -w=/root -p 8000:8000 coderaiser/cloudcmdLeggi il comando prima di eseguirlo. -v /:/mnt/fs monta l'intero filesystem dell'host nel container e il comando di esempio include ~/.cloudcmd.json, "root": "/", "auth": false e "console": true. Questa combinazione significa che chiunque raggiunga la porta 8000 ottiene accesso all'intero disco e a una console di comandi sul server. È un'impostazione ragionevole per un laptop, ma inadeguata per un VPS.
Limita l'ambito. Il container legge /root/.cloudcmd.json, che il comando pubblicato fornisce montando la directory home. Mantieni quindi il mount della configurazione e rimuovi il resto:
docker run -d --name cloudcmd \
-v ~/.cloudcmd.json:/root/.cloudcmd.json \
-v /srv/files:/srv/files \
-w=/srv/files \
-p 127.0.0.1:8000:8000 \
coderaiser/cloudcmdNel file di configurazione imposta "root" su /srv/files, "auth" su true con un "username" e "password", quindi imposta "console" e "terminal" su false, a meno che tu non voglia consentire esplicitamente l'accesso alla shell dal browser. Esistono anche equivalenti da riga di comando, tra cui --root, --auth, --username, --password e --prefix.
Considera correttamente le sue funzionalità. Dispone di una sola coppia di credenziali, non supporta limitazioni per singolo utente, quote o link di condivisione. È uno strumento personale. Associalo quindi a localhost come indicato sopra e raggiungilo tramite un tunnel:
ssh -L 8000:127.0.0.1:8000 you@your-vpsApri quindi http://127.0.0.1:8000 sul tuo computer. Il file manager non è mai esposto pubblicamente e l'unico servizio accessibile da Internet è il demone SSH che hai già messo in sicurezza sul tuo VPS.
Perché Nextcloud non è lo strumento adatto per questo specifico compito
Nextcloud è un buon software, ma non è progettato per questo. È una piattaforma di collaborazione: un’applicazione PHP, un database, processi in background, client di sincronizzazione desktop e un app store. Eseguirlo per ottenere una visualizzazione web di /srv/files introduce molte componenti per un’attività semplice e presenta anche un’incompatibilità specifica. Nextcloud conserva i metadati dei file in una tabella del database invece di leggere la directory a ogni richiesta. Di conseguenza, i file scritti da rsync o da un cron job possono rimanere invisibili nell’interfaccia finché una scansione non aggiorna i dati, con sudo -u www-data php occ files:scan --all. Un file manager elenca la directory quando si carica la pagina, quindi questo problema non si verifica.
Usa Nextcloud per ciò che gestisce bene: calendari, contatti, sincronizzazione e condivisione con persone che si aspettano un client desktop. Nextcloud su un VPS con Docker, TLS e backup descrive questa configurazione. Se lo esegui già e devi soltanto visualizzare una directory esistente, abilita l’app External Storage e fermati lì. Una seconda applicazione web con accesso in scrittura allo stesso disco è un ulteriore componente da aggiornare.
Come eseguirne uno senza esporre l'intero server
Non puntarlo mai a /. Il processo può leggere e scrivere tutto ciò che l'account utente può raggiungere, quindi un token di sessione sottratto concede esattamente lo stesso accesso al filesystem. Fornisci una sola directory, /srv/files, e creala appositamente.
Eseguilo con un utente non-root e monta soltanto ciò che deve pubblicare. In Compose questo significa user: "1000:1000" più un bind mount per ogni directory, con :ro su tutto ciò in cui non deve mai scrivere:
volumes:
- /srv/files:/folder
- /srv/media:/media:roIl risultato tipico di questa modifica è che la navigazione funziona, mentre gli upload falliscono con permission denied, perché l'ID utente del container non è proprietario della directory esterna. Confronta i due valori: docker exec filebrowser id stampa l'utente del container, ls -ln /srv/files stampa il proprietario numerico sull'host. Correggi il problema con sudo chown -R 1000:1000 /srv/files. È lo stesso problema di proprietà che PUID e PGID nelle immagini Docker risolve.
Associa la porta pubblicata a localhost, 127.0.0.1:8080:80, invece di 8080:80. Docker scrive le proprie regole netfilter prima di quelle di ufw, quindi una porta pubblicata senza ulteriori restrizioni resta raggiungibile da Internet anche quando ufw deny 8080 è attivo. Inserisci un reverse proxy davanti al servizio per gestire TLS. Su HTTP in chiaro il cookie di sessione attraversa la rete senza cifratura, e quel cookie equivale all'accesso al filesystem. Se Compose è ancora una novità, Docker Compose su un VPS descrive la struttura dei file usata da questi esempi.
Aggiungi un livello di autenticazione quando quello integrato nell'applicazione è limitato. Per un'istanza usata da una sola persona è sufficiente l'autenticazione HTTP basic sul proxy. Quando sono coinvolte più persone, usa OIDC o forward auth con un identity provider, in modo che la revoca di un account revochi l'accesso ovunque.
Disattiva le funzioni aggiuntive. Qualsiasi file manager che offre una shell, un command runner o un terminale nel browser offre l'esecuzione di codice da remoto a chiunque disponga di una sessione valida. Le indicazioni di FileBrowser raccomandano di mantenere disabilitato il command runner, mentre la configurazione di esempio di Cloud Commander abilita la console. Decidi consapevolmente, invece di accettare il comportamento predefinito.
Cosa si rompe per primo e quali errori verranno visualizzati
listen tcp :80: bind: permission denied. Linux riserva le porte inferiori a 1024 ai processi privilegiati. La configurazione documentata di FileBrowser Quantum usa la porta 80, che funziona all'interno di un container ma non appena si esegue il binario come utente non privilegiato sull'host. Impostare una porta superiore a 1024 in config.yaml e lasciare che il proxy gestisca la porta 443.
I caricamenti non funzionano, mentre la navigazione sì. Per elencare il contenuto di una directory serve r-x, mentre per scrivervi serve w. L'interfaccia web mostra un errore generico, quindi controllare prima il filesystem invece dei log dell'applicazione.
413 Request Entity Too Large. L'errore proviene da nginx, non dal file manager. Il valore predefinito di client_max_body_size è 1 MB, quindi un caricamento più grande viene rifiutato dal proxy prima che l'applicazione possa riceverlo. Impostare client_max_body_size 4096m; nel blocco server oppure usare 0 per disabilitare il controllo.
I file caricati hanno il gruppo errato. I nuovi file appartengono all'utente del processo, indipendentemente dalle impostazioni della directory che li contiene. Questo impedisce a un secondo servizio di leggere lo stesso albero di directory. Assegnare a entrambi i servizi un gruppo condiviso e impostare il bit setgid sulla directory con sudo chmod g+s /srv/files, in modo che i nuovi file ereditino il gruppo della directory.
Tutto funziona sulla porta, ma non dietro il proxy. Un'applicazione pubblicata sotto un sottopercorso genera i collegamenti a partire da un prefisso che deve essere configurato esplicitamente. Cloud Commander dispone dell'opzione --prefix. Se l'applicazione non offre un'opzione equivalente, assegnarle un sottodominio dedicato e inoltrare il percorso radice.
Quale file manager self-hosted dovresti usare?
- Un solo VPS, una o due directory, link di condivisione con scadenza ed eventualmente SSO in seguito: FileBrowser Quantum.
- File che risiedono altrove, ad esempio in un bucket S3, su un host SFTP o su un NAS tramite SMB, e vuoi una sola vista web: Filestash, entro i limiti del piano gratuito.
- Altre persone devono avere account, quote e la possibilità di caricare file tramite SFTP o FTPS: SFTPGo, considerando il client web un extra utile e non il motivo principale della scelta.
- Uno strumento personale con editor e terminale, raggiungibile tramite un tunnel SSH e mai pubblicato: Cloud Commander.
- Nextcloud è già in esecuzione e vuoi esporre una directory esistente: l'app External Storage, senza installare altro software.
Qualunque sia la scelta, la distribuzione conta più del prodotto. Una directory, un utente non-root, una porta associata a localhost e l'autenticazione davanti al servizio. Un file manager configurato in questo modo è una comodità. Lo stesso software puntato a / con una password condivisa è una shell remota con un'interfaccia più gradevole.
FAQ
FileBrowser è ancora sicuro da eseguire nel 2026?
Il README filebrowser/filebrowser del progetto upstream indica che File Browser è archiviato dal 2026-09-01 e che non verranno pubblicate altre release né corretti bug o vulnerabilità. Il codice continua a funzionare, ma il software senza patch che dispone dell'accesso in scrittura al filesystem rappresenta un rischio destinato ad aumentare nel tempo. Se lo mantieni, segui le indicazioni del progetto: nessuna esposizione diretta a Internet, un reverse proxy che gestisca TLS e la propria autenticazione, il command runner disabilitato e un container senza privilegi con il solo montaggio della directory pubblicata. Considera inoltre che le sue sessioni sono JWT autonomi, non identificatori gestiti lato server: non possono quindi essere revocati e la modifica della password non invalida un token già emesso. Per una nuova installazione, usa il fork FileBrowser Quantum, pubblicato come immagine gtstef/filebrowser, il cui sviluppo continua.
Un file manager self-hosted può usare il mio SSO esistente?
FileBrowser Quantum supporta OIDC, LDAP e una modalità basata su proxy header, quindi può essere eseguito dietro un identity provider esistente senza mantenere un secondo elenco di utenti. L'integrazione OpenID Connect di SFTPGo è inclusa nella build open source e associa gli utenti dell'identity provider agli amministratori e agli utenti di SFTPGo per entrambe le interfacce WebAdmin e WebClient. Filestash è l'eccezione da considerare: ad agosto 2026 la pagina dei prezzi colloca SSO (SAML, OIDC e LDAP) nel piano self-hosted a pagamento, a partire da $50 al mese, mentre il piano gratuito è indicato come AGPL v3 con un massimo di 3 utenti. Quando un'applicazione non supporta affatto SSO, l'alternativa è usare la forward authentication sul reverse proxy. Questa protegge la pagina di accesso, ma non modifica i permessi interni dell'applicazione.
Quale di questi strumenti offre link condivisi con scadenza?
SFTPGo offre l'implementazione più completa. Un utente crea un link HTTP/S da WebClient e può limitare il numero di download e upload, impostare una password, limitare l'accesso in base all'indirizzo IP di origine e impostare una data di scadenza automatica. FileBrowser Quantum supporta condivisioni con un tempo di scadenza. L'accesso può essere anonimo oppure limitato a un utente, con permessi distinti per la visualizzazione, la modifica e l'upload. Anche Filestash dispone di una funzione di condivisione. È l'unico caso in cui il server conserva una copia persistente e crittografata delle credenziali dello storage, perché il link deve continuare a funzionare quando la sessione del browser non è più attiva. Cloud Commander non offre alcun link condiviso.
È sicuro indicare / come directory radice a un file manager se sono l'unico utente?
No. Il rischio non dipende realmente dal fatto che tu sia l'unico utente. Il processo dispone dell'accesso in lettura e scrittura a tutto ciò che l'account di servizio può raggiungere. Di conseguenza, qualsiasi percorso verso quella sessione, un cookie sottratto, una vulnerabilità senza patch nel gestore degli upload o una password riutilizzata può consentire l'accesso a /etc, alle chiavi SSH e alle directory dei dati di tutti i servizi. Limita invece il montaggio a una sola directory: /srv/files anziché /. Cloud Commander è il caso più esposto, perché il comando Docker pubblicato monta la root dell'host in /mnt/fs e la configurazione di esempio imposta "root": "/" con "auth": false. Modifica entrambi i valori prima di consentire al container di mettersi in ascolto su un indirizzo diverso da localhost.