Suite à cette présentation de isso ( Installation d’une alternative open-source à Disqus ) j’ai décidé de le mettre en place sur Hugo et docker swarm.
J’ai pour cela créé un dockerfile de isso afin qu’il tourne sur mon infra ARM64 : https://github.com/fredix/dockerfile/tree/master/isso . Le fichier entrypoint.sh est directement pris de ce dépôt git : https://github.com/SISheogorath/isso-docker il faut ensuite le modifier afin de préciser les variables host et name.
Dockerfile.arm64
FROM arm64v8/python:3.6
RUN pip install isso && mkdir /data
COPY entrypoint.sh /entrypoint.sh
HEALTHCHECK CMD ["wget", "-qO", "/dev/null", "http://127.0.0.1/js/embed.min.js"]
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
cat >/isso.conf <<EOF
[general]
dbpath = /data/isso.db
name = ${ISSO_NAME:-comments.fredix.xyz}
host = ${ISSO_HOST:-https://fredix.xyz}
max-age = ${ISSO_MAX_AGE:-30m}
[server]
listen = http://0.0.0.0:80
[guard]
enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = ${ISSO_REPLY_TO_SELF:-false}
require-email = ${ISSO_REQUIRE_EMAIL:-false}
require-author = ${ISSO_REQUIRE_AUTHOR:-false}
EOF
exec isso -c /isso.conf "$@"
Sur votre serveur ARM64 :
docker build -f Dockerfile.arm64 -t fredix/arm64v8-isso .
docker push fredix/arm64v8-isso
Voici le yaml nécessaire à lancer la stack docker et le launcher : https://github.com/fredix/swarm/tree/master/hugo .
hugo-arm64v8.yml
version: '3'
services:
hugo:
image: fredix/arm64v8-blog
restart: always
ports:
- 1313
networks:
- traefik-net
deploy:
placement:
constraints:
# - node.labels.location == cloud-arm64
- node.role == manager
labels:
- "traefik.port=1313"
- "traefik.docker.network=traefik-net"
- "traefik.frontend.rule=Host:fredix.xyz,www.fredix.xyz"
isso:
image: fredix/arm64v8-isso
restart: always
ports:
- 80
volumes:
- /docker_volumes/isso:/data
networks:
- traefik-net
deploy:
placement:
constraints:
# - node.labels.location == cloud-arm64
- node.role == manager
labels:
- "traefik.port=80"
- "traefik.docker.network=traefik-net"
- "traefik.frontend.rule=Host:isso.fredix.xyz"
networks:
traefik-net:
external: true
Il faut penser à créer le répertoire /docker_volumes/isso ou le modifier pour que isso puisse stocker sa base sqlite.
Pour finir il est nécessaire de modifier le thème de votre blog hugo afin qu’il ajoute les scripts de gestion des commentaires. Dans le répertoire de votre thème il faut ajouter le fichier suivant :
votretheme/layouts/partials/isso.html
<script data-isso="//isso.fredix.xyz/" src="//isso.fredix.xyz/js/embed.min.js"></script>
<section id="isso-thread"></section>
puis ajouter ce nouveau partial dans le fichier votretheme/layouts/post/single.html
{{ partial "header.html" . }}
<div class="header">
<h1>{{ .Title }}</h1>
<h2>{{ .Description }}</h2>
</div>
<div class="content">
{{ partial "post_meta.html" . }}
{{ .Content }}
{{ partial "prev_next_post.html" . }}
{{ partial "isso.html" . }}
</div>
{{ partial "footer.html" . }}
On peut maintenant lancer la stack :
docker stack deploy --compose-file=hugo-arm64v8.yml hugo-arm64
En cas de mise à mise à jour de votre image il suffit de relancer docker stack deploy pour qu’il la télécharge et mette à jour le conteneur. Si vous utiliser drone.io voici le pipeline dans lequel j’ai remplacé docker service update par docker stack deploy :
platform: linux/arm64
clone:
default:
image: plugins/git:linux-arm64
depth: 50
pipeline:
publish:
image: plugins/docker:linux-arm64
repo: fredix/arm64v8-blog
tags: latest
dockerfile: Dockerfile.arm64
secrets: [ docker_username, docker_password ]
ssh:
image: fredix/arm64v8-alpine-drone-ssh
host: 192.168.254.1
port: 22
username: drone
volumes:
- /docker_volumes/drone_agent/drone.key:/root/ssh/drone.key
key_path: /root/ssh/drone.key
script:
# - "sudo docker service update --image fredix/arm64v8-blog hugo-arm64"
- "sudo docker stack deploy --compose-file=/root/scripts/swarm/hugo/hugo-arm64v8.yml hugo-arm64"
when:
status: success
telegram:
image: fredix/arm64v8-alpine-drone-telegram
token: $PLUGIN_TOKEN
to: $PLUGIN_TO
secrets: [ plugin_token, plugin_to ]
message: >
{{#success build.status}}
build {{build.number}} succeeded on {{repo.name}}. Good job {{build.author}} {{build.link}}
{{else}}
build {{build.number}} failed on {{repo.name}}. Fix me please {{build.author}} {{build.link}}
{{/success}}
when:
status: [ success, failure ]