Criar um site com Hugo Framework é extremamente rápido e fácil, mas um site fica melhor ainda e mais funcional quando inclui um gerenciador de conteúdo (CMS), e é justamente isso que iremos fazer nesse tutorial.

Faremos a integração do TinaCMS a um site feito em Hugo Framework que está hospedado no Netlify.

TinaCMS é uma ótima opção, pois já traz diversos recursos prontos para uso como toda uma client para editar suas páginas e autenticação na nuvem via Tina Cloud para ser usado em produção.

Pré-requisitos:

Configurando o TinaCMS no modo local Link para o cabeçalho

Melhor opção para trabalhar localmente ou em desenvolvimento.

No terminal, no meu caso no PowerShell do Windows, na raiz do seu projeto, instale o TinaCMS.

# No meu caso faço uso do fnm para versionar o NodeJs, então preciso roda
# Talvez na sua máquina não precise desse comando
fnm env --use-on-cd | Out-String | Invoke-Expression
fnm use default # (seleciono a versão que irei usar)

# Instala o TinaCMS
npx @tinacms/cli@latest init

# Será feito algumas perguntas, selecione de acordo com as instruções abaixo:

# √ What framework are you using? » Hugo
# √ Choose your package manager » NPM
# ? Would you like to use Typescript for your Tina Configuration (Recommended)? » Y

Se ocorreu tudo bem com a instalação do TinaCMS, no terminal, você pode subir localmente o CMS junto com o seu site com o comando

# Sobe TinaCMS junto com o site Hugo
npx tinacms dev -c "hugo server -D"

Agora acesse a parte admin do TinaCMS, através do link

http://localhost:1313/admin

TinaCMS - postagem 1

Você verá que o TinaCMS informa que você está no modo local e já mostra uma postagem chamada Hello, World!, que foi uma criação de exemplo do próprio TinaCMS durante a instalação.

TinaCMS faz uso de Markdown para criar as postagens, se você tiver alguma postagem anterior em algum outro formato, será necessário fazer a conversão para Markdown.

Exemplo: No site já tinha uma postagem chamada My first post no formato Rich Text, dessa forma:

+++
title = 'My First Post'
date = 2024-11-17T18:34:57-03:00
draft = false
+++

Conteúdo

Tive que converter para Markdown, então a postagem ficou da seguinte forma:

---
title: My First Post
date: 2024-11-17T18:34:57-03:00
draft: false
---

Conteúdo

Se você voltar lá na tela do TinaCMS e der um refresh, verá que agora ele mostrará a postagem anterior, pois agora foi convertida para Markdown.

TinaCMS - postagem 2

A partir de agora você já pode editar suas postagens localmente através desse ótimo CMS.

Caso queira encerrar o serviço, é só voltar no terminar e pressionar as teclas CTRL + C.

Configurando o TinaCMS no modo produção Link para o cabeçalho

Começaremos pelo Tina Cloud para que possamos começar a nossa configuração.

Antes de prosseguir, caso esteja rodando o TinaCMS local, cancele com as teclas CTRL + C.

Tina cloud configurando projeto Link para o cabeçalho

No Tina Cloud, clique no link Create Project

TinaCloud - create project

Na próxima tela clique em Import your Site

TinaCloud - import site

Agora clique em Authenticate With Github

TinaCloud - auth with github

Na janela que se abre, selecione Only select repositories, pesquise o repositório onde está seu site, selecione-o e depois clique em Install

TinaCloud - install repository github

Assim o Tina Cloud vai poder ter acesso ao repositório do seu site, para que possa ler e escrever postagens diretamente nele.

Agora na próxima tela, clique em Select, para selecionar o repositório.

TinaCloud - select repository github

Na próxima tela, clique em Create Project

TinaCloud - bt create project

Na tela que surge, veja que já tem um campo informando um Client ID, copie esse código e já reserve pois iremos utilizar em breve.

TinaCloud - client id

Depois clique no menu Tokens, copie os 2 tokens, copie o token Content (Readonly) e o token Search, e depois reserve separando bem cada um, pois iremos utilizar.

TinaCloud - tokens

Configurando o site

