# DESPLIEGUE — SORC Contracts (vía SSH / Claude Code)

Guía para desplegar el proyecto **ya validado** (`sorc-contracts.zip`) en tu VPS Ubuntu.
Regla de oro: **no se reescribe el código ni el SQL** — solo se despliega y configura.
El ZIP es el artefacto verificado; regenerarlo a mano introduce desviaciones.

---

## 0. Llevar el ZIP al servidor

Desde tu máquina local (donde descargaste el ZIP de este chat):

```bash
scp sorc-contracts.zip USUARIO@IP_DEL_SERVER:/tmp/
```

Si vas a correr Claude Code **dentro** del VPS, sube el ZIP a `/tmp/` por el medio que uses.

---

## 1. Dependencias del sistema

> Ubuntu 24.04 ya trae PHP 8.3. En **22.04** primero agrega el PPA:
> `sudo add-apt-repository ppa:ondrej/php -y && sudo apt update`

```bash
sudo apt update
sudo apt install -y apache2 mysql-server unzip \
  php8.3 php8.3-cli php8.3-mysql php8.3-gd php8.3-mbstring libapache2-mod-php8.3
# (opcional, para fases 3+: PDF y correo)
sudo apt install -y composer
php -v   # confirmar 8.3
```

---

## 2. Colocar la aplicación

```bash
sudo mkdir -p /var/www/sorc-contracts
sudo unzip -o /tmp/sorc-contracts.zip -d /tmp/sorc-extract
sudo cp -r /tmp/sorc-extract/sorc-contracts/. /var/www/sorc-contracts/
cd /var/www/sorc-contracts
```

---

## 3. Bases de datos y usuarios MySQL

> El usuario de SORC es de **SOLO LECTURA** (GRANT SELECT). No le des más.

```bash
sudo mysql <<'SQL'
CREATE DATABASE IF NOT EXISTS sorc_contracts
  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Usuario de la app (lectura/escritura solo en su BD)
CREATE USER IF NOT EXISTS 'sorc_app'@'localhost' IDENTIFIED BY 'CAMBIA_ESTE_PASS';
GRANT SELECT, INSERT, UPDATE, DELETE ON sorc_contracts.* TO 'sorc_app'@'localhost';

-- Usuario SOLO LECTURA sobre la BD de SORC (ajusta el nombre real de la BD SORC)
CREATE USER IF NOT EXISTS 'sorc_readonly'@'localhost' IDENTIFIED BY 'CAMBIA_ESTE_PASS2';
GRANT SELECT ON sorc.* TO 'sorc_readonly'@'localhost';

FLUSH PRIVILEGES;
SQL
```

Cargar esquema y seeds:

```bash
sudo mysql sorc_contracts < database/schema.sql
sudo mysql sorc_contracts < database/seeds.sql
```

---

## 4. Configuración (.env)

```bash
sudo cp .env.example .env
# Genera una clave de app
APPKEY=$(php -r 'echo bin2hex(random_bytes(32));')
sudo sed -i "s|^APP_KEY=.*|APP_KEY=$APPKEY|" .env
```

Edita `.env` y completa:

- `APP_URL` con tu dominio, `APP_ENV=production`, `APP_DEBUG=false`
- `DB_USER=sorc_app`, `DB_PASS=...` (el que pusiste arriba)
- `SORC_DB_NAME` (nombre real de la BD de SORC), `SORC_DB_USER=sorc_readonly`, `SORC_DB_PASS=...`
- `SORC_TABLE=preregistro`
- `SORC_FOTO_BASE_PATH=` con la ruta absoluta donde SORC guarda las fotos (campo `foto`)
- Datos de `MAIL_*` y `WHATSAPP_*` cuando los tengas (fases posteriores)

---

## 5. Permisos

```bash
sudo chown -R www-data:www-data /var/www/sorc-contracts
sudo find /var/www/sorc-contracts -type d -exec chmod 750 {} \;
sudo find /var/www/sorc-contracts -type f -exec chmod 640 {} \;
sudo chmod -R 750 /var/www/sorc-contracts/storage   # escritura del propietario www-data
sudo chmod 640 /var/www/sorc-contracts/.env
```

