Ghost+Mysql via Docker-Compose

Aqui vamos mostrar como instalar um Ghost via Docker, usando banco MySQL em poucos minutos.

PreReq

Instalando Docker

Vamos instalar o docker com o script fornecido pelo projeto

curl -fsSL https://get.docker.com -o get-docker.sh

Saída esperada

# Executing docker install script, commit: 442e66405c304fa92af8aadaa1d9b31bf4b0ad94
+ sh -c 'apt-get update -qq >/dev/null'
+ sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null'
+ sh -c 'curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null'
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c 'echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" > /etc/apt/sources.list.d/docker.list'
+ sh -c 'apt-get update -qq >/dev/null'
+ '[' -n '' ']'
+ sh -c 'apt-get install -y -qq --no-install-recommends docker-ce >/dev/null'
+ sh -c 'docker version'
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b7f0
 Built:             Wed Mar 11 01:25:46 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:24:19 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

Instalando docker compose

Faça download do binário

curl -L “https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose

Ajuste a permissão para execução

chmod +x /usr/local/bin/docker-compose

Pronto docker e docker-compose instalados, agora vamos ativar o docker no boot

systemctl enable docker

Feito, agora vamos iniciar o serviço do docker

systemctl start docker

Instalando Ghost

Crie um diretório para servir de volume para mysql e ghost.

mkdir -p /srv/sites/guto/ghost/content
mkdir -p /srv/sites/guto/ghost/config
mkdir -p /srv/sites/guto/ghost/mysql

Crie o arquivo config.json em ghost/config

{
  "url": "https://mindnotes.sh",
  "server": {
    "port": 2368,
    "host": "0.0.0.0"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "db",
      "port": 3306,
      "user": "root",
      "password": "sua senha",
      "database": "ghost",
      "ssl": false
     }
    },
    "mail": {
    "from": "ghost@mindnotes.sh",
      "transport": "SMTP",
      "options": {
        "service": "sendinblue",
        "host": "smtp-relay.sendinblue.com",
        "port": 587,
        "secureConnection": false,
        "auth": {
          "user": "seu_user",
          "pass": "sua_senha"
        }
      }
    },
    "paths": {
      "contentPath": "/var/lib/ghost/content"
    }
  }

Vamos agora criar do docker-compose.yml

cd /srv/sites/guto/ghost/
vim docker-compose.yml

Insira o conteúdo abaixo

version: '3'
services:

  ghost:
    image: ghost:latest
    container_name: mindnotes_ghost_app
    restart: always
    depends_on:
      - db
    environment:
      url: https://mindnotes.sh
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: sua_senha
      database__connection__database: ghost
    volumes:
      - /srv/sites/guto/ghost/site/content:/var/lib/ghost/content
      - /srv/sites/guto/ghost/site/config/config.json:/var/lib/ghost/config.production.json
    ports:
      - 80:2368

  db:
    image: mysql:5.7
    container_name: mindnotes_ghost_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: sua_senha
    volumes:
      -  /srv/sites/guto/ghost/site/mysql:/var/lib/mysql

Execute o docker-compose

docker-compose up -d

E pronto, acesse seu ghost pelo navegador e finalize a instalação :)

http://coloque-seu-ip-aqui/

Dicas soltas

Caso queira reiniciar os containers

docker-compose restart

Caso queria matar os containers

docker-compose kill

Caso queira ver o log de um dos containers

docker-compose logs -f mindnotes_ghost_app

Caso queria entrar em um dos containers

docker exec -ti mindnotes_ghost_app sh

Amarrando as pontas

Instalar qualquer coisa via docker-compose é muito fácil, especialmente quando você quer testar algo ou conhecer alguma tecnologia.

Neste cenário criamos um ambiente ghost composto por 1 container com a aplicação, e outro container rodando o banco MySQL. Ambos containers persistem os dados em disco, no HOST, utilizando o diretório /srv/sites/guto/ghost.

Observe que eu monto um volume para os dados, outro para o banco e outro para o arquivo de configuração, assim fica fácil alterar qualquer coisa e reiniciar o container em seguida.

Com a persistência de dados você pode reiniciar o seu containers e não perderá seus dados.

Usar docker em produção requer alguns cuidados além deste, como o uso de um orquestrador mais eficiente que ofereça alta disponibilidade, resiliência, escalabilidade e persistência, além de claro, um sólido plano de backup dos dados além de um procedimento bem claro para Disaster Recovery.

Bye!