Como Configurar um Blog Ghost na AWS com CDN

Você decidiu utilizar o Ghost como alternativa ao Wordpress, sabe que seu blog precisa de um CDN de alta performance para lidar com os picos de tráfego, mas ainda tem dificuldades em relação à hospedagem do serviço? Se a resposta for sim, fique por aqui, porque este artigo foi feito para você!
Antes de seguirmos no passo-a-passo, estou assumindo que você está familiarizado com o Ghost (sabe que se trata de uma plataforma de blogs de código aberto) e o mais importante: que já possui uma conta ativa na AWS.
Em relação ao Ghost, e como usuário, gosto particularmente da arquitetura dele. É desacoplado, e com um pouco de conhecimento é possível remover e/ou substituir partes que não interessam. Segundo a documentação oficial, essa é a arquitetura do sistema:
Para simplificar, neste artigo irei focar nas etapas de configuração da instância VPS dedicada e no CDN, ambos através do Amazon Lightsail. Caso ainda não esteja familiarizado, o serviço Amazon Lightsail oferece aos usuários capacidade de processamento, armazenamento e rede, além de recursos para implantar e gerenciar websites e web applications na cloud.
1. Criando o VPS com Blog Ghost
Para criar o servidor ou instância, como é chamado no ecosistema da AWS, navegue até o AWS Lightsail, no menu lateral selecione "Instance" e em seguida clique em "Create Instance".
Na próxima tela, você pode selecionar a região em que deseja criar o servidor (nesse exemplo, escolhi us-east-1a). Em seguida escolha um servidor Linux com Ghost. A Bitnami[1] é a responsável pela criação da imagem do servidor e toda documentação pode ser consultada no site deles.
Para este artigo, selecionei a menor VPS disponível. Mais adiante adicionaremos um CDN "na frente" do servidor primário. Na prática, você não precisa de uma instância maior, a menos que de fato tenha muitos editores em seu blog ou ainda, alguma necessidade bem específica.
Escolha um nome para sua nova instância e clique em "Create instance".
Você verá que a nova instância está sendo criada (...Starting). Aguarde até que o processo finalize.
Passado alguns poucos minutos, o processo de criação finaliza e o status final mudará para "Running" (em execução), conforme imagem a seguir. Clique no nome da instância para ter acesso aos detalhes.
Nesta tela você terá acesso ao IP público do servidor. É através dele que você irá se conectar ao VPS via SSH, diretamente através do Lightsail, sem precisar usar o seu terminal ou Putty para se conectar à instância.
Clique em "Connect using SSH" para ter acesso ao detalhes de login do painel de administração do Ghost.
Se tudo deu certo até aqui, você deverá ter acesso ao terminal de seu servidor Linux (sua instância na AWS). Uma vez no terminal, digite cat bitnami_application_password e será exibida sua senha de acesso ao painel de administração do Ghost.
Importante:
- Considere que o usuário padrão do Ghost é user@example.com
- Anote ou decore a senha que será mostrada! E através dela que você terá acesso para administrar o Ghost e tudo que envolve a criação de seu blog (ex: artigos, páginas, etc)
Agora que você já conhece a senha de acesso, abra uma janela de seu navegador e digite http://PUBLIC_IP. No meu caso, é http://44.204.209.27
Nesse ponto você terá acesso a página inicial de seu blog com o tema padrão do Ghost.
Agora você pode abrir o painel de administração acessando http://IP_PUBLIC/ghost. No meu caso, http://44.204.209.27/ghost , e em seguida inserir suas credenciais de acesso.
Após fazer login no painel, você poderá editar, excluir ou criar novo conteúdo para seu blog (página e artigos), além de alterar configurações e expandir as funcionalidades do Ghost através de diversas integrações.
Clique aqui para ter acesso a documentação oficial do Ghost.
2. Configurar e-mail
Agora que você já tem acesso ao painel do Ghost, é hora de avançarmos para uma parte importante na estrutura de um blog/site: o envio de e-mail
No Ghost, normalmente podemos enviar dois tipos de e-mail:
- Transacional: redefinição de senhas, convites a novos usuários, inscrição de membros, etc.
- Newsletters para seus assinantes: nesse exemplo, usarei o Mailgun para envio de e-mails em massa. Existem diversas soluções alternativas, mas por padrão farei uso do que é recomendado e bem documentado na plataforma oficial do Ghost.
Acesse a documentação e encontre mais detalhes dos motivos para usar o Mailgun.
Importante: Nesse artigo não irei detalhar a criação de chaves de acesso no Mailgun, pois é algo pessoal, e dependendo do volume desejado de envios pode ser necessário assinar o serviço, embora exista um plano Free ideal para testes (cerca de 100 envios por dia).
O ponto de atenção aqui é:
- Envio de newsletter é algo nativo do Ghost, diferente do Wordpress que precisaria instalar plugins adicionais
- Se não tiver a necessidade de enviar e-mails em massa, desconsidere a etapa 3 a seguir e foque em configurar apenas os dados para envio de e-mails transacionais via SMTP
Por padrão o Ghost usa Nodemailer para enviar e-mails e o Sendmail como camada de transporte, mas que não está instalado em nosso servidor (instância criada a partir de uma imagem Bitnami na AWS). Recomendo o uso de um servidor SMTP externo a fim de garantir uma taxa de entrega mais alta. Nesse caso, o envio poder ocorrer através do Gmail, AWS SES, Mailgun (se tiver interesse em usar o recurso de envio de Newsletter) ou através de qualquer serviço SMTP de sua preferência.
Para atualizar as configurações do serviço de e-mail em sua instância, conecte-se novamente ao servidor via SSH, e uma vez no prompt, edite o arquivo /opt/bitnami/ghost/config.production.json
Eu usarei o VI, mas você pode utilizar seu editor preferido. Digite o comando
$ vi /opt/bitnami/ghost/config.production.json e encontre as linhas:
"mail": {
"transport": "Direct"
},
Se você pretende usar o Mailgun, pode substituir as 3 linhas anteriores pelo seguinte bloco de código, obviamente substituindo seu usuário/senha:
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"auth": {
"user": "zz@sandboxcd1234567890.mailgun.org",
"pass": "xxxxxxxxxxxxxxx-yyyyyyyyy-8c2d7a09"
}
}
},
Em se tratando de SMTP, fique atento a porta TCP padrão do seu provedor externo (normalmente 587 para conexões do tipo TLS e 465 para SSL). Se for necessário, adicione por exemplo a linha "port": 587 ao arquivo de configuração.
Caso decida utilizar o Mailgun, obtenha os detalhes de configuração do SMTP no painel de configuração do Mailgun depois de fazer login em sua conta:
Finalmente, depois de atualizar todos os detalhes de configuração de seu e-mail, reinicie o Ghost. Execute na console de seu servidor o comando:
sudo /opt/bitnami/ctlscript restart ghost
3. Configurações para o envio de Newsletters por Email
Antes que comece a enviar e-mail em massa para sua audiência, você precisa fornecer sua chave de API do Mailgun ao Ghost. Acesse o painel do Mailgun, selecione "Chaves API" e copie a chave. Em seguida, no painel de administração do Ghost, acesse Settings-> Email newsletter-> Mailgun settings e clique em Edit para expandir. Cole o Domínio e a chave de API do Mailgun.
Isso é tudo que você precisa para enviar newsletter e emails transacionais a partir do seu blog Ghost. Uma forma rápida de validar o funcionamento do envio de e-mails é "convidar pessoas" para fazer parte da lista de colaboradores do seu blog (ex: editores, admnistradores, etc).
No painel do Ghost, acesse Settings-> Staff-> Invite People e adicione um e-mail que você tem acesso. Se fez tudo certo, você ou pessoa indicada receberá um e-mail de convite para que crie um novo login de acesso ao Ghost.
Parabéns! Até aqui você já tem um blog totalmente operacional, hospedado na AWS, e com um serviço de email ativo. 👏
Vamos seguir para os próximos passos (eu avisei que seria um passo-a-passo 😄):
- Adicionar um CDN
- Habilitar SSL
- Usar um nome de domínio personalizado
4. Adicione um CDN para aumentar a velocidade e reduzir a latência
Um Content Delivery Network, ou simplesmente CDN, é resumidamente uma rede de servidores geograficamente distribuídos e que armazenam cópias de conteúdo de seu site, como imagens, vídeos e dados. No contexto da AWS, e apenas para referência, ele refere-se ao serviço Amazon Cloudfront.
CDNs oferecem uma maneira fácil de aumentar a velocidade de um site e, ao mesmo tempo, reduzir a latência. Eles são essenciais para que seu conteúdo seja entregue de forma rápida, eficiente e segura para os usuários do seu blog.
Hoje em dia, como quase todo conteúdo é "consumido" em velocidade 2x, entregar algo com qualidade, autoral, e o mais rápido possível, é a melhor estratégia para manter a atenção de seus visitantes.
Até este ponto, sempre acessamos nossa instância através do IP estático que foi associado durante a criação de nosso servidor. Assim que finalizarmos a criação de nosso CDN, teremos um novo nome de domínio, e isso afetará a forma como nos conectamos à nossa intância de agora em diante. De maneira simplificada, nosso CDN receberá tráfego via HTTPS, onde ele atuará como um proxy reverso, que se comunicará com nosso servidor via HTTP.
Você não precisa entender todos os detalhes e nomenclaturas técnicas para seguir adiante nesse artigo, por hora basta saber que, felizmente, podemos hospedar o Ghost por trás de um proxy reverso sem maiores problemas.
Importante: para garantirmos que o Ghost não entre em um loop infinito, pensando que não estamos usando SSL, precisamos passar alguns cabeçalhos adicionais para evitar esse comportamento. Faremos isso mais adiante, mas para evitar que este artigo se afaste de seu foco principal, faremos a configuração adequada e a explicação do porquê será tratada em outro post aqui do blog.
Para criar um CDN, acesse o painel do Lightsail, no menu lateral clique em Networking e depois em Create distribution
A seguir, configuramos qual será o comportamento de nosso CDN. Escolha seu servidor Ghost como origem, ou seja, sua instância já configurada e que possui um IP estático. Isso significa que o CDN irá armazenar em cache o conteúdo da origem escolhida.
Role a tela até ter acesso a Advanced cache settings. É aqui que incluiremos os cabeçalhos HTTP para mitigar o risco do Ghost entrar em um loop infinito por conta do "Proxy reverso vs SSL".
Clique na opção "Forward headers I specify" e adicione as opções X-Forwarded-Proto / X-Forwarded-For, conforme mostrado na tela de captura a seguir.
💡Dica: Se você gostaria ou precisa entender um pouco mais do porquê dessa configuração, visite este artigo. Nele explico com mais detalhes "O Problema do Loop de Redirecionamento" que ocorrem com aplicações web que estejam por trás de um proxy reverso.
Vamos em frente, porque já estamos quase no final! 😅
Continue rolando a página para atribuir um nome ao CDN, escolha o plano desejado e em seguida, clique em Create distribution
Na sequência você será redirecionado para a tela com os detalhes de configuração do CDN e poderá verificar que ele está sendo criado, algo que dura normalmente entre 5 a 10 minutos. Seja paciente e aguarde até que o status mude de "In progress" para "Enable".
Observe que agora obtemos um nome de domínio para a distribuição no formato "https://.cloudfront.net" (verifique a URL no campo Default domain), logo, precisamos fazer com que o Ghost reconheça esse host como o domínio do Blog.
Para isso, conecte-se via SSH ao servidor, edite o arquivo config.production.json e, na linha onde a URL pública do blog é especificada, altere o valor para a URL pública do CDN, no formato "https://.cloudfront.net.
Este é um passo intermediário. Adiante o atualizaremos novamente para que possamos acessar o blog com nossa URL personalizada.
Habilitar SSL
Como estamos forçando HTTPS a partir do CDN, é necessário alterarmos a configuração do Apache e passarmos os cabeçalhos especificados anteriormente no CDN. Edite o arquivo de configuração do Apache executando o seguinte comando no terminal do servidor:
sudo vi /opt/bitnami/apache2/conf/httpd.conf
Busque o bloco a seguir e adicione RequestHeader set X-Forwarded-Proto "https", conforme descrito a seguir:
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
RequestHeader set X-Forwarded-Proto "https"
</IfModule>
Após completar a atualização do domínio e configuração SSL, reinicie o Ghost e o Apache com os seguintes comandos:
sudo /opt/bitnami/ctlscript.sh restart ghost
sudo /opt/bitnami/ctlscript.sh restart apache
Finalmente, você já pode navegar até seu blog e painel de administração do Ghost usando o domínio do Cloudfront.
5. Utilizar um nome de domínio personalizado
Chegamos ao último passo de nossa jornada, que é associar o seu domínio próprio a essa nova infraestrutura. Para configurá-lo, acesse o painel do Lightsail, no menu lateral clique em Networking, clique em sua distribuição Ghost-CDN, selecione a aba "Custom domains" e clique no botão "I understand, continue"
Você pode perceber que a opção de habilitar "meu domínio personalizado" está desabilitada, justamente porque não tenho um certificado SSL válido e meu tráfego atual SSL ocorre através do CDN. Nesse caso, criarei um certificado inserindo o nome do domínio que desejo utilizar, nesse exemplo, ivanfarias.com.br
Clique em "Create certificate", em seguida dê um nome ao Certificado e insira o nome de domínio que deseja utilizar. Ao final, clique em "Create certificate" novamente.
Uma vez que informamos o nome do domínio personalizado, precisamos validar que somos de fato o proprietário do domínio. Nesse ponto o Lightsail vai te informar 2(dois) valores que você precisa incluí-los como um registro do tipo CNAME em seu servidor de DNS.
Record type: CNAME
Name: "aqui constará o valor que será apresentado pelo Lightsail"
Value: "aqui constará o valor que será apresentado pelo Lightsail"
Este tipo de configuração vai variar dependendo do provedor do seu domínio atual (ex: Regitro.br, Hostinger, Hostgator, GoDaddy, etc.), mas independente do provedor, a configuração é padrão e fácil de executar.
Importante: Após incluir o registro CNAME é necessário aguardar o tempo de propagação do DNS. Esse processo pode levar horas até ser concluído, portanto, tenha paciência!
Depois de criar a entrada CNAME, e ter finalizado a propagação do DNS, o certificado ficará com o status "Valid", mas ainda não estará em uso.
Agora podemos de fato associar o seu domínio personalizado ao CDN e a toda infraestrutura que criamos até aqui. Por fim, não esqueça de criar outro registro CNAME "direcionando" o nome de domínio para o Cloudfront. No meu caso, seria algo como :
ivanfarias.com.br CNAME ********.cloudfront.net
E com isso, chegamos ao fim desse guia! A partir desse ponto você já pode navegar no seu blog Ghost, hospedado na AWS com o Amazon Lightsail, usando HTTPS e com um CDN que está pronto para melhorar a experiência dos leitores do seu blog.
Ufa😓! Este artigo ficou extenso, mas como prometido lá na introdução do artigo, minha intenção era entregar um guia prático, passo-a-passo e com eficiência profissional!
Espero ter ajudado, que tenha dado tudo certo até aqui e boa sorte com seu blog!
A Bitnami cria a imagem do servidor com toda pilha de tecnologia instalada por padrão (Apache, MySQL, Node.js e o Ghost) ↩︎