Docker : ISSO

Je vous ai présenté ISSO, un serveur de commentaires Open Source, il y a bientôt 6 ans. Aujourd'hui je vous propose de l'utiliser sous Docker !

Docker : ISSO

La première fois que je vous ai proposé ISSO (il y a 6 ans), nous avions pu le mettre en place en suivant la documentation officielle.

Toujours utilisé sur mes serveurs, il fonctionne depuis maintenant plus de 2 ans avec Docker. Jusqu'il y a peu, j'utilisais l'image Wonderfall/docker-isso mais celle-ci n'ayant pas été mise à jour depuis un petit moment (2 ans en fait), j'ai décidé de la reprendre et de la mettre à jour, que ce soit ISSO ou Alpine OS. Vous la trouverez sur le Hub Docker ainsi que sur le Gitlab de ma communauté, Nefald.

Ce que je vous propose aujourd'hui, c'est de déployer ledit container avec un joli reverse proxy réalisé avec SWAG.


Sommaire

  1. Prérequis
  2. Docker-Compose : ISSO
  3. Configuration : ISSO
  4. Docker-Compose: SWAG
  5. Configuration : NGINX
  6. Utilisation et intégration
  7. Ressources

Prérequis

  • Être coutumier de Docker
  • Avoir pré-installé Docker est Docker-compose
  • Avoir édité sa zone DNS avec une entrée de type A ou AAAA pointant un sous-domaine vers l'IP de votre serveur. Ex.: comments.domain.tld. 86400 IN A 127.0.0.1

Répertoire de travail

Dans le présent tutoriel nous aurons comme répertoire de travail /docker :

  • Nous le créons avec :
sudo mkdir /docker
  • On s'assurera que notre utilisateur ai les droits avec :
sudo chown -R <user>:<user> /docker
  • L'arborescence ressemblera à ceci :
/docker/isso
├── config/
│   └── isso.conf
├── db/
│   └── comments.db
└── docker-compose.yml

ISSO

Docker-Compose : ISSO

On commence en créant un fichier nommé docker-compose.yml dans le répertoire de votre choix (ici /docker/isso), avec votre éditeur de texte favori (nano ?).

Il vous faudra adapter selon vos besoins et votre infrastructure, notamment :

  • Volumes persistents : ici le chemin est absolu /docker/config et /docker/db

  • User ID et Group ID : ici GID=1000 et UID=1000. Pour connaitre ceux de l'utilisateur souhaité, utilisez la commande id elle vous retournera l'UID et le GID de votre utilisateur courant (1000 par défaut pour le premier utilisateur du système).

  • on créé le répertoire - mkdir /docker/isso

  • on créé le fichier - nano /docker/isso/docker-compose.yml

  • et on y colle ce qui suit :

version: '3.7'

services:
    isso:
      image: nefald/isso:latest
      container_name: isso
      restart: always
      environment:
        - UID=1000
        - GID=1000
      volumes:
        - /docker/config:/config
        - /docker/db:/db

Configuration : ISSO

On créé maintenant un fichier nommé isso.conf dans le répertoire de votre choix, ici /docker/isso/config/.

Il vous faudra adapter selon vos besoins et votre infrastructure, notamment. Référez-vous toujours à la documentation officielle d'ISSO , je ne mentionne ici que les paramètres essentiels :

  • [general] : Spécifiez le chemin vers la base de données si différente, par défaut /db/comments.db. Spécifiez également l'url du site qui utilisera ISSO, par exemple dans mon cas c'est https://hiob.fr.
  • [server] : Spécifiez listen; par défaut le port est 8059.
  • [smtp] : Si vous avez activé la notification, détaillez vos paramètres SMTP, afin de notifier vos usagers et vous-même des commentaires et des réponses à ceux-ci.

Pour aller plus loin dans la configuration du serveur ISSO, référez-vous également à cette documentation


  • on créé le répertoire - mkdir /docker/isso/config
  • on créé le fichier - nano /docker/isso/config/isso.conf
  • et on y colle ce qui suit en adaptant :
[general]
dbpath = /db/comments.db
host = https://domain.tld/
notify = smtp

[server]
listen = http://0.0.0.0:8059/
reload = off
profile = off

[smtp]
username = mail@domain.tld
Password = password
host = mail.domain.tld
port = 465
security = tls
from = mail@domain.tld
to = mail@domain.tld
timeout = 10

ISSO : Démarrage

Votre serveur ISSO est configuré, vous pouvez le démarrer en mode attaché :

docker-compose up
  • Si le container démarre correctement et que vous n'avez pas d'erreur, fermez-le avec la combinaison de touches ctrl + C puis redémarrez-le en mode détaché avec :
docker-compose down; docker-compose up -d

Passons à la suite en créant le reverse proxy avec SWAG/NGINX.

Docker-compose : SWAG

On passe à la configuration de NGINX, au travers l'image linuxserver/SWAG. Nous nous attarderons surtout sur la configuration de NGINX. Aussi je me dois de vous la présenter et vous expliquer pourquoi j'ai opté pour cette solution.

