Estudo de caso · Stack

Como o Ghost construiu uma plataforma de publicação aberta em Node.js

O Ghost é uma plataforma de publicação de código aberto mantida por uma fundação sem fins lucrativos, usada para blogs, newsletters e assinaturas pagas. O núcleo é uma API JSON em Node.js com MySQL, um painel separado que está sendo refeito em React e serviços de fora como Stripe, Mailgun e Tinybird para pagamentos, e-mail e análise.
Copiar stackghost.org Plataforma de publicação para newsletters e assinaturas pagas · SG · fundada em 2013

A stack da Ghost

Abrir no montador

Linguagem

  • TypeScriptgithub.com

    Linguagem de todo código novo, enquanto o projeto deixa o JavaScript puro para trás.

    Por quê: Segurança de tipos é a prioridade número um declarada pelo time.

Biblioteca de interface

  • Handlebarsdocs.ghost.org

    Linguagem de templates dos temas do Ghost.

    Por quê: O Ghost diz que ela é poderosa e muito rápida sem deixar de ser simples.

  • Reactgithub.com

    Framework do painel, onde toda tela nova é feita.

Framework full-stack

  • Expressdocs.ghost.org

    Servidor web que entrega a camada de temas de cada site Ghost.

Hospedagem

  • Dockerghost.org

    Jeito oficial de instalar e rodar o Ghost com os novos serviços ao lado, que deve virar o padrão no Ghost 7.0.

    Por quê: A análise e a rede social agora rodam como serviços separados ao lado do Ghost.

Banco de dados

Pagamentos

  • Stripeghost.org

    Cuida das assinaturas pagas e dos preços criados no painel do Ghost.

E-mail

  • Mailgundocs.ghost.org

    Dispara as newsletters em massa para os membros.

    Por quê: Mandar e-mail em massa por SMTP comum pode colocar o IP do servidor em lista de bloqueio.

Estilo e kit de interface

  • Tailwind CSSgithub.com

    Cuida do visual do painel e da biblioteca de componentes Shade.

Build e runtime

  • Vitegithub.com

    Monta e serve o painel em React durante o desenvolvimento.

ORM

  • Bookshelf.jsdocs.ghost.org

    Camada de ORM entre o Ghost e o banco, que está sendo trocada por repositórios sobre o Knex.

    Por quê: Ele permitia que o Ghost funcionasse com mais de um banco.

Framework de servidor

  • Node.jsdocs.ghost.org

    Roda o servidor central e a API do Ghost.

    Por quê: O Ghost queria ser familiar para times que já trabalham com código em JavaScript.

Testes

  • Vitestgithub.com

    Roda os testes do painel e do servidor.

Análise de uso

  • Tinybirdghost.org

    Sustenta a análise de visitas própria do Ghost, sem cookies, sobre ClickHouse.

Erros

Como montaram

Uma API no centro e um painel à parte

O Ghost foi feito como uma API JSON no padrão REST, dividida em Content API e Admin API. O painel é um cliente totalmente separado dessa API, então o editor continua rápido sem pesar no site público, e quem escreve não precisa de Git para publicar.

O site público sai de uma camada de temas servida pelo Express, com templates em Handlebars. O Ghost diz que escolheu ficar todo em JavaScript para que times acostumados com esse tipo de código se sintam em casa.

Fontes:docs.ghost.org

Do Ember para o React no painel

Durante anos o painel rodou em Ember. A troca para React foi feita tela por tela, com apps novos em React rodando dentro do painel antigo. Hoje o app do painel no monorepo é um projeto React montado com Vite, estilizado com Tailwind e testado com Vitest, e o guia para quem contribui manda fazer toda tela nova em React.

O servidor passa por uma faxina parecida. A prioridade declarada é segurança de tipos: levar o código de JavaScript para TypeScript, validar os dados que chegam com Zod e trocar aos poucos o ORM Bookshelf por serviços, repositórios e Knex direto.

Fontes:github.com github.com forum.ghost.org

Ghost 6.0: análise e rede social como serviços à parte

Até o Ghost 6.0, lançado em agosto de 2025, o Ghost era um único app num servidor com um banco MySQL. A versão 6 trouxe análise de visitas própria e sem cookies, feita sobre ClickHouse numa parceria com a Tinybird, e a ligação com a rede social aberta pelo protocolo ActivityPub.

Os dois recursos rodam como serviços independentes ao lado do Ghost. Foi por isso também que o Docker Compose virou um jeito oficial de instalar e rodar o Ghost, e a previsão é que ele vire o padrão no Ghost 7.0.

Fontes:ghost.org github.com

Newsletter e pagamento ficam com especialistas

O Ghost não tenta mandar e-mail em massa sozinho. As newsletters saem pelo Mailgun, o único serviço de envio em massa suportado, porque disparar muito e-mail por SMTP comum pode colocar o IP do servidor em lista de bloqueio. O SMTP normal continua para mensagens do dia a dia, como links de login e convites.

As assinaturas pagas rodam no Stripe: depois que o site conecta a conta, os preços criados no painel do Ghost aparecem lá automaticamente.

Fontes:docs.ghost.org docs.ghost.org ghost.org

Também detectado no site

Achado na página inicial com as regras abertas do Wappalyzer (HTML, scripts e cabeçalhos). Mostra o que roda no navegador, não o backend inteiro.

  • Alpine.js
  • FirstPromoter
  • HSTS
  • Hugo
  • Netlify