Saltar para o conteúdo
Kulular Teknoloji, Kulular Bilişim Teknolojileri Limited Şirketi

← Publicações

Como construir um site institucional: notas sobre o nosso próprio site

18 de setembro de 2026Atualização 1 de outubro de 20265 minVersão 1.1

Resumo

A geração estática consiste em produzir as páginas de um site uma única vez, durante a compilação, e não quando chega um visitante. O servidor não volta a calcular a página a cada pedido. Entrega HTML já pronto. Esta abordagem aumenta a velocidade, reduz a carga no servidor e permite guardar a página em cache. O preço é ter de regenerar a página e limpar a cache sempre que o conteúdo muda.

Autor

Tarık İsmet ALKAN →

Organização

Kulular Bilişim Teknolojileri Limited Şirketi

O site de uma empresa de software é o primeiro software que a empresa escreve. Quem o visita não vê o código, mas vê o resultado. Se a página demora a abrir, se ficou uma frase em turco noutra língua, se o formulário de contacto falha em silêncio, o visitante atribui isso ao trabalho da empresa.

Por isso, construímos o site não como uma brochura, mas como um pequeno produto. Escrevo abaixo que decisões tomámos, porquê, e onde nos enganámos.

Geração estática

O site foi escrito com Next.js. Na primeira versão, as páginas eram geradas de novo no servidor a cada pedido. A causa era uma linha inocente: o layout raiz lia o cabeçalho do pedido para descobrir a língua. O Next considera dinâmica qualquer página onde vê isso.

O resultado era que a Cloudflare não conseguia guardar nenhuma página em cache. Cada visita ia até ao servidor na Hetzner. Medido localmente, o tempo até ao primeiro byte era de poucos milissegundos. Ou seja, o código não era lento. O problema ia surgir com a escala.

A solução foi deduzir a língua a partir do endereço e não do pedido. Cada língua tem o seu próprio layout raiz, e a língua fica clara pela pasta onde a página está. Hoje, todas as cerca de trezentas páginas são geradas uma única vez, durante a compilação.

Sete línguas e coerência

O site está publicado em turco, inglês, francês, português, alemão, espanhol e árabe. A tradução em si é a parte fácil. O difícil é que, quando um texto muda, mude em sete sítios ao mesmo tempo.

A maioria dos erros que encontrámos nas primeiras revisões vinha do mesmo padrão. Uma longa cadeia de condições que escolhia o texto conforme a língua caía em silêncio no último ramo quando se esquecia de uma língua. E o último ramo era quase sempre o turco. Era assim que aparecia uma frase em turco a meio de uma página em francês.

Resolvemos isto com uma função auxiliar. Qualquer sítio que escolha um texto tem de fornecer as sete línguas de uma vez. Se faltar uma, o código não compila. O erro é apanhado antes de chegar à produção.

Os títulos académicos eram um problema parecido. Numa tradução, o título «Doç. Dr.» tinha-se transformado em professor catedrático. Agora o título não é traduzido em nenhuma língua. Vem do registo em turco, e um teste verifica isso a cada push.

Testes

Não montámos uma framework de testes pesada. Escrevemos nove testes com o módulo de testes do próprio Node. Cada um apanha um erro que já nos aconteceu de verdade.

Entre eles: o título manter-se igual em todas as línguas, não haver travessões longos em nenhum texto, o nome da marca não ser traduzido, cada artigo em turco ter equivalente nas outras seis línguas e os textos jurídicos não serem resumidos na tradução. O último teste é grosseiro, mas funciona: se a página jurídica numa língua for mais curta do que sessenta por cento da versão turca, é muito provável que tenha sido resumida.

A cada push para o GitHub correm a verificação de tipos, o lint, estes testes e a compilação de produção. Se algum falhar, a versão não vai para produção.

Segurança

A política de segurança de conteúdo é rigorosa. Não se pode carregar nenhum script, tipo de letra ou imagem de um domínio externo. Os tipos de letra vêm do nosso próprio servidor. Assim, o navegador do visitante não envia pedidos a terceiros ao abrir a página. O Google Analytics só é carregado se o visitante der consentimento.

