Aujourd’hui nous allons voir comment lancer un nouveau blog avec Ghost sur un VPS disposant de docker-compose. Les instructions sont les mêmes peu importe l’OS, c’est tout l’intérêt de docker.

Configuration de docker-compose pour Ghost

Créer un fichier docker-compose.yml avec le contenu suivant :

version: '2.3'

services:
    ghost:
        image: ghost:latest
        container_name: ghost
        hostname: ghost
        volumes:
        - ./config.production.json:/var/lib/ghost/config.production.json:z
        - ghost:/var/lib/ghost/content
        environment:
            NODE_ENV: production
            VIRTUAL_PROTO: http
            VIRTUAL_HOST: nicolaskempf.fr
            VIRTUAL_PORT: 80
            LETSENCRYPT_HOST: nicolaskempf.fr
            LETSENCRYPT_EMAIL: contact@nicolaskempf.fr
        restart: always
        networks:
        - nginx-proxy
        - ghost
        links:
        - mysql

    mysql:
        image: mysql:5.7
        container_name: mysql
        volumes:
            - db:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: ROOT_PASSWORD
            MYSQL_USER: nicolas
            MYSQL_PASSWORD: MY_PASSWORD
            MYSQL_DATABASE: ghost
        restart: always
        networks:
        - ghost
networks:
    nginx-proxy:
        external: true
    ghost:
        name: ghost

volumes:
    ghost: {}
    db: {}

J’utilise nginx-proxy et letsencrypt-nginx-proxy-companion pour faire le lien entre mes containers et mes noms de domaines.

Il est possible de faire fonctionner le blog sans proxy en ajustant un peu les propriétés :

version: '2.3'

services:
    ghost:
        image: ghost:latest
        container_name: ghost
        hostname: ghost
        volumes:
        - ./config.production.json:/var/lib/ghost/config.production.json:z
        - ghost:/var/lib/ghost/content
        environment:
            NODE_ENV: production
        restart: always
        ports:
        - "80:80"
        networks:
        - nginx-proxy
        - ghost
        links:
        - mysql

    mysql:
        image: mysql:5.7
        container_name: mysql
        volumes:
            - db:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: ROOT_PASSWORD
            MYSQL_USER: nicolas
            MYSQL_PASSWORD: MY_PASSWORD
            MYSQL_DATABASE: ghost
        restart: always
        networks:
        - ghost
networks:
    nginx-proxy:
        external: true
    ghost:
        name: ghost

volumes:
    ghost: {}
    db: {}

Configuration du container ghost

Pour Ghost, on fournir un fichier de configuration JSON avec les informations de la base de données.

{
    "url": "https://nicolaskempf.fr",
    "server": {
        "port": 2368,
        "host": "0.0.0.0"
    },
    "database": {
        "client": "mysql",
        "connection": {
            "host": "mysql",
            "port": 3306,
            "user": "nicolas",
            "password": "MY_PASSWORD",
            "database": "ghost",
            "charset": "utf8mb4"
        }
    },
    "mail": {
        "from": "'Nicolas KEMPF' <contact@nicolaskempf.fr>", 
        "transport": "SMTP",
        "logger": true,
        "options": {
            "host": "",
            "secureConnection": false,
            "auth": {
                "user": "",
                "pass": ""
            }
        }
    },
    "logging": {
        "transports": [
            "file",
            "stdout"
        ]
    },
    "process": "systemd",
    "paths": {
        "contentPath": "/var/lib/ghost/content"
    }
}

Si tout se passe bien, Ghost se lance et crée les tables nécessaires à son fonctionnement dans la db.

Au niveau de MySQL, il n'y a rien à faire, les variables d'environnement suffisent. Il est possible que vous aillez des erreurs au démarrage des services, le temps que mysql accepte les connexions. Pour le résoudre, il faudra ajouter un endpoint à ghost pour ne pas démarrer le conteneur tant qu'il n'arrive pas à se connecter à la db.

Si jamais vous rencontrez l'erreur suivante, il suffit de supprimer le volume db et recommencer :

ER_HOST_NOT_PRIVILEGED: Host ‘172.30.0.3’ is not allowed to connect to this MySQL server

Une fois le démarrage terminé, votre site est accessible à l’url choisie. Il ne vous reste plus qu’à vous rendre sur /ghost pour créer votre compte administrateur.