Stirling-PDF : la boite à outils PDF auto-hébergée

Dans cet article nous allons voir comment installer Stirling-PDF via docker sur un serveur debian auto-herbergé et le rendre disponible avec un certificat signé let’s encrypt via apache2.

1- Prérequis

Les logiciels et packages ci-dessous déjà installées :

  • Debian 12
  • Apache2 installé
  • IP fixe
  • Ouvrir les ports 443 et 80 en NAT sur l’adresse IP privée du serveur stirling (dans mon cas 192.168.3.29)
  • Déclarer une adresse IP publique fixe dans votre nom de domaine pour votre seveur (dans mon cas pdf.gabinhocity.eu pointe sur l’adresse IP publique de mon serveur de test)

1 – Installer docker

Débutons par la mise à jour du serveur debian

apt-get update && apt-get upgrade

Installer les prérequis dans votre système si ce n’est pas déjà fait

apt-get install ca-certificates curl sudo

Installer le package pour docker sur votre machine debian

install -m 0755 -d /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
 echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 apt-get update
 apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Tester le bon fonctionnement de docker avec les commandes

docker run hello-world

Ou avec la commande

sudo systemctl status docker

Activer le démarrage de docker en même temps que le système

systemctl enable docker

2 – Installer Stirling-PDF

Il faut créer le repertoire d’installation des fichiers necessaires au fonctionnement de Stirling-PDF

mkdir /var/www/PDF
cd /var/www/PDF

Lancer l’installation de l’application via docker

location=$(pwd)/gradlew
docker run -d \
  --name stirling-pdf \
  -p 8080:8080 \
  -v "./StirlingPDF/trainingData:/usr/share/tessdata" \
  -v "./StirlingPDF/extraConfigs:/configs" \
  -v "./StirlingPDF/customFiles:/customFiles/" \
  -v "./StirlingPDF/logs:/logs/" \
  -v "./StirlingPDF/pipeline:/pipeline/" \
  -e DOCKER_ENABLE_SECURITY=false \
  -e LANGS=fr_FR \
  docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest

3 – Personnaliser docker

créer le fichier docker-compose.yml

vi docker-compose.yml
version: '3.3'
services:
  stirling-pdf:
    image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest
    ports:
      - '8080:8080' #Port d'écoute de l'application
    volumes:
      - ./StirlingPDF/trainingData:/usr/share/tessdata # Required for extra OCR languages
      - ./StirlingPDF/extraConfigs:/configs
      - ./StirlingPDF/customFiles:/customFiles/
      - ./StirlingPDF/logs:/logs/
      - ./StirlingPDF/pipeline:/pipeline/
    environment:
      - DOCKER_ENABLE_SECURITY=false  #Désactive l'authentification pour l'accès à l'application
      - LANGS=fr_FR  # Langue de polices disponible pour la conversion de documents
    restart: unless-stopped  # Redemarre le contenaire en même temps que le serveur

Maintenant nous pouvons démarrer l’application en visualisant les logs

docker compose up -d && docker compose logs -f

Si vous obtenez le message d’erreur ci-dessus qui vous dit que le port 8080 est déjà utilisé, redemarrer le serveur et relancer la commande dans le repertoire du fichier docker-compose.yml que vous venez de créer

Vous pouvez vous rendre sur le lien suivant pour accéder au portail :

http://votre.adresse.ip:8080

4 – Configuration de l’accès en HTTP

Si ce n’est déjà fait, activer la fonctionnalité de reverse proxy du package apache2

a2enmod proxy_http headers
systemctl restart apache2

Créer le fichier de configuration apache de stirling PDF. Dans mon cas le nom de domaine sera pdf.gabinhocity.eu

cd /etc/apache2/sites-available/
vi pdf.gabinhocity.eu.conf

Ajouter les lignes ci-dessous :

    # The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin mail@tonmail.fr
    DocumentRoot /var/www/PDF/
    ServerName  pdf.gabinhocity.eu

   

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf

Activer le virtualhost

a2ensite pdf.gabinhocity.eu.conf
systemctl reload apache2

5 – Configuration de l’accès en HTTPS

Si ce n’est pas encore fait, vous pouvons installer le certbot Let’s Encrypt en suivant les commandes ci-dessous :

sudo apt install python3 python3-venv libaugeas0
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-apache
 sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

Configurer la génération du certificat et du fichier de configuration ssl automatiquement pour le nom de domaine pdf.gabinhocity.eu

sudo certbot --apache

Pour configurer le renouvellement automatique du certificat ajouter la commande suivante :

echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

Nous devons modifier le fichier généré automatiquement par le certbot lors de la création du certificat ssl. Dans mon cas le fichier créé se nomme pdf.gabinhocity.eu-le-ssl.conf

vi pdf.gabinhocity.eu-le-ssl.conf

Ajouter les lignes suivantes

                ProxyPreserveHost On
                ProxyRequests On
                ProxyPass / http://127.0.0.1:8080/
                ProxyPassReverse / http://127.0.0.1:8080/

               Header always set Access-Control-Allow-Origin "*"
               Header always set Content-Security-Policy "upgrade-insecure-requests;"

Redemarrer apache2

systemctl reload apache2

Votre site est désormais accèssible et fonctionnel en https avec un certificat reconnu par tous les navigateurs