O ecrã do protocolo de trabalho na página inicial envia a um modelo de linguagem o texto que o visitante escreve. É o ponto do site mais fácil de usar de forma abusiva. Alguém que queira usar de graça um modelo pago pode chamar diretamente o endpoint. Impedimos isso com várias camadas: a verificação de que o pedido vem da nossa página, um bilhete assinado de curta duração e utilização única, um limite por hora e por dia para cada endereço, um teto diário para o site inteiro e um limite para o número de pedidos que podem ir ao modelo em simultâneo.

Implementação

O código está no GitHub. No servidor da Hetzner corre o Coolify, que a cada push para o ramo principal volta a compilar o site como imagem Docker e o coloca em produção. Uma implementação demora cerca de dois minutos e meio.

À frente está a Cloudflare. Com a passagem para a geração estática, também o HTML passou a poder ficar em cache, e as páginas ficam lá guardadas até uma hora.

Onde nos enganámos

A cache foi a fonte da velocidade, mas também de um equívoco. Pusemos uma nova versão em produção, o Coolify disse que tinha corrido bem, mas a página inicial continuava a aparecer na versão antiga. A causa era simples. A Cloudflare não pedia a cópia nova enquanto a que tinha não expirasse.

A solução certa é limpar a cache automaticamente no fim de cada implementação. O processo de publicação só está concluído quando termina no sítio que o visitante vê, e não apenas no servidor.

Há também a acessibilidade. A análise automática não encontrava erros nas páginas. Mas as pequenas etiquetas da página inicial estavam sobre uma fotografia semitransparente, e a ferramenta de análise não consegue medir o contraste sobre uma fotografia. Medimos à parte os píxeis por trás das etiquetas e o rácio rondava 3:1. Depois de esbater um pouco a fotografia e escurecer as etiquetas um tom, passou acima de 5:1. Mesmo quando a ferramenta diz «sem erros», é preciso olhar.

Porque contamos isto

É fácil dizer a um cliente «entregamos software que funciona». Quando escrevemos abertamente o que fizemos neste site, também se torna fácil ver em que se apoia essa frase.

Perguntas frequentes

01Um site institucional precisava mesmo de sete línguas?
Nos projetos europeus em que procuramos parceiros e entre os nossos interlocutores no estrangeiro, poucos leem turco. O verdadeiro custo de sete línguas não é a tradução. É a coerência. Deixámos isso a cargo dos testes, não da atenção humana.
02Porque não usaram um construtor de sites pronto?
O ecrã do protocolo de trabalho na página inicial envia um pedido a um modelo de linguagem, e esse pedido tem de estar protegido contra abusos. Com ferramentas prontas era difícil montar essa proteção e, ao mesmo tempo, uma política de segurança de conteúdo rigorosa. No nosso próprio código, ambas ficam visíveis e auditáveis.
03Porque é que a página antiga aparece depois da publicação?
As páginas ficam na cache da Cloudflare durante uma hora, no máximo. Mesmo depois de a nova versão entrar em produção, a cópia em cache pode continuar a ser mostrada até expirar. A solução é limpar a cache automaticamente após cada implementação.

Fontes

  1. 01Documentação do Next.js, renderização estática e dinâmica
  2. 02MDN, Content Security Policy
  3. 03W3C, Diretrizes de Acessibilidade para Conteúdo Web 2.1
  4. 04Documentação da Cloudflare, limpeza da cache

Citação sugerida

Öğr. Gör. Tarık İsmet Alkan. “Como construir um site institucional: notas sobre o nosso próprio site”. Kulular Teknoloji, versão 1.1, 1 de outubro de 2026. https://kulular.com.tr/pt/publicacoes/como-construimos-este-site

Kulular Teknoloji

Fazemos isto para organizações

A Kulular Teknoloji é uma empresa de software sediada em Ancara. Desenvolvemos software à medida e sistemas de IA e de dados para organizações. Se tem uma necessidade semelhante, descreva brevemente o seu projeto e planeamos juntos uma primeira reunião.

  • Arquitetura de software
  • Next.js
  • Multilinguismo
  • Implementação