Sobre mim
Sou engenheiro de software e também cuido dos servidores onde meu código roda. Desde 2019 trabalho no CBPF, o Centro Brasileiro de Pesquisas Físicas, onde fico com boa parte do que faz o instituto funcionar na web: as máquinas, os serviços de rede dos quais elas dependem e muitos dos sistemas que o pessoal usa todo dia.
Gosto de cuidar do caminho inteiro de uma requisição. Escrevo o frontend em Nuxt e o backend em Go, coloco num container, mando pelo CI do GitLab, e fui eu também quem configurou o nginx na frente, o DNS que aponta pra ele, o LDAP onde ele autentica e o backup que traz tudo de volta quando algo quebra. Conhecer cada camada deixa o debug muito menos sofrido e me obriga a pensar duas vezes antes de adicionar complexidade.
Fora do trabalho, quase sempre acabo criando as ferramentas que eu preciso no trabalho. O LDAP Studio é um cliente LDAP nativo pra macOS que escrevi em SwiftUI com um núcleo em C em cima da libldap e do OpenSSL, porque a única opção decente que a gente tinha exigia uma VM Windows só pra navegar no diretório. Também mantenho alguns pacotes open source pequenos, como o nuxt-cap e minha config de oxlint/oxfmt, além deste site.
Experiência
- Centro Brasileiro de Pesquisas Físicas
Engenheiro de Software & DevOps
2019 - presente
Quando entrei, muita coisa da qual o instituto dependia estava velha. Sistemas em PHP 5 sem framework, servidores em versões de Debian e Ubuntu que já tinham perdido suporte havia tempo, BIND 9 no DNS e OpenLDAP nas contas. Boa parte do meu trabalho nesses anos foi substituir tudo isso aos poucos, sem derrubar o que as pessoas usam.
Hoje os servidores que administro rodam Rocky Linux com SELinux em enforcing, virtualizados no VMware e provisionados com Ansible. Todo servidor web segue o mesmo padrão: nginx no host com HTTP/2 e HTTP/3, aplicações em Docker Compose escutando só em localhost, e toda a configuração (vhosts, composes, certificados) versionada no Git. Um push nesse repositório dispara um webhook que recarrega o nginx ou refaz o deploy do container pelo cbpfdocker, uma CLI pequena que escrevi em Go só pra isso.
Migrei o DNS do BIND 9 para o PowerDNS. São quatro servidores autoritativos com backend MySQL atendendo cbpf.br, rederio.br e algumas outras zonas, todas assinadas com DNSSEC e NSEC3, e mais quatro PowerDNS Recursor atrás de um nome em round robin para a rede interna. As máquinas antigas com BIND estão sendo desligadas conforme as últimas zonas vão sendo movidas.
As contas ficavam num OpenLDAP. Migrei tudo para o 389 Directory Server, que hoje é um cluster de quatro nós com um primário de escrita e três réplicas só de leitura, schemas próprios para os atributos que o instituto precisa, TLS em todos os nós, backup de hora em hora e exporters alimentando o Prometheus.
Em cima do diretório construí o login que todo mundo usa. O SSO do CBPF é um provedor OpenID Connect nosso, feito em Go e Nuxt, com sessões no Redis e um captcha de proof of work hospedado aqui mesmo, sem Keycloak. Junto dele fica o ID CBPF, onde as contas são de fato criadas e administradas. Ele escreve direto no LDAP, cuida dos grupos e dos perfis acadêmicos como ORCID e Lattes, e os outros sistemas leem os dados das pessoas de lá em vez de manter cópia própria.
O projeto em que mais mergulhei ultimamente é a reescrita do CBPF Index, o sistema que acompanha a produção científica do instituto: artigos, teses, patentes, softwares, projetos e eventos. O original entrou no ar em 2004, escrito em PHP 5 com templates Smarty e um painel admin em Yii que veio depois, uns 48 mil linhas de código. Li arquivo por arquivo, anotei todas as regras que ele tinha e refiz tudo em Nuxt 4 e Go, com login pelo SSO, pessoas vindas do LDAP e PDFs no S3.
A migração foi metade do trabalho. Escrevi os scripts que levam tudo do MySQL em latin1 para o MongoDB, casam os usuários antigos com as contas do LDAP, juntam mais de 30 mil coautores externos numa lista única, movem uns 8 GB de PDFs e mantêm toda URL antiga redirecionando para a página nova. Também estou adicionando um chat que responde perguntas sobre todo o acervo público, rodando inteiro no nosso hardware: gpt-oss-120b e bge-m3 no Ollama em oito GPUs, Qdrant com mais de 300 mil trechos extraídos dos PDFs (com OCR nos escaneados) e chamadas de ferramenta no MongoDB para que contagens e listas de autores venham exatas em vez de chutadas.
Quase tudo que rodamos é feito em casa e na mesma stack. Nuxt na frente, Go atrás, MongoDB, MySQL e Redis num servidor central de banco de dados, arquivos num S3 próprio (saímos do MinIO para o RustFS), erros indo para um servidor compatível com Sentry hospedado por nós, analytics no Umami e uptime no Uptime Kuma. Para manter tudo consistente mantenho um template de projeto e pacotes compartilhados de Nuxt, Node e Go no registry do nosso GitLab, então um app novo já nasce com autenticação, rastreamento de erros e deploy prontos.
Administro o GitLab do instituto, com runners compartilhados, registries de containers e de npm, e o GitLab Pages. Recentemente tirei o Pages de um subdomínio do cbpf.br e passei para um domínio próprio, o cbpf.page, para que o site de um usuário não consiga criar cookies que alcancem o SSO ou qualquer outra coisa no domínio principal, e enviei o domínio para a Public Suffix List.
Também hospedo as ferramentas de terceiros que as equipes usam no dia a dia, como Vaultwarden, Outline, Vikunja, OpenProject, OnlyOffice e Stirling PDF, e o serviço de backup que cobre tudo isso. Esse é um programa em Go que escrevi e que faz dump do DNS, MySQL, MongoDB, LDAP, buckets S3 e volumes Docker em horários definidos, mandando e-mail quando algo falha. Todo servidor expõe métricas de sistema, containers, nginx, bancos, LDAP e DNS para o monitoramento, e os certificados TLS de tudo isso também passam por mim.
Tem ainda um servidor para pesquisadores e grupos que mantêm seus próprios sites em WordPress ou PHP antigo. Cada site roda no próprio container com o código montado na home do dono, assim ele edita por SSH enquanto eu cuido do nginx, dos certificados e das atualizações por baixo.
Também lidero a equipe web. Divido e acompanho as tarefas, reviso código, participo das contratações e ajudo os estagiários a se acostumarem com Linux, Git, Docker e com o jeito que a gente constrói as coisas. Praticamente tudo que escrevi acima está documentado, para que qualquer pessoa da equipe consiga assumir sem precisar me perguntar antes.