Procédure d’installation

Ce document présente installation d’un système Publik standard. Des adaptations sont naturellement à envisager en fonction des besoins particuliers.

Rappel de l’architecture

Une infrastructure type de Publik est composée de plusieurs machines (une installation sur machine unique reste possible):

  • un service frontal de répartition de charge (proxy)
  • deux serveurs d'application (web1 et web2)
  • un serveur de base de données sql (Postgres)
  • un serveur de fichier (partage NFS)

Liste des modules applicatifs potentiels de Publik :

  • Authentic : gestion des identités, IdP (identity provider),
  • Combo : CMS pour portails usager et agent (porte d’entrée de Publik),
  • w.c.s. : formulaires et workflows,
  • Passerelle : connecteurs vers systèmes tiers,
  • Fargo : porte-documents,
  • Corbo : diffusion de messages,
  • Chrono : prise de rendez-vous,
  • Welco : interface de saisie (multi-canal),
  • Hobo : système de déploiement et de provisionning,
  • Bijoe : élaboration et production de rapports statistiques,
  • Chrono : gestion d'inscriptions et rendez-vous.

Pré-requis

Résolution de noms

Avant l'installation de Publik il faut vérifier que les enregistrements DNS sont fonctionnels ; Publik nécessite autant de domaines que de composants.

Typiquement :

  • portail usager (composant combo) : moncompte.macollectivite.fr,
  • portail agents (composant combo) : agents-moncompte.macollectivite.fr,
  • démarches (composant wcs/wcs-au-quotidien) : demarches-moncompte.macollectivite.fr,
  • fournisseur d'identités (composant authentic) : connexion-moncompte.macollectivite.fr,
  • hub de webservice (composant passerelle) : passerelle-moncompte.macollectivite.fr,
  • porte document (composant fargo) : portedoc-moncompte.macollectivite.fr,

Par exemple voici à quoi pourraient ressembler les entrées d'un serveur Bind:

publik         A     a.b.c.d    ; addresse IP de «publik»
portail        CNAME publik    ; portail usage (brique: combo)
backoffice     CNAME publik    ; portail agent (brique: combo)
connexion      CNAME publik    ; fournisseur d'identités (brique: authentic)
demarches      CNAME publik    ; téléservices (brique: wcs)
passerelle     CNAME publik    ; hub de webservices (brique: passerelle)
hobo           CNAME publik    ; système de déploiement (brique: hobo)