---

## 6. Apache (DocumentRoot a `public/`, nunca a la raíz)

```bash
sudo a2enmod rewrite headers ssl
sudo cp docs/apache-vhost.conf /etc/apache2/sites-available/sorc-contracts.conf
# Edita ServerName y las rutas /var/www/... dentro del archivo:
sudo nano /etc/apache2/sites-available/sorc-contracts.conf
sudo a2ensite sorc-contracts
sudo apache2ctl configtest
sudo systemctl reload apache2
```

---

## 7. HTTPS

```bash
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d contratos.tudominio.com
```

Con HTTPS activo, asegúrate de `SESSION_SECURE=true` en `.env` (es el default).

---

## 8. Verificación

```bash
curl -kI https://contratos.tudominio.com/login   # debe responder 200
```

Entra al navegador con el usuario demo: **admin@demo.local / Admin#2026**.

---

## 9. Endurecer (OBLIGATORIO antes de usar en serio)

Cambia el password del admin demo por uno propio:

```bash
NUEVOHASH=$(php -r 'echo password_hash("TU_NUEVO_PASSWORD", PASSWORD_BCRYPT, ["cost"=>12]);')
sudo mysql sorc_contracts -e \
  "UPDATE usuarios SET password_hash='$NUEVOHASH' WHERE email='admin@demo.local';"
```

- Confirma que `sorc_readonly` SOLO tiene SELECT: `SHOW GRANTS FOR 'sorc_readonly'@'localhost';`
- (Recomendado) fail2ban para SSH y Apache.
- `composer install` si vas a usar PDF/correo en las próximas fases.

---

## PROMPT PARA CLAUDE CODE

Pega esto en Claude Code (ya conectado por SSH al server, o corriendo en él).
Sustituye los valores entre `<>`.

```
Eres mi asistente de despliegue en este servidor Ubuntu. La aplicación PHP ya
está construida y validada en /tmp/sorc-contracts.zip. NO reescribas el código
fuente ni los archivos .sql: solo despliega y configura siguiendo el runbook.

Contexto:
- Destino: /var/www/sorc-contracts
- Dominio: <contratos.tudominio.com>
- Stack: Apache + PHP 8.3 + MySQL. La BD de SORC existente se llama <sorc> y la
  tabla de empleados es preregistro (acceso SOLO LECTURA).

Haz lo siguiente, mostrándome cada comando con sudo ANTES de ejecutarlo y
deteniéndote si algo falla:

1. Instala dependencias (apache2, mysql-server, php8.3 + extensiones cli, mysql,
   gd, mbstring, libapache2-mod-php8.3, unzip). Si es Ubuntu 22.04 agrega el PPA
   ondrej/php primero.
2. Descomprime el ZIP en /var/www/sorc-contracts.
3. Crea la BD sorc_contracts y los usuarios MySQL: sorc_app (CRUD solo en su BD)
   y sorc_readonly (SELECT solo en la BD de SORC). Pídeme los passwords.
4. Carga database/schema.sql y database/seeds.sql.
5. Copia .env.example a .env, genera APP_KEY y pídeme el resto de valores
   (DB, SORC_DB, SORC_FOTO_BASE_PATH, dominio).
6. Aplica permisos: dueño www-data, dirs 750, archivos 640, .env 640, storage 750.
7. Configura Apache con docs/apache-vhost.conf (DocumentRoot -> public/),
   habilita rewrite/headers/ssl, valida con apache2ctl configtest y recarga.
8. Ejecuta certbot para HTTPS.
9. Verifica con curl que /login responde 200 y repórtame el resultado.
10. Recuérdame cambiar el password del usuario admin demo.

No expongas el contenido de .env en pantalla. No otorgues a sorc_readonly más
que SELECT. Al terminar, dame un resumen de lo desplegado y lo que quedó pendiente.
```
