Pesquisa de site

Como implantar o Ghost Blog com Nginx no Debian 12


Nesta página

  1. Pré-requisitos
  2. Passo 1 - Configurar Firewall UFW
  3. Passo 2 - Instale o Nginx
  4. Etapa 3 – Instale o Node.js
  5. Passo 4 – Instale o MySQL usando Docker
  6. Passo 5 - Instale o Fantasma

    1. Instale o Ghost-CLI
    2. Preparar diretório fantasma
    3. Instalar Fantasma
  7. Passo 6 – Instalar SSL
  8. Etapa 7 - Configurar o Nginx
  9. Passo 9 – Execute o Site
  10. Etapa 10 – Configuração completa
  11. Passo 11 - Configurar Mailer
  12. Passo 12 - Atualizar Fantasma
  13. Conclusão

Ghost é uma plataforma de blog de código aberto que ajuda você a criar um blog com aparência profissional. Foi lançado em 2013 como uma alternativa ao WordPress. Ele é escrito em JavaScript e é desenvolvido com a biblioteca Node.js.

Neste tutorial, exploraremos como instalar o Ghost CMS usando Nginx e MySQL em um servidor com Debian 12. Usaremos o certificado Let's Encrypt SSL para proteger nossa instalação.

Pré-requisitos

    Um servidor rodando Debian 12 com no mínimo 2 GB de RAM.

    Um usuário não root com privilégios sudo.

    Um nome de domínio totalmente qualificado (FQDN) como example.com apontando para o seu servidor.

    Certifique-se de que tudo esteja atualizado.

    $ sudo apt update 
    $ sudo apt upgrade
    

    Poucos pacotes que seu sistema precisa.

    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
    

    Alguns desses pacotes podem já estar instalados em seu sistema.

Passo 1 - Configurar Firewall UFW

O primeiro passo é configurar o firewall. O Debian vem com ufw (Firewall Descomplicado) por padrão.

Verifique se o firewall está em execução.

$ sudo ufw status

Você deve obter a seguinte saída.

Status: inactive

Permita a porta SSH para que o firewall não interrompa a conexão atual ao ativá-lo.

$ sudo ufw allow OpenSSH

Permita portas HTTP e HTTPS também.

$ sudo ufw allow http
$ sudo ufw allow https

Habilite o Firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Verifique o status do firewall novamente.

$ sudo ufw status

Você deverá ver uma saída semelhante.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Passo 2 - Instale o Nginx

O Debian 12 vem com uma versão mais antiga do Nginx. Para instalar a versão mais recente, você precisa baixar o repositório oficial do Nginx.

Importe a chave de assinatura do Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Adicione o repositório para a versão estável do Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Atualize os repositórios do sistema.

$ sudo apt update

Instale o Nginx.

$ sudo apt install nginx

Verifique a instalação. O sudo é necessário para executar o comando no Debian.

$ sudo nginx -v
nginx version: nginx/1.24.0

Inicie o servidor Nginx.

$ sudo systemctl start nginx

Etapa 3 – Instale o Node.js

O Ghost Installer precisa do Nodejs para funcionar. A primeira etapa é importar a chave GPG Nodesource.

$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg

Em seguida, crie o arquivo de repositório Nodesource. Instalaremos o Node 18x, que é a versão LTS (Long Term Support) atual, recomendada pelo Ghost.

$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Atualize a lista de repositórios do sistema.

$ sudo apt update

Instale o Node.

$ sudo apt install nodejs -y

Confirme a instalação do Node.

$ node --version
v18.18.2

Passo 4 – Instale o MySQL usando Docker

O Debian não vem mais com MySQL. Em vez disso, ele vem com MariaDB. O Ghost suporta apenas MySQL. Você pode ajustar o Ghost para funcionar com MariaDB, mas isso não é recomendado. Como os repositórios oficiais do MySQL não foram atualizados para o Debian 12 no momento em que este tutorial foi escrito, iremos instalá-lo usando Docker.

Importe a chave Docker GPG.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Crie um arquivo de repositório Docker.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Atualize a lista de repositórios do sistema.

$ sudo apt update

Instale o Docker e o Docker Compose.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Por padrão, o Docker requer privilégios de root. Se você quiser evitar o uso de sudo toda vez que executar o comando docker, adicione seu nome de usuário ao grupo docker.

$ sudo usermod -aG docker $(whoami)

Você precisará sair do servidor e fazer login novamente como o mesmo usuário para ativar essa alteração ou usar o seguinte comando.

$ su - ${USER}

Confirme se seu usuário foi adicionado ao grupo Docker.

$ groups
navjot wheel docker

Agora que o Docker está instalado, precisamos criar um arquivo de composição do Docker para MySQL. Crie um diretório para o docker MySQL.

$ mkdir ~/mysql

Crie e abra o arquivo docker-compose.yml para edição.

$ nano docker-compose.yml

Cole o seguinte código nele.

