4ae7335b31
Adds auto-detection of pre-existing Samba shares and NFS exports when nasctl is installed on a host that already has these configs. New package internal/importer parses smb.conf (INI-style) and /etc/exports (line-based) and imports them into SQLite. Imported shares/exports are marked dirty so the user must review and apply manually before any file is overwritten. Backup: before the first Apply, each module backs up the original config to <path>.nasctl.bak.<timestamp> (one time only). New CLI flag --import-on-boot / NASCTL_IMPORT_ON_BOOT env var (default false, opt-in). New API endpoints: GET /api/import/status POST /api/import/samba POST /api/import/nfs New DB methods ReplaceSambaShares/ReplaceNFSExports (transactional replace-all), guarded by import.samba.done / import.nfs.done settings flags.
123 lines
4.4 KiB
Markdown
123 lines
4.4 KiB
Markdown
# 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) |
|
|
| `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:
|
|
|
|
```bash
|
|
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
|
|
|
|
```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
|