Toutes ces entrées DNS doivent pointer vers le proxy de répartition de charge (dans le cas d'une installation avec répartition de charge).

Par ailleurs, les serveurs applicatifs doivent impérativement avoir un fichier /etc/hosts consistant.

Certificat X509

Publik ne fonctionne qu'en mode HTTPS.

Un ou plusieurs certificats x509 valides et reconnus doivent être disponibles qui couvrent tous les noms des briques qui seront installées. Dans la suite de la documentation, un certificat est disponible :

  • clé publique certifiée : /etc/ssl/certs/cert-example.pem
  • clé privée : /etc/ssl/private/cert-example.key

HAProxy doit disposer du ou des certificats X509 valides pour chacun de ces domaines ; les certificats doivent être reconnus par des autorités publiques. (L’utilisation de certificats Letsencrypt est possible)

Horloges synchronisées

Il est indispensable que les machines soient exactement à la même heure. Les systèmes récent utilisent *systemd-timesyncd *par défaut. Ntp est également possible.

Envois des emails

Les serveurs applicatifs doivent disposer d'un MTA local (par exemple exim4-daemon-light) avec le port SMTP ouvert et capable d'expédier des mails vers tout Internet, en passant éventuellement par un relais. Les mails seront envoyés avec le domaine « @macollectivite.fr ». Nous recommandons vivement de les relayer via un smarthost officiel de votre réseau.

Configuration de la localisation

Sur toutes les machines il est nécessaire de reconfigurer locales pour fr_FR.UTF-8 :

dpkg-reconfigure locales

Configuration des dépôts logiciels

Vue générale

Les différents composants logiciels utilisés par Publik proviennent, par ordre de préférence :

  • de la distribution Debian GNU/Linux stable
  • des backports officiels Debian, disposant du suivi de sécurité par l’équipe Debian,
  • des paquets Debian fournis et maintenus par les projets upstream,
  • de paquets Debian maintenus par Entr’ouvert qui en assure le suivi de sécurité.

Configuration des dépôts logiciels

Les machines doivent disposer des dépôts jessie et jessie-backports.

Ajoutons aussi les dépôts Entr'ouvert et RabbitMQ par la création de /etc/apt/sources.list.d/eo-prod.list :

deb http://deb.entrouvert.org/ jessie main
deb http://www.rabbitmq.com/debian/ testing main

Ajoutons les clés correspondantes :

wget -O- https://deb.entrouvert.org/entrouvert.gpg | apt-key add -
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | apt-key add -
apt update

Pricisons les paquets qu'on veut tirer de jessie-backports en éditant /etc/apt/preferences.d/backports :

Package: python-django
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-django-common
Pin: release a=jessie-backports
Pin-Priority: 900

Package: gunicorn
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-pyasn1
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-requests
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-urllib3
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-cryptography
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-ndg-httpsclient
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-openssl
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-jwcrypto
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-setuptools
Pin: release a=jessie-backports
Pin-Priority: 900

Package: python-pkg-resources
Pin: release a=jessie-backports
Pin-Priority: 900

Installation des paquets de base

Outillage utile pour l'installation et plus tard pour le support et la maintenance :

apt install postgresql-client # pour création utilisateurs et bases de données dans postgresql
apt install bsd-mailx # pour test de l'envoi de mails
apt install zip # pour la création du squelette de site w.c.s.
apt install curl wget # pour les tests/debug locaux
apt install ipython ltrace strace psmisc tcpdump tshark locate # pour des debug applicatifs
apt install ca-certificates-entrouvert # connexion au LDAP EO

Composants additionnels nécessaires pour les applications :

apt install libreoffice # pour génération de documents dans wcs
apt install publik-base-theme # système de thème

Création des bases de données

Vue générale

Chaque brique utilise une ou plusieurs bases de données PostgreSQL. Il est courant d’utiliser une installation à deux machines identiques en master/slave. Publik peut utiliser un système PostgreSQL existant, le cas échéant. Publik nécessite PostgreSQL en version 9 (>9.4 recommandée).

Pré-requis : extensions PostgreSQL

Vérifier que les extensions PostgreSQL sont bien activées :

apt install postgresql-contrib

Création des bases

Chaque composant Publik doit disposer :

  • d'une base de données dédiée,
  • d'un accès spécifique à cette base via un usager postgreSQL dédié (avec un mot de passe SQL à créer pour chaque composant).

Principe pour le composant combo :

CREATE USER combo PASSWORD 'indiquer-ici-le-mot-de-passe-pour-combo';

CREATE DATABASE combo WITH OWNER = combo TEMPLATE = template0 LC_COLLATE = 'fr_FR.UTF_8' LC_CTYPE = 'fr_FR.UTF-8';

Remarque : template0 et LC_COLLATE et LC_CTYPE nécessaires parce que template1 est en en_US.UTF-8.

La même opération doit être répétée pour chaque brique logicielle (bien sûr à chaque fois il faut noter le mot de passe choisi, il sera nécessaire par la suite) :

  • Combo
  • Hobo
  • Authentic
  • Passerelle
  • Fargo
  • Bijoe
  • Chrono
  • Corbo
  • Mandayejs
  • Welco

Une brique est spécifique : w.c.s.. Pour w.c.s., il n'y a pas besoin de création d'une base, elle sera effectuée lors de l'instanciation. En revanche, l'utilisateur w.c.s. sur PostgreSQL doit avoir le droit CREATEDB, donc :

CREATE USER wcs PASSWORD 'indiquer-ici-le-mot-de-passe-pour-wcs' CREATEDB;

Création des utilisateurs avec UID identiques sur web1 et web2

Comme des fichiers vont être partagés en NFSv3, il faut que les UID des utilisateurs Unix concernés soient les mêmes sur les deux machines web1 et web2.

Voici un script pour faire cela sur web1 et web2 :

#!/bin/sh

uid=2100

for user in hobo authentic-multitenant wcs wcs-au-quotidien passerelle combo fargo welco chrono corbo bijoe mandayejs
do
    echo "create group $user ($uid)"
    addgroup --system --gid $uid $user
    echo "create user $user ($uid)"
    adduser --disabled-password --system --uid $uid --gecos "$user daemon" --ingroup $user --no-create-home --home /var/lib/$user $user uid=$(($uid+1))
done

Résultat dans /etc/passwd:

hobo:x:2101:2101:hobo daemon,,,:/var/lib/hobo:/bin/false
authentic-multitenant:x:2102:2102:authentic2-multitenant
daemon,,,:/var/lib/authentic2-multitenant:/bin/false
wcs:x:2103:2103:wcs daemon,,,:/var/lib/wcs:/bin/false
wcs-au-quotidien:x:2104:2104:wcs-au-quotidien
daemon,,,:/var/lib/wcs-au-quotidien:/bin/false
passerelle:x:2105:2105:passerelle
daemon,,,:/var/lib/passerelle:/bin/false
combo:x:2106:2106:combo daemon,,,:/var/lib/combo:/bin/false
fargo:x:2107:2107:fargo daemon,,,:/var/lib/fargo:/bin/false
welco:x:2108:2108:welco daemon,,,:/var/lib/welco:/bin/false
chrono:x:2109:2109:chrono daemon,,,:/var/lib/chrono:/bin/false
corbo:x:2110:2110:corbo daemon,,,:/var/lib/corbo:/bin/false
bijoe:x:2111:2111:bijoe daemon,,,:/var/lib/bijoe:/bin/false
mandayejs:x:2112:2112:mandayejs daemon,,,:/var/lib/mandayejs:/bin/false

Paramétrage du partage de fichiers

Démarrer les services uniquement après le montage de /srv/nfs

Ajouter pour les services liés à Publik un supplément RequiresMountsFor= à la description du service

Exemple pour Combo :

cat /etc/systemd/system/combo.service.d/wait-for-mnt-data.conf

[Unit]

RequiresMountsFor=/srv/nfs

Faire de même avec :

  • les services systemd-isés qui ont besoin de /srv/nfs : Combo, Fargo, Passerelle.
  • les services bientôt systemd-isés (avant fin 2017, donc prévoir dès maintenant le supplément) : authentic2-multitenant, hobo, hobo-agent, wcs

Installation des composants

Publik est la somme de plusieurs composants qui communiquent entre eux via messages et webservices. Chaque composant est un paquet Debian qui s'installe depuis de dépôt Entr'ouvert.

Lors de leur installation les briques s’attendent à trouver un service postgres fonctionnel. Afin de les satisfaire nous renseignons ces paramètres de connexion avant leur installation. Une alternative à cette approche est de relancer la configuration du paquet (dpkg --configure -a) une fois les paramètres de connexion Postgres correctement renseignés.

A noter également que par défaut, les paquets considèrent qu'ils peuvent fonctionner avec une base PostgreSQL locale. Quand on installe un paquet on ajoute postgresql- à la fin du apt install afin d'éviter l'installation d'un serveur postgres local.

Installation d'abord et seulement sur web1

****La suite de la procédure d'installation n'est à suivre que sur une des deux machines, web1****

Une fois que web1 sera en place et fonctionnelle, on pourra activer la balance de charge en installant web2. L'installation sur web2 sera beaucoup plus simple (décrite plus bas) : les configurations et initialisation des données (instanciations) auront déjà été faites sur web1, il suffit de les partager sur web2.

Installation RabbitMQ

# apt install rabbitmq-server

RabbitMQ sera utilisé uniquement en local (127.0.0.1) et n'a besoin d'aucune configuration particulière. Veiller cependant à vérifier son bon fonctionnement avant de continuer l'installation. RabbitMQ est assez sensible à la résolution DNS (présence de la machine locale dans /etc/hosts, par exemple) :

Vérifier que le service tourne :

service rabbitmq-server status

● rabbitmq-server.service - RabbitMQ broker

 Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled)
 Active: active (running) since lun. 2017-07-17 10:09:57 CEST; 4 days
