Installer le serveur en production

Cette page détaille comment installer le serveur d’impression sur un serveur de production, dédié uniquement à cet usage. On supposera que le serveur tourne avec un Debian Bullseye à jour.

Ajout des dépôts bullseye-backports

Le site est conçu pour tourner avec la dernière version de Django, à savoir Django 3.2 à cette heure. Cette version n’est disponible que dans bullseye-backports.

Pour activer les backports, il suffit d’ajouter dans le fichier /etc/apt/sources.list :

deb     $MIRROR/debian bullseye-backports main contrib

$MIRROR est votre miroir Debian favori.

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 bullseye-backports :

$ sudo apt update
$ sudo apt install -t bullseye-backports --no-install-recommends cups gettext git nginx python3-authlib python3-coverage python3-cups python3-django python3-django-auth-ldap python3-django-crispy-forms python3-django-extensions python3-pypdf2 python3-requests uwsgi uwsgi-plugin-python3

Sans oublier le paquet pip pour l’affichage qui n’est pas dans les dépôts Debian :

$ sudo pip3 install crispy-bootstrap5~=0.4

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 du serveur

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/printer.

On clone donc le dépôt en tant que www-data :

$ sudo -u www-data git clone https://gitlab.crans.org/nounous/django-printer.git /var/www/printer

Configuration du serveur

Les paramètres personnalisés sont à placer dans le fichier printer/settings_local.py. Un fichier de configuration d’exemple est présent dans printer/settings_local.example.py.

Un point sur les paramètres gérés par le site en plus de ceux de Django :

NOTE_KFET_URL = 'https://note.crans.org'
NOTE_KFET_CLIENT_ID = 'CHANGE_ME'
NOTE_KFET_CLIENT_SECRET = 'CHANGE_ME'
DESTINATION_NOTE_ID = 2088
DESTINATION_NOTE_ALIAS = 'Crans'

Ces paramètres sont utilisés pour l’authentification des utilisateur⋅rices. avec la Note Kfet. La note 2088 correspond à la note du club Crans sur la Note Kfet 2020 en production. Les identifiant et secret d’application sont à récupérer dans la gestion des applications OAuth2 de la Note Kfet.

# These parameters may be useful for testing purposes.
# This disables the interaction with Note Kfet (except login redirect)
# and/or the printer.
# Unless in a testing environment (eg. in a continuous integration or without
# any additional dependency), you should leave this to False.
IGNORE_NOTE_KFET = False
IGNORE_CUPS = False

Ces paramètres sont essentiellement utilisés pour l’intégration de tests unitaires, afin de les faire tourner sans serveur d’impression ni Note Kfet. Il ne sont pas à toucher en production.

 # This is the common name of the printer that is installed in the CUPS server
PRINTER_NAME = 'Lexmark_X950_Series'

Il s’agit ici du nom de l’imprimante connu par CUPS. Le nom donné est celui utilisé par le Crans.

Il s’agit ici de l’adresse de l’imprimante, pour la contacter pour scan. Elle doit être accessible par votre machine. Le second paramètre permet d’ignorer la vérification du certificat HTTPS, qui peut être obsolète notamment dans le cas de l’imprimante actuelle du Crans, ou en cas de redirection de ports rendant le nom de domaine utilisé non valide. Laisser à False n’empêche pas une connexion HTTPS chiffrée, elle sera simplement non vérifiée.

# To avoid spam, you can define the maximum scanning jobs a user can request.
# If set to 0, no limit is applied.
MAX_SIMULTANEOUS_SCANNING_JOBS = 5

Ce nombre permet de limiter le nombre de tâches de numérisations simultanées pour un⋅e même utilisateur⋅rice. Cela évite de pouvoir spammer les tâches. Si vous ne souhaitez pas de limite, mettez à 0.

# This address is the address of the server that will receive the scanned file.
# This may be allowed in your firewall and contactable by the printer.
SCANNER_SERVER_ADDRESS = '127.0.0.1'
SCANNER_SERVER_PORT = 9751

Il s’agit ici de l’adresse et du port du serveur de réception des scans. Cette adresse et ce port seront transmis à l’imprimante.

# Uncomment and adapt to use a LDAP server for authentication
# AUTHENTICATION_BACKENDS = ["django_auth_ldap.backend.LDAPBackend"]
# AUTH_LDAP_SERVER_URI = "ldaps://ldap.example.com:1636/"
# AUTH_LDAP_CONNECTION_OPTIONS = {
#     ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_ALLOW,
#     ldap.OPT_X_TLS_NEWCTX: 0,
#     ldap.OPT_REFERRALS: 0,
# }
# AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=passwd,dc=example,dc=com"

# AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
#     "ou=group,dc=example,dc=com",
#     ldap.SCOPE_SUBTREE,
#     "(objectClass=posixGroup)",
# )

# AUTH_LDAP_GROUP_TYPE = PosixGroupType()

# AUTH_LDAP_MIRROR_GROUPS = True

# AUTH_LDAP_USER_FLAGS_BY_GROUP = {
#     "is_active": "cn=_user,ou=group,dc=example,dc=com",
#     "is_staff": "cn=_user,ou=group,dc=example,dc=com",
#     "is_superuser": "cn=_nounou,ou=group,dc=example,dc=com",
# }

Ce bout de configuration permet de configurer une intégration LDAP, pour se connecter notamment à l’interface d’administration. Cette configuration est facultative.

Plus d’informations sur la documentation du module : https://django-auth-ldap.readthedocs.io/en/latest/