Projet

Général

Profil

Djadhere » Historique » Version 3

Version 2 (Élie Bouttier, 09/10/2016 14:51) → Version 3/11 (Élie Bouttier, 12/10/2016 22:24)

h1. Djadhere

C’est le SI de tetaneutral.net ! Il est codé en Python avec le framework web Django.
Il est accessible à l’adresse https://adherents.tetaneutral.net.

h2. Contribuer

Le code source est sur la forge de ffdn : https://code.ffdn.org/tetaneutral.net/djadhere
Celle-ci permet également d’ouvrir des tickets ou de créer des pull-requests.
Pour rejoindre l’équipe, demander à djanos ou nim65s sur IRC.
Pad de travail : http://pad.tetaneutral.net/p/djadhere

h2. Déploiement

Il est déployé sur la VM djadhere.tetaneutral.net (Debian 8.6 Jessie).
Deux instances sont déployées, la première pour la version de production, et la deuxième pour la version de developpement.

Le serveur web utilisé est nginx.
La configuration se trouve dans le fichier @/etc/nginx/sites-available/djadhere@.

Les certificats letsencrypt sont généré avec @certbot@ (installé depuis les backports) :

@certbot -c /etc/letsencrypt/webroot.ini -d mondomaine.tetaneutral.net@

La base de données utilisée est postgresql.

Django est lancé par @uwsgi@.
La configuration de celui-ci se trouve dans le dossier @/etc/uwsgi/@.
Les dossiers @apps-available@ et @apps-enabled@ ne sont pas utilisé.
En effet, l’ajout du .service systemd uwsgi@.service permet de lancer de manière indépendante chaque instance.

Voici une description du déploiement de la prod, le déploiement en dev étant analogue.

Le dossier @/etc/uwsgi/djadhere/@ contient un lien symbolique vers la configuration uwsgi de cette instance.
Le lien est nommé @prod@ permettant d’utiliser systemd ainsi :

@systemctl {start,stop,restart,status} uwsgi@djadhere-prod@

Un utilisateur @djadhere-prod@ a été créé (et automatiquement un groupe du même nom).
L’utilisateur @www-data@ a été rajouté au groupe @djadhere-prod@.
L’umask de @djadhere-prod@ est définie à 077 dans son @.bashrc@.

Le home de djadhere-prod se trouve dans le dossier @/srv/djadhere/prod@ et contient :

* @uwsgi.ini@ : la conf uwsgi symlinké depuis @/etc/uwsgi/djadhere/prod@
* @uwsgi.socket@ : le socket unix référencé dans la conf de nginx
* @touch-to-reload@ : un fichier permettant de relancer uwsgi via la commande touch : @touch touch-to-reload@
* @app@ : un clone du projet Git
* @log@ : les logs (nginx + uwsgi + django)
* @venv@ : le virtualenv dans lequel tourne django
* @webdir@ : le dossier servie par nginx (g+rX) qui contient un dossier static et un dossier media (géré par django)
* @update.sh@ : un script pour mettre à jour

Voici la conf uwsgi.ini :

<pre>
[uwsgi]

uid = djadhere-prod
gid = djadhere-prod

chdir = /srv/djadhere/prod/app

plugin=python3
module=djadhere.wsgi:application
virtualenv = /srv/djadhere/prod/venv
env=DJANGO_SETTINGS_MODULE=djadhere.local_settings

uwsgi-socket=/srv/djadhere/prod/uwsgi.socket
chmod-socket=660

pidfile=/srv/djadhere/prod/uwsgi.pid
touch-reload = /srv/djadhere/prod/touch-to-reload

logto=/srv/djadhere/prod/log/uwsgi.log
logfile-chmod=400
logfile-chown=djadhere-prod:djadhere-prod

vacuum=True
</pre>

Voici une partie de la configuration local de django (situé dans @app/djadhere/local_settings.py@) :

<pre>
from djadhere.settings import *

from os.path import join

BASE_DIR = '/srv/djadhere/prod/'

SECRET_KEY = 'removed'

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'djadhere_prod',
'USER': 'djadhere_prod',
'PASSWORD': 'removed',
'HOST': 'localhost',
'PORT': '',
},
}

DEBUG = False

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': join(BASE_DIR, 'log/debug.log'),
},
'mail_admins': {
'class': 'django.utils.log.AdminEmailHandler',
'level': 'ERROR',
# But the emails are plain text by default - HTML is nicer
'include_html': True,
},
},
'loggers': {
'django.request': {
'handlers': ['file', 'mail_admins'],
'level': 'WARNING',
'propagate': True,
},
},
}

STATIC_ROOT = join(BASE_DIR, 'webdir/static')
STATIC_URL = '/static/'

MEDIA_ROOT = join(BASE_DIR, 'webdir/media')
MEDIA_URL = '/media/'

ALLOWED_HOSTS = [ 'adherents.tetaneutral.net' ]

DEFAULT_FROM_EMAIL = 'noreply@tetaneutral.net'
SERVER_EMAIL = 'djadhere <projet-web-at-lists.tetaneutral.net>'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp'
EMAIL_SUBJECT_PREFIX = "[PROD] "

ADMINS = (
('Prénom Nom', 'adresse mail'),
)
</pre>

Et le script d’easy update :

<pre>
#!/bin/bash

cd ~/app
git fetch
git checkout master
pip install --upgrade -r requirements.txt
./manage.py migrate
echo yes | ./manage.py collectstatic --noinput

cd ~
chmod g+rX webdir -R
touch touch-to-reload
</pre>