nasctl
Sistema NAS monolítico en Go, gestionable vía interfaz web, distribuido como un único binario estático.
Requisitos
- Go 1.22+
- Linux (para aplicar configuración Samba/NFS en producción)
Requisitos de build
- Go 1.22+
- Node.js 18+ y npm (solo para compilar el frontend embebido)
Build
make build # compila frontend (npm) + binario Go con assets embebidos
Binario generado en bin/nasctl. Si ya tienes internal/web/dist compilado, make build-go compila solo el binario.
Ejecución local
make run
Levanta en http://localhost:8080. Credenciales iniciales por defecto admin / admin (cámbialas con las variables de entorno o tras el primer login).
Para desarrollo del frontend con hot-reload:
cd web && npm run dev # Vite en :5173, proxya /api a :8080
Variables de entorno útiles:
| Variable | Default | Descripción |
|---|---|---|
NASCTL_ADDR |
:8080 |
Dirección HTTP |
NASCTL_DB |
/var/lib/nasctl/nasctl.db |
Ruta SQLite |
NASCTL_SMB_CONF |
/etc/samba/smb.conf |
Destino de smb.conf generado |
NASCTL_EXPORTS |
/etc/exports |
Destino de /etc/exports generado |
NASCTL_EXEC_SYSTEM |
true |
Ejecutar comandos reales del sistema (reload servicios, useradd, smbpasswd...) |
NASCTL_ALLOWED_ROOTS |
(vacío) | Directorios raíz permitidos para paths de shares/exports, separados por coma |
NASCTL_ADMIN_USER |
admin |
Usuario admin inicial (solo si no existe ninguno) |
NASCTL_ADMIN_PASSWORD |
admin |
Contraseña admin inicial (solo si no existe ninguno) |
NASCTL_IMPORT_ON_BOOT |
false |
true para importar smb.conf y /etc/exports existentes al primer arranque |
En desarrollo, make run usa ./.data/ y NASCTL_EXEC_SYSTEM=false (no toca el sistema real).
API
Autenticación (cookie de sesión firmada, httpOnly):
POST /api/auth/login—{username, password}→ cookie de sesiónPOST /api/auth/logoutGET /api/auth/status
El resto de endpoints requieren sesión válida:
GET /api/dirty— módulos con cambios pendientesPOST /api/apply— aplica configuración pendienteGET /api/apply/log— historial de aplicacionesGET /api/system/status— uso de disco y estado de serviciosGET/POST/PUT/DELETE /api/samba/shares— CRUD de shares SambaGET/POST/PUT/DELETE /api/nfs/exports— CRUD de exports NFSGET/POST/PUT/DELETE /api/users— CRUD de usuarios del sistemaGET /api/import/status— estado del import (done, counts)POST /api/import/samba— re-importa shares desdesmb.confPOST /api/import/nfs— re-importa exports desde/etc/exports
Todos los cambios marcan el módulo como dirty y NO se aplican al sistema hasta POST /api/apply.
Flujo dirty → apply
- Los cambios se guardan solo en SQLite.
- Se marca el módulo correspondiente como dirty.
- El usuario pulsa "Aplicar cambios" (
POST /api/apply). - El motor regenera archivos de configuración desde templates y recarga servicios.
Importar configuración existente
Si el host ya tiene smb.conf o /etc/exports configurados, nasctl puede importarlos al primer arranque:
NASCTL_IMPORT_ON_BOOT=true ./nasctl
El import:
- Detecta shares en
smb.confy exports en/etc/exports. - Los importa a SQLite (marca el módulo como dirty).
- No sobreescribe los archivos automáticamente — el usuario revisa y pulsa Apply.
- Antes del primer Apply, hace backup de los archivos originales en
<path>.nasctl.bak.<timestamp>. - Los flags
import.samba.done/import.nfs.doneen la base de datos evitan re-importar en cada arranque.
Para re-escanear manualmente después de editar los archivos en disco:
POST /api/import/samba— reimporta shares desdesmb.confPOST /api/import/nfs— reimporta exports desde/etc/exportsGET /api/import/status— estado del import
Empaquetado
make package
Genera dist/nasctl_0.1.0_amd64.deb.
Estado
Implementado: módulos Samba, NFS y usuarios (con flujo dirty→apply), autenticación web (bcrypt + cookie de sesión firmada), validación de paths permitidos, dashboard con estado del sistema y frontend React + Vite + Tailwind embebido en el binario.
Próximas mejoras posibles
- Gestión de admins web desde la UI (cambio de contraseña)
- Polkit para delegar acciones puntuales sin correr como root
- Métricas e histórico más detallados en el dashboard