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.
Installation PostgreSQL¶
Lors de leur installation les briques s’attendent à trouver un service PostgreSQL fonctionnel, la configuration par défaut utilise un serveur local, dont l’installation a été vue dans la section précédente.
Vérifier que le service tourne :
# systemctl status postgresql@15-main.service
● postgresql@15-main.service - PostgreSQL Cluster 15-main
Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)
Active: active (running) since Tue 2021-01-12 16:01:30 CET; 7min ago
Main PID: 22215 (postgres)
Tasks: 7 (limit: 19660)
Memory: 100.2M
CGroup: /system.slice/system-postgresql.slice/postgresql@15-main.service
├─22215 /usr/lib/postgresql/11/bin/postgres -D […]
├─…
Installation RabbitMQ¶
RabbitMQ sera utilisé uniquement en local (127.0.0.1) et n’a besoin d’aucune configuration particulière.
# apt install rabbitmq-server
Il est utile ensuite de vérifier que le service tourne :
# systemctl status rabbitmq-server
● 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 [...]
├─ 897 /usr/lib/erlang/erts-6.2/bin/epmd -daemon
├─1780 inet_gethost 4
└─1781 inet_gethost 4
Et que les journaux ne contiennent pas d’erreurs, ils 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.
Installation Combo¶
Dans /etc/combo/settings.d/database.py nous renseignons éventuellement les paramètres de connexion particuliers, par exemple le mot de passe ajouté à l’étape de création manuelle des bases :
DATABASES['default']['PASSWORD'] = "foobar"
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.macollectivite.passerelle@entrouvert.com'
On installe ensuite le logiciel combo :
# apt install combo
Vérification avec systemctl status combo :
# systemctl status combo
● combo.service - Combo
Loaded: loaded (/lib/systemd/system/combo.service; enabled)
Active: active (running) since jeu. 2019-07-20 13:33:44 CEST; 19h ago
Process: 16317 ExecStartPre=/usr/bin/combo-manage collectstatic --noinput (code=exited, status=0/SUCCESS)
Process: 16319 ExecStartPre=/usr/bin/combo-manage migrate_schemas --noinput (code=exited, status=0/SUCCESS)
Main PID: 16324 (uwsgi)
Status: "uWSGI is ready"
CGroup: /system.slice/combo.service
├─16429 combo uWSGI worker 1
├─16434 combo uWSGI worker 5
├─16436 combo uWSGI worker 3
├─16483 combo uWSGI worker 2
├─16421 combo uWSGI worker 4
└─16324 combo uWSGI master
Installation Passerelle¶
La procédure est la même que pour Combo.
Dans /etc/combo/settings.d/database.py nous renseignons éventuellement les paramètres de connexion particuliers.
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
Et vérification avec systemctl is-active passerelle qui doit montrer «active»
Installation Fargo¶
Reprendre la même procédure que pour les autres composants, en adaptant le nom de la brique, c’est-à-dire :
Éventuelle configuration des accès base de données
Configuration du mail dans /etc/fargo/settings.d/macollectivite.py
Installation du composant :
# apt install fargo
Vérification avec systemctl is-active fargo qui doit retourner « active »
Installation Hobo serveur¶
Reprendre la même procédure que pour les autres composants, en adaptant le nom de la brique, c’est-à-dire :
Éventuelle configuration des accès base de données
Configuration du mail dans /etc/hobo/settings.d/macollectivite.py
Installation du composant :
# apt install hobo
Vérification avec systemctl is-active hobo qui doit retourner « active »
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 :
systemctl stop supervisor
systemctl start supervisor
Et on vérifie que hobo-agent est bien lancé par supervisor :
# systemctl status supervisor
● 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 :
Éventuelle configuration des accès base de données
Configuration du mail dans /etc/authentic2-multitenant/settings.d/macollectivite.py
ADMINS = (('Admin EO', 'admin+prod.macollectivite.authentic@entrouvert.com'),) EMAIL_SUBJECT_PREFIX = '[prod macollectivite authentic] ' SERVER_EMAIL = 'admin+prod.macollectivite.authentic@entrouvert.com'
Installation du composant :
# apt install authentic2-multitenant
Vérification avec systemctl is-active authentic2-multitenant qui doit retourner « active »
Vérification avec service authentic2-multitenant status :
# systemctl status authentic2-multitenant
● authentic2-multitenant.service - Authentic 2 (multitenants)
Loaded: loaded (/lib/systemd/system/authentic2-multitenant.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-02-19 08:49:27 CET; 2 days ago
Main PID: 11591 (uwsgi)
Status: "uWSGI is ready"
CGroup: /system.slice/authentic2-multitenant.service
├─ 9944 authentic2-multitenant uWSGI worker 6
├─ 9946 authentic2-multitenant uWSGI worker 7
├─ 9949 authentic2-multitenant uWSGI worker 8
├─ 9950 authentic2-multitenant uWSGI worker 9
├─11083 authentic2-multitenant uWSGI worker 10
└─11591 authentic2-multitenant uWSGI master
Installation w.c.s.¶
Comme noté précédemment le module w.c.s. est spécifique et n’a pas besoin de configuration initiale pour configurer ses mails, il y a donc simplement deux étapes :
Installation du composant :
# apt install wcs wcs-au-quotidien
Vérification avec systemctl is-active wcs qui doit retourner « active »
Installation de Nginx¶
# apt install nginx
… rien de plus. Nous installons la version de Debian 12 («bookworm»).
Configuration de base¶
L’installation de publik-commonn aura mis en place la configuration pour un format de log nginx 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]';
Ainsi qu’un fichier /etc/nginx/conf.d/client-max-body-size.conf pour contrôler la taille maximale des fichiers téléversables :
client_max_body_size 200M;
Dans les installations où un serveur HAProxy serait posé en amont, il faudra adapter la configuration de celui-ci pour correspondre.
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.
- la terminaison SSL est assurée en amont et le traffic parvient non-chiffré à nginx.
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 ».
Des fichiers type sont distribués dans le paquet publik-common, dans le répertoire /usr/share/doc/publik-common/nginx/sites-available/. Ils peuvent être directement copiés dans /etc/nginx/sites-available/.
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
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-.*;
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-.*;
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-.*;
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-.*;
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-.*;
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/tenants/$host/static/$1
/var/lib/wcs/tenants/$host/theme/static/$1
/var/lib/wcs/$host/static/$1
/var/lib/wcs/$host/theme/static/$1
/var/lib/wcs/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/tenants/$host$uri
/var/lib/wcs/$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 (si vous l’avez déjà installé),
- 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.