Blogging · 13 min read · Oct 23, 2025

Como implantar o Ghost Blog com Nginx no Debian 12

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

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

Pré-requisitos

  • Um servidor executando Debian 12 com um mínimo de 2GB 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 seu servidor.
  • Certifique-se de que tudo está atualizado. $ sudo apt update $ sudo apt upgrade
  • Alguns 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 o Firewall UFW

O primeiro passo é configurar o firewall. O Debian vem com o ufw (Uncomplicated Firewall) 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 também as portas HTTP e HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Ative o Firewall

$ sudo ufw enable
Comando pode interromper conexões ssh existentes. Prosseguir com a operação (y|n)? y
Firewall está ativo e habilitado na inicialização do sistema

Verifique o status do firewall novamente.

$ sudo ufw status

Você deve ver uma saída semelhante.

Status: active

Para                         Ação      De
--                         ------      ----
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 - Instalar 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

Passo 3 - Instalar Node.js

O Ghost Installer precisa do Node.js para funcionar. O primeiro passo é importar a chave GPG do 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 do Nodesource. Instalaremos o Node 18x, que é a versão LTS (Long Term Support) atual, que é o que o Ghost recomenda.

$ 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 - Instalar MySQL usando Docker

O Debian não vem mais com o MySQL. Em vez disso, vem com o MariaDB. O Ghost só suporta MySQL. Você pode ajustar o Ghost para funcionar com o MariaDB, mas não é recomendado. Como os repositórios oficiais do MySQL não foram atualizados para o Debian 12 no momento da redação deste tutorial, instalaremos usando o Docker.

Importe a chave GPG do Docker.

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

Crie um arquivo de repositório do 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 usar 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 entrar novamente como o mesmo usuário para habilitar essa alteração ou usar o seguinte comando.

$ su - ${USER}

Confirme que 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 o MySQL. Crie um diretório para o docker do 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 do MySQL para o banco de dados Ghost. Estes 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 - Instalar Ghost

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

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

Instalar Ghost-CLI

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

$ sudo npm install ghost-cli@latest -g

Preparar o Diretório do Ghost

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 corretas do diretório.

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

Mude para o diretório Ghost.

$ cd /var/www/html/ghost

Instalar Ghost

Instalar o Ghost é um processo de um único comando.

$ ghost install

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

  • URL do Blog: Insira a URL completa 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, uma vez que nossa instalação do Ghost e o MySQL estão no mesmo servidor.
  • Nome de Usuário MySQL: Insira ghost como seu nome de usuário MySQL.
  • Senha MySQL: Insira sua senha root criada anteriormente no arquivo docker.
  • Nome do banco de dados Ghost: Insira o nome do banco de dados ( ghostdb) configurado no arquivo docker.
  • Senha Sudo: Ele pedirá sua senha sudo para realizar tarefas administrativas.
  • Configurar Nginx? Normalmente, o Ghost-CLI detecta sua instalação do Nginx e a configura automaticamente para seu blog. Mas isso funciona apenas para o Nginx instalado usando o pacote do SO. Como o instalamos usando o repositório do Nginx, o Ghost não consegue detectá-lo e o ignorará automaticamente.
  • Configurar SSL?: Como ele ignorou a configuração do Nginx, a ferramenta CLI também ignorará a configuração de um SSL.
  • Configurar systemd?: O Ghost perguntará se você deseja configurar um serviço de sistema para o Ghost. Pressione Y para prosseguir.
  • Iniciar Ghost?: Pressione Y para iniciar sua 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 de pacotes Snapd. O Snapd sempre carrega a versão estável mais recente do Certbot. No entanto, 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 está atualizada.

$ sudo snap install core
$ sudo snap refresh core

Instale o Certbot.

$ sudo snap install --classic certbot

Use o seguinte comando 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 protected] -d example.com

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

Gere um certificado de grupo Diffie-Hellman.

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

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

$ sudo systemctl list-timers

Você encontrará snap.certbot.renew.service como um dos serviços agendados 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 um teste do processo para verificar se a renovação do SSL está funcionando bem.

$ sudo certbot renew --dry-run

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

Passo 7 - Configurar 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 para servi-lo através 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 vir erros, significa que está tudo certo. Reinicie o servidor Nginx para aplicar a configuração.

$ sudo systemctl restart nginx

Passo 9 - Executar o Site

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

Página Inicial do Ghost

Passo 10 - Completar a Configuração

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

Aqui, você será solicitado a criar sua conta de Administrador e escolher um título para o blog.

Detalhes da Configuração do Ghost

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

Em seguida, você será levado à seguinte tela onde são dadas opções como escrever sua primeira postagem, personalizar seu site e importar membros.

Sugestões do Instalador do Ghost

Escolheremos Explorar o admin do Ghost para explorar e ir diretamente ao painel. Ao final da configuração, você será recebido com o painel de Administração do Ghost.

Painel de Administração do Ghost

Se você quiser mudar para o modo escuro, pode fazê-lo clicando no interruptor ao lado do botão de engrenagem de configurações na parte inferior da página de configurações.

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

Painel de Postagens do Ghost

Passo 11 - Configurar o Mailer

O Ghost não apenas atua como uma plataforma de blog, mas também como um gerenciador de newsletters. Para operações do dia a dia, você pode usar qualquer serviço de e-mail transacional para trabalhar com o Ghost para enviar e-mails. Mas se você quiser enviar newsletters via Ghost, o único serviço de e-mail em massa oficial suportado é o Mailgun. Você também pode usar um serviço de newsletter diferente, mas para isso, precisará usar o recurso de integração Zapier do Ghost.

Vamos primeiro configurar um serviço SMTP para e-mails 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-as pelo seguinte código.

"mail": {
    "from": "'HowtoForge Support' [email protected]",
    "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 de e-mail Amazon SES, pois é acessível e não requer taxas mensais.

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

$ ghost restart

Para configurar as configurações da newsletter, visite a seção Configurações >> Newsletter por e-mail.

Configurações da Newsletter do Ghost

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

Preencha sua Região do Mailgun, domínio e chave da API.

Configurações da Newsletter MailGun do Ghost

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

Para testar a entrega da newsletter, crie uma nova postagem de teste, publique e selecione a opção Apenas e-mail. Se você quiser publicar a postagem também, selecione a opção Publicar e enviar por e-mail.

Opção de Publicar/Enviar E-mail do Ghost

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

Confirmar Envio de Newsletter do Ghost

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

Mensagem de Entrega Bem-Sucedida da Newsletter do Ghost

Verifique seu e-mail pela postagem.

E-mail da Newsletter do Ghost

Passo 12 - Atualizar o Ghost

Existem dois tipos de atualizações do Ghost - Atualizações menores e Atualizações maiores.

Primeiro, faça um backup completo se você quiser executar uma atualização menor. Isso 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 de atualização para realizar a atualização menor.

$ ghost update

Para realizar uma atualização maior, você deve seguir o guia de atualização detalhado oficial no Ghost. Dependendo de qual versão você está atualmente e a versão maior para a qual deseja atualizar, os passos variarão.

Conclusão

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

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.