darroyo 10d0769071 feat!: complete visual redesign → 1.0.0
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
2026-07-08 01:24:51 -04:00

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ón
  • POST /api/auth/logout
  • GET /api/auth/status

El resto de endpoints requieren sesión válida:

  • GET /api/dirty — módulos con cambios pendientes
  • POST /api/apply — aplica configuración pendiente
  • GET /api/apply/log — historial de aplicaciones
  • GET /api/system/status — uso de disco y estado de servicios
  • GET/POST/PUT/DELETE /api/samba/shares — CRUD de shares Samba
  • GET/POST/PUT/DELETE /api/nfs/exports — CRUD de exports NFS
  • GET/POST/PUT/DELETE /api/users — CRUD de usuarios del sistema
  • GET /api/import/status — estado del import (done, counts)
  • POST /api/import/samba — re-importa shares desde smb.conf
  • POST /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

  1. Los cambios se guardan solo en SQLite.
  2. Se marca el módulo correspondiente como dirty.
  3. El usuario pulsa "Aplicar cambios" (POST /api/apply).
  4. 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:

  1. Detecta shares en smb.conf y exports en /etc/exports.
  2. Los importa a SQLite (marca el módulo como dirty).
  3. No sobreescribe los archivos automáticamente — el usuario revisa y pulsa Apply.
  4. Antes del primer Apply, hace backup de los archivos originales en <path>.nasctl.bak.<timestamp>.
  5. Los flags import.samba.done/import.nfs.done en 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 desde smb.conf
  • POST /api/import/nfs — reimporta exports desde /etc/exports
  • GET /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
S
Description
No description provided
Readme 604 KiB
Languages
Go 51.4%
TypeScript 45.4%
CSS 1.1%
JavaScript 1%
Makefile 0.5%
Other 0.5%