Skip to content
This repository has been archived by the owner on Nov 7, 2020. It is now read-only.

Tutorial d'installation sur un serveur de production

Christian Quest edited this page Dec 2, 2017 · 27 revisions

A REVOIR

Warning, ceci est un pas-à-pas qui fait certains raccourcis pour les besoins de l'exercice, il est important qu'avant toute ouverture au public un administrateur système ait pris la main sur le serveur (SSL, fail2ban, monitoring, etc.)

Ce pas-à-pas est adapté à une machine sous Debian ou Ubuntu Server.

  1. Installer les dépendances système

     sudo apt install python3.4 python3.4-dev python-virtualenv wget nginx uwsgi uwsgi-plugin-python3 postgresql-9.5 postgresql-9.5-postgis-2.2 git
    
  2. Créer un user Unix dédié

     sudo useradd -N ban
    
  3. Créer un dossier de déploiement

     sudo mkdir /srv/ban
    
  4. Créer un virtualenv et l'activer

     virtualenv /srv/ban/venv --python=/usr/bin/python3.4
     source /srv/ban/venv/bin/activate
    
  5. Cloner le code source de l'API

     git clone https://github.com/BaseAdresseNationale/api-gestion /srv/ban/src/
    

    Note: les sources seront dans le dossier /srv/ban/src/

  6. Installer les dépendances python

     pip install -r /srv/ban/src/requirements.txt
    

    Attention, en cas de présence d'un proxy, il sera nécessaire d'ajouter l'option --proxy

     pip install -r /srv/ban/src/requirements.txt --proxy=http://user:pwd@url:port
    

    Dans ce cas, les sous dépendances peuvent poser problème et empêcher les installations : dans ce cas, les identifier et les installer 1 à 1. Par exemple (c'est le seul cas d'ailleurs à ce jour), pour installer bcrypt(==3.1.1), qui a elle même pour dépendance cffi(>1.1), il faut installer cffi avant. Dans mon cas, la dernière version de cffi >1.1 était à 1.8.3.

     pip install cffi>1 --proxy=http://user:pwd@url:port
    
  7. Installer localement la ban

     se positionner d'abord dans le dossier source /srv/ban/src/
     python /srv/ban/src/setup.py develop
    
  8. Créer un user Postgresql (avec le même nom que le user Unix pour utiliser la connexion locale sans mot de passe)

     sudo -u postgres createuser ban
    
  9. Créer une base de données

     sudo -u postgres createdb ban -O ban
    
  10. Activer les extensions postgis et hstore

     sudo -u postgres psql ban
     CREATE EXTENSION postgis;
     CREATE EXTENSION hstore;
    
  11. Initialiser la base

     ban db:create
    
  12. Créer un utilisateur admin

     ban auth:createuser --is-staff
    
  13. Importer les données (avec les données France entière ça prend 4 jours environ)

     ban import:init fichier1.json fichier2.json fichier3.json
    
  14. Créer un fichier /srv/ban/uwsgi_params avec le contenu suivant (sans le modifier):

    uwsgi_param  QUERY_STRING       $query_string;
    uwsgi_param  REQUEST_METHOD     $request_method;
    uwsgi_param  CONTENT_TYPE       $content_type;
    uwsgi_param  CONTENT_LENGTH     $content_length;
    
    uwsgi_param  REQUEST_URI        $request_uri;
    uwsgi_param  PATH_INFO          $document_uri;
    uwsgi_param  DOCUMENT_ROOT      $document_root;
    uwsgi_param  SERVER_PROTOCOL    $server_protocol;
    uwsgi_param  REQUEST_SCHEME     $scheme;
    uwsgi_param  HTTPS              $https if_not_empty;
    
    uwsgi_param  REMOTE_ADDR        $remote_addr;
    uwsgi_param  REMOTE_PORT        $remote_port;
    uwsgi_param  SERVER_PORT        $server_port;
    
  15. Créer un fichier /etc/uwsgi/apps-enabled/ban.ini avec ce contenu:

    [uwsgi]
    uid = ban
    gid = users
    # Python related settings
    # the base directory (full path)
    chdir           = /srv/ban/
    # Ban's wsgi module
    module          = ban.http.api:app
    # the virtualenv (full path)
    home            = /srv/ban/venv
    
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 4
    # the socket (use the full path to be safe
    socket          = /srv/ban/uwsgi.sock
    # ... with appropriate permissions - may be needed
    chmod-socket    = 666
    stats           = /srv/ban/stats.sock
    # clear environment on exit
    vacuum          = true
    plugins         = python3
    
  16. Créer un fichier de config Nginx /etc/nginx/sites-enabled/ban, en pensant à changer le nom de domaine

    # the upstream component nginx needs to connect to
    upstream ban {
        server unix:///srv/ban/uwsgi.sock;
    }
    
    # configuration of the server
    server {
        # the port your site will be served on
        listen      80;
        listen   [::]:80;
        listen      443 ssl;
        listen   [::]:443 ssl;
        # the domain name it will serve for
        server_name your-domain.org;
        charset     utf-8;
    
        # max upload size
        client_max_body_size 5M;   # adjust to taste
    
        # Finally, send all non-media requests to the WSGI server.
        location / {
            uwsgi_pass  ban;
            include     /srv/ban/uwsgi_params;
        }
    }
    

    Penser dans un deuxième temps à mettre en place la gestion SSL.

  17. Redémarrer les services

     sudo systemctl restart uwsgi nginx
    
     en cas d'absence de la commande systemctl, utiliser +service+ à la place
     sudo service uwsgi restart
     sudo service nginx restart