# Instalacion de la intranet en Ubuntu

Fecha de referencia: 1 de abril de 2026.

Esta guia describe la instalacion actual del nucleo en un servidor Ubuntu ya preparado. La referencia de entorno base es [entorno-ubuntu-24-mariadb-php84.md](./entorno-ubuntu-24-mariadb-php84.md).

## Alcance

El instalador web actual:

- comprueba requisitos tecnicos del servidor
- recoge la marca y el ambito de la intranet
- configura la base de datos
- permite elegir `LDAP` o `LDAPS`
- instala o prepara la CA si usas `LDAPS`
- prueba la conexion LDAP
- crea esquema y datos base
- genera `common/config.php`
- genera `styles/css/theme-vars.css`
- crea `config/installed.lock`

Codigo relacionado:

- [`../instalacion/index.php`](../instalacion/index.php)
- [`../instalacion/lib.php`](../instalacion/lib.php)
- [`../common/config.php`](../common/config.php)

## Requisitos previos

Antes de abrir `/instalacion/`, verifica:

- Apache operativo
- PHP con `pdo_mysql`, `ldap` y `json`
- MariaDB operativo
- codigo desplegado en la ruta definitiva
- permisos de escritura sobre `common/`
- existencia de `config/intranet_schema.sql` y `config/intranet_seed.sql`

Comprobacion rapida:

```bash
cd /var/www/intranet
php -v
php -m | grep -E 'PDO|pdo_mysql|ldap|json'
test -f config/intranet_schema.sql && echo "schema OK"
test -f config/intranet_seed.sql && echo "seed OK"
test -w common && echo "common escribible"
```

## URL del instalador

Accede a:

- `http://intranet.local/instalacion/`

o a la URL equivalente del servidor.

Notas:

- fuera de `localhost` y `127.0.0.1`, el instalador fuerza HTTPS
- si usas dominio propio, conviene tener TLS bien resuelto antes de empezar
- si existe `config/installed.lock`, el instalador se bloquea hasta que lo elimines manualmente

## Flujo actual del instalador

## Paso 1. Marca, ambito y comprobaciones

En el primer paso se validan requisitos y se guardan los datos base de branding:

- `site_name`
- `organization_name`
- `territory_name`
- `unit_name`
- `website_url`
- `welcome_entity`

Estos valores terminan reflejados en `common/config.php` como constantes y helpers tipo:

- `INTRANET_SITE_NAME`
- `INTRANET_ORGANIZATION_NAME`
- `INTRANET_TERRITORY_NAME`
- `INTRANET_UNIT_NAME`
- `INTRANET_WEBSITE_URL`
- `INTRANET_WELCOME_ENTITY`
- `intranet_site_name()`
- `intranet_brand_name()`
- `intranet_website_url()`

## Paso 2. Base de datos

El instalador pide al menos:

- `DB_HOST`
- `DB_PORT`
- `DB_NAME`
- `DB_USER`
- `DB_PASS`

Y puede usar credenciales administrativas para:

- crear la base de datos si no existe
- crear el usuario si no existe
- conceder permisos al usuario de aplicacion

## Paso 3. Tipo de conexion LDAP

Puedes elegir entre:

- `LDAP`
- `LDAPS`

Recomendacion:

- `LDAP` solo para laboratorios o pruebas controladas
- `LDAPS` para entornos serios, siempre que el servidor confie en la CA del dominio

## Paso 4. Certificado de CA para LDAPS

Este paso solo aparece si en el paso anterior elegiste `LDAPS`.

El instalador permite:

- subir un certificado `.crt`, `.cer` o `.pem`
- validarlo como X.509
- convertirlo a PEM si hace falta
- intentar copiarlo a `/usr/local/share/ca-certificates/`
- ejecutar `update-ca-certificates`

Si la parte automatica falla por permisos, deja el certificado preparado para que el administrador complete el proceso manualmente.

Ejemplo manual:

```bash
sudo cp mi-ca.crt /usr/local/share/ca-certificates/intranet-ldaps-ca.crt
sudo update-ca-certificates
```

## Paso 5. Configuracion LDAP o LDAPS

Se introducen:

- servidor LDAP o LDAPS
- dominio LDAP
- base DN
- bind DN tecnico
- password del bind

Ejemplo:

```text
Servidor: ldaps://dc01.midominio.local:636
Dominio: midominio
Base DN: DC=midominio,DC=local
Bind DN: CN=tecnico,CN=Users,DC=midominio,DC=local
```

Antes de continuar, usa la prueba integrada de LDAP. El instalador:

1. valida la URL
2. prueba conectividad TCP
3. hace `ldap_connect`
4. intenta `bind`
5. lanza una busqueda minima sobre la base DN

## Paso 6. Tema y logos

En el ultimo paso se suben:

- logo principal `logo.png`
- logo claro `logob.png`

Y se genera:

- `styles/css/theme-vars.css`
- `styles/images/logo.png`
- `styles/images/logob.png`

## Que deja generado

### `common/config.php`

El instalador genera un `common/config.php` operativo con:

- constantes de base de datos
- constantes LDAP
- constantes de marca y ambito
- lista de rutas de override externas

El orden actual de override es:

1. `/etc/intranet/intranet-config.php`
2. `/etc/csif/intranet-config.php`

### `styles/css/theme-vars.css`

Se genera con los colores del tema elegidos en el instalador.

### `config/installed.lock`

Bloquea nuevas instalaciones accidentales.

Si necesitas reinstalar en un entorno controlado:

```bash
rm /var/www/intranet/config/installed.lock
```

## Configuracion sensible fuera del repositorio

Despues de instalar, deja la configuracion sensible del nucleo en:

- `/etc/intranet/intranet-config.php`

La ruta legacy `/etc/csif/intranet-config.php` sigue siendo valida como fallback, pero la recomendada para nuevas instalaciones es la generica.

Ejemplo:

```php
<?php

define('CORE_UPDATE_BUILD_ENABLED', true);
define('PLUGIN_STORE_BASE_URL', 'https://sede.example.org/plugin-store/');
define('PLUGIN_STORE_PUBLISH_URL', 'https://sede.example.org/plugin-store/api/publish-core-update.php');
define('PLUGIN_STORE_PUBLISH_TOKEN', 'AQUI_EL_TOKEN_REAL');
```

## Verificacion posterior

### Archivos

```bash
ls -l /var/www/intranet/common/config.php
ls -l /var/www/intranet/config/installed.lock
ls -l /var/www/intranet/styles/css/theme-vars.css
```

### PHP

```bash
php -l /var/www/intranet/common/config.php
```

### Base de datos

```bash
mariadb -u intranet -p -D intranet -e "SHOW TABLES;"
```

### Aplicacion

Prueba:

- `login.php`
- `dashboard.php`

Y revisa:

- login LDAP
- carga del dashboard
- nombre visible de la intranet
- logos y tema

## Endurecimiento minimo tras instalar

Cuando la instalacion haya terminado:

- reduce permisos de escritura en `common/`
- elimina `info.php` si lo usaste
- borra o bloquea `instalacion/`

Ejemplo:

```bash
sudo chmod 640 /var/www/intranet/common/config.php
sudo chown www-data:www-data /var/www/intranet/common/config.php
```

## Problemas habituales

### Falta `ldap` en PHP

```bash
sudo apt install -y php8.4-ldap
sudo systemctl restart php8.4-fpm
sudo systemctl reload apache2
```

### No puede escribir `common/config.php`

```bash
sudo chgrp -R www-data /var/www/intranet/common
sudo chmod -R 775 /var/www/intranet/common
```

### LDAPS falla por certificado

Revisa:

- CA instalada
- uso de FQDN y no IP
- validez del certificado del DC

### Redireccion HTTPS con bucle

Revisa:

- configuracion TLS en Apache
- `HTTP_X_FORWARDED_PROTO` si hay proxy inverso

## Flujo recomendado despues de instalar

1. validar login y navegacion base
2. revisar la documentacion de `docs/`
3. generar la build de `core-update`
4. subir a preproduccion
5. validar actualizacion y plugins
