septembre
2010
Dans cet article, on va créer un package Debian pour une application Django.
Le package va être responsable pour:
- Installer l’application
- Configurer le serveur web (dans notre cas: Lighttpd + fastcgi)
- Script init.d pour démarrer/arrêter le serveur Django
On va utiliser une template debconf pour demander 1 question à l’utilisateur. Cela va rendre le package plus dynamique..
On présume que l’application Django se trouve dans /usr/share/djangoapp . C’est là où se trouve settings.py, manage.py, views.py etc…
Tout d’abord, on crée un dossier debian et on copie le dossier de l’application Django dedans.
mkdir ./debian mkdir -p ./debian/usr/share/ cp -r /usr/share/djangoapp ./debian/usr/share/
On a également besoin de créer un dossier DEBIAN dans debian/
mkdir ./debian/DEBIAN
Fichiers dans DEBIAN
Ce dossier doit contenir les fichiers suivants:
- control
- config
- conffiles
- templates
- postinst
- postrm
- preinst
- prerm
control
C’est le fichier le plus important dans un package Debian. Ce fichier défini le package et ses dépendances. Il contient dans notre cas le texte suivant:
Package: djangoapp Version: 0.1-1 Section: devel Priority: optional Architecture: all Depends: python, python-django, python-flup, debconf, lighttpd Maintainer: Laurent Luce Description: short description long description
Le paramètre « depends » est une liste de packages dont depends notre package.
config
config est un script demandant des questions à l’utilisateur avant que le package soit installé. On demande une seule question dans notre exemple:
#!/bin/sh -e # Source debconf library. . /usr/share/debconf/confmodule # votre nom ? db_input critical djangoapp/username || true db_go
On a besoin d’inclure le module debconf. Notre question est de type ‘critical’.
Mais où est la définition de notre question ? Elle est défini dans le fichier templates
templates
Template: djangoapp/username Type: string Description: Username: Ce package nécessite votre nom
conffiles
Ce fichier contient les fichiers de configuration généralement localisés dans /etc . Nous ajoutons le fichier de lancement de Django.
/etc/init.d/django
preinst
Ce script est executé avant l’installation du package.
#!/bin/bash set -e # stop le serveur Django if [ -f /etc/init.d/django ] then invoke-rc.d django stop fi
postinst
Ce script est executé après l’installation du package.
#!/bin/sh set -e # Source debconf library. . /usr/share/debconf/confmodule db_get djangoapp/username username="$RET" # utiliser le nom de l'utilisateur comme bon vous semble # enregistrer Django update-rc.d django defaults 90 >/dev/null # démarrer Django invoke-rc.d django start db_stop
postrm
Ce script est executé après que le package soit désinstallé.
#!/bin/bash set -e if [ "$1" = "purge" -a -e /usr/share/debconf/confmodule ]; then # Source debconf library. . /usr/share/debconf/confmodule # Supprimer mes changements dans la base de données db_purge fi if [ "$1" = "remove" ]; then # Source debconf library. . /usr/share/debconf/confmodule # Supprimer le script de lancement de Django update-rc.d -f django remove # Supprimer mes changements dans la base de données db_purge fi
prerm
Ce script est exécuté avant la désinstallation du package
#!/bin/bash set -e # stop django server invoke-rc.d django stop
Configuration du serveur web
On a besoin de modifier le fichier de configuration de lighttpd: lighttpd.conf:
mod_fastcgi doit être ajouté à la liste des modules du serveur.
le serveur Django écoute sur le port 3033:
fastcgi.server = ( "/djangoapp.fcgi" => ( "main" => ( # Use host / port instead of socket for TCP fastcgi "host" => "127.0.0.1", "port" => 3033, "check-local" => "disable", )) )
Script Django init.d
C’est le moment d’ajouter notre script de lancement pour Django:
#! /bin/sh ### BEGIN INIT INFO # Provides: FastCGI servers for Django # Required-Start: networking # Required-Stop: networking # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Django FastCGI # DJANGO_SITE="djangoapp" SITE_PATH=/var/www RUNFILES_PATH=$SITES_PATH/tmp HOST=127.0.0.1 PORT_START=3033 RUN_AS=www-data set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="Django FastCGI" NAME=$0 SCRIPTNAME=/etc/init.d/$NAME # # Function that starts the daemon/service. # d_start() { # Starting all Django FastCGI processes echo -n ", $DJANGO_SITE" if [ -f $RUNFILES_PATH/$DJANGO_SITE.pid ]; then echo -n " already running" else start-stop-daemon --start --quiet \ --pidfile $RUNFILES_PATH/$DJANGO_SITE.pid \ --chuid $RUN_AS --exec /usr/bin/env -- python \ $SITE_PATH/$DJANGO_SITE/manage.py runfcgi \ host=$HOST port=$PORT \ pidfile=$RUNFILES_PATH/$DJANGO_SITE.pid fi } # # Function that stops the daemon/service. # d_stop() { # Killing all Django FastCGI processes running echo -n ", $DJANGO_SITE" start-stop-daemon --stop --quiet --pidfile $RUNFILES_PATH/$SITE.pid \ || echo -n " not running" if [ -f $RUNFILES_PATH/$DJANGO_SITE.pid ]; then rm $RUNFILES_PATH/$DJANGO_SITE.pid fi } ACTION="$1" case "$ACTION" in start) echo -n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" d_stop echo "." ;; restart|force-reload) echo -n "Restarting $DESC: $NAME" d_stop sleep 1 d_start echo "." ;; *) echo "Usage: $NAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac exit 0
Le script doit être placé dans ./debian/etc/init.d/
On a besoin de créer un lien de /var/www/djangoapp vers /usr/share/djangoapp
changelog, changelog.Debian et copyright
Ces fichiers sont nécessaires pour notre package:
changelog
djangoapp (0.1-1) unstable; urgency=low * Initial release. + Initial package -- Laurent Luce Fri, 01 Jan 2010 00:00:00 +0000
Dans notre cas, changelog.Debian contient la même chose que changelog.
copyright
DjangoApp Copyright: bla bla 2010-01-01 The home page of xxx is at: http://www.xxx.com Copyright xxx 2010
On doit placer ces fichiers proprement:
mkdir -p ./debian/usr/share/doc/djangoapp cp changelog changelog.Debian copyright ./debian/usr/share/doc/djangoapp/ gzip --best ./debian/usr/share/doc/djangoapp/changelog gzip --best ./debian/usr/share/doc/djangoapp/changelog.Debian
Construction du package
On doit régler les permissions:
find ./debian -type d | xargs chmod 755
On construit le package et on le vérifie de cette manière:
fakeroot dpkg-deb --build debian mv debian.deb DjangoApp_0.1-1_all.deb lintian DjangoApp_0.1-1_all.deb
Notre package est prêt !!!
Si vous avez aimé cet article, ca serait cool d’aller sur mon site Gourmious pour découvrir et partager vos plats préférés au resto.