CransWiki:

Installer la NoteKfet2015 chez soi

Pour la tester pour développer, ou bien pour la déployer sur le serveur du BDE.

On supposera tout du long que l'on est l'utilisateur 'arcas', sur le serveur 'achlys.crans.org', disposant des droits root.

Les paquets à installer

Backend

su
apt install python python-psycopg2 postgresql python-netaddr python-beautifulsoup imagemagick python-jinja2

(python-beautifulsoup n'est nécessaire que pour les éditions du Wiki)

(imagemagick n'est nécessaire que pour la conversion des photos)

(python-jinja2 n'est nécessaire que pour l'envoi de mails)

On a besoin de django >= 1.3 et python >= 2.7 (incompatible python3 pour le moment) et postgresql >= 8.4.

La note Kfet a, pour le moment, été testée sous Wheezy, Jessie et Stretch.

Frontend

su
apt install python-django gunicorn nginx gettext

Devenir note

adduser note
chmod 2775 /home/note/
adduser note sudo
su note
cd

Notez que note n'a absolument pas besoin d'être dans le groupe sudo (c'est même pas vraiment désirable), mais le temps de l'installation c'est bien pratique ...

Récupérer les codes

Backend

On supposera qu'on est dans /home/note en tant qu'user note, même si ce n'est pas nécessaire.

git clone https://gitlab.crans.org/bde/note-kfet-2015-serveur.git

cd note-kfet-2015-server/config
cp secrets.py.sample secrets.py

Puis éditer config/config.py et adapter basedir et photosdir si on n'était pas dans /home/note/.

Frontend

git clone https://gitlab.crans.org/bde/note-kfet-2015-django.git

cd note-kfet-2015-django
cp secrets_sample.py secrets.py
cp settings.py.example settings.py

Penser à mettre une vraie SECRET_KEY dans secrets.py et corriger ROOT_PATH dans settings.py si ce n'est pas /home/note/.

Bases de données

Backend

La note a besoin d'une base de données pour fonctionner. Et c'est mieux si elle n'est pas vide.

On a besoin de pouvoir s'identifier en tant qu'utilisateur PostgreSQL note.

Si vous utilisez www-data pour le frontend:

Dans /etc/postgresql/<version>/main/pg_hba.conf :

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
local   all             note                                    ident map=notemap

et dans /etc/postgresql/<version>/main/pg_ident.conf :

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
notemap         username                note
# Pour le frontend django, si lancé en tant que www-data (avec gunicorn)
notemap         www-data                note

Si vous utilisez note pour le frontend :

Dans /etc/postgresql/<version>/main/pg_hba.conf :

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
local   note             note                                    peer

Dans les deux cas, vous devez créer l'user; tant qu'à faire, on en crée aussi un pour nous :

sudo -u postgres psql
postgres=# CREATE ROLE note WITH LOGIN CREATEDB;
postgres=# CREATE ROLE arcas SUPERUSER LOGIN;

Maintenant, la base. Dans le dépôt git, il y a un script permettant de récupérer une base minimale pour faire tourner la note; il conserve uniquement les comptes d'idbde<0. Penser à le modifier pour conserver un idbde dans lequel on peut se loguer. Attention, il faut également créer une base nkmails même si on ne compte pas utiliser les mails, la note la cherchera !

cd /home/note/note-kfet-2015-serveur/scripts/bdd/

./export_schema.sh >> schema_note
sudo -u postgres createdb note
psql note < schema_note > /dev/null

pg_dump -s nkmails >> schema_mails
sudo -u postgres createdb nkmails
psql nkmails < schema_mails > /dev/null

Frontend

Django aussi a besoin de sa base de données pour tourner.

sudo -u postgres createdb django_client
sudo -u postgres psql
postgres=# ALTER DATABASE django_client OWNER TO note;

Si vous utilisez Django < 1.7

cd note-kfet-2015-django/
./manage.py syncdb

Si vous utilisez Django >= 1.7

cd note-kfet-2015-django/
./manage.py makemigrations
./manage.py migrate

Récupérer un joli affichage

On commence par indiquer à Django où trouver les css/js

cd /home/note/note-kfet-2015-django/
mv static/ note/
./manage.py collectstatic --noinput --clear

ln -s /usr/share/javascript/jquery/jquery.js note/static/js/jquery.js

apt install libjs-bootstrap
ln -s /usr/share/javascript/bootstrap/js/bootstrap.js note/static/js/bootstrap.js

Récupérer les traductions

django-admin makemessages
django-admin compilemessages

Créer des clefs pour le serveur

Le dépôt git contient un script tout fait :

cd //home/note/note-kfet-2015-serveur/utils
./generate_keys.sh

Tester en standalone

On peut lancer la note en standalone, en foreground.

Backend

cd note-kfet-2015-serveur/serveur
./Serveur.py &

2013/03/10 00:48:58 MainServer :: Server started.
Debug levels : file=5 stdout=5
2013/03/10 00:48:58 MainServer :: Ecoute sur 0.0.0.0:4242

Frontend

cd note-kfet-2015-django
./manage.py runserver 0.0.0.0:8000 &

Et vous pouvez tester sur http://<votre IP>:8000/

Lancer tout ça proprement

En fait, lancer en standalone, c'est moche. Tout est prévu pour pouvoir être lancé en daemon.

Si cela n'a pas été fait avant, on commence par créer l'utilisateur qui va faire tourner la note. Attention dans de cas à bien lui donner les droits sur tous les fichiers utiles ! Par soucis de simplicité, il s'appelera note. Si vous voulez l'appeler autrement, faites comme bon vous semble, j'essaierai de signaler autant que j'y penser les endroits où il faudra penser à changer les variables en conséquence.

On supposera également que les git clone de tout à l'heure ont bien été faits dans /home/note

sudo adduser note

La méthode d'installation des services dépend de votre distribution.

Si vous utilisez Debian Wheezy (ou une distribution démarrant avec SysV)

Backend

cd /etc/init.d/
sudo ln -s /home/note/note-kfet-2015-serveur/utils/initscript note

(éditez les variables USER et DIRECTORY)

La première fois, il faut créer le dossier /var/log/note et s'assurer que l'utilisateur note (ou whatever) peut écrire dedans.

À partir de là, sudo service note start permet de lancer le backend de la note comme n'importe quel service.

Frontend

NB : c'est uniquement à partir de là qu'on a besoin des paquets gunicorn et nginx

cd /etc/nginx/sites-available/
sudo ln -s /home/note/note-kfet-2015-django/utils/note.nginx note
cd /etc/nginx/sites-enabled/
sudo ln -s ../sites-available/note
cd /etc/gunicorn.d/
sudo ln -s /home/note/note-kfet-2015-django/utils/gunicorn.d-note note

sudo service nginx restart
sudo service gunicorn start

Par défaut, la note écrit dans un fichier de log, pour

cd /var/log
sudo mkdir note
cd note
sudo touch full_log.log

On pensera aussi a chown le tout pour donner les droits en écriture au groupe note.

Si vous utilisez Debian Jessie/Stretch/Sid (ou une distribution démarrant avec systemd)

Backend

Il faut copier les unitfiles du serveur dans /etc/systemd/system :

cd note-kfet-2015-serveur/utils/
sudo cp note.socket /etc/systemd/system/
sudo cp note.service /etc/systemd/system/

Il faut ensuite dire à systemd que des nouveaux services sont apparus:

sudo systemctl daemon-reload

Vous pouvez maintenant lancer le serveur avec la commande

sudo systemctl start note

l'arrêter avec

sudo systemctl stop note

et la redémarrer avec

sudo systemctl restart note

Si vous voulez que le serveur de la note démarre automatiquement lorsque votre machine boote, vous pouvez ajouter

sudo systemctl enable note.service

Frontend

NB : c'est uniquement à partir de là qu'on a besoin des paquets gunicorn et nginx

cd /etc/nginx/sites-available/
sudo ln -s /home/note/note-kfet-2015-django/utils/note.nginx note
cd /etc/nginx/sites-enabled/
sudo ln -s ../sites-available/note
cd /etc/gunicorn.d/
sudo ln -s /home/note/note-kfet-2015-django/utils/gunicorn.d-note note

sudo systemctl restart nginx
sudo systemctl start gunicorn

cd note-kfet-2015-django/utils/
sudo cp note-client.service /etc/systemd/system/
sudo systemctl daemon-reload

Dans les deux cas

Pour générer les certificats en question :

sudo su
cd /etc/ssl/
mkdir note
cd note/
openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout note-django.key -out note-django.crt
chmod 600 note-django.key

Lignes à éditer :

Maintenant que c'est www-data qui lance le frontend, il faut qu'il ait le droit de créer les photos :

sudo chgrp www-data /home/note/note-kfet-2015-django/media/photos
sudo chmod g+ws /home/note/note-kfet-2015-django/media/photos

Un petit peu de vaudou juste pour le plaisir :

sudo mkdir /run/gunicorn
sudo chown root:note /run/gunicorn
sudo chmod 2644 /run/gunicorn

Blague à part, c'est dû à un bug au lancement des services : gunicorn écrit son fichier de PID dans /run/gunicorn/gunicorn.pid _en tant que root_, ce qui fait que la note ne peut pas les lire. Cela peut peut-être se régler en tweakant le note.service, à creuser ...

On peut maintenant lancer le client avec :

sudo systemctl start note-client

On peut également l'ajouter au démarrage avec :

sudo systemctl enable note-client.service

Cron et mails

Si il s'agit d'une mise en production réelle de la note, il faut qu'elle puisse envoyer des mails et on a également un certains nombre de scripts qui doivent tourner régulièrement pour vérifier l'intégrité de la base de données.

Postfix

Il faut commencer par installer un serveur postfix, qui se charge d'envoyer les mails.

sudo apt-get install postfix

Lorsqu'il vous propose, choisir aucune configuration. Ensuite, récupérer les fichiers de configuration postfix présent dans le dossier utils du dépot git et les placer dans le dossier /etc/postfix

cp main.cf /etc/postfix/
cp master.cf /etc/postfix/

Attention, ces fichiers de configurations ne marchent que en zone crans. Enfin, il faut préciser au serveur comment il s'appelle en créant le fichier /etc/mailname avec par exemple le contenu :

note.crans.org

Voilà, tout devrait marcher, il n'y a plus qu'à lancer le serveur, et vérifier qu'il tourne :

sudo systemctl start postfix
sudo systemctl status postfix

cron

Maintenant, il suffit de récupérer le fichier cron de la note qui se charge de l'envoie de mail et des vérifications d'intégrité et de le placer dans /etc/cron.d/

cp note.cron /etc/cron.d/

Attention, on ne peut pas faire de ln -s, car sinon le cron sera ignoré par le système.

Ça marche pas

Django

Attention, nginx est tatillons sur les options.

On ne peut pas préciser plus d'une fois ipv6only=on (donc comme il est dans le fichier note.nginx, il faut qu'il ne soit pas dans le fichier default).

Serveur

Par défaut, le serveur de la note est monitoré par systemd : lorsque celle-ci s'arrête avec un code de retour indiquant une fin inattendue, systemd la relance automatiquement. Pour désactiver ce comportement, il faut commenter la ligne Restart=on-failure dans /etc/systemd/system/note.service, puis indiquer à systemd que des services ont changé avec

sudo systemctl daemon-reload

CransWiki: NoteKfet/NoteKfet2015/TestLocal (dernière édition le 2018-02-16 18:43:49 par Arcas)