🛰️ SimplePanel Ver como HTML
# 🛰️ SimplePanel

> Tu VPS, tus apps, cero contenedores. Un panel de despliegue que cabe en la cabeza.

SimplePanel es un panel de hosting **single-user** para un único VPS con **Ubuntu Server 24.04**. Despliega aplicaciones **PHP, Node.js, Bun y .NET** con nginx delante, systemd vigilando, HTTPS de Let's Encrypt y bases de datos PostgreSQL/MariaDB por aplicación. Todo registrado, todo consultable, todo tuyo.

Sin Docker. Sin Kubernetes. Sin magia. Solo las piezas de siempre de un servidor Linux, bien atadas.

```text
        INTERNET :80/:443
              │
            nginx ──── una conf por dominio
     ┌────────┼────────────┐
  PHP-FPM   Node/Bun     .NET
 (pool/app) (systemd)  (systemd)

  Panel (127.0.0.1:9090) ──▶ PostgreSQL ◀── Agente (root)
        "quiero esto"      operation_jobs     "hecho"
```

El panel nunca toca el sistema: escribe **jobs** en una cola. El agente los ejecuta uno a uno y deja un informe paso a paso que ves en directo desde la interfaz. Si algo falla, el mensaje de error es útil y el botón «Reintentar» retoma justo donde se quedó.

---

## ✨ Qué sabe hacer

| | |
|---|---|
| 🚀 **Deploys por ZIP** | Sube un ZIP, se valida a conciencia (rutas maliciosas, symlinks, límites) y se publica como release inmutable con cambio atómico. Se conservan los 3 últimos. |
| 🌍 **Dominios + HTTPS** | Añade un dominio, pulsa un botón y certbot emite el certificado con redirección a HTTPS. El panel avisa de los que caducan en menos de 30 días. |
| 🗄️ **Bases de datos** | PostgreSQL o MariaDB por app, con usuario propio y contraseña generada. Opcionalmente inyecta `DATABASE_URL` y compañía en el entorno de la app. |
| 🔐 **Secretos cifrados** | Variables de entorno con AES-256-GCM. Nunca en claro en la base de datos ni en los logs. |
| 🧹 **Borrado sin residuos** | Eliminar una app se lleva el usuario Linux, el servicio, la conf de nginx y los archivos. Las bases de datos **solo** si las marcas explícitamente. |
| 🩺 **Reconciliación** | Un botón compara lo que dice la base de datos con lo que hay de verdad en el sistema y señala cualquier deriva. |
| 📜 **Logs al instante** | Las últimas líneas del journal de cada app, desde el navegador. |

---

## 📦 Instalación en tu VPS — todos los pasos, uno a uno

### Lo que necesitas

- Un VPS con **Ubuntu Server 24.04** y acceso **root** por SSH (necesitarás su IP).
- Tu ordenador con un terminal (Windows: PowerShell o Git Bash · macOS/Linux: Terminal) y un navegador.
- 10 minutos y un café ☕.

Cada paso indica **dónde** se ejecuta: 🖥️ en tu ordenador · 🐧 dentro del VPS · 🌐 en tu navegador. No te saltes ninguno.

### Paso 1 — 🖥️ Conéctate a tu VPS

```bash
ssh root@IP_DE_TU_VPS
```

Sustituye `IP_DE_TU_VPS` por la IP real. La primera vez te pedirá aceptar la huella del servidor: escribe `yes`. Cuando el prompt cambie, ya estás **dentro del VPS**.

### Paso 2 — 🐧 Lanza el instalador

```bash
curl -fsSL https://simple-panel.ruesdev.es/install.sh | bash
```

Durante la instalación te preguntará un **email para Let's Encrypt** (opcional, pero necesario para emitir certificados HTTPS más adelante): escríbelo y pulsa Enter.

El instalador es **idempotente** (si algo falla, puedes relanzarlo sin miedo) y se encarga de todo:

1. 📥 Descarga el código en `/opt/simplepanel`.
2. 🧰 Instala nginx, PostgreSQL, MariaDB, PHP 8.3-FPM, Node LTS, .NET y Bun.
3. 🔑 Genera la clave maestra de cifrado y la configuración global.
4. 🗃️ Crea la base de datos del panel y aplica el esquema.
5. ⚙️ Arranca los dos servicios: `simplepanel-panel` y `simplepanel-agent`.
6. ✅ Verifica que todo responde antes de despedirse.

Espera al mensaje final `SimplePanel instalado.` con sus ✓.

### Paso 3 — 🐧 Sal del VPS

```bash
exit
```

Vuelves a tu ordenador. (Sí, este paso también cuenta.)

### Paso 4 — 🖥️ Abre el túnel SSH… y déjalo abierto