Na pasta raiz do seu site crie um arquivo .env

É nele que adicionaremos as configurações para produção.

Adicione o conteúdo e salve.

Não esqueça de substituir a chave e tokens pelas que você obteve anteriormente

# Branch que o Tina Cloud irá manipular no Github
GITHUB_BRANCH=main
# Pegue no Tina Cloud, no seu projeto em "Overview"
TINA_CLIENT_ID=06ac9d80-e2c5-4c39-86f3-33b65ac45ccf
# Pegue no Tina Cloud, no seu projeto em "Token > Content (Readonly)"
TINA_TOKEN=6abdb45d8b624e1cdf42054bb1238638313e02ba
# Pegue no Tina Cloud, no seu projeto em "Token > search"
TINA_TOKEN_SEARCH=aa15f112adf203e0df91cd7dc188ca0c37159976

Agora iremos referenciar as informações no arquivo config.ts que está presente na pasta raiz tina do seu site.

No arquivo config.ts, na parte defineConfig, deixe da seguinte forma e salve:

export default defineConfig({
  branch: process.env.GITHUB_BRANCH || "", // Branch github que será manibulada

  // Get this from tina.io
  clientId: process.env.TINA_CLIENT_ID || "", // Pegue no Tina Cloud, no seu projeto em "Overview"
  // Get this from tina.io
  token: process.env.TINA_TOKEN || "", // Pegue no Tina Cloud, no seu projeto em "Token > Content (Readonly)"

  build: {
    outputFolder: "admin",
    publicFolder: "static",
  },
  media: {
    tina: {
      mediaRoot: "",
      publicFolder: "static",
    },
  },
  // See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/schema/
  schema: {
    collections: [
      {
        name: "post",
        label: "Postagens",
        path: "content/posts",
        fields: [
          {
            type: "string",
            name: "title",
            label: "Título",
            isTitle: true,
            required: true,
          },
          {
            type: 'boolean',
            name: 'draft',
            label: 'É rascunho'
          },
          {
            type: "rich-text",
            name: "body",
            label: "Conteúdo",
            isBody: true,
          },
        ],
      },
    ],
  },
  search: { // Configuração de campo de busca
    tina: {
      indexerToken: process.env.TINA_TOKEN_SEARCH, // Pegue no Tina Cloud, no seu projeto em "Token > search"
      stopwordLanguages: ['eng'],
    },
    indexBatchSize: 100,
    maxSearchIndexFieldLength: 100,
  },
});

Na linha 2 à 7, fiz o importe da branch, client id e token Content Readonly.

Na linha 27 à 44, personalizei os campos front matter (campos de metadados), adicionando mais campos e realizando a tradução deles.

Na linha 49 à 56, habilitei e configurei a busca no TinaCMS, pois por padrão, ela não vem habilitada.

No seu terminal, na raiz do site, comite essas alterações e envie para a branch, pois é ela que será manipulada pelo Tina Cloud.

# Adiciona alterações no git
git add .
# Comita alterações
git commit -m "update config tina cloud"
# Vê se tem alguma alteração na branch main remota
git pull origin main
# Envia as alterações para branch remota
git push origin main

Alterações enviadas para branch main remota, agora vamos verificar se as configurações estão ok para o Tina Cloud, no terminal, na raiz do seu site, execute:

# Checa configurações no Tina Cloud
npx tinacms build

Se tudo estiver ok, você verá 4 checks verdes

TinaCloud - config local ok

Lá na tela de projeto do Tina Cloud, se você for no menu Configuration, você verá que aparecerá a branch mainno bloco Branch Status.

Aparecendo isso, é sinal que toda configuração está ok.

Ajustando o deploy do site no Netlify Link para o cabeçalho

Para que o site possa puxar corretamente o TinaCMS, será precisa fazer alguns ajustes no deploy no Netlify.

Acesse o Netlify, selecione seu site que está configurando, depois no menu lateral esquerdo ou ao meio clique em Site configuration.

Na tela exibida, clique em Build & deploy.

Netlify - config 1

Depois role a página até embaixo e clique em “Configure”

Netlify - config 2

Procure o campo Buid command e substitua o comando por e clique no botão Save

