# Claude Code - vBulletin Morto Ressuscitado de 2016

**URL:** https://meta.discourse.org/t/claude-code-resurected-dead-vbulletin-from-2016/398120
**Category:** General
**Created:** [11 Março , 2026 00:54 UTC](https://meta.discourse.org/t/claude-code-resurected-dead-vbulletin-from-2016/398120 "2026-03-11T00:54:20Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![DavidO](https://avatars.discourse-cdn.com/v4/letter/d/f475e1/32.png) [@DavidO](https://meta.discourse.org/u/DavidO)
#### Post date: [11 Março , 2026 00:54 UTC](https://meta.discourse.org/t/claude-code-resurected-dead-vbulletin-from-2016/398120/1 "2026-03-11T00:54:20Z")

</div>

Eu só queria compartilhar uma experiência para os administradores menos habilidosos e com menos conhecimento que estão lutando com as coisas. Começou comigo perguntando sobre alguns problemas persistentes. Ele estava me dando comandos e me orientando nas coisas. Mas o verdadeiro avanço foi quando conectei o Claude code diretamente via SFTP e SSH…

![image](https://global.discourse-cdn.com/meta/original/4X/c/0/e/c0ee487a864fca043c8661f4bef9ffb06f3382a7.png)

Uma vez conectado, ele fez coisas incríveis! Nosso Discourse é usado apenas por um grupo de amigos, então não temos muito orçamento para fazer as coisas se algo der errado. Recentemente, o Claude Code encontrou todo tipo de coisinha errada na minha configuração.

- Corrigiu minha configuração do S3 no Spaces. Eu estava perto, mas ainda havia alguns problemas com os ativos JS carregando corretamente na reconstrução. Saga completa aqui: [Digital Ocean Spaces (S3) "unable to sign request without credentials set" - #20 by DavidO](https://meta.discourse.org/t/digital-ocean-spaces-s3-unable-to-sign-request-without-credentials-set/391139/20)

- Corrigiu o carregamento do JS do Discourse do [X.com](http://X.com) em vez de usar uma chave de API

- Me guiou na configuração de CDN, configurações de DNS do Cloudflare e tudo mais

- Encontrou 4.000 imagens órfãs do Tapatalk da nossa antiga migração do phpBB e as vinculou

- Converteu um monte de BBCode antigo para HTML para que as imagens funcionassem

- Descobriu que meu Volume da Digital Ocean estava completamente vazio e me deu confiança para apertar EXCLUIR e economizar R$/mês. Eu tinha movido tudo para o S3, ou pelo menos tinha certeza que sim, mas ainda estava nervoso para excluí-lo. É embaraçoso, na verdade, mas eu não queria perder nenhuma foto.

Mas o que foi ainda mais divertido foi que ele me deu confiança para assumir outro projeto, a ressurreição do nosso antigo fórum vBulletin que funcionou de 2002 a 2016 para um clube universitário. Ele caiu em desuso e foi finalmente aposentado depois de dar AIDS a alguns telefones. Ele conseguiu pegar um backup antigo, descompactá-lo e reconstruí-lo.

Ele fez um trabalho impressionante:

- Importou 12.394 tópicos e 282.096 postagens
  - O banco de dados estava tão corrompido que exportamos partes dele como tabelas separadas, ou partes de tabelas, como CSVs, já que não fazia o arquivo SQL completo. Mais de 25 arquivos individuais. Ele juntou tudo e depois criou o arquivo de importação do Discourse.

- Migrou e reconectou 9.504 imagens do backup
  - Então ele entrou e puxou algumas que faltavam da WayBackMachine e de outras importações. Eu dei a ele um backup de um phpGallery2 que usávamos na época e ele encontrou mais 288 imagens e as vinculou em outras 735 postagens.
  - Eu simplesmente joguei diretórios e arquivos de backup zip nele e ele vasculhou e encontrou todo tipo de coisa e as conectou diretamente
  - Infelizmente, não pôde fazer muito sobre as mais de 7.000 que estavam no Photobucket
  - Puxou mais 780 imagens com link direto

- Recuperou 143 dos 159 nomes de usuário que haviam sido excluídos anteriormente e estavam aparecendo apenas como “system”
  - Também encontrou seus avatares
  - Ele até encontrou meu avatar antigo, uma foto do melhor garoto bom de todos!

- Censurou mais de 5.000 palavras “colegiais” carinhosamente conhecidas como: O RELATÓRIO DE INSULTOS
- Criou novos logotipos com base em alguns originais parciais que tinha dos arquivos
- Recuperou todos os emojis clássicos do vbulletin e os vinculou a todas as postagens
  - Relatou que :flipoff2: foi o emoji mais usado (19.191 instâncias), seguido por :rolleyes : e :beer : (seguidores distantes)

- Permitiu alguma substituição de nomes, números de telefone ou e-mails que eram públicos.
- Me guiou na mudança para a API Resend
- Me guiou na configuração de SSL
- Me guiou na configuração de CORS
- Então, antes que entrássemos muito fundo, ele executou a varredura ClamAV em todos os arquivos

Ficou rodando em segundo plano por quase uma semana, aqui e ali ao longo de várias sessões. Tem sido uma janela divertida para o passado enquanto encontramos fotos e detalhes sobre viagens e projetos.

Também estou totalmente impressionado que existam humanos por aí que sabem o que isso está fazendo…

Permitir que o Claude execute cat \u003c\u003c ‘RUBY’ \u003e /tmp/tapatalk\_analysis.rb posts\_with\_tapatalk = Post.where(“raw LIKE ‘%uploads/tapatalk/%’”).where(deleted\_at: nil) dual\_ref\_count = 0 tapatalk\_only\_count = 0 tapatalk\_only\_files = posts\_with\_both = 0 posts\_tapatalk\_only = 0 posts\_with\_tapatalk.find\_each do |post| raw = post.raw tapatalk\_urls = raw.scan(/uploads/tapatalk/\[^\\s"'\u003c\u003e)\]\]+/) has\_upload\_ref = raw.include?(“upload://”) post\_has\_dual = false post\_has\_only = false tapatalk\_urls.each do |url| idx = raw.index(url) next unless idx start\_pos = \[idx - 200, 0\].max context = raw\[start\_pos..idx + 10\] if context \u0026\u0026 context.include?(“upload://”) dual\_ref\_count += 1 post\_has\_dual = true else tapatalk\_only\_count += 1 post\_has\_only = true tapatalk\_only\_files \u003c\u003c url unless tapatalk\_only\_files.include?(url) end end posts\_with\_both += 1 if post\_has\_dual posts\_tapatalk\_only += 1 if post\_has\_only end puts “=== TAPATALK IMAGE ANALYSIS ===” puts “Dual reference (upload:// + tapatalk): #{dual\_ref\_count} refs” puts “Tapatalk only (no upload:// nearby): #{tapatalk\_only\_count} refs” puts “Unique tapatalk-only files: #{tapatalk\_only\_files.length}” puts “Posts with at least one dual ref: #{posts\_with\_both}” puts “Posts with at least one tapatalk-only ref: #{posts\_tapatalk\_only}” puts “—SAMPLE TAPATALK-ONLY FILES—” tapatalk\_only\_files.first(15).each { |f| puts f } RUBY scp /tmp/tapatalk\_analysis.rb [root@23.21.11.54](mailto:root@23.21.11.54):/tmp/ 2\u003e/dev/null \u0026\u0026 echo “Uploaded”?

Extremamente impressionante.

Enfim, eu só queria compartilhar caso a ideia possa ajudar a inspirar algo divertido para mais alguém. Faça um bom backup e mande ver!

Feliz Discourse’n. ✌

---

_[View the full topic](https://meta.discourse.org/t/claude-code-resurected-dead-vbulletin-from-2016/398120)._
