Installer Wifi-with-me
wifi-with-me est une application Web écrite en python3 avec django. Nous allons la déployer sur une Debian stretch, avec nginx et uwsgi.
J'ai fait ici des choix qui peuvent être considérés comme peu orthodoxes. Notamment, je choisis délibérément de créer un virtualenv "poreux" avec l'option --system-site-packages. Ainsi, certaines dépendances python peuvent être installées et maintenues par APT.
Dans le cas de wifi-with-me, presque toutes les dépendances python sont déjà disponibles sous forme de paquets Debian officiels. Seule la version de django ne convient pas et c'est ce qui nous oblige encore à faire usage d'un virtualenv. Plus tard si le code évolue pour devenir compatible avec la version de django disponible dans Debian (actuellement 1.10 dans stretch et 1.11 dans testing) alors on pourra se passer complètement de virtualenv.
Paquets Debian
sudo apt --no-install-recommends install python3-pip \
python3-virtualenv virtualenv \
python3-yaml python3-tz python3-sqlparse \
uwsgi-plugin-python3 uwsgi-emperor equivs
Remarque : le paquet equivs
tire beaucoup de dépendances. Si c'est
un problème, il est tout à fait possible de l'installer sur une autre
machine pour créer le méta-package.
Méta-paquet
Nous créons un méta-paquet Debian déclarer les dépendances nécessaires au bon fonctionnement de WWM.
cd /tmp/
equivs-control wifi-with-me.control
edit wifi-with-me.control
Section: misc
Priority: optional
Homepage: https://code.ffdn.org/FFDN/wifi-with-me
Standards-Version: 3.9.2
Package: wifi-with-me
Version: 2017.11
Maintainer: Admin Franciliens <admin@listes.franciliens.net>
Depends: python3, python3-yaml, python3-tz, python3-sqlparse,
uwsgi-plugin-python3, python3-pip, python3-virtualenv, virtualenv
Architecture: all
Description: Plate-forme d'échange pour personnes intéressées par un réseau radio
Application Web permettant de recenser les personnes souhaitant participer
à la mise en œuvre d'un réseau de ponts Radio.
.
L'intérêt des ponts radio étant de pouvoir fournir de l'accès à Internet
dans des zones "blanches".
On peut maintenant générer le méta-paquet puis l'installer :
equivs-build wifi-with-me.control
sudo dpkg -i wifi-with-me_2017.11_all.deb
Récupération du code
sudo mkdir /srv/venv
sudo chown www-data: /srv/venv
sudo -u www-data virtualenv --system-site-packages -p $(which python3) /srv/venv
sudo mkdir /srv/code/wwm
sudo chown www-data: /srv/code/wwm
cd /srv/code/wwm
sudo -u www-data git clone https://code.ffdn.org/FFDN/wifi-with-me.git .
# ou bien sudo -u www-data curl -JO https://code.ffdn.org/FFDN/wifi-with-me/archive/master.tar.gz && sudo -u tar xavf master.tar.gz
sudo -u www-data /srv/venv/bin/pip install -r requirements/base.txt
Customisation de l'appli
Créer le fichier /srv/code/wwm/wifiwithme/settings/local.py
avec ceci :
# -*- coding: utf-8 -*-
ISP={
'NAME':'Franciliens.net',
'TITLE':'Réseau wifi expérimental',
'SITE':'https://www.franciliens.net',
'EMAIL':'bureau (at) franciliens.net',
'ZONE':'Région parisienne',
'ADDRESS_EXAMPLE': 'rue gallieni, boulogne-billancourt',
'URL_CONTACT':'https://www.franciliens.net/contact/',
'LATITUDE':48.8657,
'LONGITUDE':2.34581,
'ZOOM':11,
'CNIL':{
'LINK':'https://f.franciliens.net/administratif/cnil/cnil-franciliens-2117019-wifiwithme.pdf',
'NUMBER':2117019
}
}
ALLOWED_HOSTS = ['tools.franciliens.net', 'localhost']
NOTIFICATION_EMAILS=['admin@listes.franciliens.net', 'bureau@listes.franciliens.net']
DEFAULT_FROM_EMAIL='admin@listes.franciliens.net'
SITE_URL="https://tools.franciliens.net/"
URL_PREFIX='wifiwithme/'
Initialisation de la BDD
Voici la config à placer dans wifiwithme/settings/local.py
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'wifiwithme',
'USER': 'fcn',
'PASSWORD': 'blablablabla',
'HOST': 'styx.franciliens.net',
'PORT': '5432',
}
}
Il faut ensuite taper :
sudo -u www-data /srv/venv/bin/python manage.py migrate --settings wifiwithme.settings.prod
Lancement automatique au démarrage
sudo mkdir /run/wifiwithme
sudo chown www-data: /run/wifiwithme
Créer le fichier /etc/uwsgi-emperor/vassals/wifiwithme.ini
avec :
[uwsgi]
plugins = python3
uwsgi-socket = /run/wifiwithme/uwsgi.socket
chdir = /srv/code/wwm
module=wifiwithme.wsgi
processes = 2
threads = 2
virtualenv = /srv/venv
env = DJANGO_SETTINGS_MODULE=wifiwithme.settings.prod
vacuum = True
uid = www-data
gid = www-data
Configuration nginx
location /wifiwithme {
location /wifiwithme/assets {
alias /srv/code/wwm/wifiwithme/static;
expires 1h;
}
uwsgi_pass unix:/run/wifiwithme/uwsgi.socket;
include uwsgi_params;
}