diff --git a/source/production.rst b/source/production.rst index 7b0dbf2..0fa47ec 100644 --- a/source/production.rst +++ b/source/production.rst @@ -9,12 +9,193 @@ Pour une mise ne production, il nous faut donc quelque chose de plus solide: * Nginx comme serveur principal * Gunicorn comme serveur d'application * PostgreSQL comme base de données + * supervisor pour lancer notre application + +Les points suivants décrivent les étapes nécessaires à la mise en place de ces outils. + +***Remarque***: dans ce qui suit, les commandes exécutées en root seront précédées de $$$. + +********** +PostgreSQL +********** + +On commence par installer PostgreSQL. + +Par exemple, dans le cas de debian, on exécute la commande suivante: + +.. code-block:: shell + + $$$ aptitude install postgresql postgresql-contrib + +Ensuite, on crée un utilisateur pour la DB: + +.. code-block:: shell + + $$$ su - postgres + postgres@gwift:~$ createuser --interactive -P + Enter name of role to add: gwift_user + Enter password for new role: + Enter it again: + Shall the new role be a superuser? (y/n) n + Shall the new role be allowed to create databases? (y/n) n + Shall the new role be allowed to create more new roles? (y/n) n + postgres@gwift:~$ + +Finalement, on peut créer la DB: + +.. code-block:: shell + + postgres@gwift:~$ createdb --owner gwift_user gwift + postgres@gwift:~$ exit + logout + $$$ + +************ +environement +************ + +Préparation +=========== + +On prépare l'environement pour accueillir notre application django. + +Il faut d'abords rajouter certains packets qui seront nécessaires pour compiler certains module python: + +.. code-block:: shell + + $$$ aptitude install libpq-dev python3-dev + +On créé un utilisateur dédié, pour limiter les accès au serveur dans le cas où notre application serait piratée. + +.. code-block:: shell + + $$$ groupadd --system webapps + $$$ useradd --system --gid webapps --shell /bin/bash --home /webapps/gwift gwift + +Ensuite, on crée le repertoire où se trouvera notre application et on lui attribue le bon utilisatuer: + +.. code-block:: shell + + $$$ mkdir -p /webapps/gwift + $$$ chown gwift:webapps /webapps/gwift + +Puis on crée notre environement virtuel: + +.. code-block:: shell + + $$$ su - gwift + gwift@gwift:~$ mkvirtualenv -p /usr/bin/python3 gwift + Already using interpreter /usr/bin/python3 + Using base prefix '/usr' + New python executable in gwift/bin/python3 + Also creating executable in gwift/bin/python + Installing setuptools, pip...done. + (gwift)gwift@gwift:~$ + + +On peut maintenant cloner notre projet: + +.. code-block:: shell + + (gwift)gwift@gwift:~$ git clone git@framagit.org:Grimbox/gwift.git + +Et installer les dépendances: + +.. code-block:: shell + + (gwift)gwift@gwift:~$ pip install -r requirements/production.txt + + +Le fichier production.txt contient les librairies pour gunicorn et PostgreSQL: + +.. code-block:: txt + + -r base.txt + + gunicorn + psycopg2 + +Configuration +============= + +Il ne nous reste plus qu'à mettre à jour la DB. On commance par créer le fichier de configuration de l'application en production: + +.. code-block:: shell + + (gwift)gwift@gwift:~$ touch gwift/gwift/settings/local.py + +Et le contenu de local.py, avec la clé secrète et les paramètres pour se connecter à la DB: + +.. code-block:: python + + from .production import * + + # SECURITY WARNING: don't run with debug turned on in production! + DEBUG = False + + # SECURITY WARNING: keep the secret key used in production secret! + SECRET_KEY = 'strong_secret_key' + + # Password validation + # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, + ] + + # DB + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'gwift', + 'USER': 'gwift_user', + 'PASSWORD': 'gwift user password', + 'HOST': 'localhost', + 'PORT': '', # Set to empty string for default. + } + } + +Finalement, on peut mettre à jour la DB et créer un super utilisateur: + +.. code-block:: shell + + (gwift)gwift@gwift:~$ python manage.py migrate + (gwift)gwift@gwift:~$ python manage.py createsuperutilisater + +Test +==== + +On peut tester si tout fonctionne bien en lancant le server avec django + +.. code-block:: shell + + (gwift)gwift@gwift:~$ python manage.py runserver sever_name.com:8000 + +Et en se rendant sur server_name.com:8000/admin, on obtient: + +.. image:: production/admin_without_static.png + :align: center + +Comme on peut le voir, il n'y a pas de mise en forme de la page car les fichiers statics ne sont pas encore servis. Il le seront pas nginx + Voir http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/ Et http://tutos.readthedocs.org/en/latest/source/ndg.html -.. include:: production/environment.rst +Ne pas oublier la génération des fichiers statics ! + .. include:: production/postgresql.rst +.. include:: production/environment.rst .. include:: production/gunicorn.rst .. include:: production/nginx.rst diff --git a/source/production/admin_without_static.png b/source/production/admin_without_static.png new file mode 100644 index 0000000..aa6b25c Binary files /dev/null and b/source/production/admin_without_static.png differ