5227
Commentaire: gunicorn s'est amélioré
|
← Version 28 à la date du 2018-02-16 18:43:49 ⇥
12884
|
Texte supprimé. | Texte ajouté. |
Ligne 1: | Ligne 1: |
#acl +All:read | |
Ligne 4: | Ligne 5: |
On supposera tout du long que l'on est l'utilisateur 'arcas', sur le serveur 'achlys.crans.org', disposant des droits root. |
|
Ligne 10: | Ligne 13: |
python python-psycopg2 postgresql }}} |
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. |
Ligne 15: | Ligne 29: |
python-django gunicorn nginx }}} |
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 ... |
Ligne 23: | Ligne 49: |
git clone http://bde2.crans.org/git/Note_Kfet_2015_server.git }}} {{{ cd Note_Kfet_2015_server.git/config |
git clone https://gitlab.crans.org/bde/note-kfet-2015-serveur.git }}} {{{ cd note-kfet-2015-server/config |
Ligne 35: | Ligne 61: |
git clone http://bde2.crans.org/git/Django_Client.git }}} {{{ cd Django_Client cp secrets.py.sample secrets.py |
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 |
Ligne 50: | Ligne 77: |
'''Si vous utilisez www-data pour le frontend:''' |
|
Ligne 65: | Ligne 94: |
et on crée l'user : | '''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 : |
Ligne 68: | Ligne 105: |
postgres=# CREATE ROLE note LOGIN; | postgres=# CREATE ROLE note WITH LOGIN CREATEDB; postgres=# CREATE ROLE arcas SUPERUSER LOGIN; |
Ligne 73: | Ligne 111: |
Heureusement, dans le dépôt git, il y a déjà un script pour créer une base et mettre deux-trois trucs dedans histoire de pouvoir commencer. Pensez à changer {{{NOTEUSER}}} au début du script si vous ne voulez pas l'exécuter en tant que l'utilisateur UNIX {{{note}}}. {{{ cd Note_Kfet_2015_server/recreate/ sudo ./recreate_database.sh }}} |
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 }}} * Si vous n'êtes pas respo-info, vous pouvez récupérer un dump [[http://doc-bde.crans.org/bdd/schema.sql|ici]] (mis à jour une fois par jour) |
Ligne 92: | Ligne 136: |
Puis {{{ cd Django_Client/ |
'''Si vous utilisez Django < 1.7''' {{{ cd note-kfet-2015-django/ |
Ligne 98: | Ligne 143: |
'''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 }}} |
|
Ligne 104: | Ligne 188: |
cd Note_Kfet_2015_server/serveur ./Serveur.py |
cd note-kfet-2015-serveur/serveur ./Serveur.py & |
Ligne 114: | Ligne 198: |
cd Django_Client ./manage.py runserver 0.0.0.0:8000 }}} Et vous pouvez tester sur {{{http://<votre IP>:8000/note}}} Ah, j'oubliais : dans cette base de données par défaut, il y a quelques utilisateurs, ils ont tous pour mot de passe '''{{{plop}}}'''. |
cd note-kfet-2015-django ./manage.py runserver 0.0.0.0:8000 & }}} Et vous pouvez tester sur {{{http://<votre IP>:8000/}}} |
Ligne 125: | Ligne 207: |
On commence par créer l'utilisateur qui va faire tourner la note. 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. | 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. |
Ligne 133: | Ligne 215: |
=== Backend === | 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 ==== |
Ligne 136: | Ligne 222: |
sudo ln -s /home/note/Note_Kfet_2015_server/initscript note | sudo ln -s /home/note/note-kfet-2015-serveur/utils/initscript note |
Ligne 145: | Ligne 231: |
=== Frontend === | ==== Frontend ==== |
Ligne 150: | Ligne 236: |
sudo ln -s /home/note/Django_Client/utils/note.nginx note | sudo ln -s /home/note/note-kfet-2015-django/utils/note.nginx note |
Ligne 154: | Ligne 240: |
sudo ln -s /home/note/Django_Client/utils/gunicorn.d-note note | sudo ln -s /home/note/note-kfet-2015-django/utils/gunicorn.d-note note |
Ligne 159: | Ligne 245: |
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 === |
|
Ligne 179: | Ligne 336: |
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 === * ''Je suis sous Jessie, et la note redémarre toute seule lorsque je l'arrête avec kill {-9 | -s KILL | ... }'' 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 }}} |
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.
Sommaire
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
Si vous n'êtes pas respo-info, vous pouvez récupérer un dump ici (mis à jour une fois par jour)
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 :
- Dans le fichier de conf de nginx :
server_name note2 note2.crans.org;
rewrite ^ https://note2.crans.org$request_uri permanent;
server_name note2 note2.crans.org;
alias /home/note/Django_Client/static;
- Les paths des certificats SSL
- Dans le fichier de conf gunicorn :
La variable 'working_dir'
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
Je suis sous Jessie, et la note redémarre toute seule lorsque je l'arrête avec kill {-9 | -s KILL | ... }
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