Ressuscitando Um Blog Morto: De Ruby 2.3 a Um Site Funcional Em Uma Sessão

| Comments

PTEN

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
docker run --rm -it -v $(pwd):/blog ruby:2.3 bash
# apt-get update
# => 404 Not Found em todos os mirrors

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
- gem install bundler -v 2.4.22

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
require 'rouge'

lexer = Rouge::Lexer.find_fancy(lang, code) || Rouge::Lexers::PlainText
formatter = Rouge::Formatters::HTML.new
highlighted = formatter.format(lexer.lex(code))

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
mise install ruby@2.7.8
gem install bundler -v 2.4.22
bundle install
bundle exec rake generate

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.

Comments