El panel escucha **solo en `127.0.0.1:9090` del VPS**: no está expuesto a internet, y eso es una decisión de seguridad, no un descuido. Se entra por túnel SSH:

```bash
ssh -L 9090:localhost:9090 root@IP_DE_TU_VPS
```

**Esta ventana debe seguir abierta mientras uses el panel**: es tu puerta de entrada. Si la cierras, el panel dejará de cargar en el navegador (el VPS sigue funcionando; solo se cierra tu túnel).

### Paso 5 — 🌐 Crea tu cuenta de administrador

Con el túnel abierto, visita en tu navegador:

```text
http://localhost:9090/setup
```

Elige usuario y contraseña y pulsa **Crear administrador**. Esta pantalla desaparece para siempre en cuanto existe el primer admin.

> Alternativa por consola (🐧 dentro del VPS): `/opt/simplepanel/bin/simplepanel-create-admin`

### Paso 6 — 🌐 Inicia sesión

```text
http://localhost:9090/login
```

🎉 Ya está. Crea tu primera app, súbele un ZIP y ponle un dominio.

---

## 🧭 Primer paseo

1. **Aplicaciones → Nueva**: elige nombre y runtime (PHP, NODE, BUN o DOTNET).
2. **Desplegar**: sube el ZIP de tu app. Verás el job avanzar paso a paso.
3. **Dominios**: añade `miapp.midominio.com` (con su DNS apuntando a la IP del VPS) y pulsa **SSL** para el certificado.
4. **Bases de datos**: crea una con «crear variables de entorno» marcado y tu app recibe `DATABASE_URL` lista para usar.
5. **Dashboard**: estado de todas las apps, últimos jobs, certificados a punto de caducar y el botón **Reconciliar** para dormir tranquilo.

---

## 🔄 Actualizaciones: solas

SimplePanel se mantiene solo: el agente comprueba cada 24 horas si hay versión nueva y, si la hay, se actualiza — **haciendo antes una copia de seguridad** (un único archivo con el código y el volcado de la base de datos, en `/var/backups/simplepanel/`; se conservan las 5 últimas). Si algo falla a mitad, restaura código y base de datos y todo queda como estaba.

¿Prisa? Botón **"Actualizar ahora"** en el dashboard. ¿Prefieres decidir tú? Desactiva la auto-actualización con un clic en el mismo sitio.

---

## 🔒 Seguridad, en dos palabras: paranoia sana

- El panel corre como usuario sin privilegios y **jamás ejecuta comandos del sistema**; solo el agente (root) toca el servidor, y únicamente para ejecutar jobs de una lista cerrada.
- Cada app vive con su **propio usuario Linux** sin shell, su servicio systemd endurecido y su puerto interno sin publicar.
- Contraseñas con **argon2id**, sesión con cookie firmada, verificación de Origin en cada POST y bloqueo por IP tras 5 intentos fallidos.
- Al firewall solo se asoman los puertos **22, 80 y 443**.

---

## 🛠️ ¿Algo no va?

```bash
# Estado de los servicios del panel
systemctl status simplepanel-panel simplepanel-agent

# Últimas líneas de sus logs
journalctl -u simplepanel-panel -n 50
journalctl -u simplepanel-agent -n 50
```

Cada job fallido guarda su motivo en la interfaz, y «Reintentar» continúa desde el paso exacto en que se quedó.

---

## 🧬 Bajo el capó

| Pieza | Elección |
|---|---|
| Runtime | [Bun](https://bun.sh) + TypeScript |
| Web | SPA en [Preact](https://preactjs.com) sobre una API JSON de [Hono](https://hono.dev). Bundle con el compilador nativo de Bun (sin Vite/Webpack), embebido en el binario. |
| Datos | PostgreSQL con SQL directo. Sin ORM. |
| Proxy y TLS | nginx + certbot |
| Supervisión | systemd + journald |

---

## 📜 Licencia

SimplePanel es **software propietario de código disponible** (*source-available*), **no open source**. Consulta el archivo [`LICENSE`](LICENSE) para el texto completo (bilingüe ES/EN; la versión en español prevalece).

En resumen:

- **Uso gratuito** para cualquiera —empresa, autónomo o particular— con facturación anual del grupo **inferior a 1.000.000 €**. Por encima de ese umbral, el uso requiere una **licencia comercial**.
- **Prohibido modificar, adaptar o revender** la aplicación. Para cambios o adaptaciones, se contratan los servicios del titular.
- **Permitido cobrar por servicios** de instalación, configuración, despliegue o soporte sobre SimplePanel, siempre que no se venda ni redistribuya la aplicación en sí.

Para una licencia comercial o para modificaciones a medida, contacta con el titular (ver `LICENSE`).