Qué es NSFS
nsfs (NSFS) es un gestor de ficheros self-hosted en un único binario Go: explora el sistema de ficheros local y servidores remotos por SSH/SFTP desde el navegador, con login JWT, RBAC por grupos→roles→permisos (afinable por conexión y prefijo de ruta), registro de auditoría y licencia nslib con trial de 30 días.
- Local + remoto: la barra lateral muestra la raíz
Localy cada conexión SSH como una raíz más; se navega igual en ambas. - Sin build de frontend: Alpine.js + Tailwind por CDN, 6 idiomas (EN fuente de verdad, ES traducida, FR/DE/IT/PT con fallback a EN).
- Credenciales SSH cifradas en reposo con AES-256-GCM (
security.aes_key).
Los nombres de hosts, rutas y usuarios de los ejemplos son ficticios.
Casos de uso
1. Explorar y operar sobre el directorio local permitido
Ver el contenido de /data, crear carpetas, subir/descargar, renombrar y borrar.
nsfs init ./midata
nsfs start --config ./midata
nsfs status
Flujo web: login → conexión Local en la barra lateral → navegar con breadcrumbs → vista lista/cuadrícula → nueva carpeta, subir (arrastrar y soltar), descargar, renombrar, borrar, menú contextual.
2. Añadir un servidor remoto por SSH y navegarlo
Registrar el host prod-ejemplo y comprobar la conexión antes de usarla.
Flujo web: Administración → conexiones → crear (host, puerto 22, usuario, auth password o key con passphrase opcional, root_path) → botón probar conexión → aparece como raíz en la barra lateral (punto verde = conectado, gris = idle, rojo = error) → navegar igual que en local.
3. Dar acceso de solo lectura a un equipo sobre una ruta remota
El grupo operadores solo puede listar /var/log del host prod-ejemplo.
Flujo web: Administración → reglas de acceso → crear regla (connection_id + path_prefix + acciones list|read) para el grupo → comprobar con vista efectiva por usuario → el usuario ve la lista filtrada y recibe 403 al intentar crear carpetas fuera de su jail.
4. Subida masiva, búsqueda y descarga como zip con auditoría
Subir un lote, localizar un fichero por nombre y descargar la selección comprimida.
Flujo web: seleccionar múltiples ficheros → acciones en lote (borrado/movido en lote) → descargar como zip → buscar por nombre (insensible a mayúsculas, paginado con ?page=&limit=) → cada operación queda en audit/YYYY-MM-DD.jsonl y en la vista de auditoría reciente.
Interfaz

Referencia
Comandos CLI
| Comando | Descripción |
|---|---|
nsfs init [dir] [--admin-password PASS] | Crea el entorno: config.yaml + base SQLite + carpetas. Sin --admin-password genera una clave aleatoria de 6 caracteres |
nsfs start [dir] / --config dir | Arranca el servidor en background (daemon) |
nsfs stop [--config dir] | Para el daemon |
nsfs status | PID, uptime, memoria |
nsfs run [--config dir] | Primer plano (interno, no documentado en --help) |
nsfs --version | Versión y build |
Configuración principal (config.yaml)
| Clave | Descripción |
|---|---|
server.host / server.port | Escucha (por defecto 0.0.0.0:3333) |
server.tls_cert_file / tls_key_file | TLS opcional |
database.path | Ruta SQLite (./db/security.db) |
security.jwt_secret | Secreto JWT (mín. 32 caracteres) |
security.token_expiry_hours | Validez del token (24) |
security.aes_key | Clave de cifrado de credenciales SSH |
security.password_reset_code_ttl_minutes | Validez del código de reset (10) |
fs.local_roots | Jail local ([/data, /tmp]; vacío = sin restricción) |
fs.max_upload_mb | Tamaño máximo de subida (500) |
fs.hidden_patterns | Patrones ocultos |
fs.audit_dir | Directorio de auditoría (./audit) |
smtp.* | SMTP opcional para emails de reset |
pagination.page_size | Tamaño de página (100) |
Áreas de la web
Explorador (breadcrumbs, lista/cuadrícula, búsqueda, orden por nombre/tamaño/fecha, multiselección, menú contextual, arrastrar y soltar) · vista previa (texto/código, imagen, PDF; límite ~1 MB) y editor inline con guardado · conexiones SSH · favoritos · administración (usuarios, grupos, roles, reglas de acceso, vista efectiva por usuario, mis permisos) · auditoría reciente · editor de configuración · acerca de · temas y selector de idioma.
Ejemplos comentados
# 1. Entorno nuevo y arranque
nsfs init ./midata
nsfs start --config ./midata
nsfs status
# 2. Fijar la clave de admin en el init (para scripting)
nsfs init /opt/nsfs-prod --admin-password "clave-segura"
# 3. Ver versión
nsfs --version
# 4. Parar el daemon
nsfs stop --config ./midata
# Listado paginado vía API (con token JWT)
curl -H "Authorization: Bearer $TOKEN" \
"http://localhost:3333/api/fs/list?connection=local&path=/data&page=1&limit=100"
# Búsqueda por nombre
curl -H "Authorization: Bearer $TOKEN" \
"http://localhost:3333/api/fs/search?connection=local&path=/data&q=informe"
Preguntas frecuentes
¿Dónde creo la clave de admin? En el init: sin --admin-password se genera una aleatoria (se muestra una vez); fíjela con --admin-password para automatizar.
¿Por qué recibo 403 al crear una carpeta? La lista está filtrada por sus permisos (list|read) y la escritura exige regla sobre esa connection_id + path_prefix. Revise la vista efectiva del usuario.
¿Se guardan las contraseñas SSH en claro? No: se cifran con AES-256-GCM usando security.aes_key y nunca se registran en logs.
¿Qué idiomas soporta? EN (fuente), ES (completa), FR/DE/IT/PT (con fallback a EN si falta alguna clave).