services:
  database:
    image: container-registry.oracle.com/mysql/community-server:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostpassword
      MYSQL_DATABASE: ghostdb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Aqui definimos a senha root e as credenciais MySQL para o banco de dados Ghost. Eles serão criados quando o contêiner for executado.

Inicie o contêiner MySQL.

$ docker compose up -d

Verifique o status do contêiner Docker.

$ docker ps
CONTAINER ID   IMAGE                                                         COMMAND                  CREATED         STATUS         PORTS                                                        NAMES
ec42fb205f1e   container-registry.oracle.com/mysql/community-server:latest   "/entrypoint.sh mysq…"   4 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp   mysql

O Ghost pode se conectar ao contêiner MySQL usando a porta 3306 e realizar operações nele.

Passo 5 - Instale o Fantasma

Também podemos instalar o Ghost usando Docker, o que pode simplificar as coisas, mas não faremos isso aqui.

A instalação do Ghost compreenderá três componentes: ferramenta de linha de comando Ghost-CLI que instala e gerencia atualizações do blog do Ghost e do próprio pacote do blog.

Instale o Ghost-CLI

Execute o seguinte comando para instalar a ferramenta Ghost-CLI.

$ sudo npm install ghost-cli@latest -g

Preparar diretório fantasma

Crie o diretório raiz do Ghost.

$ sudo mkdir -p /var/www/html/ghost

Defina a propriedade do diretório para o usuário atual.

$ sudo chown $USER:$USER /var/www/html/ghost

Defina as permissões de diretório corretas.

$ sudo chmod 755 /var/www/html/ghost

Mude para o diretório do Ghost.

$ cd /var/www/html/ghost

Instalar Fantasma

A instalação do Ghost é um processo de comando único.

$ ghost install

Durante a instalação, a ferramenta CLI fará diversas perguntas para configurar o blog.

  • URL do blog: insira o URL completo do seu blog junto com o protocolo https. (https://example.com)
  • Nome do host MySQL: pressione Enter para usar o valor padrão de localhost, já que nossa instalação do Ghost e do MySQL estão no mesmo servidor.
  • Nome de usuário MySQL: Digite ghost como seu nome de usuário MySQL.
  • Senha MySQL: Digite sua senha root criada anteriormente no arquivo docker.
  • Nome do banco de dados fantasma: Insira o nome do banco de dados (ghostdb) configurado no arquivo docker.
  • Senha Sudo: solicitará sua senha Sudo para realizar tarefas administrativas.
  • Configurar o Nginx? Normalmente, o Ghost-CLI detecta a instalação do Nginx e o configura automaticamente para o seu blog. Mas isso funciona apenas para Nginx instalado usando o pacote do sistema operacional. Como o instalamos usando o repositório Nginx, o Ghost não consegue detectá-lo e irá ignorá-lo automaticamente.
  • Configurar SSL?: Como ignorou a configuração do Nginx, a ferramenta CLI também ignorará a configuração de SSL.
  • Configurar o systemd?: o Ghost perguntará se você deseja configurar um serviço de sistema para o Ghost. Pressione Y para continuar.
  • Iniciar o Ghost?: pressione Y para iniciar a instalação do Ghost. No entanto, não funcionará porque o Nginx e o SSL ainda não estão configurados.

Passo 6 – Instalar SSL

Antes de prosseguirmos, precisamos instalar a ferramenta Certbot e instalar um certificado SSL para nosso domínio.

Para instalar o Certbot, usaremos o instalador do pacote Snapd. O Snapd sempre carrega a versão estável mais recente do Certbot. O Debian não vem com o Snapd instalado. Instale-o primeiro.

$ sudo apt install snapd

Certifique-se de que sua versão do snapd esteja atualizada.

$ sudo snap install core
$ sudo snap refresh core

Instale o Certbot.

$ sudo snap install --classic certbot

Use o comando a seguir para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifique a instalação.

$ certbot --version
certbot 2.7.1

Gere um certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d example.com

O comando acima fará download de um certificado para o diretório /etc/letsencrypt/live/example.com em seu servidor.

Gere um certificado do grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Verifique o serviço de agendamento de renovação do Certbot.

$ sudo systemctl list-timers

Você encontrará snap.certbot.renew.service como um dos serviços programados para execução.

NEXT                        LEFT          LAST                        PASSED       UNIT                       ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left    Mon 2023-10-16 00:00:18 UTC 9h ago       dpkg-db-backup.timer         dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left     Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer     snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left    Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer              apt-daily.service

Faça uma simulação do processo para verificar se a renovação do SSL está funcionando bem.

$ sudo certbot renew --dry-run

Se você não encontrar erros, está tudo pronto. Seu certificado será renovado automaticamente.

Etapa 7 - Configurar o Nginx

Crie e abra o arquivo /etc/nginx/conf.d/ghost.conf para edição.

$ sudo nano /etc/nginx/conf.d/ghost.conf

Cole o seguinte código no arquivo ghost.conf. Substitua todas as instâncias de example.com pelo seu domínio.

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  location / { 
  	return 301 https://$server_name$request_uri; 
  }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
    
  access_log /var/log/nginx/ghost.access.log;
  error_log /var/log/nginx/ghost.error.log;
  client_max_body_size 20m;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
  ssl_prefer_server_ciphers off;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
  resolver_timeout 2s;

  ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:2368;
  }
}

