Originalmente, a configuração do meu blog foi planejada como um projeto puramente IPv6 via WireGuard, já que tudo é operado em um servidor doméstico (aliás, você pode obter endereços IPv6 gratuitos em route64.org). Para aumentar a acessibilidade, adicionei agora um proxy IPv4 externo (obrigado @Larvitz).
No entanto, surgiram imediatamente problemas de SSL: como originalmente tanto o registro A quanto o AAAA passavam pelo proxy, a validação do Let's Encrypt no meu servidor falhou.
A Solução: O "Hack de IPv6"
A solução foi apontar explicitamente o registro AAAA diretamente para o IP do WireGuard do meu servidor, em vez de também encaminhá-lo pelo proxy.
- Domínio:
blog.burningboard.org
- Registro A (Proxy):
194.28.98.217
- Registro AAAA (Servidor):
2a11:6c7:f05:a8::2 (WireGuard)
Através deste registro AAAA direto para o meu IP do WireGuard, o Let’s Encrypt continua alcançando meu servidor diretamente via IPv6 (já que o registro AAAA é priorizado por padrão) e emite o certificado SSL. O tráfego IPv4 é repassado para mim de forma criptografada pelo proxy.
A Configuração Final
Para que a comunicação funcione sem problemas, tivemos que ajustar os servidores Caddy:
1. No meu servidor (NixOS, blog.nix)
Para que os IPs reais dos visitantes cheguem corretamente e não sejam sobrescritos pelo IP do proxy, este deve ser marcado como confiável:
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. No proxy externo (Caddy)
Para que o proxy se comunique corretamente com o meu servidor via HTTPS, ele deve enviar o hostname (SNI):
reverse_proxy [https://[2a11:6c7:f05:a8::2]:443](https://[2a11:6c7:f05:a8::2]:443) {
header_up Host {host}
transport http {
tls_server_name blog.burningboard.org
}
}
O blog agora está acessível via IPv4 e IPv6, criptografado com segurança, e meu IP doméstico continua privado! 🚀
O mais importante primeiro: os habituais ficheiros Markdown continuam a ser a base – sou simplesmente um grande fã desta solução descomplicada. Mas, nos bastidores, muita coisa mudou:
Fiz alguns ajustes na configuração:
📂 Ficheiros MD: A estrutura do blog continua a ser simples, baseada em Markdown.
🌍 Mais global do que nunca: O meu blog suporta agora traduções em 43 idiomas. Sim, incluindo Klingon! 🖖 (Qapla'!)

O plano era ter uma tradução em tempo real totalmente automática, baseada no reconhecimento de idioma do navegador. Spoiler: funcionou apenas parcialmente. Nota-se que a IA é impressionante, mas ainda não está exatamente "lá" onde gostaríamos.
A solução: agora traduzo simplesmente cada artigo antecipadamente para todos os idiomas definidos, o que também é muito melhor para os motores de busca (SEO). Caso a deteção automática falhe, podem definir manualmente o vosso idioma preferido através do ícone do globo, que será guardado de forma simples através de um cookie.
As traduções são agora realizadas com o Gemini 3 Flash, que apresenta resultados surpreendentemente bons. No entanto, é preciso estar atento à IA: na primeira execução em massa, as tags também foram traduzidas por engano, o que, obviamente, não estava planeado.
O código continua disponível (se estiverem interessados, basta enviarem-me uma mensagem) 👍 Mas tenham em atenção que o sistema agora necessita da sua própria chave de API do Gemini 🔑.
Decidi mudar meu blog do WriteFreely para uma solução própria: o MD-Blog (o MD, claro, significa Markdown). O gatilho foi uma atualização malsucedida do sistema antigo – mas, no fim, foi o impulso perfeito para simplificar tudo radicalmente e ganhar o controle total sobre o design.
O núcleo são arquivos Markdown simples na pasta data/, que são convertidos em HTML moderno em tempo de execução. O resultado é ultrarrápido, dispensa banco de dados e, graças ao meu próprio sistema de design (incluindo modo escuro), agora tem exatamente a aparência que eu imaginei. Até mesmo um moderno botão de compartilhamento do Mastodon já está integrado.
Se você tiver interesse no código ou na configuração enxuta, sinta-se à vontade para entrar em contato comigo pelo Mastodon!