CMS · 15 min read · Oct 14, 2025

Como implantar o Ghost CMS no Rocky Linux 9

Ghost é uma plataforma de blogging de código aberto para ajudar você a criar um blog com aparência profissional. Foi lançada em 2013 como uma alternativa ao WordPress, pois estava se tornando excessivamente complexa. É escrita em JavaScript e é alimentada pela biblioteca Node.js.

Este tutorial explorará como instalar o Ghost CMS usando Nginx e MySQL em um servidor alimentado pelo Rocky Linux 9. Usaremos o servidor Nginx para hospedar o blog e o certificado SSL Let’s Encrypt para garantir nossa instalação.

Pré-requisitos

  • Um servidor executando Rocky Linux 9.
  • Um usuário não-root com privilégios sudo.
  • Um nome de domínio totalmente qualificado (FQDN) apontando para seu servidor. Para nossos propósitos, usaremos ghost.example.com como o nome de domínio.
  • Certifique-se de que tudo esteja atualizado. $ sudo dnf update
  • Instale pacotes de utilitários básicos. Alguns deles podem já estar instalados. $ sudo dnf install wget curl nano unzip yum-utils -y

Passo 1 - Configurar o Firewall

O primeiro passo é configurar o firewall. O Rocky Linux usa o Firewalld Firewall. Verifique o status do firewall.

$ sudo firewall-cmd --state
running

O firewall funciona com diferentes zonas, e a zona pública é a padrão que usaremos. Liste todos os serviços e portas ativos no firewall.

$ sudo firewall-cmd --permanent --list-services

Deve mostrar a seguinte saída.

cockpit dhcpv6-client ssh

O Wiki.js precisa das portas HTTP e HTTPS para funcionar. Abra-as.

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent

Recarregue o firewall para aplicar as alterações.

$ sudo firewall-cmd --reload

Passo 2 - Instalar o Nginx

O Rocky Linux 9 vem com uma versão mais antiga do Nginx. Você precisa baixar o repositório oficial do Nginx para instalar a versão mais recente.

Crie e abra o arquivo /etc/yum.repos.d/nginx.repo para criar o repositório oficial do Nginx.

$ sudo nano /etc/yum.repos.d/nginx.repo

Cole o seguinte código nele.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

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

Instale o servidor Nginx.

$ sudo dnf install nginx -y

Verifique a instalação.

$ nginx -v
nginx version: nginx/1.22.1

Habilite e inicie o servidor Nginx.

$ sudo systemctl enable nginx --now

Verifique o status do servidor.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2022-10-25 08:27:47 UTC; 2s ago
       Docs: http://nginx.org/en/docs/
    Process: 1650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 1651 (nginx)
      Tasks: 2 (limit: 5912)
     Memory: 1.9M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??1651 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??1652 "nginx: worker process"

Oct 25 08:27:47 ghost.example.com systemd[1]: Starting nginx - high performance web server...

Passo 3 - Instalar o Node.js

O Ghost Installer precisa do Node.js para funcionar. Execute os seguintes comandos para instalar o Node 16.

$ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -

Instale o Node.

$ sudo dnf install -y nodejs

Verifique a instalação do Node.

$ node --version
v16.18.0

No momento da redação deste tutorial, o Node 18 está disponível e é a versão LTS. O Ghost ainda não adicionou suporte para isso. Fique atento ao documento do Ghost sobre versões do Node para a versão mais recente suportada. Quando o Ghost adicionar suporte ao Node 18, instale o Node 18 usando os seguintes comandos.

$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs

Passo 4 - Instalar o MySQL

O Rocky Linux 9 vem com a versão mais recente do MySQL. Você pode instalá-lo com um único comando.

$ sudo dnf install mysql-server

Verifique a versão do MySQL.

$ mysql --version
mysql  Ver 8.0.30 for Linux on x86_64 (Source distribution)

Habilite e inicie o serviço MySQL.

$ sudo systemctl enable mysqld --now

Verifique o status do serviço.

$ sudo systemctl status mysqld
? mysqld.service - MySQL 8.0 database server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2022-10-25 09:00:26 UTC; 3s ago
    Process: 2920 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
    Process: 2942 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
   Main PID: 3021 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 5912)
     Memory: 404.4M
        CPU: 4.686s
     CGroup: /system.slice/mysqld.service
             ??3021 /usr/libexec/mysqld --basedir=/usr

Oct 25 09:00:18 ghost.example.com systemd[1]: Starting MySQL 8.0 database server...
Oct 25 09:00:18 ghost.example.com mysql-prepare-db-dir[2942]: Initializing MySQL database
Oct 25 09:00:26 ghost.example.com systemd[1]: Started MySQL 8.0 database server.

Você pode fazer login no shell do MySQL usando autenticação Unix por padrão. Mas você não pode executar o assistente de configuração de segurança. Portanto, o seguinte passo é necessário para versões do MySQL 8.0.28 e superiores. Entre no Shell do MySQL.

$ sudo mysql

Execute o seguinte comando para definir a senha do seu usuário root. Certifique-se de que tenha uma mistura de números, letras maiúsculas, minúsculas e caracteres especiais.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';

Saia do shell. A desvantagem deste passo é que você não poderá mais fazer login no shell do MySQL usando autenticação Unix.

mysql> exit

Execute o script de instalação segura do MySQL.

$ sudo mysql_secure_installation

Você será solicitado a instalar o Componente de Validação de Senha. Ele verifica a força das senhas usadas no MySQL. Pressione Y para instalá-lo.

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

