# Entorno Ubuntu 24.04, MariaDB y PHP 8.4

Fecha de referencia: 1 de abril de 2026.

Esta guia deja preparado un entorno base para la intranet en Ubuntu 24.04 con:

- Apache 2.4
- MariaDB
- PHP 8.4
- extensiones PHP necesarias para instalador, login LDAP y modulos base

## Alcance

El instalador actual comprueba, como minimo:

- PHP 8.0 o superior
- `PDO` y `pdo_mysql`
- `ldap`
- `json`
- escritura en `common/config.php` o en `common/`
- presencia de `config/intranet_schema.sql`
- presencia de `config/intranet_seed.sql`

Referencia de codigo:

- [`../instalacion/lib.php`](../instalacion/lib.php)

## Paquetes base del sistema

```bash
sudo apt update
sudo apt install -y \
  software-properties-common \
  ca-certificates \
  curl \
  unzip \
  git \
  apache2 \
  mariadb-server
```

## Instalar PHP 8.4

### Opcion practica para desarrollo

```bash
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt install -y \
  php8.4 \
  php8.4-cli \
  php8.4-common \
  php8.4-fpm \
  php8.4-mysql \
  php8.4-ldap \
  php8.4-curl \
  php8.4-mbstring \
  php8.4-xml \
  php8.4-zip \
  php8.4-gd \
  php8.4-intl \
  php8.4-bcmath
```

Notas:

- `json` ya va integrado en PHP
- `php8.4-ldap` es obligatorio para autenticacion AD
- `php8.4-mysql` aporta `pdo_mysql`

### Dejar Apache con PHP-FPM

```bash
sudo a2dismod php8.3 2>/dev/null || true
sudo a2enmod proxy_fcgi setenvif rewrite headers ssl
sudo a2enconf php8.4-fpm
sudo systemctl enable --now php8.4-fpm
sudo systemctl restart apache2
```

## Comprobaciones rapidas de PHP

```bash
php -v
php -m | grep -E 'PDO|pdo_mysql|ldap|json'
systemctl status php8.4-fpm --no-pager
```

## Configurar MariaDB

### Activar y securizar

```bash
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation
```

En entornos serios:

- pon clave al administrador
- elimina usuarios anonimos
- deshabilita login remoto de `root`
- elimina la base de pruebas

### Crear base y usuario de aplicacion

```bash
sudo mariadb
```

```sql
CREATE DATABASE intranet CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'intranet'@'localhost' IDENTIFIED BY 'CAMBIA_ESTA_CLAVE';
GRANT ALL PRIVILEGES ON intranet.* TO 'intranet'@'localhost';
CREATE USER 'intranet'@'127.0.0.1' IDENTIFIED BY 'CAMBIA_ESTA_CLAVE';
GRANT ALL PRIVILEGES ON intranet.* TO 'intranet'@'127.0.0.1';
FLUSH PRIVILEGES;
```

El instalador puede crear base y usuario usando credenciales administrativas, pero sigue siendo util tener este escenario preparado de antemano.

## Desplegar el codigo

Ejemplo:

```bash
sudo mkdir -p /var/www/intranet
sudo chown -R $USER:www-data /var/www/intranet
sudo chmod -R 775 /var/www/intranet
```

Si usas Git:

```bash
cd /var/www
git clone <URL_DEL_REPOSITORIO> intranet
cd intranet
```

Comprueba al menos:

- `config/intranet_schema.sql`
- `config/intranet_seed.sql`
- `instalacion/`
- `common/`
- `docs/`

## VirtualHost de Apache

Ejemplo basico:

```apache
<VirtualHost *:80>
    ServerName intranet.local
    DocumentRoot /var/www/intranet

    <Directory /var/www/intranet>
        AllowOverride All
        Require all granted
    </Directory>

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

Activacion:

```bash
sudo nano /etc/apache2/sites-available/intranet.conf
sudo a2ensite intranet.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
```

Si usas nombre local:

```bash
echo "127.0.0.1 intranet.local" | sudo tee -a /etc/hosts
```

## Permisos y configuracion local

### `common/config.php`

El instalador necesita poder escribir el archivo o la carpeta `common/`.

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

### Configuracion sensible fuera del repo

Para claves del store, publicacion de actualizaciones o ajustes del nucleo, usa:

```bash
sudo mkdir -p /etc/intranet
sudo nano /etc/intranet/intranet-config.php
sudo chmod 640 /etc/intranet/intranet-config.php
sudo chown root:www-data /etc/intranet/intranet-config.php
```

Ejemplo minimo:

```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');
```

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

## Ajustes utiles de PHP

Archivo recomendado:

```bash
sudo nano /etc/php/8.4/fpm/php.ini
```

Valores razonables:

```ini
memory_limit = 256M
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 120
date.timezone = Europe/Madrid
display_errors = On
log_errors = On
```

Despues:

```bash
sudo systemctl restart php8.4-fpm
sudo systemctl reload apache2
```

## Ajustes utiles de MariaDB

Si quieres fijar charset por coherencia:

```bash
sudo nano /etc/mysql/mariadb.conf.d/99-intranet.cnf
```

```ini
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
```

```bash
sudo systemctl restart mariadb
```

## Prueba final del entorno

### Servicios

```bash
systemctl status apache2 --no-pager
systemctl status php8.4-fpm --no-pager
systemctl status mariadb --no-pager
```

### Conexion a MariaDB

```bash
mariadb -u intranet -p -D intranet -e "SELECT VERSION();"
```

### PHP desde Apache

```bash
cat <<'PHP' | sudo tee /var/www/intranet/info.php >/dev/null
<?php phpinfo();
PHP
```

Abre `http://intranet.local/info.php` y luego elimina el archivo:

```bash
sudo rm /var/www/intranet/info.php
```

## Siguiente paso

Con el entorno listo:

1. ejecuta el instalador web
2. valida LDAP o LDAPS
3. revisa `/etc/intranet/intranet-config.php`
4. actualiza la documentacion de `docs/`
5. genera y prueba la build de `core-update`
