diff --git a/source/index.rst b/source/index.rst index 9242bce..45be885 100644 --- a/source/index.rst +++ b/source/index.rst @@ -15,7 +15,7 @@ Contents: intro specs models - views + mvc forms admin docs diff --git a/source/production.rst b/source/production.rst index 31fa2d2..1579449 100644 --- a/source/production.rst +++ b/source/production.rst @@ -4,7 +4,7 @@ Mise en production Le serveur que django met à notre disposition est prévu uniquement pour le développement: inutile de passer par du code Python pour charger des fichiers statiques (feuilles de style, fichiers JavaScript, images, ...). De même, la base de donnée doit supporter plus qu'un seul utilisateur: SQLite fonctionne très bien dès lors qu'on se limite à un seul utilisateur... Sur une application Web, il est plus que probable que vous rencontriez rapidement des erreurs de base de données verrouillée pour écriture par un autre processus. Il est donc plus que bénéfique de passer sur quelque chose de plus solide. -Pour une mise ne production, la proposition *de facto* est la suivante: +Pour une mise ne production, le standard *de facto* est le suivant: * Nginx comme serveur principal * Gunicorn comme serveur d'application @@ -13,13 +13,19 @@ Pour une mise ne production, la proposition *de facto* est la suivante: C'est celle-ci que nous allons décrire ci-dessous. -Il est évidemment possible de configurer des connecteurs vers d'autres bases de données (Oracle, MSSQL ou MySQL), mais il ne nous est pas possible de décrire tous les cas d'utilisation. +Il est évidemment possible de configurer des connecteurs vers d'autres bases de données (Oracle, MSSQL ou MySQL), mais il ne nous est pas possible de décrire tous les cas d'utilisation. Nous allons nous limiter au + +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 $$$. 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 statiques ! + .. include:: production/postgresql.rst +.. include:: production/environment.rst .. include:: production/gunicorn.rst .. include:: production/nginx.rst .. include:: production/fabric.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 diff --git a/source/production/environment.rst b/source/production/environment.rst index e69de29..c78cb30 100644 --- a/source/production/environment.rst +++ b/source/production/environment.rst @@ -0,0 +1,124 @@ + +************* +Environnement +************* + +Préparation +=========== + +On prépare l'environement pour accueillir notre application Django. On considère que le serveur est un système GNU/Linux, basé sur une distribution Debian ou Ubuntu. Si vous vous basez sur un autre système d'exploitation ou une autre distribution, adaptez en fonction. + +Il faut d'abord rajouter certains paquets 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 utilisateur: + +.. 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' + + # Allowed host needed to be defined in production + ALLOWED_HOSTS = ["sever_name.com", "www.sever_name.com"] + + # 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 lançant le serveur 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 par Nginx. \ No newline at end of file diff --git a/source/production/postgresql.rst b/source/production/postgresql.rst index e69de29..8c499a9 100644 --- a/source/production/postgresql.rst +++ b/source/production/postgresql.rst @@ -0,0 +1,35 @@ + +********** +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 + $$$