
O fin de File Browser dejó a mucha gente buscando un gestor de archivos web para poner en el servidor. FileBrowser Quantum es el sustituto directo, pero no es la única opción. El Filestash parte de otra idea: en lugar de mostrar una carpeta del disco, es un cliente web para casi cualquier almacenamiento, desde SFTP y FTP hasta S3, SMB, WebDAV, NFS y Git. En esta guía, vas a compilar Filestash a partir del código, instalar el binario en Debian o Ubuntu con systemd y Nginx, y comparar las tres opciones para saber cuál tiene sentido en tu caso.
Qué es Filestash
O Filestash es mantenido por Mickael Kerjean desde 2017, escrito en Go, con la interfaz web en JavaScript puro, y tiene cerca de 14,7 mil estrellas en GitHub. La licencia es la AGPL-3.0: puedes usar y modificar libremente, pero si ofreces una versión modificada como servicio en la red, necesitas publicar el código de esas modificaciones.
La arquitectura gira en torno a plugins. El propio README resume la filosofía: todo lo que no es una “verdad fundamental del universo” vive en un plugin. En la práctica, esto se traduce en tres tipos de pieza:
- Almacenamiento (backends): disco local, SFTP, FTP, S3 y compatibles, SMB, NFS, WebDAV, Git, Dropbox, Google Drive, Backblaze, Storj, Artifactory y otros.
- Autenticación: solo el administrador, archivo
htpasswdestilo Apache, usuarios locales con MFA, LDAP/Active Directory, passthrough (el inicio de sesión se reenvía al propio almacenamiento) e incluso usuarios de un WordPress. - Aplicaciones de visualización: editor de código, imágenes RAW, PDF, vídeo con transcodificación bajo demanda, documentos de oficina mediante Collabora/WOPI y, como plugins extra, visores para formatos de áreas como GIS, CAD y datos.
Conviene saber de antemano dónde está la línea entre lo que es abierto y lo que es de pago. La documentación oficial marca como funciones de la edición comercial el inicio de sesión mediante OpenID Connect y SAML, las reglas de autorización por rol (RBAC) y el HTTPS nativo con certificado propio o ACME. En la build AGPL que tú compilas, esos plugins no vienen incluidos; LDAP, htpasswd y usuarios locales sí vienen.
Cómo funciona
Filestash no guarda tus archivos: se conecta a los almacenamientos que habilites y los muestra todos en la misma interfaz. La configuración, la base de datos de metadatos, el índice de búsqueda y la caché quedan en un directorio de estado. En nuestra guía, el binario se ejecuta con systemd, escucha en el puerto 8334 y queda detrás de Nginx con TLS.

