J’ai récemment migré ce site web / blog de Jekyll vers Ghost, juste pour l’essayer après avoir entendu beaucoup de bonnes choses à son sujet récemment.

J’avais ce petit VPS personnel sous la main, j’ai donc décidé de lui donner un peu d’espace là-bas, et d’utiliser Podman (et sa fonctionnalité quadlets) pour le configurer. Cela exploite Systemd pour exécuter vos images docker. Voici un guide rapide, si quelqu’un est intéressé :

Évidemment, vous avez besoin d’un VPS avec accès SSH. Son pare-feu doit être ouvert au web sur le port 443. Mon VPS fonctionne sous Ubuntu, donc mes commandes d’installation prennent en compte ce contexte. J’ai également choisi d’utiliser le mode root pour exécuter les quadlets, mais d’autres options sont possibles.

Configuration

D’abord, installez Podman :

sudo apt install podman podman-docker podman-toolbox

Téléchargez les images requises de docker :

sudo podman pull docker.io/mysql:8
sudo podman pull docker.io/ghost:5-alpine
sudo podman pull docker.io/caddy:alpine

Les services Systemd

Créez un fichier de conteneur MySQL à /etc/containers/systemd/mysql.container avec ce contenu :

[Unit]
Description=Blog MySQL Container
After=network-online.target

[Container]
ContainerName=blog-mysql
AddCapability=SYS_NICE
Image=docker.io/mysql:8
Volume=/srv/containers/blog/mysql/var/lib/mysql:/var/lib/mysql:Z
Pod=blog.pod
Secret=blog_db_name,type=env,target=MYSQL_DATABASE
Secret=blog_db_user,type=env,target=MYSQL_USER
Secret=blog_db_password,type=env,target=MYSQL_PASSWORD
Secret=blog_db_rootpassword,type=env,target=MYSQL_ROOT_PASSWORD

[Service]
Restart=always

[Install]
WantedBy=default.target
RequiredBy=blog-ghost.service

Créez un fichier de conteneur Ghost à /etc/containers/systemd/ghost.container

N’oubliez pas de changer yourdomain.com avec votre domaine.

[Unit]
Description=Ghost Container
After=blog-db.service

[Container]
ContainerName=blog-ghost
Environment=database__client=mysql database__connection__host=blog-mysql url=http://yourdomain.com
Image=docker.io/ghost:5-alpine
Pod=blog.pod
Secret=blog_db_name,type=env,target=database__connection__database
Secret=blog_db_user,type=env,target=database__connection__user
Secret=blog_db_password,type=env,target=database__connection__password
Volume=/srv/containers/blog/var/lib/ghost/content:/var/lib/ghost/content:Z

[Service]
Restart=always

[Install]
WantedBy=default.target

Vous devez configurer les secrets utilisés dans ces deux fichiers pour accéder à MySQL. C’est parti :

printf $(tr -dc A-Za-z0-9 </dev/urandom | head -c 13) | sudo podman secret create blog_db_rootpassword -
printf $(tr -dc A-Za-z0-9 </dev/urandom | head -c 13) | sudo podman secret create blog_db_password -
printf "gdb" | sudo podman secret create blog_db_name -
printf "guser" | sudo podman secret create blog_db_user -

Vous devez également avoir les fichiers stockés sur votre système de fichiers, alors créons les répertoires qui seront montés dans les images :

sudo mkdir -p /srv/containers/blog/var/lib/ghost/content
sudo mkdir -p /srv/containers/blog/mysql/var/lib/mysql

Maintenant, ajoutez un fichier blog.network à /etc/containers/systemd/blog.network

[Unit]
Description=Custom blog Podman network

[Network]
NetworkName=blog
Driver=bridge

Et un fichier blog.pod à /etc/containers/systemd/blog.pod

[Unit]
Description=Blog Pod

[Pod]
PodName=blog
Network=blog.network
PublishPort=3001:2368

Configuration de Caddy

J’ai choisi Caddy pour servir l’application sur Internet. J’ai choisi de laisser Caddy en dehors du contexte du pod blog parce que je l’utilise pour proxy d’autres serveurs de test sur ce VPS.

Créez le fichier de service à /etc/containers/systemd/caddy.container

[Container]
ContainerName=caddy
Image=docker.io/caddy:alpine
PublishPort=80:80
PublishPort=443:443
Volume=/srv/containers/caddy/Caddyfile:/etc/caddy/Caddyfile:ro
Volume=/srv/containers/caddy/data:/data
Volume=/srv/containers/caddy/config:/config
Network=host

[Service]
Restart=always

[Install]
WantedBy=default.target

Et créez le répertoire Caddy :

sudo mkdir -p /srv/containers/caddy

Ajoutez un Caddyfile à /srv/containers/caddy/Caddyfile avec le contenu suivant :

{
    # email to use on Let's Encrypt
    email your@email.com
}

www.yourdomain.com {
        redir https://yourdomain.com{uri}
}

yourdomain.com {
  reverse_proxy 127.0.0.1:3001
}

N’oubliez pas de mettre à jour le fichier avec votre email et domaine.

Mise en ligne

Maintenant, on ouvre les bons ports…

sudo systemctl daemon-reload
sudo systemctl enable caddy
sudo systemctl start caddy
sudo systemctl enable blog-pod
sudo systemctl start blog-pod

Voilà, vous pouvez maintenant visiter yourdomain.com/ghost pour commencer à bloguer !