Hugo : Installation de remark42 pour les commentaires

Comme je le disais dans l’article à propos de migrer le blog vers Hugo, j’ai choisi Remark42 comme système de commentaire. Il a plusieurs qualités qui m’ont intéressé :

  • on peut l’auto-héberger dans un container docker.
  • le thème Stack que j’ai choisi le supporte de base (utile surtout pour le css).
  • on peut importer les commentaires du site WordPress que l’on migre.
  • Il est basé sur la sécurité et le respect de la vie privée.
  • Il est recommandé par l’outil de migration wp2hugo.

Il coche donc toutes les cases. Il lui manque peut-être une interface d’administration, mais est-ce vraiment utile ? on peut quand même bloquer un utilisateur, supprimer un commentaire, désactiver les commentaires pour un article. L’essentiel est là.

On trouve quelques tutos pour l’installer et le paramétrer comme par exemple :

C’est donc parti pour l’installation !

Docker

On commence bien sûr par installer le container Docker. Comme d’habitude, j’utilise Dockge pour ce faire, avec le fichier compose.yaml suivant (qui sera modifié par la suite, mais c’est une base pour démarrer) :

services:
  remark:
    image: ghcr.io/umputun/remark42:latest
    container_name: remark42
    hostname: remark42
    restart: always
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: "5"
    # uncomment to expose directly (no proxy)
    ports:
      - 8132:8080
    #  - "443:8443"

    # uncomment to expose to reverse proxy running on the same host but not in docker
    #ports:
    #  - "127.0.0.1:8080:8080"

    environment:
      - REMARK_URL=https://remark42.mon-domaine.fr
      - SECRET=xxxxx
      - DEBUG=true
      - AUTH_GOOGLE_CID
      - AUTH_GOOGLE_CSEC
      - AUTH_GITHUB_CID=xxxxxxxxxxxxxxxxxxxxxxx
      - AUTH_GITHUB_CSEC=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
      - AUTH_FACEBOOK_CID
      - AUTH_FACEBOOK_CSEC
      - AUTH_DISQUS_CID
      - AUTH_DISQUS_CSEC
      # Enable it only for the initial comment import or for manual backups.
      # Do not leave the server running with the ADMIN_PASSWD set if you don't have an intention
      # to keep creating backups manually!
      - ADMIN_PASSWD=remark42
    volumes:
      - /srv/dev-disk-by-uuid-wwww-xxxx-yyyy-zzzz/AppData/remark42/var:/srv/var
networks: {}
  • J’ai laissé les paramètres d’authentification des réseaux sociaux, mais je n’utiliserai que Github, dont les paramètres sont expliqués plus bas.
  • J’ai défini au niveau de mon hébergeur un sous-domaine pour ce serveur.
  • Le paramètre REMARK_URL doit être l’adresse externe par laquelle le service sera utilisé.
  • Mon proxy (swag) tourne dans un autre container, et j’y ai ajouté un fichier remark42.subdomain.conf standard.
  • Le paramètre ADMIN_PASSWD est activé pour pouvoir importer les commentaires de WP. Je le désactiverai ensuite.

On le lance, et ajoute PING à l’adresse du serveur : on reçoit « pong », et donc le service tourne ! 😎

Autorisations

Remark42 supporte l’identification via les réseaux sociaux de type Facebook, Apple ou Google : je ne les traiterai pas ici, et je n’ai pas l’intention de les activer pour mon blog. Je souhaite autoriser les commentaires anonymes, ceux avec un compte mail classique, et pour le fun j’ai ajouté Github.

Mail

Voilà les paramètres à ajouter au fichier compose.yaml de remark42, à modifier en fonction de votre fournisseur :

SMTP_HOST=smtp.mail.com
SMTP_PORT=465
SMTP_TLS=true
SMTP_STARTTLS=
SMTP_USERNAME=user@exemple.fr
SMTP_PASSWORD=mot_de_passe
NOTIFY_USERS=email
NOTIFY_EMAIL_VERIFICATION_SUBJ # "Email verification" by default
NOTIFY_ADMINS=email
NOTIFY_EMAIL_FROM="Remark42 notifications"
ADMIN_SHARED_EMAIL=administrateur@mail.fr
AUTH_ANON=true # enable anonymous commenting
  • Les paramètres SMTP_ sont obligatoires pour utiliser les fonctions de mail de Remark42.
  • Les paramètres NOTIFY_ permettent à l’utilisateur et/ou à l’administrateur de recevoir un mail en cas de nouveau commentaire sur l’adresse définie avec ADMIN_SHARED_EMAIL.
  • Enfin, le paramètre AUTH_ANON autorise les commentaires anonymes.

Remark42 a l’air assez pointu sur la sécurité, et lors de votre premier commentaire, un TOKEN vous est envoyé par mail que vous devrez copier/coller pour pouvoir envoyer votre commentaire.

Concernant l’autorisation de commentaires anonymes, à voir à l’usage, car sans les plugins WP de filtrage et autres détections de commentaires indésirables envoyés par des bots (et ce n’est pas ça qui manque !), je ne sais pas du tout quel sera la situation avec Hugo et Remark42 sur ce sujet. Je devrai peut-être annuler les commentaires anonymes.

GitHub

Il faut d’abord créer un nouveau « OAuth App »: https://github.com/settings/developers. Renseigner « Application Name » and « Homepage URL » pour votre site. Sous « Authorization callback URL » saisir l’URL de type FQDN suivie de /auth/github/callback, soit par exemple : https://remark42.mysite.com/auth/github/callback

Noter le Client ID (as AUTH_GITHUB_CID) et le Client Secret (AUTH_GITHUB_CSEC) pour les renseigner dans le fichier compose.yaml (voir plus haut).

Pendant la manip, j’ai eu cette erreur :

C’était le paramètre REMARK_URL dans le fichier compose.yaml qui était incorrect (je l’avais renseigné au départ avec une adresse locale 192.168.1.x). Il doit absolument être une l’adresse web accessible de l’extérieur :

REMARK_URL=https://remark42.mon-domaine.fr

Utilisation

Voilà, on peut donc s’identifier via Github, mail, ou choisir le mode anonyme, puis poster un commentaire.

Et cerise sur le gâteau, Remark42 permet aussi de voter pour un commentaire :

Modèles pour les mails ou les messages d’erreur

Pour aller un peu plus loin, on peut créer ses propres « templates » de messages envoyés par Remark42, pour les franciser par exemple. Pour un serveur en Docker, il faut récupérer les fichiers sources sur le site gihtub: https://github.com/umputun/remark42/tree/master/backend/app/templates/static

Puis les éditer, les traduire, et les sauvegarder dans un dossier customised_templates créé à la même hauteur que le dossier var. Et on ajoute un nouveau volume pour chaque fichier dans le fichier compose.yaml :

volumes:
  - ./var:/srv/var
  - ./customised_templates/email_confirmation_login.html.tmpl:/srv/email_confirmation_login.html.tmpl:ro
  - ./customised_templates/email_confirmation_subscription.html.tmpl:/srv/email_confirmation_subscription.html.tmpl:ro
  - ./customised_templates/email_reply.html.tmpl:/srv/email_reply.html.tmpl:ro
  - ./customised_templates/email_unsubscribe.html.tmpl:/srv/email_unsubscribe.html.tmpl:ro
  - ./customised_templates/error_response.html.tmpl:/srv/error_response.html.tmpl:ro

Une fois le serveur redémarré, les fichiers modifiés sont bien utilisés :

Administration

Pas d’interface web pour gérer les commentaires, c’est peut-être le point faible de remark42. Il existe cependant des solutions externes, comme celle-ci : https://github.com/lauralesteves/remark42-admin-ui mais je ne l’ai pas installée. Je ne suis pas certain d’en avoir besoin. Car il y a tout de même moyen de réaliser certaines actions :

  • Afficher les paramètres : liste les utilisateurs cachés ou bloqués.
  • Désactiver les commentaires pour l’article. Peut être réactivé si on le souhaite.
  • Bloquer un utilisateur définitivement ou temporairement.
  • Effacer un commentaire.

Il faut renseigner le paramètre suivant dans le fichier compose.yaml pour définir un administrateur :

ADMIN_SHARED_ID=github_xxxxxxxxxxxxxxxxxxxxxxx

On trouve cet ID en s’identifiant avec son compte Github par exemple sur la page d’un article, comme si l’on voulait poster un commentaire, puis on clique sur son nom : on trouve alors en haut à droite son ID :

ou avec son compte mail :

Une fois identifié comme administrateur, on a accès à certaines fonctions, comme afficher les utilisateurs cachés ou bloqués, ainsi que désactiver les commentaires sur un article donné.

Import

Maintenant que tout est prêt, il faut importer les commentaires du site WP que l’on souhaite migrer. Remark42 propose fort heureusement cette possibilité, et la documentation est ici. Cette opération est importante et à faire immédiatement, car elle va écraser tous les commentaires existants (ceux ayant servis pour les tests par exemple).

On part donc du fichier d’export au format XML généré par WP (Panneau d’admin – Outils – Export) comme on a fait pour Hugo. Il faut ensuite l’éditer pour remplacer l’URL du site si celle-ci est destinée à changer. Par exemple si j’importe les commentaires du blog WP à l’adresse https://wptest.pled.fr, mais que mon futur blog se trouvera à l’adresse https://myhugo.pled.fr, alors il faut éditer le fichier XML et remplacer toutes les occurrences correspondantes avec la nouvelle URL.

Une fois ceci fait, il faut copier le fichier d’export dans le dossier /srv/var du container, puis lancer la commande suivante qui va importer les commentaires :

pascal@NAS:/srv/dev-disk-by-uuid-071a-91e2-4184-971f-7697/AppData/remark42/var$ sudo docker exec -it remark42 import -p wordpress -f /srv/var/wptest-export.xml -s remark

Côté log du container docker, on doit voir quelque chose de ce style :

remark42  | 2026/07/05 08:41:33.969 [DEBUG] {api/migrator.go:236 api.(*Migrator).runImport} import request for site=remark, provider=wordpress
remark42  | 2026/07/05 08:41:34.268 [INFO]  {migrator/wordpress.go:153 migrator.(*WordPress).convert.func1} converted 4 comments, {inpItems:563 failedItems:0 inpComments:4 failedComments:0 rejectedComments:0}
remark42  | 2026/07/05 08:41:34.276 [DEBUG] {migrator/wordpress.go:85 migrator.(*WordPress).Import} imported 4 comments to site remark
remark42  | 2026/07/05 08:41:34.276 [DEBUG] {api/migrator.go:250 api.(*Migrator).runImport} import request completed. site=remark, provider=wordpress, comments=4

On voit clairement que les quatre commentaires de test ont bien été importés.

Dépannage

Si vous ne voyez pas les commentaires malgré les logs positifs du container, il s’agit probablement d’un problème d’URL. Les commentaires sont stockés avec l’URL de l’article concerné, et celle-ci doit absolument correspondre. Elle peut être erronée, ou simplement être en http au lieu de https, ou même manquer d’un « / » en fin d’adresse. Il va donc falloir vérifier ces points.

Dans le navigateur, afficher un article censé avoir des commentaires, et vérifier dans la console (outils dev web) du navigateur la requête réseau (onglet network) de type GET api/v1/find?...&url=<URL> effectuée, et vérifier particulièrement la valeur de l’URL réclamée, ce doit être celle de votre site, par exemple :

https://remark42.mon-nas.fr/api/v1/find?site=remark&url=https%3A%2F%2Fmon-site-hugo.fr%2Farticle-avec-bouts-de-code%2F&sort=-active&format=tree

En parallèle, aller voir les URLs stockées par remark42 pour les comparer : pour cela, exécutez la commande suivante (sur une seule ligne) :

$ sudo docker exec remark42 backup -s remark -f /srv/var/dump.gz && \
sudo docker exec remark42 sh -c "gunzip -c /srv/var/dump.gz | grep -oE '\"url\":\"[^\"]+\"' | sort | uniq -c"
remark42 v1.16.0-556e0a7-20260522T13:32:16
2026/07/06 11:25:10.007 [INFO]  {cmd/backup.go:26 cmd.(*BackupCommand).Execute} export to ./var/backup, site remark
2026/07/06 11:25:10.007 [DEBUG] {cmd/backup.go:35 cmd.(*BackupCommand).Execute} export file /srv/var/dump.gz
2026/07/06 11:25:10.093 [INFO]  {cmd/backup.go:78 cmd.(*BackupCommand).Execute} export completed, file /srv/var/dump.gz
      2 "url":"https://mon-site-hugo.fr/article-avec-bouts-de-code/"
      2 "url":"https://mon-site-hugo.fr/article-avec-citation/"

Si la commande ne passe pas, allez voir les backups, ou créez-en un, puis éditer le fichier :

$ sudo docker exec -it remark42 backup -s remark

NOTE: le paramètre ADMIN_PASSWD doit être activé sur le serveur pour que la commande fonctionne.

Puis récupérer dans le dossier /srv/var/backup le fichier de backup créé (userbackup-remark-20260706T045628.gz par exemple). Il reste à décompresser le fichier puis à l’éditer. On peut alors vérifier l’URL stockée dans Remark42 :

{"id":"40","pid":"","text":"

ceci est un commentaire premier niveau

\n","user":{"name":"pled","id":"wordpress_8d4451bb47d8fcd71060d39bada39c4b01818ce3","picture":"","ip":"c5e2c316a3678a6bd0723a79aad2b6964f805917","admin":false},"locator":{"site":"remark","url":"https://myhugo.pled.fr/article-avec-bouts-de-code"},"score":0,"vote":0,"time":"2026-06-09T15:49:33Z","imported":true,"title":"Article avec bouts de code"}

Si les URLs diffèrent, le plus simple est sans doute de modifier le fichier d’export WP à l’aide d’un éditeur de texte, modifier toutes les URLs pour correspondre à ce que l’on attend, puis relancer l’import (qui écrasera l’existant).

On peut aussi créer un fichier remap.txt contenant sur une line les deux URLs concernées sur la même ligne, comme ceci par exemple :

https://hugo.mon-site.fr/* https://hugo.mon-site.fr/posts/*

Puis exécuter le commande suivante :

$ sudo docker exec remark42 remark42 remap -s remark -f /srv/var/remap.txt

Conclusion

Voilà, le système de commentaire est installé et fonctionnel. Cela m’a paru très compliqué au départ, mais finalement, en y allant étape par étape, tout s’est très bien passé.

Le seul problème que j’ai eu a été pour l’importation des commentaires, et c’était parce que j’avais oublié de renseigner dans le site Hugo le paramètre suivant dans le fichier hugo.toml :

baseURL = 'https://hugo.pled.fr/'

Donc une erreur de ma part à force de tester des choses sur Hugo en même temps, en réinstallant, repartant de zéro, etc…

Finalement, je suis très satisfait de ce résultat, Remak42 a l’air très bien, sobre et fonctionnel, exactement ce que je cherchais.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *