Tengo varias aplicaciones desplegadas de forma "tradicional", es decir, con su PHP en paquetería de la distribución, en mi caso Debian 12.
Tradicionalmente Debian ha sido bastante conservadora con las versiones de las aplicaciones y librerías que proporciona en sus repositorios estables. En general esto no es un problema y más ahora con la transición a contenedores pero en algunos casos nos podemos encontrar con versiones que no cumplen los mínimos requeridos por las aplicaciones.
Tengo varias instancias de Drupal 10 instaladas y estaba viendo cómo migrar a la versión 11. También tengo una instancia de Drupal 7 a extinguir que todavía está operativa. En este caso está actualizada a la última revisión 103 que lo único que añade es compatibilidad con PHP 8.3.
A grandes rasgos no tiene mucha dificultad pero Drupal 11 requiere PHP 8.3 y la versión instalada en Debian 12 es la 8.2.
En mi caso Debian está instalado en un contenedor LXC en Proxmox pero los pasos para actualizar la versión son igualmente aplicables a instalaciones en una VM o en una máquina física.
Pasos previos
En general no debería haber problemas al actualizar pero teniendo la instalación en un contenedor sería recomendable hacer un snapshot o un backup por si tenemos que restaurar la configuración anterior.
También es interesante guardar una lista de referencia de los paquetes relacionados con PHP que tenemos instalados en la máquina. Para ello ejecutaremos:
dpkg -l | grep php | tee packages.txt
Esta lista la utilizaremos de referencia para saber qué paquetes actualizados debemos instalar.
Añadir nuevo repositorio
Una posible opción para actualizar sería cambiar de la versión de Debian stable a testing pero al necesitar sólo un paquete no lo veo necesario.
La forma más sencilla es añadir un repositorio de terceros, en este caso el de Ondřej Surý que mantiene versiones actualizadas de PHP para Debian y Ubuntu. Necesitaremos instalar previamente algunas dependencias y la clave pública del repositorio.
En los ejemplos utilizaremos sudo pero Debian en este aspecto no es igual que Ubuntu, aquí podemos ver las diferencias.
Ejecutaremos en el terminal:
# sudo apt install apt-transport-https curl
# sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
# sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
# sudo apt update
Instalar los paquetes actualizados
Al ser un repositorio diferente no nos actualizará automáticamente los paquetes a la nueva versión. Podríamos incluso mantener la 8.2 y 8.3 simultáneamente en la máquina pero salvo alguna necesidad concreta yo no lo recomiendo.
Los paquetes dependerán de nuestra configuración actual pero como base podemos empezar ejecutando:
sudo apt install php8.3-common php8.3-cli php8.3-fpm php8.3-{curl,bz2,mbstring,intl}
Los paquetes restantes los instalaremos como cualquier otro, por ejemplo:
apt install php8.3-calendar
Configuración del servidor web
En este paso los pasos a seguir variarán según la configuración que tengamos en la máquina. En mi caso utilizo nginx y php-fpm así que será lo que explicaré.
La instalación base de PHP 8.3 creará un socket en /run/php/php8.3-fpm.sock. A este socket es el que deberemos apuntar la directiva fastcgi_pass en nuestra configuración de nginx.
También podríamos utilizar el sistema de alternativas de Debian para configurar la versión de PHP por defecto.
Podemos ver la configuración actual de PHP con el siguiente comando:
update-alternatives --display php
Haciendo un reload del servicio nginx debería ser suficiente para que se llame a la versión nueva.
Migrar archivos de configuración
Los ficheros por defecto de la nueva configuración se habrán creado en /etc/php8.3.
Aquí tenemos dos opciones, copiar la configuración antigua y cruzar los dedos. En general si no tenemos ningún cambio importante esta opción debería ser bastante segura. En cualquier caso deberíamos revisar los cambios de la nueva versión antes.
La forma más segura y ortodoxa sería hacer un diff de la configuración nueva por defecto y la antigua y hacer un merge razonado entre las dos.
Eliminar la versión antigua
Si no queremos conservar la versión 8.2 ejecutaremos el siguiente comando:
sudo apt purge php8.2*
Más info
Puedes ampliar la información en el siguiente artículo.
Comentarios