gwift-book/source/deploy/centos.adoc

6.9 KiB
Raw Blame History

Déploiement sur CentOS

yum update
groupadd --system webapps
groupadd --system gunicorn_sockets
useradd --system --gid webapps --shell /bin/bash --home /home/medplan medplan
mkdir -p /home/medplan
chown medplan:webapps /home/medplan

Installation des dépendances systèmes

yum install python36 git tree -y

# CentOS 7 ne dispose que de la version 3.7 d'SQLite. On a besoin d'une version 3.8 au minimum:
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.8.11/1.fc21/x86_64/sqlite-devel-3.8.11-1.fc21.x86_64.rpm
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.8.11/1.fc21/x86_64/sqlite-3.8.11-1.fc21.x86_64.rpm
sudo yum install sqlite-3.8.11-1.fc21.x86_64.rpm sqlite-devel-3.8.11-1.fc21.x86_64.rpm -y

Préparation de lenvironnement utilisateur

su - medplan
cp /etc/skel/.bashrc .
cp /etc/skel/.bash_profile .
ssh-keygen
mkdir bin
mkdir .venvs
mkdir webapps
python3.6 -m venv .venvs/medplan
source .venvs/medplan/bin/activate
cd /home/medplan/webapps
git clone git@vmwmedtools:institutionnel/medplan.git

La clé SSH doit ensuite être renseignée au niveau du dépôt, afin de pouvoir y accéder.

A ce stade, on devrait déjà avoir quelque chose de fonctionnel en démarrant les commandes suivantes:

# en tant qu'utilisateur 'medplan'

source .venvs/medplan/bin/activate
pip install -U pip
pip install -r requirements/base.txt
pip install gunicorn
cd webapps/medplan
gunicorn config.wsgi:application --bind localhost:3000 --settings=config.settings_production

Configuration de lapplication

SECRET_KEY=<set your secret key here>
ALLOWED_HOSTS=*
STATIC_ROOT=/var/www/medplan/static

Création des répertoires de logs

mkdir -p /var/www/medplan/static

Création du répertoire pour le socket

Dans le fichier /etc/tmpfiles.d/medplan.conf:

D /var/run/webapps 0775 medplan gunicorn_sockets -

Suivi de la création par systemd :

systemd-tmpfiles --create

Gunicorn

#!/bin/bash

# defines settings for gunicorn
NAME="Medplan"
DJANGODIR=/home/medplan/webapps/medplan
SOCKFILE=/var/run/webapps/gunicorn_medplan.sock
USER=medplan
GROUP=gunicorn_sockets
NUM_WORKERS=5
DJANGO_SETTINGS_MODULE=config.settings_production
DJANGO_WSGI_MODULE=config.wsgi

echo "Starting $NAME as `whoami`"

source /home/medplan/.venvs/medplan/bin/activate
cd $DJANGODIR
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user $USER \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-

Supervision

yum install supervisor -y

On crée ensuite le fichier /etc/supervisord.d/medplan.ini:

[program:medplan]
command=/home/medplan/bin/start_gunicorn.sh
user=medplan
stdout_logfile=/var/log/medplan/medplan.log
autostart=true
autorestart=unexpected
redirect_stdout=true
redirect_stderr=true

Et on crée les répertoires de logs, on démarre supervisord et on vérifie quil tourne correctement:

mkdir /var/log/medplan
chown medplan:nagios /var/log/medplan

systemctl enable supervisord
systemctl start supervisord.service
systemctl status supervisord.service
● supervisord.service - Process Monitoring and Control Daemon
   Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-12-24 10:08:09 CET; 10s ago
  Process: 2304 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS)
 Main PID: 2310 (supervisord)
   CGroup: /system.slice/supervisord.service
           ├─2310 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
           ├─2313 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
           ├─2317 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
           ├─2318 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
           ├─2321 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
           ├─2322 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
           └─2323 /home/medplan/.venvs/medplan/bin/python3 /home/medplan/.venvs/medplan/bin/gunicorn config.wsgi:...
ls /var/run/webapps/

On peut aussi vérifier que lapplication est en train de tourner, à laide de la commande supervisorctl:

$$$ supervisorctl status gwift
gwift                            RUNNING    pid 31983, uptime 0:01:00

Et pour gérer le démarrage ou larrêt, on peut passer par les commandes suivantes:

$$$ supervisorctl stop gwift
gwift: stopped
root@ks3353535:/etc/supervisor/conf.d# supervisorctl start gwift
gwift: started
root@ks3353535:/etc/supervisor/conf.d# supervisorctl restart gwift
gwift: stopped
gwift: started

Ouverture des ports

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Installation dNginx

yum install nginx -y
usermod -a -G gunicorn_sockets nginx

On configure ensuite le fichier /etc/nginx/conf.d/medplan.conf:

upstream medplan_app {
        server unix:/var/run/webapps/gunicorn_medplan.sock fail_timeout=0;
}

server {
        listen 80;
        server_name <server_name>;
        root /var/www/medplan;
        error_log /var/log/nginx/medplan_error.log;
        access_log /var/log/nginx/medplan_access.log;

        client_max_body_size 4G;
        keepalive_timeout 5;

        gzip on;
        gzip_comp_level 7;
        gzip_proxied any;
        gzip_types gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;


        location /static/ {
                access_log off;
                expires 30d;
                add_header Pragma public;
                add_header Cache-Control "public";
                add_header Vary "Accept-Encoding";
                try_files $uri $uri/ =404;
        }

        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;

                proxy_pass http://medplan_app;
        }
}

Configuration des sauvegardes

Les sauvegardes ont été configurées avec borg: yum install borgbackup.

Cest lutilisateur medplan qui sen occupe.

mkdir -p /home/medplan/borg-backups/
cd /home/medplan/borg-backups/
borg init medplan.borg -e=none
borg create medplan.borg::{now} ~/bin ~/webapps

Et dans le fichier crontab :

0 23 * * * /home/medplan/bin/backup.sh