Em seguida, você será solicitado a definir o nível da política de validação de senha. Escolha 2, pois é a mais forte. Você será solicitado a criar uma senha para o root. Digite uma senha com os requisitos dados. E quando perguntado se deseja continuar com a senha, pressione Y para prosseguir.

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

Por fim, pressione Y para remover usuários anônimos, proibir logins remotos do root, remover o banco de dados de teste e recarregar as tabelas de privilégios.

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done!

Isso completa o processo de instalação e segurança do MySQL.

Passo 5 - Instalar o Ghost

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

Instalar o Ghost-CLI

Execute o seguinte comando para instalar a ferramenta Ghost-CLI. Ignore quaisquer avisos que você receber durante o processo.

$ 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 do Ghost.

$ cd /var/www/html/ghost

Instalar o 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.

  • No momento da redação deste tutorial, o Ghost-CLI não suporta nenhum outro SO além do Ubuntu. Ele perguntará se você ainda deseja continuar com a instalação. Pressione Y para continuar.
  • URL do Blog: Digite a URL completa do seu blog junto com o protocolo https. ( https://ghost.example.com)
  • Nome do Host MySQL: Pressione Enter para usar o valor padrão de localhost, já que nossa instalação do Ghost e o MySQL estão no mesmo servidor.
  • Nome de Usuário MySQL: Digite root como seu nome de usuário MySQL.
  • Senha MySQL: Digite sua senha root criada anteriormente.
  • Nome do banco de dados Ghost: Dê um nome para seu banco de dados Ghost. ( ghostdb)
  • Senha sudo: Digite a senha sudo do seu sistema para executar comandos elevados.
  • Configurar um usuário MySQL para o Ghost?: O instalador perguntará se você deseja criar um usuário MySQL separado para o Ghost. Pressione Y para prosseguir.
  • Configurar o Nginx?: Normalmente, o Ghost-CLI detecta sua instalação do Nginx e a configura automaticamente para seu blog. Mas, até agora, ele não consegue detectar nossa instalação do Nginx. Portanto, o instalador pulará automaticamente esta etapa. Configuraremos o Nginx manualmente.
  • Configurar SSL?: Como ele pulou a configuração do Nginx, a ferramenta CLI também pulará 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 o Ghost?: Pressione Y para iniciar sua instalação do Ghost. O serviço será iniciado, mas precisaremos configurar o Nginx e o SSL para fazê-lo funcionar.

Passo 6 - Instalar SSL

Antes de prosseguir, precisamos instalar a ferramenta Certbot e 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, que você deve usar.

A ferramenta Snapd requer o repositório Epel para funcionar.

$ sudo dnf install epel-release -y

Usaremos o Snapd para instalar o Certbot. Instale o Snapd.

$ sudo dnf install snapd -y

Habilite e inicie o serviço Snap.

$ sudo systemctl enable snapd.socket --now

Crie links necessários para o Snapd funcionar.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

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 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

Gere um certificado SSL.

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

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

Gere um certificado de grupo Diffie-Hellman.

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

Faça um teste do processo para verificar se a renovação do SSL está funcionando corretamente.

$ sudo certbot renew --dry-run

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

Passo 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 ghost.example.com pelo seu domínio.

## enforce HTTPS
server {
  listen 80;
  listen [::]:80;
  server_name ghost.example.com;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name ghost.example.com;

  access_log /var/log/nginx/ghost.access.log;
  error_log /var/log/nginx/ghost.error.log;
  client_max_body_size 20m;

  http2_push_preload on; # Enable HTTP/2 Server Push

  ssl_certificate     /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/ghost.example.com/chain.pem;
  ssl_session_timeout 1d;

  # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
  ssl_protocols TLSv1.2 TLSv1.3;

  # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
  # prevent replay attacks.
  #
  # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
  ssl_early_data on;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  add_header X-Early-Data $tls1_3_early_data;

  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;
  }
}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

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 ver erros, significa que está tudo certo. Recarregue o servidor Nginx.

$ sudo systemctl reload nginx

Passo 8 - Configurar SELinux

Permita que o Nginx se conecte à rede.

$ sudo setsebool -P httpd_can_network_connect 1

Passo 9 - Executar o Site

Agora, você pode verificar sua instalação abrindo https://ghost.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://ghost.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.

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

Detalhes da Configuração do Ghost

Digite 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. No 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 botão de alternância ao lado do botão de engrenagem de configurações na parte inferior da página de configurações.

Mude para a página de Postagens e 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 blogging, 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": "'Acme 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 é muito barato e gratuito por toda a vida se você estiver usando seu serviço EC2.

Se você quiser usar o serviço de newsletter usando o Mailgun, insira o seguinte código em vez disso.

"mail": {
  "from": "'Acme Support' [email protected]",
  "transport": "SMTP",
  "options": {
    "service": "Mailgun",
    "host": "smtp.mailgun.org",
    "port": 587,
    "secure": true,
    "auth": {
      "user": "[email protected]",
      "pass": "1234567890"
    }
  }
},

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 API.

Configurações da newsletter do MailGun do Ghost

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

Para testar a entrega da newsletter, abra qualquer postagem, abra suas configurações e clique na opção Newsletter por e-mail. Em seguida, envie um e-mail de teste para verificar se funciona. Se você não receber erros, significa que a entrega da sua newsletter está funcionando.

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.

$ 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 Rocky Linux 9 usando 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.