Merge branch 'Kerl/production_settings' into 'master'

Crée un setup proche de celui en production

On fait tourner GestioCOF avec daphne derrière un reverse-proxy Apache
sur la VM Vagrant tout comme sur le serveur de production. On peut tester
en local GestioCOF en “conditions réelles”.

Le serveur lancé avec `python manage.py runserver 0.0.0.0:8000` est toujours
accessible à la même url `localhost:8000`.

Le (nouveau) serveur apache est accessible à `localhost:8080`.

Pour appliquer les changements dans le code au serveur type prod, il faut
relancer le worker : `sudo supervisorctl restart worker`. Alors que le serveur
de dev se relance tout seul.

NB important : ce patch supprime le mot de passe sur le serveur redis en dev,
pour faire marcher ce nouveau setup avec un version précédente de la VM, il faut
lancer `sudo redis-cli config set requirepass ""`

Fixes #66 
Fixes #9 

See merge request !79
This commit is contained in:
Martin Pepin 2016-09-23 22:20:15 +02:00
commit cf430b5d3b
7 changed files with 103 additions and 16 deletions

View file

@ -47,28 +47,49 @@ gérer la machine virtuelle :
- `vagrant ssh` vous connecte en SSH à la machine virtuelle, dans le dossier - `vagrant ssh` vous connecte en SSH à la machine virtuelle, dans le dossier
où est installé GestioCOF. Vous pouvez utiliser les commandes Django où est installé GestioCOF. Vous pouvez utiliser les commandes Django
habituelles (`manage.py runserver` etc.); toutefois pour lancer le serveur il faut faire habituelles (`manage.py runserver` etc.) pour lancer
[le serveur en dev](#lancer-le-serveur-de-développement-standard) par
python manage.py runserver 0.0.0.0:8000 exemple
car par défaut Django n'écoute que sur l'adresse locale de la machine
virtuelle - or vous voudrez accéder à GestioCOF depuis votre machine
physique.
**Le dossier avec le code de GestioCOF est partagé entre la machine virtuelle **Le dossier avec le code de GestioCOF est partagé entre la machine virtuelle
et votre machine physique : vous pouvez donc utiliser votre éditeur favori pour et votre machine physique : vous pouvez donc utiliser votre éditeur favori pour
coder depuis l'extérieur de la machine virtuelle, et les changements seront coder depuis l'extérieur de la machine virtuelle, et les changements seront
répercutés dans la machine virtuelle.** répercutés dans la machine virtuelle.**
#### Lancer le serveur de développement standard
Pour lancer le serveur de développement, il faut faire
python manage.py runserver 0.0.0.0:8000
car par défaut Django n'écoute que sur l'adresse locale de la machine virtuelle
or vous voudrez accéder à GestioCOF depuis votre machine physique. L'url à
entrer dans le navigateur est `localhost:8000`.
#### Serveur de développement type production
Sur la VM Vagrant, un serveur apache est configuré pour servir GestioCOF de
façon similaire à la version en production : on utilise
[Daphne](https://github.com/django/daphne/) et `python manage.py runworker`
derrière un reverse-proxy apache. Le tout est monitoré par
[supervisor](http://supervisord.org/).
Ce serveur se lance tout seul et est accessible en dehors de la VM à l'url
`localhost:8080`. Toutefois il ne se recharge pas tout seul lorsque le code
change, il faut relancer le worker avec `sudo supervisorctl restart worker` pour
visualiser la dernière version du code.
### Installation manuelle ### Installation manuelle
Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il
est fortement conseillé d'utiliser un environnement virtuel pour Python. est fortement conseillé d'utiliser un environnement virtuel pour Python.
Il vous faudra installer mercurial, pip, les librairies de développement de Il vous faudra installer mercurial, pip, les librairies de développement de
python, ainsi qu'un client et un serveur MySQL ; sous Debian et dérivées (Ubuntu, ...) : python, un client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et
dérivées (Ubuntu, ...) :
sudo apt-get install mercurial python-pip python-dev libmysqlclient-dev sudo apt-get install mercurial python-pip python-dev libmysqlclient-dev
redis-server
Si vous décidez d'utiliser un environnement virtuel Python (virtualenv; Si vous décidez d'utiliser un environnement virtuel Python (virtualenv;
fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF
@ -87,7 +108,7 @@ Vous pouvez maintenant installer les dépendances Python depuis les fichiers
pip install -r requirements.txt -r requirements-devel.txt pip install -r requirements.txt -r requirements-devel.txt
Enfin, copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`. Copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`.
#### Installation avec MySQL #### Installation avec MySQL

View file

@ -1,6 +1,6 @@
import os import os
from channels.asgi import get_channel_layer from channels.asgi import get_channel_layer
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings_dev")
channel_layer = get_channel_layer() channel_layer = get_channel_layer()

View file

@ -29,7 +29,7 @@ SECRET_KEY = 'q()(zn4m63i%5cp4)f+ww4-28_w+ly3q9=6imw2ciu&_(5_4ah'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = ['127.0.0.1']
# Application definition # Application definition
@ -123,6 +123,7 @@ USE_TZ = True
# https://docs.djangoproject.com/en/1.8/howto/static-files/ # https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC_URL = '/static/' STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/static/'
STATICFILES_DIRS = ( STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static/'), os.path.join(BASE_DIR, 'static/'),
@ -175,7 +176,7 @@ CHANNEL_LAYERS = {
"default": { "default": {
"BACKEND": "asgi_redis.RedisChannelLayer", "BACKEND": "asgi_redis.RedisChannelLayer",
"CONFIG": { "CONFIG": {
"hosts": [("redis://:redis_password@127.0.0.1:6379/0")], "hosts": [("localhost", 6379)],
}, },
"ROUTING": "cof.routing.channel_routing", "ROUTING": "cof.routing.channel_routing",
} }

29
provisioning/apache.conf Normal file
View file

@ -0,0 +1,29 @@
<VirtualHost *:80>
ServerName default
DocumentRoot /var/www/html
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /static/ !
ProxyPass /media/ !
ProxyPass /ws/ ws://127.0.0.1:8001/ws/
ProxyPass / http://127.0.0.1:8001/
ProxyPassReverse / http://127.0.0.1:8001/
Alias /media /vagrant/media
Alias /static /var/www/static
<Directory /vagrant/media>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/static>
Order deny,allow
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

View file

@ -9,7 +9,7 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
# Installation de paquets utiles # Installation de paquets utiles
apt-get update && apt-get install -y mercurial python-pip python-dev \ apt-get update && apt-get install -y mercurial python-pip python-dev \
libmysqlclient-dev libjpeg-dev git libmysqlclient-dev libjpeg-dev git redis-server
# Configuration et installation de mysql. Le mot de passe root est le même que # Configuration et installation de mysql. Le mot de passe root est le même que
# le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance # le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance
@ -21,9 +21,15 @@ apt-get install -y mysql-server
mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME; GRANT ALL PRIVILEGES ON $DBNAME.* TO '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASSWD'" mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME; GRANT ALL PRIVILEGES ON $DBNAME.* TO '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASSWD'"
# Installation de redis-server. Todo: lui mettre un mot de passe # Installation et configuration d'Apache
apt-get install -y redis-server apt-get install -y apache2
redis-cli config set requirepass redis_password a2enmod proxy proxy_http
cp /vagrant/provisioning/apache.conf /etc/apache2/sites-available/gestiocof.conf
a2ensite gestiocof
a2dissite 000-default
service apache2 restart
mkdir /var/www/static
chown -R vagrant:www-data /var/www/static
# Mise en place du .bash_profile pour tout configurer lors du `vagrant ssh` # Mise en place du .bash_profile pour tout configurer lors du `vagrant ssh`
cat > ~vagrant/.bash_profile <<EOF cat > ~vagrant/.bash_profile <<EOF
@ -54,3 +60,12 @@ sudo -H -u vagrant DJANGO_SETTINGS_MODULE='cof.settings_dev' DBUSER=$DBUSER DBNA
# Installation du cron pour les mails de rappels # Installation du cron pour les mails de rappels
sudo -H -u vagrant crontab provisioning/cron.dev sudo -H -u vagrant crontab provisioning/cron.dev
# On installe Daphne et on demande à supervisor de le lancer
pip install daphne
apt-get install -y supervisor
cp /vagrant/provisioning/supervisor.conf /etc/supervisor/conf.d/gestiocof.conf
sed "s/{DBUSER}/$DBUSER/" -i /etc/supervisor/conf.d/gestiocof.conf
sed "s/{DBNAME}/$DBNAME/" -i /etc/supervisor/conf.d/gestiocof.conf
sed "s/{DBPASSWD}/$DBPASSWD/" -i /etc/supervisor/conf.d/gestiocof.conf
service supervisor restart

View file

@ -2,3 +2,4 @@
python manage.py migrate python manage.py migrate
python manage.py loaddata users root bda gestion sites python manage.py loaddata users root bda gestion sites
python manage.py collectstatic --noinput

View file

@ -0,0 +1,20 @@
[program:worker]
command=/usr/bin/python /vagrant/manage.py runworker
directory=/vagrant/
user=vagrant
environment=DBUSER={DBUSER},DBNAME={DBNAME},DBPASSWD={DBPASSWD},DJANGO_SETTINGS_MODULE="cof.settings_dev"
autostart=true
autorestart=true
redirect_stderr=true
stopasgroup=true
redirect_stderr=true
[program:interface]
command=/usr/local/bin/daphne -b 127.0.0.1 -p 8001 cof.asgi:channel_layer
environment=DBUSER={DBUSER},DBNAME={DBNAME},DBPASSWD={DBPASSWD},DJANGO_SETTINGS_MODULE="cof.settings_dev"
directory=/vagrant/
redirect_stderr=true
autostart=true
autorestart=true
stopasgroup=true
user=vagrant