# Instalación y despliegue

## 1. Preparación

Requisitos mínimos recomendados para producción:

- PHP 8.2+ con `pdo_mysql`, `mbstring`, `dom`, `gd`, `fileinfo` y `opcache`.
- Composer 2.
- MySQL 8+ o MariaDB compatible con columnas generadas.
- Apache 2.4 o Nginx.
- Certificado HTTPS válido.
- Un dominio o subdominio dedicado, por ejemplo `levantamientos.empresa.mx`.

La raíz pública debe ser siempre `public/`.

## 2. Variables de entorno

```bash
cp .env.example .env
```

Ejemplo de producción:

```dotenv
APP_ENV=production
APP_URL=https://levantamientos.empresa.mx
APP_NAME="Levantamientos CAD"
APP_TIMEZONE=America/Mexico_City
SESSION_SECURE=true
SESSION_NAME=levantamientos_session

DB_DSN="mysql:host=127.0.0.1;port=3306;dbname=levantamientos;charset=utf8mb4"
DB_USER=levantamientos
DB_PASSWORD=una-clave-larga-y-unica

MAX_UPLOAD_MB=15
PDF_ENABLED=true
```

No guardes `.env` en Git ni lo pongas dentro de `public/`.

## 3. Base de datos MySQL/MariaDB

Ejemplo:

```sql
CREATE DATABASE levantamientos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'levantamientos'@'localhost' IDENTIFIED BY 'una-clave-larga-y-unica';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, REFERENCES
ON levantamientos.* TO 'levantamientos'@'localhost';
FLUSH PRIVILEGES;
```

El instalador crea las tablas y el primer usuario administrador:

```bash
composer install --no-dev --optimize-autoloader
php bin/install.php \
  --name="Administrador" \
  --email="admin@empresa.mx" \
  --password="Una-Clave-Larga-2026"
```

Para reemplazar la contraseña de un administrador existente:

```bash
php bin/install.php \
  --name="Administrador" \
  --email="admin@empresa.mx" \
  --password="Nueva-Clave-Larga-2026" \
  --force
```

## 4. Prueba local con SQLite

Requiere `pdo_sqlite`. Usa una ruta absoluta:

```dotenv
APP_ENV=local
APP_URL=http://127.0.0.1:8080
SESSION_SECURE=false
DB_DSN="sqlite:/ruta/absoluta/levantamientos-cad-pwa/storage/app.sqlite"
DB_USER=
DB_PASSWORD=
```

Después:

```bash
php bin/install.php --name="Administrador" --email="admin@local.test" --password="Clave-Local-2026"
php -S 127.0.0.1:8080 -t public
```

SQLite sirve para demostración y desarrollo; MySQL/MariaDB es la opción recomendada para varios usuarios.

## 5. Apache

VirtualHost orientativo:

```apache
<VirtualHost *:443>
    ServerName levantamientos.empresa.mx
    DocumentRoot /var/www/levantamientos-cad-pwa/public

    <Directory /var/www/levantamientos-cad-pwa/public>
        AllowOverride All
        Require all granted
        Options -Indexes
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/levantamientos-error.log
    CustomLog ${APACHE_LOG_DIR}/levantamientos-access.log combined
</VirtualHost>
```

Habilita módulos y reinicia:

```bash
sudo a2enmod rewrite headers expires ssl
sudo systemctl reload apache2
```

## 6. Nginx

Configuración orientativa:

```nginx
server {
    listen 443 ssl http2;
    server_name levantamientos.empresa.mx;
    root /var/www/levantamientos-cad-pwa/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\. {
        deny all;
    }

    client_max_body_size 15m;
}
```

Ajusta el socket a la versión instalada de PHP.

## 7. Permisos

```bash
sudo chown -R www-data:www-data storage
sudo find storage -type d -exec chmod 750 {} \;
sudo find storage -type f -exec chmod 640 {} \;
```

El código puede ser de solo lectura para el usuario web. `storage/` necesita escritura.

## 8. Docker

El paquete incluye `Dockerfile` y `docker-compose.yml`:

```bash
cp .env.example .env
docker compose up -d --build
docker compose exec app php bin/install.php \
  --name="Administrador" \
  --email="admin@empresa.mx" \
  --password="Cambiar-Esta-Clave-2026"
```

La configuración incluida publica la aplicación en `http://localhost:8080` y usa MariaDB. Para producción, coloca un proxy HTTPS delante del contenedor y cambia contraseñas, puertos y volúmenes.

## 9. PWA e instalación en tablet

En producción usa HTTPS. Abre el sitio en Chrome/Edge Android o Safari en iPadOS, inicia sesión y usa la opción del navegador para agregarlo a la pantalla de inicio.

Prueba estos puntos en cada modelo de tablet:

1. reconocimiento de pluma;
2. rechazo de palma;
3. paneo con dedo en modo Solo pluma;
4. zoom con dos dedos;
5. teclado numérico y orientación horizontal;
6. apertura de DXF/PDF descargados;
7. pérdida y recuperación de internet.

## 10. PDF

Dompdf se instala con Composer. Si no está disponible, la aplicación mantiene una vista HTML imprimible, pero el endpoint de PDF mostrará un error explícito.

## 11. Respaldos

Respalda diariamente:

- base de datos;
- directorio `storage/`;
- archivo `.env` mediante un mecanismo seguro;
- versión desplegada del código.

Ejemplo MySQL:

```bash
mysqldump --single-transaction --routines --triggers levantamientos | gzip > levantamientos-$(date +%F).sql.gz
```

Realiza una restauración de prueba al menos trimestralmente.

## 12. Actualización

```bash
git pull
composer install --no-dev --optimize-autoloader
php bin/test.php
sudo systemctl reload php8.3-fpm   # si aplica
```

Antes de actualizar producción, prueba exportación DXF, PDF y un levantamiento completo en staging.