npx tinacms build && hugo

Agora clique na opção Environment variables.

Netlify - config 3

Na tela que aparece, clique em Add a variable, depois em import from a .env file

Netlify - config 4

Copie o conteúdo do seu .env e cole no campo Content of .env file, depois clique em import variables

Netlify - config 5

As variáveis sendo importadas, elas irão aparecer da seguinte forma na tela:

Netlify - config 6

Agora vá no menu lateral esquerdo e clique em Deploy, depois na parte direita em Trigger e Deploy site.

Netlify - config 7

Aguarde o deploy, isso demora alguns segundos, para que o site seja compilado já incluindo o TinaCMS.

Tudo ocorrendo bem, seu deploy vai aparecer com o status de Complete em todas as etapas.

Netlify - config 8

O site agora já está integrado ao TinaCMS!

Agora vamos para a última parte.

Tina Cloud configurando domínio de acesso Link para o cabeçalho

Para acessar o TinaCMS em modo de produção é utilizado o Tina Cloud que serve de ponte para esse acesso.

No Tina Cloud será necessário configurar os domínios que tem permissão de acesso

O Netlify forneceu a seguinte URL de acesso para o site:

https://spontaneous-figolla-d5e343.netlify.app

Nesse caso já pego essa URL e vou lá no Tina Cloud, no menu Configuration do projeto e já defino essa URL para liberar o acesso para esse domínio

TinaCloud - url1

Agora vamos acessar a URL do site com /admin

No meu caso a URL ficou: https://spontaneous-figolla-d5e343.netlify.app/admin

Clique em Login in

Caso dê algum erro de URL

Copie a URL que aparece no campo origin=URL… que está presente na própria URL da janela de autenticação, exemplo:

https://app.tina.io/signin?clientId=06ac9d80-e2c5-4c39-86f3-33b65ac45ccf&origin=https://__main-spontaneous-figolla-d5e343.netlify.app

Nesse exemplo, você copia apenas https://__main-spontaneous-figolla-d5e343.netlify.app

Volte lá no Tina Cloud, Configuration do seu projeto e adicione essa URL também.

Agora volte na tela de login e dê um refresh.

Tudo ocorrendo bem, você conseguirá acessar TinaCMS no modo de produção, já incluindo alguns campos com traduções e com a função de pesquisa já habilitada.

Site com CMS de produção

Agora você já pode escrever suas postagens e artigos utilizando esse ótimo CMS de uma forma bem prática e intuitiva🙂!

Em breve abordarei mais recursos sobre o assunto.

Código fonte desse tutorial

https://github.com/tiagotsc/hugo-tinacms

Comandos úteis

# COMANDOS HUGO

# Compila o site, o resultado fica diponível na pasta public
hugo

# Sobe o site localmente sem exibir postagens de rascunhos (padrão do Hugo)
hugo server

# Sobe o site localmente exibindo postagens de rascunhos
hugo server -D

# Sobe o site localmente deixando-o acesssível de qualquer dispositivo na rede
# Bom para acessar de outra máquina ou visualizar no celular
hugo server --bind 0.0.0.0 --baseURL http://0.0.0.0 --port 1313 -D
Ou
hugo server --bind=0.0.0.0 --baseURL=http://0.0.0.0:1313 -D

# Cria uma nova postagem
hugo new content content/posts/my-first-post.md

# Listar comandos
hugo -h

# Mais detalhes dos comandos na documentação oficial
https://gohugo.io/commands

# COMANDOS TINACMS

# Sobe TinaCMS junto com o site Hugo
npx tinacms dev -c "hugo server -D"

Links úteis

Documentação oficial do Hugo

https://gohugo.io/documentation

Documentação oficial TinaCMS

https://tina.io/docs

Caso queira personalizar ainda mais a pesquisa

https://tina.io/docs/reference/search/overview

Caso queira configurar e personalizar ainda mais os campos

https://tina.io/docs/reference/types

https://tina.io/docs/reference/fields

Caso queira customizar a forma como o arquivo de postagem é salvo

https://tina.io/docs/extending-tina/filename-customization

https://tina.io/blog/add-and-delete-files