Files
darroyo 4ae7335b31 feat: import existing smb.conf and /etc/exports on first boot
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.
2026-07-05 21:45:25 -04:00

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