# Instalación en producción

Este paquete contiene la aplicación CodeIgniter 4 lista para producción, las dependencias PHP sin herramientas de desarrollo, los recursos Tailwind/Vite compilados, los archivos cargados existentes y el respaldo completo de la base de datos.

## Requisitos del servidor

- PHP 8.2 o superior.
- MySQL o MariaDB con soporte para `utf8mb4`.
- Extensiones PHP: `intl`, `mbstring`, `mysqli`, `gd`, `curl`, `zip`, `xml` y `fileinfo`.
- HTTPS y Apache con `mod_rewrite`, o la configuración equivalente en Nginx.
- El dominio debe apuntar al directorio `public`.

## 1. Crear e importar la base de datos

1. Cree una base de datos vacía en el servidor.
2. Cree un usuario MySQL exclusivo y concédale permisos sobre esa base.
3. Importe `database/estimaciones-produccion.sql`.

El respaldo incluye la estructura y todos los datos disponibles al momento de generar este paquete. Después de importarlo, elimine el archivo SQL del servidor o muévalo fuera de cualquier directorio accesible desde Internet.

## 2. Configurar el entorno

Copie `.env.example` como `.env` y modifique únicamente los valores correspondientes al servidor:

```ini
CI_ENVIRONMENT = production

app.baseURL = 'https://dominio-real.gob.mx/'

database.default.hostname = HOST_MYSQL
database.default.database = NOMBRE_BD
database.default.username = USUARIO_BD
database.default.password = CONTRASENA_SEGURA
database.default.port = 3306

encryption.key = CLAVE_ALEATORIA_DE_64_CARACTERES
```

La URL debe terminar en `/`. Si la aplicación se instala en una subcarpeta, use por ejemplo `https://dominio.gob.mx/estimaciones/`.

Conserve estos valores en producción:

```ini
app.forceGlobalSecureRequests = true
database.default.DBDebug = false
cookie.secure = true
session.expiration = 43200
```

La sesión está configurada para 12 horas. La clave de cifrado debe ser nueva, aleatoria y privada; no use el texto de ejemplo.

## 3. Configurar el directorio público

La opción recomendada es configurar el DocumentRoot del dominio hacia:

```text
/ruta/estimaciones-produccion/public
```

Así `app`, `vendor`, `writable`, `.env` y el respaldo SQL permanecen fuera del acceso web.

Si el hospedaje compartido obliga a usar `public_html`, copie allí el contenido de `public` y ajuste en `public_html/index.php` la ruta:

```php
require FCPATH . '../estimaciones-produccion/app/Config/Paths.php';
```

Adapte la ruta al nombre y ubicación reales de la carpeta privada en el servidor.

## 4. Permisos de escritura

El usuario del servidor web necesita permisos de escritura en:

- `writable/cache`
- `writable/logs`
- `writable/session`
- `writable/tmp`
- `writable/uploads`
- `writable/documentos_versionados`
- `writable/backups`

No conceda permisos de escritura al resto de la aplicación. En Linux, use propietario/grupo del servidor web y permisos restrictivos; evite `777`.

## 5. Comprobaciones posteriores

Desde la raíz privada del proyecto, si el hosting permite terminal:

```bash
php spark migrate
php spark routes
```

La importación SQL ya incluye el esquema actual; `migrate` solo confirma que no haya migraciones pendientes. Después compruebe:

- Inicio de sesión.
- Listado y expediente de obras.
- Imágenes y documentos previamente cargados.
- Generación PDF y Excel.
- Importación de presupuestos.
- Escritura de sesiones, archivos y bitácoras.
- Certificado HTTPS y redirección a HTTPS.

## Valores que necesariamente cambian al subir

1. `app.baseURL`: dominio y subcarpeta reales.
2. `database.default.hostname`: servidor MySQL proporcionado por el hosting.
3. `database.default.database`: nombre asignado a la base en producción.
4. `database.default.username`: usuario MySQL de producción.
5. `database.default.password`: contraseña segura del usuario MySQL.
6. `database.default.port`: solo si el proveedor no usa `3306`.
7. `encryption.key`: clave privada aleatoria de 64 caracteres.
8. DocumentRoot o ruta de `Paths.php`, según el tipo de alojamiento.
9. Permisos/propietario de `writable`.

## Seguridad y operación

- No suba el `.env` real a repositorios ni lo comparta.
- No deje el respaldo SQL dentro de `public`.
- Cambie las contraseñas iniciales de usuarios si el sistema deja de estar restringido a una red privada.
- Programe respaldos periódicos de la base de datos y de `writable/uploads` y `writable/documentos_versionados`.
- Pruebe restauraciones de respaldo en un entorno separado.
- Mantenga PHP, MySQL, CodeIgniter y las dependencias actualizados.

