Claude Code — воскрешение мертвого vBulletin 2016 года

Я просто хотел поделиться опытом для менее опытных и knowledgeable администраторов, которые с трудом разбираются в вещах. Всё началось с того, что я задал ему вопросы о некоторых lingering проблемах. Он давал мне команды и проводил меня через процесс. Но настоящий прорыв случился, когда я подключил Claude Code напрямую через SFTP и SSH…

image

После подключения он сделал удивительные вещи! Наш Discourse используется только для группы друзей, поэтому у нас нет большого бюджета на исправления, если что-то пойдёт не так. Недавно Claude Code обнаружил множество мелких проблем в моей конфигурации.

  • Исправил настройку S3 на Spaces. Я был близок, но всё ещё были проблемы с корректной загрузкой JS-активов при перестроении. Полная история здесь: Digital Ocean Spaces (S3) "unable to sign request without credentials set" - #20 by DavidO

    • Он всё настроил правильно
  • Исправил загрузку JS для X.com в Discourse вместо использования API-ключа

  • Провёл меня через настройку CDN, параметры DNS Cloudflare и всё остальное

    • Контролировал процесс перепекания (rebake)
  • Нашёл 4000 сиротских изображений Tapatalk из нашей старой миграции с phpBB и связал их

  • Преобразовал множество старых BBCode-тегов в HTML, чтобы изображения работали

  • Я показал ему скриншот нашего счёта, он проанализировал использование и обнаружил, что мой том Digital Ocean был полностью пуст. Кроме того, он дал мне уверенность нажать DELETE и сэкономить $/месяц. Я перенёс всё на S3, или, по крайней мере, я был почти уверен, что перенёс, но всё ещё слишком боялся удалить это. Очень стыдно, но я не хотел потерять ни одного фото.

Но ещё более весело было то, что он дал мне уверенность взяться за другой проект — возрождение нашего старого форума vBulletin, который работал с 2002 по 2016 год для студенческого клуба. Он пришёл в упадок и был окончательно выведен из эксплуатации после того, как «заразил» HIV несколько телефонов. Он смог взять старую резервную копию, распаковать её и восстановить.

Он проделал впечатляющую работу:

  • Импортировал 12 394 темы и 282 096 сообщений
    • База данных была настолько повреждена, что мы экспортировали её части как отдельные таблицы или фрагменты таблиц в виде CSV-файлов, поскольку полный SQL-файл не получался. Более 25 отдельных файлов. Он собрал всё вместе и создал файл импорта для Discourse.
  • Мигрировал и восстановил связь 9504 изображений из резервной копии
    • Затем он зашёл и нашёл недостающие изображения в WayBackMachine и других источниках. Я дал ему резервную копию phpGallery2, которую мы использовали тогда, и он нашёл ещё 288 изображений и связал их с 735 другими сообщениями.
    • Я просто кидал ему директории и zip-архивы с резервными копиями, а он сортировал их, находил всёвозможные вещи и правильно их подключал
    • К сожалению, он мало что мог сделать с более чем 7000 изображениями, которые были на Photobucket
    • Подключил ещё 780 изображений по прямым ссылкам
  • Восстановил 143 из 159 имён пользователей, которые ранее были удалены и отображались просто как «system»
    • Также нашёл их аватары
    • Он даже нашёл мой старый аватар — фотографию лучшего хорошего мальчика!
  • Цензурировал более 5000 «студенческих» \(\)\(\)\(\)\(\) слов, ласково называемых: ОТЧЁТ ОБ ОСКОРБЛЕНИЯХ
  • Создал новые логотипы на основе некоторых старых фрагментов, найденных в файлах
  • Восстановил все классические эмодзи vBulletin и связал их со всеми сообщениями
    • Он сообщил, что :flipoff2: был самым используемым эмодзи (19 191 раз), за ним следовали :rolleyes: и :beer: (далекие аутсайдеры)
  • Позволил выполнить поиск и замену для имён, номеров телефонов или email-адресов, которые были публичными
  • Провёл меня через переход на API Resend
  • Провёл меня через настройку SSL
  • Провёл меня через настройку CORS
  • Затем, прежде чем мы углубились в процесс, он запустил сканирование ClamAV на всех файлах

Он работал в фоновом режиме почти неделю, время от времени в течение нескольких сессий. Это было увлекательное окно в прошлое, когда мы находили фотографии и детали о поездках и проектах.

Я также глубоко впечатлён тем, что есть люди, которые понимают, что это делает…

Разрешить Claude выполнить:

cat << 'RUBY' > /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"'<>\]]+/)
  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 && context.include?("upload://")
      dual_ref_count += 1
      post_has_dual = true
    else
      tapatalk_only_count += 1
      post_has_only = true
      tapatalk_only_files << 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:/tmp/ 2>/dev/null && echo "Uploaded"

Чрезвычайно впечатляюще.

В любом случае, я просто хотел поделиться, на случай если эта идея поможет кому-то ещё начать что-то интересное. Сделайте хорошую резервную копию и давайте начинать!

Счастливого Discourse-ния. :victory_hand:

13 лайков

Как администратор Discourse, я стал гораздо увереннее благодаря возможностям кодинговых агентов, подключённых напрямую через SSH! Удивительно, чего можно добиться с их помощью.