From e64c3d0b3743a7399a34ec3fec85076990c8a791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 16 May 2017 16:13:31 +0100 Subject: [PATCH] Setup a production-like environment in vagrant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - We already use Daphne and channels to prepare the future use of websockets. - The app is served behind an nginx reverse-proxy - The services we need are managed by systemctl The production-like running instance of GestionÉvénementiel can be accessed on localhost:8080 outside vagrant. --- evenementiel/asgi.py | 7 +++ evenementiel/routing.py | 2 + evenementiel/settings_dev.py | 30 ++++----- provisioning/bootstrap.sh | 114 ++++++++++++++++++++++++++--------- provisioning/daphne.service | 19 ++++++ provisioning/nginx.conf | 40 ++++++++++++ provisioning/worker.service | 19 ++++++ requirements.txt | 5 ++ 8 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 evenementiel/asgi.py create mode 100644 evenementiel/routing.py create mode 100644 provisioning/daphne.service create mode 100644 provisioning/nginx.conf create mode 100644 provisioning/worker.service diff --git a/evenementiel/asgi.py b/evenementiel/asgi.py new file mode 100644 index 0000000..59c5d58 --- /dev/null +++ b/evenementiel/asgi.py @@ -0,0 +1,7 @@ +import os +from channels.asgi import get_channel_layer + +if "DJANGO_SETTINGS_MODULE" not in os.environ: + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "evenementiel.settings") + +channel_layer = get_channel_layer() diff --git a/evenementiel/routing.py b/evenementiel/routing.py new file mode 100644 index 0000000..8f9af19 --- /dev/null +++ b/evenementiel/routing.py @@ -0,0 +1,2 @@ +# Nothing yet +channel_routing = [] diff --git a/evenementiel/settings_dev.py b/evenementiel/settings_dev.py index 3d0f63d..535c6c2 100644 --- a/evenementiel/settings_dev.py +++ b/evenementiel/settings_dev.py @@ -43,6 +43,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'channels', 'bootstrapform', 'debug_toolbar', 'widget_tweaks', @@ -82,21 +83,19 @@ TEMPLATES = [ }, ] -WSGI_APPLICATION = 'evenementiel.wsgi.application' +CHANNEL_LAYERS = { + "default": { + "BACKEND": "asgi_redis.RedisChannelLayer", + "CONFIG": { + "hosts": [( + "redis://:{passwd}@{host}:{port}/{db}" + .format(passwd="dummy", host="localhost", port=6379, db=0) + )], + }, + "ROUTING": "evenementiel.routing.channel_routing", + } +} - -# Database -# https://docs.djangoproject.com/en/1.9/ref/settings/#databases - -# # MySQL -# DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), -# } -# } - -# PostGreSQL DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', @@ -108,6 +107,9 @@ DATABASES = { } } +STATIC_ROOT = "/srv/GE/static/" +MEDIA_ROOT = "/srv/GE/media/" + # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators diff --git a/provisioning/bootstrap.sh b/provisioning/bootstrap.sh index 3acd68f..2986efe 100644 --- a/provisioning/bootstrap.sh +++ b/provisioning/bootstrap.sh @@ -1,25 +1,102 @@ -#!/bin/sh +#!/bin/bash -# Configuration de la base de données. Le mot de passe est constant car c'est -# pour une installation de dév locale qui ne sera accessible que depuis la -# machine virtuelle. +# The credentials of the database. Can be public since they will only be used in +# the local development environment DBUSER="event_gestion" DBNAME="event_gestion" DBPASSWD="4KZt3nGPLVeWSvtBZPsd9jdssdJMds78" -# Installation de paquets utiles +# Not critical either +REDIS_PASSWD="dummy" + +# It is used in quite a few places +SETTINGS="evenementiel.settings_dev" + +# --- +# Installs the dependencies +# --- + +# System packages apt-get update && apt-get upgrade apt-get install -y python3-pip python3-dev python3-venv libpq-dev postgresql \ - postgresql-contrib libjpeg-dev + postgresql-contrib libjpeg-dev nginx redis-server -# Setup Database and User +# Python packages, in a virtual environment +sudo -H -u vagrant python3 -m venv ~vagrant/venv +sudo -H -u vagrant ~vagrant/venv/bin/pip install -U pip wheel +sudo -H -u vagrant ~vagrant/venv/bin/pip install -U -r /vagrant/requirements-devel.txt + + +# --- +# Setup the production-like environment +# --- + +# Database and User sudo -u postgres createdb $DBNAME sudo -u postgres createuser -SDR $DBUSER sudo -u postgres psql -c "ALTER USER $DBUSER WITH PASSWORD '$DBPASSWD';" sudo -u postgres psql -c "ALTER USER $DBUSER CREATEDB;" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DBNAME TO $DBUSER;" -# Mise en place du .bash_profile pour tout configurer lors du `vagrant ssh` +# The working directory for Daphne and cie +mkdir -p /srv/GE/{media,static} +chown -R vagrant:vagrant /srv/GE + +# Nginx +cp /vagrant/provisioning/nginx.conf /etc/nginx/sites-available/ge.conf +if [ ! -h /etc/nginx/sites-enabled/ge.conf ] +then + # If the configuration file is not activated yet, activates it + ln -s /etc/nginx/sites-available/ge.conf /etc/nginx/sites-enabled/ge.conf +fi +rm -f /etc/nginx/sites-enabled/default # We do not need this +service nginx restart + +# Daphne and the worker(s) +for service in {daphne,worker}.service +do + cp /vagrant/provisioning/$service /etc/systemd/system/$service + sed "s/{{DBUSER}}/$DBUSER/" -i /etc/systemd/system/$service + sed "s/{{DBNAME}}/$DBNAME/" -i /etc/systemd/system/$service + sed "s/{{DBPASSWD}}/$DBPASSWD/" -i /etc/systemd/system/$service + sed "s/{{SETTINGS}}/$SETTINGS/" -i /etc/systemd/system/$service + systemctl enable $service + systemctl start $service +done + +# Redis +redis-cli CONFIG SET requirepass $REDIS_PASSWD +if [ ! $? ] +then + # In case the requirepass command failed, checks that it was because the + # password was already set *to the right value*. + redis-cli AUTH $REDIS_PASSWD +fi +redis-cli -a $REDIS_PASSWD CONFIG REWRITE + + +# --- +# Prepare Django +# --- + +function venv_python { + sudo -H -u vagrant DJANGO_SETTINGS_MODULE=$SETTINGS \ + DBUSER=$DBUSER DBNAME=$DBNAME DBPASSWD=$DBPASSWD \ + ~vagrant/venv/bin/python \ + $@ +} + +cd /vagrant +venv_python manage.py collectstatic --noinput +venv_python manage.py migrate + +unset venv_python + + +# --- +# Setup a friendly environment for the user +# --- + cat >> ~vagrant/.bashrc <