SWAG - Secure Web Application Gateway - est une image docker développée par LinuxServer, embarquant NGINX, Certbot (Let's Encrypt), PHP et Fail2Ban. SWAG permet également d'utiliser la connexion avec HTTP Auth, LDAP via leur image ldap-auth, et Authelia (2 facteurs). Bref, je vous recommande.


Il vous faudra adapter selon vos besoins et votre infrastructure, notamment :

  • le volume persistent : ici le chemin est relatif et monte le volume dans le répertoire courant ./config
  • Déterminez le réseau docker <network>. Les containers SWAG et ISSO doivent être dans le même réseau. Pour créer le réseau docker : docker network create <network>
  • Spécifiez les variables d'environnement selon vos besoins : EMAIL, URL (obligatoire), MAXMINDDB_LICENSE_KEY (à lire : doc)

Dans notre cas, il faut spécifier un nom de domaine principal avec la variable URL et un sous-domaine avec SUBDOMAINS, cela permettra au container de créer un certificat avec certbot.

Exemple: Dans mon cas, j'ai besoin d'un certificat pour hiob.fr (mon blog) et pour le sous-domaine comments.hiob.fr (ISSO), je configurerai ainsi :

- URL=hiob.fr
- SUBDOMAINS=comments

J'obtiendrai alors un certificat Let's Encrypt incluant ces deux domaines : hiob.fr et comments.hiob.fr.


  • on créait le répertoire - mkdir /docker/swag
  • on créait le fichier - nano /docker/swag/docker-compose.yml
  • et on y colle ce qui suit, en adaptant selon nos besoins :
version: '3'

services:
  swag:
    image: ghcr.io/linuxserver/swag
    container_name: swag
    cap_add:
      - NET_ADMIN
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
      - URL=<domain.tld> #needed
      - SUBDOMAINS=<subdomain>
      - VALIDATION=http
      - EMAIL= <email> #optional
      - ONLY_SUBDOMAINS=false #optional
      - EXTRA_DOMAINS=<extra.domain.tld> #optional
      - MAXMINDDB_LICENSE_KEY=<maxminddb key>
      - STAGING=false #optional
    volumes:
      - ./config:/config
    ports:
      - 443:443
      - 80:80 #optional
    restart: unless-stopped
    networks:
      - <network>

networks:
  <network>:
    external:
      name: <network>
  • On se place dans le répertoire - cd /docker/swag
  • On enregistre et on démarre le container en mode attaché - docker-compose up
  • Une fois que les certificats Let's Encrypt ont été créés et que tout fonctionne, on peut arrêter le container avec ctrl + c. On s'assurera d'arrêter complétement le container et de supprimer les volumes non persistents en tapant docker-compose down

Configuration : NGINX

Vous devrez vous être assuré d'avoir à votre disposition un domaine de second niveau ou un sous-domaine, que vous aurez déclaré dans la zone DNS de votre provider.

  • Par défaut le DNS resolver de Docker est 127.0.0.11 (loopback), il suffit alors de faire une requête avec le nom du container, qui est défini ici par set $upstream_app isso. Pour que la requête aboutisse, il est nécessaire que le container isso se trouve dans le même réseau docker que SWAG.

  • On créait le fichier en adaptant - nano /docker/swag/config/nginx/site-confs/isso

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name comments.domain.tld;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    location / {
        include /config/nginx/proxy.conf;
        resolver 127.0.0.11 valid=30s;
        set $upstream_app isso;
        set $upstream_port 8059;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

        proxy_redirect off;
    }
}

Votre serveur NGINX est configuré, vous pouvez le démarrer en mode attaché :

docker-compose up
  • Si le container démarre correctement et que vous n'avez pas d'erreur, fermez-le avec la combinaison de touches ctrl + C puis redémarrez-le en mode détaché avec :
docker-compose down; docker-compose up -d

Allez, dernière étape ! On implémente le tout dans la page voulue !

Utilisation et intégration

Voilà, ISSO et SWAG sont installés et fonctionnels.

Inutile d'essayer d'y accéder depuis votre navigateur, le serveur ISSO n'est disponible qu'au travers du site configuré (host) dans ISSO. Vous n'obtiendrez qu'un BAD REQUEST.

Ceci pour d'évidentes raisons de sécurité, ISSO utilisant les entêtes CORS afin de pouvoir intégrer les commentaires sur le site en question tout en restreignant leur usage à celui-ci uniquement.

Tout est déjà fait, il ne vous reste plus qu'à intégrer à votre blog le script fournit par votre installation de ISSO.
Typiquement avec un thème pour Ghost, on éditera le fichier post.hbs. Collez le "code" fournit avant la balise </article>.

  • Ouvrez le fichier /content/themes/<theme>/posts.hbs et collez ce qui suit :
<script data-isso="//comments.domain.tld" src="//comments.domain.tld/js/embed.min.js"></script>
<section id="isso-thread"></section>

Relancez votre blog Ghost (avec docker?) et le tour est joué. 😋

Plusieurs options permettent au travers de différents scripts JS de moduler les fonctionnalités d'ISSO, comme par exemple avoir un compteur de commentaires.
Pour plus de détails sur ces balises et les scripts, n'hésitez pas à consulter la documentation suivante : Client configuration.

Félicitations ! Vous avez maintenant sur votre blog, Ghost ou non, un serveur de commentaires OpenSource, respectieux de la vie privée de vous et de vos utilisateurs.

Ressources