forked from Fred/gwift-book
Add postgresql and environment installation in production
This commit is contained in:
parent
95e0b0ad66
commit
c93e1f6bec
|
@ -9,12 +9,193 @@ Pour une mise ne production, il nous faut donc quelque chose de plus solide:
|
||||||
* Nginx comme serveur principal
|
* Nginx comme serveur principal
|
||||||
* Gunicorn comme serveur d'application
|
* Gunicorn comme serveur d'application
|
||||||
* PostgreSQL comme base de données
|
* 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/
|
Voir http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
|
||||||
Et http://tutos.readthedocs.org/en/latest/source/ndg.html
|
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/postgresql.rst
|
||||||
|
.. include:: production/environment.rst
|
||||||
.. include:: production/gunicorn.rst
|
.. include:: production/gunicorn.rst
|
||||||
.. include:: production/nginx.rst
|
.. include:: production/nginx.rst
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
Loading…
Reference in New Issue