BREAKING: version bump to 1.0.0 New design system: - Emerald/teal color palette with semantic tokens (success, warning, destructive) - Light/dark mode toggle with localStorage persistence and anti-FOUC - CSS custom properties via Tailwind darkMode: 'class' - Zero new dependencies — all primitives hand-rolled Foundation: - 70+ inline SVG icons (no external icon library) - ThemeProvider + useTheme hook - cn() utility for conditional classes UI primitives (web/src/components/ui/): - Button (6 variants, 4 sizes) - Input, Label, Card with slots, Badge (6 variants + sizes) - Switch (animated), Checkbox, Separator - Skeleton, Spinner, EmptyState - Toast system with auto-dismiss (success/error/warning/info) - Dialog with focus trap + escape/click-outside - ConfirmDialog replacing native confirm() - DropdownMenu with keyboard support Layout & navigation: - Sidebar with icon+label nav, active indicator, responsive drawer on mobile - Topbar for <lg viewports with hamburger - PageHeader with title/description/actions pattern - UserMenu with avatar + dropdown (change password, logout) - DirtyBanner redesigned with semantic styling Pages redesigned: - Login: centered card with gradient background - Dashboard: 4 KPI tiles, disk usage bars, services grid, recent activity - Users: table with search, empty state, edit modal - Files: breadcrumbs, drag-drop upload zone, SVG file icons, rename/delete - Samba: card list with badges, edit modal with PathField - NFS: card list with client chips, client editor - Storage: tabs (Mover/SnapRAID/Jobs), real-time job log streaming - Log: timeline grouped by date with filters - Settings: watched mounts, import actions, system info - NotFound: friendly 404 page Polish: - Toast notifications replace all native alert()/confirm() - Tailwind animations (dialog-enter, toast-enter/leave, dropdown-enter) - Custom scrollbar styling - Focus-visible rings - Skeleton loading states across all pages
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