ago
 Main PID: 580 (beam.smp)
 Status: "Initialized"

 CGroup: /system.slice/rabbitmq-server.service
 ├─ 580 /usr/lib/erlang/erts-6.2/bin/beam.smp -W w -A 64 -P 1048576 -t
5000000 -stbt db -zdbbl 32000 -K true -- -root /usr/lib/erlang -progname
erl -- -home...
 ├─ 897 /usr/lib/erlang/erts-6.2/bin/epmd -daemon
 ├─1780 inet_gethost 4
 └─1781 inet_gethost 4

Et absence d'erreur dans les logs, qui doivent ressembler à :

$journalctl -u rabbitmq-server.service

-- Logs begin at lun. 2017-07-17 10:09:46 CEST, end at ven. 2017-07-21 19:55:37 CEST. --

juil. 17 10:09:50 web1-preprod systemd[1]: Starting RabbitMQ broker...
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: RabbitMQ 3.6.10.  Copyright (C) 2007-2017 Pivotal Software, Inc.
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: ## ## Licensed under the MPL. See http://www.rabbitmq.com/
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: ## ##
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: ########## Logs: /var/log/rabbitmq/rabbit@web1-preprod.log
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: ###### ## /var/log/rabbitmq/rabbit@web1-preprod-sasl.log
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: ##########
juil. 17 10:09:54 web1-preprod rabbitmq-server[580]: Starting broker...
juil. 17 10:09:57 web1-preprod rabbitmq-server[580]: systemd unit for activation check: "rabbitmq-server.service"
juil. 17 10:09:57 web1-preprod systemd[1]: Started RabbitMQ broker.  
juil. 17 10:09:57 web1-preprod rabbitmq-server[580]: completed with 0 plugins.