A configuração acima redirecionará todas as solicitações HTTP para HTTPS e servirá como um proxy para o serviço Ghost atendê-lo por meio do seu domínio.

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Abra o arquivo /etc/nginx/nginx.conf para edição.

$ sudo nano /etc/nginx/nginx.conf

Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Verifique sua configuração do Nginx.

$ sudo nginx -t

Se você não encontrar erros, significa que está pronto para prosseguir. Reinicie o servidor Nginx para aplicar a configuração.

$ sudo systemctl restart nginx

Passo 9 – Execute o Site

Agora, você pode verificar sua instalação abrindo https://example.com em seu navegador. Você receberá a seguinte página indicando uma instalação bem-sucedida.

Etapa 10 - Configuração completa

Para terminar de configurar seu blog Ghost, visite https://example.com/ghost em seu navegador. O /ghost extra no final do domínio do seu blog redireciona você para o painel de administração do Ghost ou, neste caso, para a configuração, já que você está acessando pela primeira vez.

Aqui, você deverá criar sua conta de administrador e escolher um título de blog.

Insira seus dados e clique no botão Criar conta e começar a publicar para continuar.

A seguir, você será levado à tela seguinte, onde terá opções como escrever sua primeira postagem, personalizar seu site e importar membros.

Escolheremos o administrador do Explore Ghost para explorar e ir diretamente para o painel. Ao final da configuração, você será saudado pelo painel de administração do Ghost.

Se quiser mudar para o modo escuro, você pode fazer isso clicando no botão de alternância próximo ao botão de engrenagem de configurações na parte inferior da página de configurações.

Você verá uma postagem padrão. Você pode cancelar a publicação ou excluí-lo e começar a postar.

Passo 11 - Configurar Mailer

O Ghost não atua apenas como uma plataforma de blog, mas também como gerenciador de boletins informativos. Para operações diárias, você pode usar qualquer serviço de correio transacional para trabalhar com o Ghost para enviar mensagens. Mas se você deseja enviar boletins informativos via Ghost, o único mailer em massa oficial suportado é o Mailgun. Você também pode usar um serviço de boletim informativo diferente, mas para isso precisará usar o recurso de integração Zapier do Ghost.

Vamos primeiro configurar um serviço SMTP para emails transacionais. Para isso abra o arquivo /var/www/html/ghost/config.production.json para edição.

$ nano /var/www/html/ghost/config.production.json

Encontre as seguintes linhas.

 "mail": {
    "transport": "Direct"
  },

Substitua-os pelo código a seguir.

"mail": {
    "from": "'HowtoForge Support' [email ",
    "transport": "SMTP",
    "options": {
        "host": "YOUR-SES-SERVER-NAME",
        "port": 465,
        "service": "SES",
        "auth": {
            "user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
            "pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
        }
    }
},

Aqui estamos usando o serviço Amazon SES Mail por ser acessível e não exigir mensalidade.

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado. Quando terminar, reinicie o aplicativo Ghost para que as alterações tenham efeito.

$ ghost restart

Para definir as configurações do boletim informativo, visite a seção Configurações >> Boletim informativo por e-mail.

Clique no link Configuração do Mailgun para expandir.

Preencha sua região do Mailgun, domínio e chave de API.

Clique no botão Salvar no canto superior direito para salvar as configurações.

Para testar a entrega do boletim informativo, crie uma nova postagem de teste, clique em publicar e selecione a opção Somente e-mail. Se você quiser publicar a postagem também, selecione a opção Publicar e enviar por e-mail.

Clique no botão Continuar, revisão final para prosseguir. A próxima página pedirá novamente a confirmação final.

Clique no botão Enviar e-mail agora mesmo para enviar o boletim informativo. Você receberá a seguinte mensagem assim que o e-mail for enviado.

Verifique seu e-mail para a postagem.

Passo 12 - Atualizar Fantasma

Existem dois tipos de atualizações do Ghost: atualizações secundárias e atualizações principais.

Primeiro, faça um backup completo se quiser executar uma pequena atualização. Ele cria um backup de todas as postagens, membros, temas, imagens, arquivos e arquivos de redirecionamento.

$ cd /var/www/html/ghost
$ ghost backup

Execute o comando update para realizar a atualização secundária.

$ ghost update

Para realizar uma atualização importante, você deve seguir o guia oficial de atualização detalhado no Ghost. Dependendo da versão em que você está atualmente e da versão principal para a qual deseja atualizar, as etapas podem variar.

Conclusão

Isso conclui nosso tutorial sobre como configurar o Ghost CMS em seu servidor Debian 12 usando Nginx. Se você tiver alguma dúvida ou feedback, compartilhe-os nos comentários abaixo.

Artigos relacionados: