mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			657 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			657 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| Installer la Note Kfet en production
 | |
| ====================================
 | |
| 
 | |
| Cette page détaille comment installer la Note Kfet sur un serveur de production,
 | |
| dédié uniquement à l'utilisation de la note. On supposera que le serveur tourne
 | |
| avec un Debian Buster à jour.
 | |
| 
 | |
| 
 | |
| Ajout des dépôts buster-backports
 | |
| ---------------------------------
 | |
| 
 | |
| Debian c'est bien, c'est stable, mais les paquets sont vite obsolètes.
 | |
| En particulier, la version stable de Django dans la version stable de Debian est la
 | |
| version 1.11, qui n'est plus maintenue par Django depuis déjà quelques mois.
 | |
| Les versions stables de Django sont les versions 2.2 et 3.2, Debian Bullseye
 | |
| utilisant la version 2.2.
 | |
| 
 | |
| Afin de permettre à ses utilisateur⋅rices d'utiliser les dernières fonctionnalités de
 | |
| certains paquets, Debian a créé une distribution particulière, appelée
 | |
| ``buster-backports``. Cette distribution contient des paquets de la distribution
 | |
| à venir « ``testing`` » (``bullseye`` à l'heure où cette documentation est écrite)
 | |
| recompilés et réadapter pour fonctionner avec les paquets de la distribution stable
 | |
| (``buster``). Ce qui nous intéresse est de pouvoir récupérer Django 2.2 depuis
 | |
| cette distribution, et avoir donc une version maintenue de Django.
 | |
| 
 | |
| Plus de détails sur le wiki de Debian : `<https://wiki.debian.org/fr/Backports>`_.
 | |
| 
 | |
| Pour activer les backports, il suffit d'ajouter dans le fichier ``/etc/apt/sources.list`` :
 | |
| 
 | |
| .. code::
 | |
| 
 | |
|    deb     $MIRROR/debian buster-backports main contrib
 | |
| 
 | |
| où ``$MIRROR`` est votre miroir Debian favori, comme ``http://ftp.debian.org`` ou
 | |
| ``http://mirror.crans.org`` pour ce qui est de la version utilisée en production au BDE
 | |
| sur les serveurs du Crans. Il suffit ensuite de faire un ``sudo apt update``.
 | |
| Vérifiez que les paquets sont bien récupérés, en cherchant cette ligne :
 | |
| 
 | |
| .. code::
 | |
| 
 | |
|    Get:4 http://mirror.crans.org/debian buster-backports InRelease [46.7 kB]
 | |
| 
 | |
| .. warning::
 | |
| 
 | |
|    Avis aux futurs respos info : pensez à bien actualiser cette documentation lorsque
 | |
|    Debian Bullseye sera sorti. En particulier, il ne sera pas déconnant de continuer
 | |
|    à utiliser non pas buster-backports mais bullseye-backports pour installer la
 | |
|    note avec Django 3.2 et non Django 2.2.
 | |
| 
 | |
|    Bien sûr, vous testerez sur un serveur qui n'est pas celui utilisé avant :)
 | |
| 
 | |
| 
 | |
| Installation des dépendances nécessaires
 | |
| ----------------------------------------
 | |
| 
 | |
| On s'efforce pour récupérer le plus possible de dépendances via les paquets Debian
 | |
| plutôt que via ``pip`` afin de faciliter les mises à jour et avoir une installation
 | |
| plus propre. On peut donc installer tout ce dont on a besoin, depuis buster-backports :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo apt update
 | |
|    $ sudo apt install -t buster-backports --no-install-recommends \
 | |
|        gettext git ipython3 \  # Dépendances basiques
 | |
|        fonts-font-awesome libjs-bootstrap4 \  # Pour l'affichage web
 | |
|        python3-bs4 python3-django python3-django-crispy-forms python3-django-extensions \
 | |
|        python3-django-filters python3-django-oauth-toolkit python3-django-polymorphic \
 | |
|        python3-djangorestframework python3-memcache python3-phonenumbers \
 | |
|        python3-pil python3-pip python3-psycopg2 python3-setuptools python3-venv \
 | |
|        texlive-xetex memcached
 | |
| 
 | |
| Ces paquets fournissent une bonne base sur laquelle travailler.
 | |
| 
 | |
| Pour les mettre à jour, il suffit de faire ``sudo apt update`` puis ``sudo apt upgrade``.
 | |
| 
 | |
| 
 | |
| Téléchargement de la note
 | |
| -------------------------
 | |
| 
 | |
| Tout comme en développement, on utilise directement le Gitlab du Crans pour récupérer
 | |
| les sources.
 | |
| 
 | |
| On suppose que l'on veut cloner le projet dans le dossier ``/var/www/note_kfet``.
 | |
| 
 | |
| On clone donc le dépôt en tant que ``www-data`` :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo -u www-data git clone https://gitlab.crans.org/bde/nk20.git /var/www/note_kfet
 | |
| 
 | |
| Par défaut, le dépôt est configuré pour suivre la branche ``main``, qui est la branche
 | |
| stable, notamment installée sur `<https://note.crans.org/>`_. Pour changer de branche,
 | |
| notamment passer sur la branche ``beta`` sur un serveur de pré-production (un peu comme
 | |
| `<https://note-dev.crans.org/>`_), on peut faire :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo -u www-data git checkout beta
 | |
| 
 | |
| .. warning::
 | |
|    Avis aux successeurs : notamment pour le serveur de production derrière
 | |
|    `<https://note.crans.org>`_, il peut être intéressant de créer un paquet Python
 | |
|    de sorte à pouvoir installer la note en faisant directement
 | |
|    ``pip install git+https://gitlab.crans.org/bde/nk20.git``, et avoir ainsi une
 | |
|    installation plus propre en décourageant le développement en production.
 | |
| 
 | |
|    Voir par exemple comment le futur site d'inscription du Crans, Constellation,
 | |
|    gère cela : `<https://gitlab.crans.org/nounous/constellation>`_.
 | |
| 
 | |
| 
 | |
| Installation des dépendances Python non présentes dans les dépôts APT
 | |
| ---------------------------------------------------------------------
 | |
| 
 | |
| Même s'il est préférable d'installer les dépendances Python via les paquets APT,
 | |
| tous ne sont malheureusement pas disponibles.
 | |
| 
 | |
| On doit donc récupérer les dépendances manquantes via pip.
 | |
| 
 | |
| Tout comme en développement, on préfère avoir un environnement virtuel dédié,
 | |
| les ``sudo pip`` étant rarement compatibles avec les dépendances APT.
 | |
| 
 | |
| On construit donc un environnement virtuel et on installe les dépendances manquantes
 | |
| dans cet environnement :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ cd /var/www/note_kfet
 | |
|    $ python3 -m venv env
 | |
|    $ . env/bin/activate
 | |
|    (env) $ pip install -r requirements.txt
 | |
| 
 | |
| Normalement, seules les dépendances manquantes sont installées, les autres sont trouvées
 | |
| globalement.
 | |
| 
 | |
| Plus d'informations sur les environnements virtuels dans la documentation officielle
 | |
| de Python : `<https://docs.python.org/fr/3/tutorial/venv.html>`_.
 | |
| 
 | |
| 
 | |
| Configuration de la note
 | |
| ------------------------
 | |
| 
 | |
| La configuration de la note se gère essentiellement via des paramètres d'environnement.
 | |
| Ceux-ci sont lus via le fichier ``.env`` s'il existe, qui doit être placé à la racine
 | |
| du projet cloné (donc dans ``/var/www/note_kfet/.env``). Un fichier d'exemple est situé
 | |
| dans le fichier ``.env_example``, on peut donc faire un ``sudo cp .env_example .env``.
 | |
| 
 | |
| Attention aux permissions : le fichier doit être lu par ``www-data`` et écrit (rien
 | |
| n'empêche de l'écrire en tant que root).
 | |
| 
 | |
| Le contenu de ce fichier :
 | |
| 
 | |
| .. code:: env
 | |
| 
 | |
|    DJANGO_APP_STAGE=prod
 | |
|    DJANGO_DEV_STORE_METHOD=sqlite
 | |
|    DJANGO_DB_HOST=localhost
 | |
|    DJANGO_DB_NAME=note_db
 | |
|    DJANGO_DB_USER=note
 | |
|    DJANGO_DB_PASSWORD=CHANGE_ME
 | |
|    DJANGO_DB_PORT=
 | |
|    DJANGO_SECRET_KEY=CHANGE_ME
 | |
|    DJANGO_SETTINGS_MODULE=note_kfet.settings
 | |
|    CONTACT_EMAIL=tresorerie.bde@localhost
 | |
|    NOTE_URL=localhost
 | |
|    NOTE_MAIL=notekfet@localhost
 | |
|    EMAIL_HOST=smtp.localhost
 | |
|    EMAIL_PORT=25
 | |
|    EMAIL_USER=notekfet@localhost
 | |
|    EMAIL_PASSWORD=CHANGE_ME
 | |
|    WIKI_USER=NoteKfet2020
 | |
|    WIKI_PASSWORD=
 | |
| 
 | |
| Le paramètre ``DJANGO_APP_STAGE`` accepte comme valeur ``dev`` ou ``prod``.
 | |
| En développement, les mails ne sont pas envoyés mais affichés dans les logs du
 | |
| serveur. Les messages d'erreur sont directement affichés au lieu d'être envoyés
 | |
| par mail. Les paramètres d'envoi de mail n'ont donc aucun effet. En développement,
 | |
| il est également possible de choisir si l'on souhaite une base de données sqlite
 | |
| (par défaut) ou si on veut se connecter à une base de données PostgreSQL (rentrer
 | |
| ``postgres`` dans ``DJANGO_DEV_STORE_METHOD``), auquel cas les paramètres de
 | |
| base de données seront interprétés.
 | |
| 
 | |
| Les champs ``DJANGO_DB_`` sont relatifs à la connexion à la base de données PostgreSQL.
 | |
| 
 | |
| Le champ ``DJANGO_SECRET_KEY`` est utilisé pour la protection CSRF (voir la documentation
 | |
| `<https://docs.djangoproject.com/fr/3.2/ref/csrf/>`_ pour plus de détails). Il s'agit d'une
 | |
| clé sous forme de chaîne de caractère suffisamment longue (64 caractères paraît bien)
 | |
| qui n'est pas à transmettre et qui évite d'autres sites malveillants de faire des requêtes
 | |
| directement sur la note.
 | |
| 
 | |
| Le champ ``CONTACT_EMAIL`` correspond l'adresse mail que les adhérent⋅es peuvent contacter
 | |
| en cas de problème. C'est là où le champ ``Nous contacter`` redirigera.
 | |
| 
 | |
| Le champ ``NOTE_URL`` correspond au nom de domaine autorisé à accéder au site. C'est également
 | |
| le nom de domaine qui sera utilisé dans l'envoi de mails pour générer des liens. En
 | |
| production, cela vaut ``note.crans.org``.
 | |
| 
 | |
| Le champ ``NOTE_MAIL`` correspond au champ expéditeur des mails envoyés, que ce soit
 | |
| pour les rapports quotidiens / hebdomadaires / mensuels ou les mails d'erreur.
 | |
| En production, ce champ vaut ``notekfet2020@crans.org``.
 | |
| 
 | |
| Les champs ``EMAIL_`` sont relatifs à la connexion au serveur SMTP pour l'envoi de mails.
 | |
| En production, ``EMAIL_HOST`` vaut ``smtp.crans.org``, ``EMAIL_PORT`` vaut 25 (on reste sur
 | |
| le réseau interne du Crans) et ``EMAIL_USER`` et ``EMAIL_PASSWORD`` sont vides (ce qui est
 | |
| valide car la note est sur le réseau du Crans, qui est déjà pré-autorisé à envoyer des mails).
 | |
| 
 | |
| Les champs ``WIKI_USER`` et ``WIKI_PASSWORD`` servent à s'authentifier sur le compte Wiki
 | |
| Crans ``NoteKfet2020``, pour notamment exporter automatiquement la liste des activités sur
 | |
| le wiki.
 | |
| 
 | |
| Pour configurer la note, il est également possible de créer un fichier
 | |
| ``note_kfet/settings/secrets.py`` qui redéfinit certains paramètres, notamment la
 | |
| liste des administrateurs ou certaines applications optionnelles, ou encore certains
 | |
| éventuels mots de passe.
 | |
| 
 | |
| En production, ce fichier contient :
 | |
| 
 | |
| .. code:: python
 | |
| 
 | |
|    OPTIONAL_APPS = [
 | |
|       'cas_server',
 | |
|    #    'debug_toolbar'
 | |
|    ]
 | |
| 
 | |
|    # When a server error occured, send an email to these addresses
 | |
|    ADMINS = (
 | |
|        ('Note Kfet', 'notekfet2020@lists.crans.org'),
 | |
|    )
 | |
| 
 | |
| 
 | |
| Génération d'une clé privé pour OIDC
 | |
| ------------------------------------
 | |
| 
 | |
| Pour pouvoir proposer le service de connexion Openid Connect (OIDC) par OAuth2, il y a
 | |
| besoin d'une clé privé. Par défaut, elle est cherché dans le fichier `/var/secrets/oidc.key`
 | |
| (sinon, il faut modifier l'emplacement dans les fichiers de configurations).
 | |
| 
 | |
| Pour générer la clé, il faut aller dans le dossier `/var/secrets` (à créer, si nécessaire) puis
 | |
| utiliser la commande de génération :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    cd /var/secrets
 | |
|    openssl genrsa -out oidc.key 4096
 | |
| 
 | |
| 
 | |
| Configuration des tâches récurrentes
 | |
| ------------------------------------
 | |
| 
 | |
| Certaines opérations se font périodiquement, comme le rappel hebdomadaire pour les
 | |
| personnes en négatif. On utilise pour cela un cron. Il suffit pour cela de copier
 | |
| le fichier ``note.cron`` vers ``/etc/cron.d/note``, en veillant à ce qu'il appartienne
 | |
| bien à ``root``.
 | |
| 
 | |
| Ce fichier contient l'ensemble des tâches récurrentes associées à la note.
 | |
| Une page de documentation dédiée fera bientôt son apparition.
 | |
| 
 | |
| Sur un serveur de pré-production, on peut ne pas souhaiter activer ces tâches récurrentes.
 | |
| 
 | |
| 
 | |
| Installation de la base de données PostgreSQL
 | |
| ---------------------------------------------
 | |
| 
 | |
| En production, on utilise une vraie base de données PostgreSQL et non un fichier
 | |
| sqlite. Beaucoup plus facile pour faire éventuellement des requêtes (bien que pas
 | |
| adapté pour Django) mais surtout bien mieux optimisé pour un serveur de production.
 | |
| 
 | |
| Pour installer la base de données, on commence par installer PostgreSQL :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo apt install --no-install-recommends postgresql postgresql-contrib
 | |
| 
 | |
| PostgreSQL est désormais installé et lancé. On crée un compte ``note``, avec un
 | |
| bon mot de passe (le même que donné à Django) :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo -u postgres createuser -P note
 | |
| 
 | |
| Et on crée enfin une base de données nommée ``note_db`` appartenant à ``note``.
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo -u postgres createdb note_db -O note
 | |
| 
 | |
| La base de données est désormais prête à être utilisée.
 | |
| 
 | |
| 
 | |
| Finir l'installation de Django
 | |
| ------------------------------
 | |
| 
 | |
| On commence par construire la base de données à partir des migrations enregistrées :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py migrate
 | |
| 
 | |
| On doit compiler les traductions (pour pouvoir les lire plus vite par la suite) :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py compilemessages
 | |
| 
 | |
| Les fichiers statiques (fiches de style, fichiers Javascript, images, ...) doivent
 | |
| être exportées dans le dossier ``static`` :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py collectstatic
 | |
| 
 | |
| Et on peut enfin importer certaines données de base :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py loaddata initial
 | |
| 
 | |
| La note est désormais prête à être utilisée. Ne reste qu'à configurer un serveur Web.
 | |
| 
 | |
| 
 | |
| Configuration de UWSGI
 | |
| ----------------------
 | |
| 
 | |
| On dispose d'une instance de la note fonctionnelle et bien configurée. Cependant, nous
 | |
| n'avons pas encore de socket permettant d'intéragir avec le serveur. C'est le travail
 | |
| de UWSGI.
 | |
| 
 | |
| On rappelle que la commande ``./manage.py runserver`` n'est pas conçue pour des serveurs
 | |
| de production, contrairement à UWSGI.
 | |
| 
 | |
| On commence par installer UWSGI :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo apt install --no-install-recommends uwsgi uwsgi-plugin-python3
 | |
| 
 | |
| On place ensuite le fichier de configuration UWSGI dans les applications installées.
 | |
| Un fichier de configuration est présent à la racine du projet, contenant :
 | |
| 
 | |
| .. code:: ini
 | |
| 
 | |
|    [uwsgi]
 | |
|    uid             = www-data
 | |
|    gid             = www-data
 | |
|    # Django-related settings
 | |
|    # the base directory (full path)
 | |
|    chdir           = /var/www/note_kfet
 | |
|    # the virtualenv (full path)
 | |
|    home            = /var/www/note_kfet/env
 | |
|    wsgi-file       = /var/www/note_kfet/note_kfet/wsgi.py
 | |
|    plugin          = python3
 | |
|    # process-related settings
 | |
|    # master
 | |
|    master          = true
 | |
|    # maximum number of worker processes
 | |
|    processes       = 10
 | |
|    # the socket (use the full path to be safe
 | |
|    socket          = /var/www/note_kfet/note_kfet.sock
 | |
|    # ... with appropriate permissions - may be needed
 | |
|    chmod-socket    = 664
 | |
|    # clear environment on exit
 | |
|    vacuum          = true
 | |
|    # Touch reload
 | |
|    touch-reload    = /var/www/note_kfet/note_kfet/settings/__init__.py
 | |
|    # Enable threads
 | |
|    enable-threads  = true
 | |
| 
 | |
| Il suffit donc de créer le lien symbolique :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo ln -s /var/www/note_kfet/uwsgi_note.ini /etc/uwsgi/apps-enabled/uwsgi_note.ini
 | |
| 
 | |
| On peut désormais relancer UWSGI :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo systemctl restart uwsgi
 | |
| 
 | |
| 
 | |
| Configuration de NGINX
 | |
| ----------------------
 | |
| 
 | |
| Nous avons désormais un socket qui nous permet de faire des connexions au serveur web,
 | |
| placé dans ``/var/www/note_kfet/note_kfet.sock``. Cependant, ce socket n'est pas accessible
 | |
| au reste du monde, et ne doit pas l'être : on veut un serveur Web Nginx qui s'occupe des
 | |
| connexions entrantes et qui peut servir de reverse-proxy, notamment utile pour desservir
 | |
| les fichiers statiques ou d'autres sites sur le même serveur.
 | |
| 
 | |
| On commence donc par installer Nginx :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo apt install nginx
 | |
| 
 | |
| On place ensuite dans ``/etc/nginx/sites-available/nginx_note.conf`` le fichier de
 | |
| configuration Nginx qui va bien, en remplaçant ``note.crans.org`` par ce qu'il faut :
 | |
| 
 | |
| .. code::
 | |
| 
 | |
|     # the upstream component nginx needs to connect to
 | |
|     upstream note {
 | |
|         server unix:///var/www/note_kfet/note_kfet.sock; # file socket
 | |
|     }
 | |
| 
 | |
|     # Redirect HTTP to nk20 HTTPS
 | |
|     server {
 | |
|         listen 80 default_server;
 | |
|         listen [::]:80 default_server;
 | |
| 
 | |
|         location / {
 | |
|             return 301 https://note.crans.org$request_uri;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     # Redirect all HTTPS to nk20 HTTPS
 | |
|     server {
 | |
|         listen 443 ssl default_server;
 | |
|         listen [::]:443 ssl default_server;
 | |
| 
 | |
|         location / {
 | |
|             return 301 https://note.crans.org$request_uri;
 | |
|         }
 | |
| 
 | |
|         ssl_certificate /etc/letsencrypt/live/note.crans.org/fullchain.pem;
 | |
|         ssl_certificate_key /etc/letsencrypt/live/note.crans.org/privkey.pem;
 | |
|         include /etc/letsencrypt/options-ssl-nginx.conf;
 | |
|         ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
 | |
|     }
 | |
| 
 | |
|     # configuration of the server
 | |
|     server {
 | |
|         listen 443 ssl;
 | |
|         listen [::]:443 ssl;
 | |
| 
 | |
|         # the port your site will be served on
 | |
|         # the domain name it will serve for
 | |
|         server_name note.crans.org;
 | |
|         charset     utf-8;
 | |
| 
 | |
|         # max upload size
 | |
|         client_max_body_size 75M;
 | |
| 
 | |
|         # Django media
 | |
|         location /media  {
 | |
|             alias /var/www/note_kfet/media;
 | |
|         }
 | |
| 
 | |
|         location /static {
 | |
|             alias /var/www/note_kfet/static;
 | |
|         }
 | |
| 
 | |
|         location /doc {
 | |
|             alias /var/www/documentation;
 | |
|         }
 | |
| 
 | |
|         # Finally, send all non-media requests to the Django server.
 | |
|         location / {
 | |
|             uwsgi_pass note;
 | |
|             include /etc/nginx/uwsgi_params;
 | |
|         }
 | |
| 
 | |
|         ssl_certificate /etc/letsencrypt/live/note.crans.org/fullchain.pem;
 | |
|         ssl_certificate_key /etc/letsencrypt/live/note.crans.org/privkey.pem;
 | |
|         include /etc/letsencrypt/options-ssl-nginx.conf;
 | |
|         ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
 | |
|     }
 | |
| 
 | |
| On peut enfin activer le site :
 | |
| 
 | |
| .. code::
 | |
| 
 | |
|    $ sudo ln -s /etc/nginx/sites-available/nginx_note.conf /etc/nginx/sites-enabled/nginx_note.conf
 | |
| 
 | |
| Si on peut se dire que recharger Nginx suffira, il n'en est rien : voir paragraphe suivant.
 | |
| 
 | |
| 
 | |
| Génération d'un certificat SSL
 | |
| ------------------------------
 | |
| 
 | |
| Nginx va essayer de lire les certificats présents dans
 | |
| ``/etc/letsencrypt/live/note.crans.org/``, mais ce dossier n'existe pas encore.
 | |
| 
 | |
| On doit donc générer un certificat pour permettre les connexions HTTPS. Cela est permis
 | |
| grâce à ``certbot``, qu'on s'empresse d'installer :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo apt install certbot python3-certbot-nginx
 | |
| 
 | |
| Le plugin pour nginx permet de certifier que le serveur a bien les droits pour
 | |
| ``note.crans.org`` grâce à Nginx, le BDE n'ayant a priori aucune raison de pouvoir
 | |
| gérer le nom de domaine ``crans.org``.
 | |
| 
 | |
| On place dans le dossier ``/etc/letsencrypt/conf.d`` (qu'on crée au besoin) un fichier
 | |
| nommé ``nk20.ini`` :
 | |
| 
 | |
| .. code:: ini
 | |
| 
 | |
|     # To generate the certificate, please use the following command
 | |
|     # certbot --config /etc/letsencrypt/conf.d/nk20.ini certonly
 | |
| 
 | |
|     # Use a 4096 bit RSA key instead of 2048
 | |
|     rsa-key-size = 4096
 | |
| 
 | |
|     # Always use the staging/testing server
 | |
|     # server = https://acme-staging.api.letsencrypt.org/directory
 | |
| 
 | |
|     # Uncomment and update to register with the specified e-mail address
 | |
|     email = notekfet2020@lists.crans.org
 | |
| 
 | |
|     # Uncomment to use a text interface instead of ncurses
 | |
|     text = True
 | |
| 
 | |
|     # Use Nginx challenge
 | |
|     authenticator = nginx
 | |
| 
 | |
| En exécutant ``certbot``, il va lire les fichiers de configuration Nginx et générer les
 | |
| certificats qu'il faut en créant un point d'entrée pour le serveur.
 | |
| 
 | |
| Il faut néanmoins que la configuration soit valide. Les certificats n'existant pas encore,
 | |
| la configuration nginx est donc pour l'instant invalide. Il faut alors temporairement
 | |
| commenter les parties de la configuration qui traitent des certificats et relancer ``nginx``
 | |
| (``sudo systemctl reload nginx``).
 | |
| 
 | |
| On peut ensuite exécuter ``certbot`` :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ certbot --config /etc/letsencrypt/conf.d/nk20.ini certonly
 | |
| 
 | |
| L'instruction ``certonly`` indique à ``certbot`` qu'il se contente de générer le certificat,
 | |
| sans chercher à l'installer. Si tout s'est bien passé, l'installation se fait simplement
 | |
| en décommentant les lignes préalablement commentées.
 | |
| 
 | |
| Un certificat généré de la sorte expire au bout de 3 mois. Néanmoins, certbot tourne
 | |
| régulièrement pour renouveler les certificats actifs automatiquement. Il n'y a donc
 | |
| plus rien à faire.
 | |
| 
 | |
| Après avoir rechargé la configuration de ``Nginx``, rendez-vous sur
 | |
| `<https://note.crans.org>`_ (ou votre site) pour vérifier que tout fonctionne correctement :)
 | |
| 
 | |
| 
 | |
| Mettre à jour la note
 | |
| ---------------------
 | |
| 
 | |
| Pour mettre à jour la note, il suffit a priori, après avoir mis à jour les paquets APT,
 | |
| de faire un ``git pull`` dans le dossier ``/var/www/note_kfet``.
 | |
| 
 | |
| Les éventuelles nouvelles migrations de la base de données doivent être appliquées :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py migrate
 | |
| 
 | |
| Les nouvelles traductions compilées :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py compilemessages
 | |
| 
 | |
| Les nouveaux fichiers statiques collectés :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py collectstatic
 | |
| 
 | |
| Et enfin les nouvelles fixtures installées :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ ./manage.py loaddata initial
 | |
| 
 | |
| Une fois tout cela fait, il suffit de relancer le serveur UWSGI :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    $ sudo systemctl restart uwsgi
 | |
| 
 | |
| 
 | |
| Avec Ansible
 | |
| ------------
 | |
| 
 | |
| Tout ce travail peut sembler très laborieux et peut mériter d'être automatisé.
 | |
| Toutefois, il est essentiel de bien comprendre comment chaque étape de l'installation
 | |
| fonctionne.
 | |
| 
 | |
| Un playbook Ansible a été écrit permettant de réaliser toutes les tâches décrites ci-dessus.
 | |
| Il se trouve dans le dossier ``ansible``.
 | |
| 
 | |
| Ansible s'installe sur votre propre machine (et non sur le serveur) en installant simplement
 | |
| le paquet ``ansible``.
 | |
| 
 | |
| Pour déployer la note sur un serveur vierge, commencez par copier le fichier ``hosts_example``
 | |
| en le nommant ``hosts``. Ajoutez votre propre serveur, dans la section correspondante.
 | |
| 
 | |
| Dans le dossier ``host_vars``, créez un fichier dont le nom est l'adresse du serveur, avec
 | |
| l'extension ``.yml``.
 | |
| 
 | |
| Dans ce fichier, remplissez :
 | |
| 
 | |
| .. code:: yaml
 | |
| 
 | |
|    ---
 | |
|    note:
 | |
|      server_name: note.crans.org
 | |
|      git_branch: main
 | |
|      cron_enabled: true
 | |
|      email: notekfet2020@lists.crans.org
 | |
| 
 | |
| 
 | |
| en adaptant à votre configuration.
 | |
| 
 | |
| Il suffit ensuite de lancer ``./base.yml -l urldevotreserveur``.
 | |
| 
 | |
| Pour une première installation, vous devrez renseigner le mot de passe de la base de données
 | |
| pour créer le compte ``note``. Vous devrez ensuite également refaire quelques ajustements
 | |
| pour générer le certificat, voir la partie ``certbot``. La configuration du fichier
 | |
| ``.env`` sera également à faire à la main.
 | |
| 
 | |
| Cependant, pour mettre à jour, lancer cette commande suffit.
 | |
| 
 | |
| 
 | |
| Copier une base de données
 | |
| --------------------------
 | |
| 
 | |
| On peut vouloir périodiquement copier la base de données de production vers le serveur
 | |
| de développement, afin de travailler avec des données à jour.
 | |
| 
 | |
| On aura besoin de pouvoir accéder aux deux bases de données. On commence donc si ce n'est
 | |
| pas déjà fait par créer un utilisateur sur les deux serveurs :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    ynerant@bde-note:~$ sudo -u postgres createuser -s ynerant
 | |
| 
 | |
| On réinitialise **sur le serveur de développement** la base de données présente, en
 | |
| éteignant tout d'abord le serveur Web :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    ynerant@bde-note-dev:~$ sudo systemctl stop uwsgi
 | |
|    ynerant@bde-note-dev:~$ sudo -u postgres dropdb note_db
 | |
|    ynerant@bde-note-dev:~$ sudo -u postgres createdb -O note note_db
 | |
| 
 | |
| Et on copie enfin la base de données, en une seule ligne via SSH :
 | |
| 
 | |
| .. code:: bash
 | |
| 
 | |
|    ynerant@bde-note:~$ pg_dump note_db | ssh note-dev.crans.org "psql note_db -f -"
 | |
| 
 | |
| On peut enfin redémarrer le serveur Web. Les données ont bien été copiées.
 | |
| 
 | |
| .. caution::
 | |
| 
 | |
|    On ne copiera **jamais** des données d'adhérent⋅es sur une machine personnelle.
 | |
|    Ce type d'opération doit s'effectuer impérativement entre des serveurs du BDE.
 |