(Note : bien sûr, ce n'est pas un composant créé par Entr'ouvert, c'est https://www.rabbitmq.com/)

Installation Combo

On commence par renseigner les paramètres de connexion à la base de donnée :

L'accès à la base de données de Combo se décrit dans /etc/combo/settings.d/.py* :

# contenu de /etc/combo/settings.d/settings.py

DATABASES['default']['NAME'] = 'combo'
DATABASES['default']['USER'] = 'combo'
DATABASES['default']['PASSWORD'] = 'indiquer-ici-le-mot-de-passe-pour-combo'
DATABASES['default']['HOST'] = 'sql-prod'
DATABASES['default']['PORT'] = '5432'

Toujours dans /etc/combo/settings.d/macollectivite.py, nous configurons l'envoi des traces d'erreur par l'ajout de ces lignes en fin de fichier :

ADMINS = (('Admin EO', 'admin+prod.macollectivite.combo@entrouvert.com'),)
EMAIL_SUBJECT_PREFIX = '[prod macollectivite combo] '
SERVER_EMAIL = ['admin+prod.](mailto:'admin+prod.maville.combo@entrouvert.com)macollectivite[.combo@entrouvert.com](mailto:'admin+prod.maville.combo@entrouvert.com)'

On installe ensuite le logiciel combo en (indiquant qu'il ne faut pas suivre la recommandation d'installer PostgreSQL) :

# apt install combo postgresql-

Vérification avec service combo status :

service combo status -l

● combo.service - Combo

 Loaded: loaded (/lib/systemd/system/combo.service; enabled)
 Drop-In: /etc/systemd/system/combo.service.d
 └─wait-for-mnt-data.conf
 Active: active (running) since jeu. 2017-07-20 23:33:44 CEST; 19h ago
 Main PID: 16324 (gunicorn)

 CGroup: /system.slice/combo.service
 ├─16324 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30 --name combo combo.wsgi:application
 ├─16335 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30 --name combo combo.wsgi:application
 ├─16336 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30
 ├─16337 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30 --name combo combo.wsgi:application
 ├─16342 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30 --name combo combo.wsgi:application
 └─16347 /usr/bin/python /usr/bin/gunicorn --bind unix:/run/combo/combo.sock --worker-class=sync --workers 5 --timeout=30 --name combo combo.wsgi:application

Installation Passerelle

La procédure est la même que pour Combo

L'accès à la base de données de Passerelle se décrit dans /etc/passerelle/settings.d/.py* :

# extrait de /etc/passerelle/settings.d/macollectivite.py

DATABASES['default']['NAME'] = 'passerelle'
DATABASES['default']['USER'] = 'passerelle'
DATABASES['default']['PASSWORD'] = 'indiquer-ici-le-mot-de-passe-pour-passerelle'
DATABASES['default']['HOST'] = 'sql-prod'
DATABASES['default']['PORT'] = '5432'

Toujours dans /etc/passerelle/settings.d/macollectivite.py, configuration pour l'envoi des traces d'erreur par l'ajout de ces lignes en fin de fichier :

ADMINS = (('Admin EO', 'admin+prod.macollectivite.passerelle@entrouvert.com'),)
EMAIL_SUBJECT_PREFIX = '[prod macollectivite passerelle] '
SERVER_EMAIL = 'admin+prod.macollectivite.passerelle@entrouvert.com'

Nous pouvons ensuite installer le composant :

# apt install passerelle postgresql-

Et vérification avec service passerelle status qui doit montrer «active (running)»

Installation Fargo

Reprendre la même procédure que pour les autres composants, en adaptant le nom de la brique, c'est-à-dire :

  1. Configuration de l'accès SQL et du mail dans /etc/fargo/settings.d/macollectivite.py

  2. Installation du composant :

    # apt install fargo postgresql-
    
  3. Vérification avec service fargo status qui doit retourner « active (running) »

Installation Hobo serveur

Reprendre la même procédure que pour les autres composants, en adaptant le nom de la brique, c'est-à-dire :

  1. Configuration de l'accès SQL et du mail dans /etc/hobo/settings.d/macollectivite.py

  2. Installation du composant :

    # apt install hobo postgresql-
    
  3. Vérification avec service hobo status qui doit retourner « active (running) »

Installation Hobo agent

Il s'agit d'un composant qui va écouter les ordres de déploiement (ou provisionning) envoyés par le serveur Hobo et les exécuter sur les autres composants.

Installation :

# apt install hobo-agent

Ce démon est piloté par supervisor, ce dernier a parfois du mal à se lancer dès la première installation. On remet donc tout à plat avec :

service supervisor stop
service supervisor start

Et on vérifie que hobo-agent est bien lancé par supervisor :

service supervisor status

● supervisor.service - LSB: Start/stop supervisor

 Loaded: loaded (/etc/init.d/supervisor)
 Active: active (running) since lun. 2017-07-17 10:09:52 CEST; 4 days ago
 CGroup: /system.slice/supervisor.service

 ├─1065 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
 ├─1208 python2.7 /usr/bin/celery worker --hostname=agent.%h --app=hobo.agent.worker --loglevel=INFO --concurrency=1
 └─1494 python2.7 /usr/bin/celery worker --hostname=agent.%h --app=hobo.agent.worker --loglevel=INFO --concurrency=1

Installation Authentic

Le système Authentic, un peu plus ancien que les autres composants, ne suit pas exactement les mêmes principes et les mêmes nommages.

Le nom du paquet à installer est authentic2-multitenant, et on ajoute son plugin FranceConnect python-authentic2-auth-fc :

# apt install authentic2-multitenant python-authentic2-auth-fc postgresql-

La configuration de l'accès SQL et des mails se fait dans /etc/authentic2-multitenant/config.py (et non pas settings.py comme pour les autres) :

# extraits de /etc/authentic2-multitenant/config.py
DATABASES['default']['NAME'] = 'authentic'
DATABASES['default']['USER'] = 'authentic'
DATABASES['default']['PASSWORD'] = 'le-mot-de-passe-de-authentic-cree-sur-postgresql'
DATABASES['default']['HOST'] = 'sql-prod'
DATABASES['default']['PORT'] = '5432'
# ...

ADMINS = (('Admin EO', 'admin+prod.macollectivite.authentic@entrouvert.com'),)
EMAIL_SUBJECT_PREFIX = '[prod macollectivite authentic] '
SERVER_EMAIL = 'admin+prod.macollectivite.authentic@entrouvert.com'

Une fois ces configurations effectués, il faut remettre le service en place et lui demander de construire la base (update) :

# dpkg --configure -a
# service authentic2-multitenant stop
# service authentic2-multitenant update
# service authentic2-multitenant restart

Vérification avec service authentic2-multitenant status :

# service authentic2-multitenant status
● authentic2-multitenant.service - LSB: Authentic2 is a versatile identity provider
 Loaded: loaded (/etc/init.d/authentic2-multitenant)
 Active: active (running) since jeu. 2017-07-20 18:48:47 CEST; 24h ago
 CGroup: /system.slice/authentic2-multitenant.service
 ├─21361 /usr/bin/python /usr/bin/gunicorn --pid /var/run/authentic2-multitenant/authentic2-multitenant.pid --user authentic-multitenant --group authentic-m...
 ├─21372 /usr/bin/python /usr/bin/gunicorn --pid /var/run/authentic2-multitenant/authentic2-multitenant.pid --user authentic-multitenant --group authentic-m...
 ├─21377 /usr/bin/python /usr/bin/gunicorn --pid /var/run/authentic2-multitenant/authentic2-multitenant.pid --user authentic-multitenant --group authentic-m...
 ├─21380 /usr/bin/python /usr/bin/gunicorn --pid /var/run/authentic2-multitenant/authentic2-multitenant.pid --user authentic-multitenant --group authentic-m...
 └─25604 /usr/bin/python /usr/bin/gunicorn --pid /var/run/authentic2-multitenant/authentic2-multitenant.pid --user authentic-multitenant --group authentic-m...

Installation w.c.s.

En pré-requis, LibreOffice est installé car w.c.s. l'utilise dans des fonctionnalités de production de documents :

# apt install libreoffice

Reprendre la même procédure que pour les autres composants, en adaptant le nom de la brique, c'est-à-dire :

  1. Configuration de l'accès SQL et du mail dans /etc/wcs/settings.d/macollectivite.py

  2. Installation du composant :

    # apt install wcs postgresql-
    
  3. Vérification avec service wcs status qui doit retourner « active (running) »

Frontal nginx

Installation de Nginx

# apt install nginx

... rien de plus. Nous installons la version de Debian 8, mais la version jessie-backports est possible aussi si nécessaire.

Configuration de base

Mise en place d'un format de log avancé (qui affiche le tenant) dans /etc/nginx/conf.d/log_formats.conf :

# /etc/nginx/conf.d/log_formats.conf

log_format combined_full '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$host" [$request_time ms]';

log_format with_request_time '$remote_addr - $remote_user [$time_local] [$request_time ms] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

robots.txt et favicon communs dans /etc/nginx/includes/macollectivite-common.conf :

location /favicon.ico { alias /var/www/html/favicon-macollectivite.ico; }

location /robots.txt { alias /var/www/html/robots.txt; }

(le favicon.ico est un copie de http://www.macollectivite.fr/uploads/Image/73/SIT_macollectivitemacollectivite_603_favicon-.ico, le robots.txt interdit toute indexation)

Pour résoudre #18476, ajouter ce fichier : /etc/nginx/conf.d/client-max-body-size.conf avec ce contenu :

client_max_body_size 200M;

Il faut éventuellement adapter la configuration du HAProxy pour accepter les grosses requêtes.

Mise en place des virtualhost (frontaux HTTP des tenants des composants Publik)

Le soin est laissé à l'installateur de décider comment poser les virtualhost ci-dessous dans nginx.

Au niveau de la preprod, le modèle classique a été adopté :

  • un fichier par virtualhost dans /etc/nginx/sites-available/
  • des liens symboliques dans /etc/nginx/sites-enabled/ avec un préfixe *10_* permettant un éventuel classement d'autres services avant ou après.

A noter que ces fichiers Nginx de la plate-forme de pré-production peuvent être copiés pour la plate-forme de production, il faudra cependant veiller à la modification du server_name du portail usagers dans le virtualhost "combo".

Combo

server {
    listen 80;
    server_name ~^moncompte.* # portail usagers ; selon le nom du site (attention, différent de la pré-prod)
    ~^agents-.*; # portail agents ; selon le nom du site

    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/combo-access.log combined_full;
    error_log /var/log/nginx/combo-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/combo/tenants/$host/static/$1
                  /var/lib/combo/tenants/$host/theme/static/$1
                  /var/lib/combo/collectstatic/$1
                  =404;
        add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/media/(.+)$ {
       alias /var/lib/combo/tenants/$host/media/$1;
    }

    location / {
       proxy_pass http://unix:/run/combo/combo.sock;
       proxy_set_header Host $http_host;
       proxy_set_header X-Forwarded-SSL on;
       proxy_set_header X-Forwarded-Protocol ssl;
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Hobo

Même modèle que Combo :

server {
    listen 80;

    server_name ~^hobo-.*;
    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/hobo-access.log combined_full;
    error_log /var/log/nginx/hobo-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/hobo/tenants/$host/static/$1
                  /var/lib/hobo/tenants/$host/theme/static/$1
                  /var/lib/hobo/collectstatic/$1
                  =404;
        add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/media/(.+)$ {
        alias /var/lib/hobo/tenants/$host/media/$1;
    }

    location / {
        proxy_pass http://unix:/run/hobo/hobo.sock;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Protocol ssl;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Passerelle

Même modèle que Combo, mais aucune diffusion de /media (il s'agit de données privées dans Passerelle).

server {
    listen 80;

    server_name ~^passerelle-.*;
    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/passerelle-access.log combined_full;
    error_log /var/log/nginx/passerelle-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/passerelle/tenants/$host/static/$1
                  /var/lib/passerelle/tenants/$host/theme/static/$1
                  /var/lib/passerelle/collectstatic/$1
                  =404;
        add_header Access-Control-Allow-Origin *;
    }

    location / {
        proxy_pass http://unix:/run/passerelle/passerelle.sock;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Protocol ssl;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

fargo

Même modèle que Combo, mais aucune diffusion de /media (il s'agit des fichiers usagers privés dans Fargo).

server {
    listen 80;

    server_name ~^portedoc-.*;
    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/fargo-access.log combined_full;
    error_log /var/log/nginx/fargo-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/fargo/tenants/$host/static/$1
                  /var/lib/fargo/tenants/$host/theme/static/$1
                  /var/lib/fargo/collectstatic/$1
                  =404;
        add_header Access-Control-Allow-Origin *;
    }

    location / {
        proxy_pass http://unix:/run/fargo/fargo.sock;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Protocol ssl;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Authentic

Comme Combo, sans diffusion des /media, et en utilisant le nom du service authentic2-multitenant.

server {
    listen 80;

    server_name ~^connexion-.*;
    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/authentic2-multitenant-access.log combined_full;
    error_log /var/log/nginx/authentic2-multitenant-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/authentic2-multitenant/tenants/$host/static/$1
                  /var/lib/authentic2-multitenant/tenants/$host/theme/static/$1
                  /var/lib/authentic2-multitenant/collectstatic/$1
                  =404;
        add_header Access-Control-Allow-Origin *;
    }

    location / {
        proxy_pass http://unix:/run/authentic2-multitenant/authentic2-multitenant.sock;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Protocol ssl;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

w.c.s.

server {

    listen 80;

    server_name ~^demarches-.*;
    include includes/macollectivite-common.conf;

    access_log /var/log/nginx/wcs-access.log combined_full;
    error_log /var/log/nginx/wcs-error.log;

    location ~ ^/static/(.+)$ {
        root /;
        try_files /var/lib/wcs/$host/static/$1
                  /var/lib/wcs/$host/theme/static/$1
                  /var/lib/wcs/collectstatic/$1
                  /var/lib/wcs-au-quotidien/collectstatic/$1
                  =404;
    }

    location /qo { alias /usr/share/wcs/qommon/; }
    location /apache-errors { alias /usr/share/auquotidien/apache-errors/; }

    location /themes {
        root /;
        try_files /var/lib/wcs/$host$uri
                  /var/lib/wcs-au-quotidien/$host$uri
                  /usr/share/wcs/$uri
                  =404;
    }

    location / {
        proxy_pass http://unix:/var/run/wcs/wcs.sock;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Protocol ssl;
        proxy_set_header X-Forwarded-Proto https;
    }
}

Vérification des réponses de Nginx

Une fois les virtualhost en place, les sites doivent répondre par des erreurs 404 : ce sont les applications de Publik qui répondent qu'elles n'ont pas encore d'instance liés aux noms prévus.

C'est tout de même déjà le temps de vérifier :

  • que les certificats HTTPS sont ok,
  • que haproxy envoie bien sur web1,
  • que les requêtes arrivent sur les bons virtualhost, par exemple pour fargo on vérifiera que l'accès à https://portedoc-moncompte.macollectivite.fr provoque une 404 dans /var/log/nginx/fargo-access.log et aucun message dans /var/log/nginx/fargo-error.log ; opération à répéter avec tous les autres sites installés.

Déploiement des instances

****Attention le déploiement ne doit être lancé que si TOUS les services ont été testés et répondent des 404 aux adresses prévus ****[https://xxx-moncompte.](https://xxx-moncompte.nanterre.fr/)macollectivite.fr/.

Si ce n'est pas le cas, le déploiement va échouer ; et la reprise sur ces erreurs n'est pas toujours simple.

Préparation, création du fichier «recipe»

Installation des thèmes Publik (incluant le thème pour macollectivite) :

apt install publik-base-theme

Création d'un fichier de déploiement /srv/nfs/publik/scripts/recipe-macollectivite-prod.json (note : fichier déjà disponible sur l'infra de pré-prod); la ligne "password" est à compléter le mot de passe à communiquer à Entr'ouvert :

{
    "variables": {
        "hobo": "hobo-moncompte.macollectivite.fr",
        "authentic": "connexion-moncompte.macollectivite.fr",
        "combo": "moncompte.macollectivite.fr",
        "combo_agent": "agents-moncompte.macollectivite.fr",
        "passerelle": "passerelle-moncompte.macollectivite.fr",
        "wcs": "demarches-moncompte.macollectivite.fr",
        "fargo": "portedoc-moncompte.macollectivite.fr"
    },
    "steps": [
        {"create-hobo": {
            "url": "https://${hobo}/"
        }},
        {"create-superuser": {
             "email": "admin+macollectivite@entrouvert.com",
             "password": "..."
        }},
        {"create-authentic": {
            "url": "https://${authentic}/",
            "title": "Connexion"
        }},
        {"set-idp": { }},
        {"create-combo": {
            "url": "https://${combo}/",
            "title": "Compte citoyen",
            "template_name": "portal-user"
        }},
        {"create-combo": {
            "url": "https://${combo_agent}/",
            "slug": "portal-agent",
            "title": "Portail agent",
            "template_name": "portal-agent"
        }},
        {"create-wcs": {
            "url": "https://${wcs}/",
            "title": "Démarches",
            "template_name": "modele.zip"
        }},
        {"create-fargo": {
            "url": "https://${fargo}/",
            "title": "Porte-documents"
        }},
        {"create-passerelle": {
            "url": "https://${passerelle}/",
            "title": "Passerelle"
        }},
        {"set-theme": {
            "theme": "macollectivite"
        }}
    ]
}

Lancement du déploiement

On utilise la commande «cook» proposée par le logiciel «hobo». Cette commande doit impérativement être exécutée par l'utilisateur «hobo», on utilise donc sudo -u hobo … :

# sudo -u hobo hobo-manage cook /srv/nfs/publik/scripts/recipe-macollectivite-prod.json -v 2

Vérification du déploiement

A la fin du déploiement, les logiciels Publik Django packagés doivent avoir déployé les instances dans PostgreSQL (schémas visibles dans chaque base) mais surtout crée le répertoire contenant la configuration du site cible :

Ce qui est visible dans la plateforme de pré-production doit l'être sur la plate-forme de production, donc on doit voir ceci (en retirant les preprod-) :

# ls -ld /var/lib/*/tenants/*
drwxr-xr-x 3 authentic-multitenant authentic-multitenant   120 Jul 12 15:19 /var/lib/authentic2-multitenant/tenants/connexion-preprod-moncompte.macollectivite.fr
drwxr-xr-x 5 combo                 combo                   156 Jul 21 00:25 /var/lib/combo/tenants/agents-preprod-moncompte.macollectivite.fr
drwxr-xr-x 5 combo                 combo                  4096 Jul 20 10:38 /var/lib/combo/tenants/preprod-moncompte.macollectivite.fr
drwxr-xr-x 3 fargo                 fargo                   107 Jul 10 18:19 /var/lib/fargo/tenants/portedoc-preprod-moncompte.macollectivite.fr
drwxr-xr-x 3 hobo                  hobo                     81 Apr 18 10:42 /var/lib/hobo/tenants/hobo-preprod-moncompte.macollectivite.fr
drwxr-xr-x 3 passerelle            passerelle              107 Jul 10 18:19 /var/lib/passerelle/tenants/passerelle-preprod-moncompte.macollectivite.fr

w.c.s. créé directement une base de données wcs_demarches_moncompte_macollectivite_fr accompagnée de son dossier dans /var/lib/wcs-au-quotidien

# ls -ld /var/lib/wcs-au-quotidien/*
drwxr-xr-x 7  root             root                66 Apr 13 15:55 /var/lib/wcs-au-quotidien/collectstatic
-rw------- 1  root             root                50 Apr 13 15:55 /var/lib/wcs-au-quotidien/config.pck
drwxr-xr-x 22 wcs-au-quotidien wcs-au-quotidien  4096 Jul 10 18:19 /var/lib/wcs-au-quotidien/demarches-preprod-moncompte.macollectivite.fr
drwxr-xr-x 2  root             root                47 Apr 13 15:59 /var/lib/wcs-au-quotidien/skeleton.invalid
drwxr-xr-x 2  root             root                23 Apr 13 16:00 /var/lib/wcs-au-quotidien/skeletons

Si un répertoire manque, le déploiement a rencontré un soucis : contacter le support Entr'ouvert

Si les répertoires sont présents, alors :

  • https://moncompte.macollectivite.fr : doit afficher une page "Votre installation de Combo fonctionne (...) Le site est actuellement vide (…)",
  • https://agents-moncompte.macollectivite.fr même chose,
  • https://connexion-moncompte.macollectivite.fr : doit proposer une page de connexion avec un design proche de la pré-prod,
  • https://passerelle-moncompte.macollectivite.fr : doit re-diriger vers le site connexion-moncompte précédent,
  • https://hobo-moncompte.macollectivite.fr : même chose, redirection vers connexion-moncompte,
  • https://portedoc-moncompte.macollectivite.fr : même chose, redirection vers connexion-moncompte,
  • https://demarches-moncompte.macollectivite.fr : doit rediriger vers https://moncompte.macollectivite.fr/.

Si un des sites ne répond pas comme prévu : contacter le support Entr'ouvert.

Configuration de la gestion des identités

Configuration de l'authentification LDAP

Création d'un fichier /var/lib/authentic2-multitenant/tenants/connexion-moncompte.macollectivite.fr/settings.json.

(Conseil : prendre modèle sur le fichier identique en pré-prod et adapter les paramètres LDAP).

{
    "ACCOUNT_ACTIVATION_DAYS": 1,
    "PASSWORD_RESET_TIMEOUT_DAYS": 1,
    "A2_REGISTRATION_EMAIL_IS_UNIQUE": true,
    "A2_EMAIL_IS_UNIQUE": true,
    "LDAP_AUTH_SETTINGS": [
        {
            "realm": "mairie-macollectivite.fr",
            "url": ["ldap://v-dc1.vnan.intra/", "ldap://v-dc2.vnan.intra/"],
            "basedn": "OU=macollectivite,DC=vnan,DC=intra",
            "binddn": "xxxxx@vnan.intra",
            "bindpw": "xxxxx",
            "user_filter": "(&(objectClass=user)(sAMAccountType=805306368)(|(mail=%s)(samaccountname=%s))(|(memberOf=CN=.LD_Agents_BO,OU=macollectivite,DC=vnan,DC=intra)(memberOf=CN=.LD_Agents_Publik,OU=macollectivite,DC=vnan,DC=intra)))",
            "username_template": "{samaccountname[0]}@{realm}",
            "update_username": true,
            "active_directory": true,
            "attributes": [
                "mail",
                "sAMAccountName",
                "cn",
                "sn",
                "givenName",
                "userPrincipalName"
            ],
            "external_id_tuples": [["samaccountname"],["dn:noquote"]],
            "shuffle_replicas": false,
            "require_cert": "never",
            "use_tls": false,
            "set_mandatory_roles": ["Agent"],
            "user_can_change_password": false
        },
        {
            "realm": "entrouvert.com",
            "url": "ldaps://ldap.entrouvert.org/",
            "basedn": "o=entrouvert,ou=companies,o=libre-entreprise",
            "user_filter": "uid=%s",
            "username_template": "{uid[0]}@{realm}",
            "groupsu": ["cn=ldapadmins,ou=groups,o=entrouvert,ou=companies,o=libre-entreprise"],
            "groupstaff": ["cn=ldapadmins,ou=groups,o=entrouvert,ou=companies,o=libre-entreprise"],
            "group_filter": "(&(uniqueMember={user_dn})(objectClass=legroup))",
            "create_group": true,
            "attributes": [ "uid" ],
            "set_mandatory_groups": ["LDAP Entrouvert"],
            "user_can_change_password": false
        }
    ]
}

Lancer un import manuel des comptes (pour ne pas attendre le cron) avec :

# sudo -u authentic-multitenant authentic2-multitenant-manage tenant_command sync-ldap-users -d connexion-moncompte.macollectivite.fr

Cette commande ne doit rien afficher (ce qui signifie que tout s'est bien déroulé), les comptes doivent être visibles dans https://connexion-moncompte.macollectivite.fr/manage/users/

Mise en place de l’équilibrage de la charge

Vue générale

Le principe est de déplacer vers le partage de fichier (NFS) les éléments de configuration de web1 :

  • les répertoires de configuration /etc/xxx des composants Publik, copiés vers /srv/nfs/publik/etc/xxx,
  • les données /var/lib/xxx de ces mêmes composants, copiés vers /srv/nfs/publik/var-lib/xxx,
  • la configuration nginx ; copiés vers /srv/nfs/publik/etc/nginx/xxx et /srv/nfs/publik/var-www/html.

Sur web1 et sur web2, on utilise alors des liens symboliques :

  • Configuration : /etc/xxx/srv/nfs/publik/etc/xxx,
  • Données : /var/lib/xxx/srv/nfs/publik/var-lib/xxx,
  • Configuration nginx.

Détail des opérations

Création des répertoires partagés :

  • configurations: /srv/nfs/publik/etc,
  • données des tenants: /srv/nfs/publik/var-lib/,
  • éléments web (favicon, robots.txt): /srv/nfs/publik/var-www/,

Déplacement des configurations et données des services Publik

  1. Service wcs

    service wcs stop
    mv /etc/wcs /srv/nfs/publik/etc/
    ln -sf /srv/nfs/publik/etc/wcs /etc/wcs
    mv /var/lib/wcs /srv/nfs/publik/var-lib/
    ln -sf /srv/nfs/publik/var-lib/wcs /var/lib/wcs
    service wcs start
    
  2. Service combo

    service combo stop
    mv /etc/combo /srv/nfs/publik/etc/
    ln -sf /srv/nfs/publik/etc/combo /etc/combo
    mv /var/lib/combo /srv/nfs/publik/var-lib/
    ln -sf /srv/nfs/publik/var-lib/combo /var/lib/combo
    service combo start
    
  3. Même procédure avec fargo

  4. Même procédure avec passerelle

  5. Même procédure avec hobo

  6. Même procédure avec authentic2-multitenant

  7. Configuration hobo-agent

    service supervisor stop
    mv /etc/hobo-agent /srv/nfs/publik/etc/
    ln -sf /srv/nfs/publik/etc/hobo-agent /etc
    service supervisor start
    

Autres partages via NFS :

  1. Configurations nginx

    service nginx stop
    mkdir /srv/nfs/publik/etc/nginx
    cd /etc/nginx
    mv conf.d includes sites-available sites-enabled /srv/nfs/publik/etc/nginx/
    ln -sf /srv/nfs/publik/etc/nginx/* .
    service nginx start
    
  2. Éléments web statiques

    cd /var/www
    mv html /srv/nfs/publik/var-www/
    ln -sf /srv/nfs/publik/var-www/html .
    
  3. APT : dépôts et préférences backports

    mkdir /srv/nfs/publik/etc/apt
    cd /etc/apt
    mv sources.list.d preferences.d /srv/nfs/publik/etc/apt/
    ln -sf /srv/nfs/publik/etc/apt/* .
    

Opérations sur web2

Attention : l'UID et le GUID de l'utilisateur "web" doit être identique.

On prépare les répertoires de configuration et de données des composants Publik avant leur installation :

  1. Service wcs

    ln -sf /srv/nfs/publik/etc/wcs /etc/wcs
    ln -sf /srv/nfs/publik/var-lib/wcs /var/lib/wcs
    
  2. Service combo

    ln -sf /srv/nfs/publik/etc/combo /etc/combo
    ln -sf /srv/nfs/publik/var-lib/combo /var/lib/combo
    
  3. Même procédure avec fargo

  4. Même procédure avec passerelle

  5. Même procédure avec hobo

  6. Même procédure avec authentic2-multitenant

  7. Configuration hobo-agent

    ln -sf /srv/nfs/publik/etc/hobo-agent /etc/hobo-agent
    

On utilise aussi les autres configurations partagées via NFS :

  1. Configurations nginx

    service nginx stop
    cd /etc/nginx
    rm -rf conf.d includes sites-available sites-enabled
    ln -sf /srv/nfs/publik/etc/nginx/* .
    service nginx start
    
  2. Éléments web statiques

    cd /var/www
    rm -rf html
    ln -sf /srv/nfs/publik/var-www/html .
    
  3. APT : dépôts et préférences backports

    cd /etc/apt
    rm -rf sources.list.d preferences.d
    ln -sf /srv/nfs/publik/etc/apt/* .
    

On peut alors lancer l'installation des composants packagés. Attention, lors de cette étape, toujours refuser les éventuelles demandes de modification des fichiers de configuration (on utilise ceux partagés par NFS) :

apt install wcs wcs-au-quotidien
apt install combo
apt install fargo
apt install passerelle
apt install hobo
apt install authentic2-multitenant
apt install hobo-agent

Nous comparons la liste des paquets installés entre web1 et web2 (obtenue avec dpkg -l), et installons les paquets suivants :

  • python-authentic2-auth-fc,
  • python-combo-plugin-macollectivite,
  • publik-base-theme,
  • gettext

Désactivation des crons Publik sur web2

Il est très important de désactiver les crons de Publik sur web2, pour ne pas avoir de compétition/conflit avec ceux déjà en place sur web1, puisqu'ils agissent sur les mêmes données.

Il faut donc poser des # devant les lignes des crons suivants :

  • /etc/cron.d/wcs,
  • /etc/cron.d/authentic2-multitenant,
  • /etc/cron.d/passerelle,
  • /etc/cron.hourly/python-combo,
  • /etc/cron.hourly/fargo.