Este blog estava em silêncio desde 2017.
Não apenas o conteúdo. Toda a infraestrutura por baixo estava morta. Ruby 2.3, fim de vida desde março de 2019. Jekyll 2.x, sem suporte. Compass para compilação CSS, um projeto que parou em 2016. O pipeline do GitLab CI falhava silenciosamente a cada push.
Ninguém percebia porque ninguém fazia push.
A Autópsia
O CI usava ruby:2.3 do Docker Hub. Essa imagem ainda existe, congelada no tempo, baseada no Debian Stretch.
Os repositórios de pacotes do Debian Stretch foram arquivados. Todo apt-get update retorna 404. A imagem não consegue instalar nada. Nem mesmo locales.
1 2 3 | |
Esse foi o fim do Ruby 2.3.
A Correção: Migração Mínima Viável
O objetivo não era modernizar tudo. O objetivo era fazer o build funcionar de novo.
ruby:2.7 no Debian Bullseye. Repositórios funcionam. A imagem é estável.
Três coisas quebraram ao migrar de 2.3 para 2.7.
Bundler. O bundler padrão agora requer Ruby 3.2+. Fixar na versão 2.4.22 resolve:
1
| |
FFI. As versões da gem ffi acima de 1.17 requerem Ruby 3.0+. Fixar em ~> 1.16.3 no Gemfile impede o bundler de puxar uma versão incompatível.
Pygments. A gem pygments.rb (versão 0.6.3) usa um protocolo IPC com Python para comunicar com o syntax highlighter Pygments. Esse protocolo está quebrado com Python 3.
A correção: substituir completamente pelo Rouge, um syntax highlighter escrito em Ruby puro. Sem dependência de Python. Sem IPC. O plugin pygments_code.rb foi reescrito para chamar a API do Rouge:
1 2 3 4 5 | |
Nenhum post precisou de alteração. A mesma tag Liquid codeblock funciona exatamente como antes.
Desenvolvimento Local: Mais Fácil do que o Esperado
A expectativa era que Ruby 2.7 só funcionaria dentro do Docker por causa da compilação de extensões nativas (ffi, rdiscount, RedCloth).
Errado.
Com mise no Arch Linux:
1 2 3 4 | |
Todas as gems nativas compilaram sem problemas. bundle exec rake preview serve o site em localhost:4000. Docker não é necessário para desenvolvimento local.
Removendo o Peso Morto
Com o build funcionando, o próximo passo foi remover tudo que morreu enquanto o blog dormia.
Integrações mortas removidas: - Widget e botão +1 do Google+ — serviço encerrado em abril de 2019 - Google Analytics (Universal Analytics) — aposentado em julho de 2024, coletando zero dados - Botão de Like do Facebook — invasivo para privacidade, removido - Widget do Twitter na sidebar — removido da sidebar padrão
Código morto identificado mas mantido:
- Flash/SWFObject no octopress.js — inerte, nenhum browser usa Flash
- Modernizr 2.0 — detecção de features para browsers que não existem mais
- jQuery 1.9.1 — ainda usado pela navegação, não vale remover sem reescrever
Posts ocultados: cinco posts de baixo valor (posts de teste, reposts, conteúdo datado) marcados com published: false. Não deletados — apenas invisíveis.
Frontend: Mudanças Pequenas, Impacto Visível
O tema padrão do Octopress 2 é de 2012. Um redesign completo estava fora do escopo. Mas algumas mudanças apenas em CSS fizeram diferença perceptível.
Tipografia. O font stack estava quebrado — o Sass tratava toda a declaração de fonte dos headings como uma string entre aspas. Os browsers nunca faziam match. Corrigido para usar stacks corretos de PT Sans / PT Serif com carregamento correto do Google Fonts via HTTPS.
Largura do texto. A coluna de conteúdo não tinha restrição de max-width. Em telas largas, as linhas de texto se estendiam muito além do comprimento confortável de leitura. Um único max-width: 38em no .entry-content resolveu.
Background. A textura PNG original com tiling foi substituída por uma cor sólida. A barra de navegação agora fica sobre um fundo escuro limpo em vez de uma imagem ruidosa.
Blockquotes. Adicionado cor de fundo sutil e padding adequado para uma aparência mais moderna.
Open Graph e Compartilhamento Social
O site não tinha meta tags Open Graph ou Twitter Card. Todo link compartilhado aparecia como uma URL simples sem preview.
Adicionado ao template <head>:
- og:title, og:description, og:image, og:type, og:url
- twitter:card, twitter:title, twitter:description, twitter:image
Esses campos são populados automaticamente a partir do front matter de cada post. Posts com campo image recebem cards summary_large_image. Posts sem recebem um card summary básico.
O que Resta
A stack ainda está longe de ser moderna. Jekyll 2 e Octopress são projetos mortos. O Compass gera vendor prefixes que nenhum browser precisa há anos. O JavaScript carrega jQuery 1.9.1 e Modernizr 2.0 em cada página.
A dependência do Compass é o principal bloqueio para uma migração ao Jekyll 4. Cada arquivo Sass usa mixins e asset helpers específicos do Compass que não existem no Sass padrão. Substituí-los é um esforço de vários dias.
Mas o site builda. O CI passa. Os posts renderizam. O conteúdo é legível.
Às vezes ressuscitar algo velho é mais rápido do que reescrever do zero.
O próximo passo é decidir se vale investir em uma migração completa para Jekyll 4 ou aceitar que essa casca de Octopress, apesar da idade, ainda funciona bem o suficiente para publicar o que importa.
Por enquanto, ele publica. Isso é suficiente.