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.comapontando 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 -yAlguns 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
ghostcomo 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.

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.

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.

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.

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.

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.

Clique no link Configuração do Mailgun para expandir.
Preencha sua Região do Mailgun, domínio e chave da API.

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.

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 a newsletter. Você receberá a seguinte mensagem assim que o e-mail for enviado.

Verifique seu e-mail pela postagem.

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.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.