Add nasctl: Go NAS control plane with React frontend
This commit is contained in:
@@ -1,2 +1,97 @@
|
||||
# baby-nas
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
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) |
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
## Empaquetado
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user