Buenos enfoques para empaquetar aplicaciones web PHP para Debian

15

Muchas aplicaciones web PHP siguen este modelo para la instalación y actualización:

  1. Libere una bola de alquitrán de origen.
  2. Apunte Apache a la fuente.
  3. Navegue por un navegador web a la página de inicio.
  4. Visite varias páginas web de configuración (por ejemplo, verifica la existencia de bibliotecas, solicita información de conexión de la base de datos, crea o actualiza el esquema de la base de datos, etc.).
  5. El usuario cambia el nombre de un install/directorio a otra cosa para que la aplicación sepa que se ha instalado.

No veo ninguna forma (simple) de crear un paquete Debian a partir de esto sin hacer que el usuario que instala el paquete siga muchos de los pasos manuales anteriores. Tenga en cuenta que no soy desarrollador de la aplicación, por lo que no estoy en condiciones de realizar cambios directos en el funcionamiento de la instalación de la aplicación.

¿Cuál es el enfoque típico para empaquetar una aplicación de este tipo?

rlandster
fuente
1
No estoy seguro de lo que quiere decir con paquete Debian, pero ¿ha investigado Composer? getcomposer.org
CamelBlues

Respuestas:

19

He creado varias aplicaciones web PHP que distribuyo (internamente) a través de paquetes Debian. Hacerlo ha sido sencillo gracias a los scripts (simplificados aquí) para automatizar el proceso:

create_package.sh :

# create a clean debian package directory
rm -rf debian
mkdir -p debian/DEBIAN
mkdir -p debian/var/www/myapp

# populate the debian directory
cp control    debian/DEBIAN
cp myapp.php  debian/var/www/myapp
cp index.html debian/var/www/myapp

# finish through fakeroot so we can adjust ownerships without needing to be root    
fakeroot ./finish_package.sh debian .

finish_package.sh :

# $1 is the debian directory, $2 is the output directory

# adjust ownerships
chown -R root:root $1
chown -R nobody:nobody $1/var/www/myapp

# finally build the package
dpkg-deb --build $1 $2

control :

Package: myapp
Version: 1.2.3
Maintainer: Your Name <[email protected]>
Architecture: all
Depends: apache2, php5
Description: The myapp web application.

Todo esto es bastante fácil de hacer y funciona bien para la distribución interna de paquetes que hago. No estoy seguro de que sea suficiente para la distribución global, pero podría ser similar a lo que hacen las personas Ubuntu y Debian cuando toman paquetes fuente (probablemente distribuidos como tarballs con scripts de instalación) y crean paquetes .deb para ellos.

Creo que esto puede abordar sus cinco puntos sin problemas:

  1. El paquete Debian se descomprime automáticamente en el lugar adecuado en el sistema de destino cuando se instala.

  2. Puede hacer que el paquete Debian configure Apache automáticamente. Algunos paquetes como MySQL y Apache tienen directorios "conf.d" en / etc en los que puede colocar archivos de configuración. Este es el ideal. Su script de empaquetado puede crear un directorio debian / etc / apache2 / conf.d y copiar un archivo de configuración allí. Se instalará en el sistema de destino, y puede reiniciar Apache en un script llamado postinst que coloque en debian / DEBIAN.

  3. Esto probablemente sea inevitable si se debe ingresar información personalizada, aunque muchos prefieren sistemas que pueden ejecutarse "fuera de la caja" sin necesidad de configuración.

  4. La existencia de la biblioteca se puede garantizar mediante la inclusión de las dependencias de paquete apropiadas en el archivo de control. La información de conexión de la base de datos se puede instalar de manera predeterminada o solicitar al administrador en las páginas de configuración. Una vez ingresadas, las páginas de configuración deben invocar scripts de migración de base de datos idempotentes para actualizar el esquema de la base de datos. Varios marcos web (como Django) facilitan esta tarea.

  5. El código detrás de las páginas de configuración debe marcar el sistema como configurado, no el administrador.

Un enfoque que a veces uso es separar la instalación de la configuración de la instalación de la aplicación al hacerlos paquetes separados. Entonces puedo tener varios paquetes de configuración diferentes (versión, desarrollo, etc.) que puedo instalar a voluntad. Este desacoplamiento también es ventajoso porque la configuración y la aplicación pueden evolucionar por separado, sin chocarse entre sí cuando se reinstalan.

Randall Cook
fuente