Por qué compilar
Filestash no publica un binario listo. La instalación oficial es el docker-compose.yml de la documentación, con la imagen machines/filestash:latest, y la última etiqueta numerada en GitHub es la v0.4, de 2019: el proyecto se distribuye como rolling release, a partir de la rama principal. Para ejecutarlo sin Docker, el camino es compilar, exactamente como lo hace el Dockerfile oficial: Go para el servidor, bibliotecas C para miniaturas de imágenes y FFmpeg para vídeo.
Probamos el procedimiento siguiente en contenedores limpios de Debian 13 e Ubuntu 24.04, con el código de 21 de septiembre de 2026. Hay una diferencia importante entre ambos:
- En el Debian 13, la misma base que el
Dockerfileoficial, la compilación sale completa. - En el Ubuntu 24.04, el plugin de transcodificación de vídeo no compila: utiliza funciones de FFmpeg 7.1, y 24.04 trae FFmpeg 6.1. La solución es quitar ese plugin de la compilación, con una línea de
sed. El resto de la aplicación compila y funciona con normalidad; solo queda fuera la conversión de vídeo bajo demanda.
Dependencias de compilación
Instala las herramientas y las bibliotecas de desarrollo, las mismas que el Dockerfile oficial usa:
sudo apt update
sudo apt install -y git curl make gcc g++ pkg-config ca-certificates apache2-utils \
libjpeg-dev libtiff-dev libpng-dev libwebp-dev libraw-dev libheif-dev libgif-dev libvips-dev \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev \
libswresample-dev libswscale-dev libavutil-dev ffmpeg poppler-utils
O go.mod do proyecto exige Go 1.26, más nuevo que el de los repositorios de Debian y Ubuntu. Instale la versión oficial en /usr/local/go:
GO_VERSION=1.26.8
curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" | sudo tar -C /usr/local -xz
export PATH=/usr/local/go/bin:$PATH
go version
En servidor ARM, cambie amd64 por arm64.
Compilando el binario
git clone --depth 1 https://github.com/mickael-kerjean/filestash ~/filestash-src
cd ~/filestash-src
# Somente no Ubuntu 24.04 (FFmpeg 6.1): remove o plugin de transcodificação
sed -i '/plg_video_transcoder/d' server/plugin/index.go
make init
make build
ls -lh dist/
make init descarga los módulos Go y genera el código incrustado; make build produce dist/filestash con la interfaz web dentro del binario. Las advertencias del compilador C durante el build son normales; lo que importa es que el archivo exista al final.
El binario es dinámico: depende de las bibliotecas de imagen y vídeo instaladas en el paso anterior. Por eso, la forma más sencilla es compilar en el propio servidor. Si va a compilar en otra máquina, use la misma versión de la distribución e instale en el servidor las bibliotecas de ejecución correspondientes (las listadas por ldd dist/filestash).
Instalando con systemd
Cree un usuario de sistema, copie el contenido de dist/ para /opt/filestash y reserve /var/lib/filestash para el estado. La variable FILESTASH_PATH indica a Filestash dónde guardar configuración, base de datos, índice de búsqueda y caché; sin ella, utiliza data/ relativo al directorio de trabajo.
sudo useradd --system --home-dir /var/lib/filestash --shell /usr/sbin/nologin filestash
sudo install -d -o root -g root -m 0755 /opt/filestash
sudo cp -a ~/filestash-src/dist/. /opt/filestash/
sudo install -d -o filestash -g filestash -m 0750 /var/lib/filestash
sudo install -d -o root -g filestash -m 0750 /etc/filestash
Contraseña del administrador antes de levantar
Este es el cuidado más importante de la guía. Mientras no exista contraseña de administrador, Filestash lo redirige todo hacia /admin/setup, y quien llegue primero se convierte en administrador. Lo comprobamos en el código: sin contraseña definida, la comprobación de sesión del panel devuelve “autenticado” para cualquiera. Y el servidor HTTP escucha en todas las interfaces, no solo en 127.0.0.1.
Por eso, define la contraseña antes de la primera ejecución, mediante la variable ADMIN_PASSWORD. Esta no recibe la contraseña en texto: recibe el hash bcrypt, que el htpasswd genera:
read -rsp 'Senha do admin: ' SENHA; echo
HASH=$(htpasswd -bnBC 10 "" "$SENHA" | tr -d ':\n')
unset SENHA
printf 'FILESTASH_PATH=/var/lib/filestash/\nADMIN_PASSWORD=%s\n' "$HASH" | sudo tee /etc/filestash/filestash.env >/dev/null
sudo chown root:filestash /etc/filestash/filestash.env
sudo chmod 0640 /etc/filestash/filestash.env
En el arranque, Filestash guarda ese hash en la propia configuración. Mantén la variable en el archivo: si un día cambias la contraseña desde el panel, recuerda que la variable vuelve a tener efecto en el siguiente reinicio.
La unit
Cree /etc/systemd/system/filestash.service:
[Unit]
Description=Filestash
After=network-online.target
Wants=network-online.target
[Service]
User=filestash
Group=filestash
WorkingDirectory=/var/lib/filestash
EnvironmentFile=/etc/filestash/filestash.env
ExecStart=/opt/filestash/filestash
Restart=on-failure
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/filestash
[Install]
WantedBy=multi-user.target
Con ProtectSystem=strict, el servicio solo escribe en /var/lib/filestash. Si vas a usar el almacenamiento local para servir una carpeta del servidor, añade esa carpeta en ReadWritePaths y da permiso al usuario filestash; para SFTP, S3 y los demás, nada cambia.
sudo systemctl daemon-reload
sudo systemctl enable --now filestash
curl -s http://127.0.0.1:8334/healthz; echo
journalctl -u filestash -f
O /healthz responde con un JSON de estado, útil para monitorizar. Para lo básico de units y logs, consulta la guía de comandos esenciales de systemd.
Cierra el puerto 8334
Como Filestash escucha en todas las interfaces, bloquea el puerto 8334 en el firewall y deja el acceso externo solo a través de Nginx:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw deny 8334/tcp
sudo ufw enable
sudo ufw status
Nginx con HTTPS
La configuración sigue la que el autor publica para la demo oficial: sin buffer, con timeout largo para subidas y transferencias grandes.
server {
listen 80;
server_name arquivos.exemplo.com.br;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name arquivos.exemplo.com.br;
ssl_certificate /etc/letsencrypt/live/arquivos.exemplo.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/arquivos.exemplo.com.br/privkey.pem;
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:8334;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 86400;
proxy_set_header Host $host:$server_port;
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;
}
}
Emite el certificado con sudo certbot --nginx -d arquivos.exemplo.com.br y recarga Nginx. client_max_body_size 0 quita el límite de tamaño de subida en el proxy; si prefieres un tope, usa algo como 10G.
Primera configuración
Abre https://arquivos.exemplo.com.br/admin y entra con la contraseña definida en el hash. El panel tiene tres áreas principales:
- Almacenamiento: marca los almacenamientos que los usuarios pueden usar (por ejemplo, solo SFTP y S3). Cada uno se convierte en una opción en la pantalla de inicio de sesión.
- Autenticación: elige quién entra. Sin plugin de autenticación, el usuario introduce los datos del propio almacenamiento (host, puerto, usuario), como en un cliente FTP. Con passthrough, tú fijas el host y el puerto y el usuario solo introduce el login y la contraseña del SFTP. Con htpasswd, local o LDAP, Filestash autentica y luego conecta al almacenamiento con credenciales definidas por ti, incluso con una ruta diferente por usuario.
- Configuración: nombre del sitio,
hostpúblico (usado en los enlaces), puerto y funciones opcionales. La consola web (/admin/tty/) viene desactivado por defecto; déjelo así.
Un ejemplo habitual para un servidor Linux: habilitar solo el SFTP, usar passthrough con hostname fijo en 127.0.0.1, y cada persona entra con su propio usuario del sistema. Los permisos son los de Linux, y Filestash se convierte en una interfaz web para el SSH que ya administra.
Actualizando
Sin versiones numeradas, actualizar significa recompilar desde la rama principal. Guarde una copia del binario anterior y del directorio de estado antes:
sudo tar czf /root/filestash-estado-$(date +%F).tar.gz -C /var/lib filestash
sudo cp -a /opt/filestash /opt/filestash.anterior
cd ~/filestash-src
git pull
sed -i '/plg_video_transcoder/d' server/plugin/index.go # só no Ubuntu 24.04
make init && make build
sudo systemctl stop filestash
sudo cp -a dist/. /opt/filestash/
sudo systemctl start filestash
curl -s http://127.0.0.1:8334/healthz; echo
En Ubuntu, el git pull puede quejarse del cambio local en server/plugin/index.go; ejecute git checkout server/plugin/index.go antes de pull y aplique el sed de nuevo después.
File Browser, FileBrowser Quantum y Filestash lado a lado
Los tres son gestores de archivos web en Go, pero resuelven problemas diferentes:
| File Browser | FileBrowser Quantum | Filestash | |
|---|---|---|---|
| Situación | Archivado el 1/9/2026, sin correcciones | Activo: stable v1.5.x, beta v2.0 | Activo, rolling release |
| Licencia | Apache 2.0 | Apache 2.0 | AGPL-3.0 |
| Binario oficial | Sí | Sí (amd64, arm64, armv6, armv7) | No; Docker o compilación |
| A qué accede | Una carpeta del disco | Varias carpetas del disco | Disco, SFTP, FTP, S3, SMB, NFS, WebDAV, Git, nubes |
| Login | Usuario y contraseña, proxy, hook | Contraseña + 2FA, OIDC, LDAP, JWT, proxy | htpasswd, local + MFA, LDAP, passthrough; OIDC y SAML solo en la edición de pago |
| Búsqueda | Simple | Indexada, en tiempo real | Por escaneo en la compilación estándar; el índice full-text es un complemento aparte |
| Compartición | Enlaces con caducidad y contraseña | Enlaces con caducidad, contraseña y permisos | Enlaces con caducidad, contraseña, usuarios y permisos de lectura, escritura y subida |
| Ejecución de comandos | Existe, con fallos que no se corregirán | Eliminada | Consola web opcional, desactivada por defecto |
| Configuración | Flags y base de datos | config.yaml |
Panel /admin (graba config.json) |
Los datos de inicio de sesión, búsqueda y compartición provienen de la documentación y del código de cada proyecto; las características de la edición comercial de Filestash están marcadas en la documentación de instalación.
Cuál elegir
- File Browser original: ningún proyecto nuevo debe empezar con él. Si aún se ejecuta, trátelo como software sin mantenimiento y planifique la salida. Los motivos están en el post sobre el fin de File Browser y FileBrowser Quantum.
- FileBrowser Quantum: la elección natural cuando los archivos están en el disco del servidor y quieres una experiencia tipo “Google Drive” con usuarios, comparticiones, búsqueda y SSO mediante OIDC sin pagar nada. También es la migración más corta para quien viene de File Browser.
- Filestash: la elección cuando los archivos no están todos en un disco local. Un bucket S3, un servidor SFTP heredado, un recurso compartido SMB y un repositorio Git en la misma pantalla, con el inicio de sesión trasladado al propio almacenamiento. El precio es una instalación más laboriosa sin Docker y la licencia AGPL, que exige atención si vas a modificar y ofrecer el servicio a terceros.
Si tu almacenamiento de objetos es un MinIO, el post sobre OpenObserve con S3 y MinIO muestra cómo preparar el bucket y las credenciales que Filestash va a usar. Y para hacer seguimiento de la disponibilidad de cualquiera de las tres opciones, el Go Uptime puede comprobar el endpoint de salud y avisar cuando el servicio caiga.
Conclusión
Filestash no compite con FileBrowser Quantum en el mismo terreno: es un cliente web universal de almacenamiento, no un explorador de una carpeta. Compilado en Debian o Ubuntu, se convierte en un único binario gestionado por systemd, sin Docker. Los dos cuidados que no pueden faltar son la contraseña de administrador definida antes de la primera ejecución y el puerto 8334 cerrado en el firewall. La documentación y los plugins están en filestash.app.