Statamic Peak

Article

Install Ghost with Docker

Today we'll learn how to launch a new blog with Ghost on a VPS using docker-compose.

Today, we will learn how to start a new blog with Ghost on a VPS with docker-composee. The instructions are the same no matter the OS, that's the whol point of Docker.

Configuration de docker-compose pour Ghost

Create a docker-compose.yml file with the following content :

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: {}

I use nginx-proxy and letsencrypt-nginx-proxy-companion to make the link between my containers and my domain names

We can also make the blog work without proxy by changing a bit the properties :

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: {}

Setting up the Ghost container

For Ghost, we give a JSN config file with the database informations.

{
    "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"
    }
}

If everything works well, Ghost launches and create the tables it needs in our database.

In MySQL, there is nothing to do, the environment variables are enough. It is possible you get errors while launching the services, the time mysql accepts the connexions. To solve this, wee will add an endpoint to Ghost to don't launch the container until it is connected to the db.

If you meet the following error, you will have to delet the db volume and start again :

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

Once restarted, your website can be reached at the selected url. You only have left to go on /ghost to create your admin account.