Dronov.net

World of Warcraft (CMaNGOS) в k8s. Ностальгия, мотивация, планы

Вступление

Всем привет.

Я обожаю линуксы, контейнеры и то, что их можно запускать как угодно и где угодно: на новых серверах, на относительно старых серверах, на встраиваемых железках и вообще на чём угодно с линуксом >3.10 версии. Так уж вышло, что в юности мне очень нравилось "красноглазить" не только в консоли, но и в World of Warcraft. Это в целом неплохо ложилось на концепцию тогдашнего "красноглазия": если ты не решил проблему, просто ты ещё потратил слишком мало времени (по-другому это "биться головой об стенку"). Ровно по такому же алгоритму я собирал цветочки и фармил кожу с кабанчиков в Дуротаре.

К сожалению, что WoW , что запуска контейнеров где угодно, в жизни стало довольно мало. Я вообще не думал, что запуск вовки в кубе может быть настолько интересным, что я решу поделиться этим. Но оказалось, что это классный способ совместить приятное с полезным. Позапускать контейнеры, поиграть через них в вовку, ну и в целом похакатонить (не участвовал в хакатонах с начала ковида).

Для начала, краткий экскурс в историю.

Если вам в середине двухтысячных довелось застать релиз World of Warcraft (23 ноября 2024 года), то мне не надо вам рассказывать, какой фурор она произвела на MMORPG. Если же вы это не застали, то эффект от релиза был сравним с выходом Witcher 3.

Понятное дело, что поиграть долгое время можно было исключительно на серверах Blizzard за определённую плату в виде подписки (что для подростков в средней черте России могло вызвать проблемы). Примерно до конца 2005 года массово всё плюс-минус так и происходило. Однако желание людей попробовать WoW было настолько непреодолимым, что появились эмуляторы World of Warcraft (читай – отдельная реализация сервера WoW, не имеющая ничего общего с проектом Blizzard). Клиент игры распространялся свободно и на него на тот момент Blizzard антипиратских санкций не накладывала, поэтому это был рай для реверс-инжиниринга.

В конце 2005 года появился проект MaNGOS https://www.getmangos.eu/, Full-Featured, Free, Massive Network Game Object Server Suite. Сам MaNGOS так или иначе был основан на слитых исходниках эмулятора WoWD и потраченном времени на реверс-инжиниринг работы клиента и сервера. https://www.getmangos.eu/forums/topic/9974-how-did-the-dev-team-do-it/ Проект стал настолько популярен, что довольно быстро распространился в Интернете и докатился до энтузиастов. Некоторые серверы хостились в колокейшенах у провайдеров. Началась золотая пора приватных серверов и постепенное угасание интереса к классическому WoW на фоне релиза легендарного Wraith of the Lich King.

Интерес к классическому WoW стабильной версии 1.12.1 как-то массово вернулся после новых релизов WoW, следующих за WoTLK. Скажем так, нововведения новых версий нравились далеко не всем. Появилось большое количество приватных серверов без донатов, квесты худо-бедно, но работали полностью, комьюнити стало настолько разнообразным, что граница между людьми в разных странах вообще стёрлась.

В 2016 году в MaNGOS случился какой-то разлад и один из главных разработчиков опубликовал исходники на гитхабе (да, до этого момента тебе поставлялся mangosd.exe, realmd.exe или бинари для линукса, плюс схема и миграции базы данных). https://forum.nostalrius.org/viewtopic.php?f=76&t=43524 Большая часть разработчиков оригинального MaNGOS покинула команду и сделала свой открытый форк под названием CMaNGOS (Continued MaNGOS https://github.com/cmangos). Именно его я и буду запускать в k8s.

В этом году исполняется 20 лет с первого релиза World of Warcraft. Это будет большой материал, разбитый на несколько частей: делать сухой набор копипаст мне не интересно, но описать за один раз сразу и всё у меня вряд-ли получится. Результаты работы есть в гитхаб-репозитории, как говорится Work In Progress https://github.com/dronov/cmangos-k8s Readme и прочее будет позже, когда я завершу статьи. С одного захода написать весь текст всего процесса у меня не получилось. Надеюсь, вам понравится :)

Ностальгия

У многих в детстве (отрочестве) бывают несколько вещей, которые влезают в подкорку головного мозга и сопровождают его всю жизнь. Время летит, мы взрослеем, меняются увлечения, случаются взлеты и падения — но они всегда с нами. Если не прямо на пульсе, то на расстоянии вытянутой руки.

У меня этих вещей было две: Linux и Warcraft. Не могу сказать, чего именно в то время было больше: консоли OpenSuse 10.2 с проблемными драйверами Nvidia или часов, проведенных в Азероте (и не только, начиная с Warcraft 3, плавно перетекшим в World of Warcraft ). В какой-то момент эти вещи совместились. WoW 1.12.1 году в 2008 неплохо запускался через Wine, что позволяло совмещать приятное с полезным (тут я делаю эдакий реверанс в сторону эникейства).

Что Linux, что WoW для меня были не только компьютерными абстракциями, но и сильным социальным явлением. С друзьями мы не только организовывали встречи локальной Linux User Group, но и бегали по Азероту, Запределью и посещали короля Лича (на чём моq опыт дополнений для вов и закончился). Линуксовки и гильд встречи были не только в родном городе, но и в Москве, что казалось явлением экстранеординарным. В университете какое-то время только ленивый не хвалился нагринженым петом к 60-70 уровню.

Стоит ли говорить, что и Линукс и игра на приватных частных серверах где-то были бок о бок с юношеским представлением о распространении софта. Каюсь, я никогда не играл на официальном сервере. Как WoW ощущается у Blizzard я не имею ни малейшего понятия, кроме видео и отзывов людей. Плюс, так уж совпало, что админы первых локальных серверов WoW капитально ничем от меня не отличались, ну кроме популярной фряхи на то время. Такие же пацаны из двора, кому интересно поковырять юниксы, да поиграть в вовку. Познакомился я с ребятами-админами серверов много позже. Отдельное удовольствие было заниматься таким делом в небольшом городке, где тебя могли найти без особых трудов и попросить слегка прокачать своего чара в обмен на пару шашлыков в шашлычке (люди были интеллигентные и сразу лицо не били).

Выглядело это всё примерно вот так. Я прошу прощения за удивительное качество скриншотов, но они откуда-то из 2009 года:

Были и сходки гильдий, кто-то в кого-то влюблялся. Романтика!

Время шло. Линуксы стали лучше и понятнее, WoW тоже. Дополнение Burning Crusade мною было встречено позитивно: было интересно полетать по Запределью. Но всё равно основные движухи на сервере были в Азороте. Странгленторн… сколько часов было потрачено на ганках малышей. Волтк я уже не понял до конца. На мой взгляд нововведений было настолько много, что вов уже отличался от оригинала. Понимаю, что это дополнение было максимально популярно и пиратки активны до сих пор. Но как-то это было не для меня и я вернулся на приватки ванилы. Там всё было как когда-то недавно (а сейчас это недавно уже давно) - знакомо и комфортно. Да, можно сказать, что я вернулся в свою зону комфорта.

Мотивация и планы

В какой-то момент я начитался книжек про форекс и решил применить полученные знания в WoW. Появился классный мод auctioneer, с помощью которого можно было спарсить все товары с аукциона и сохранить их в mysql. Оставалось делом техники собрать эти данные в кучку, проанализировать и понять, в какой момент какие доступные твоему чару товары продавать. Я специализировался на сборе кожи и травки для продажи тем, кто хочет крафтить итемы. В какой-то момент (после 50 лвла) я перестал собирать кожу и траву самостоятельно, а просто скупал это всё в определённые дни по низкой цене, а продавал по вечерам пятниц, суббот и воскресений по цене дороже, чем покупал. Код писал на php: ничего другого простонародного в моем линуксе тогда не было, а до переноса удобоговаримого c# и mono на линуксы ещё было далеко.

Запускалось это всё на первом компьютере с конфигурацией примерно такой: AMD Athlon 2500, 128mb ram, 80gb ssd. Как сейчас помню, что после череды дистрибутивов OpenSuse и Ubuntu на компьютере воцарил Arch и больше личный дистрибутив не менялся. Такой вот личный колокейшн. Стоит ли говорить, что никаких docker (jail), k8s и прочих благ цивилизации тогда (2007-2010) у меня не было. Просто база данных, просто php, просто cron. Задатки девопса у меня были с юных лет, сами понимаете!

В какой-то момент задатки девопса (не уверен, что тогда такое понятие было) привели меня к ребятам, кто запускал русскоязычный приватный сервер Valkyrie WoW. Пообщавшись, ребята взяли меня к себе в команду и я начал заниматься чем-то вроде оптимизации таблиц базы данных. К сожалению, эта история ничем не кончилась. Насколько помню, в какой-то момент пришлось немного пропасть с радаров толи из-за сессии, толи работу менял, толи из-за чего-то ещё. Кипели страсти, сервер жил. Хоть и в самих чатах я общался, но доступ к инфраструктуре пропал. Хотя, телефонные номера некоторых ребят я сохранил и иногда вижу знакомые аватарки в новых контактах в телеграме. Мне, на самом деле, довольно стыдно за этот поступок. Было интересно, а могло бы быть ещё интереснее.

Года с 2010, после того как я перестал следить за новыми (после лича) обновлениями игры, я перебрался на частные серверы wow vanillla. Сначала на русскоязычные, а позже и на иностранные (чуваки на ru приватных серверах стали чаще кидать хилящего приста на шмот в данжах). Онлайн был у них даже до 2000 человек, что казалось немыслимым. Играть стал в основном за приста (тебя всегда берут в данжах) и wow из некоего инструмента социализации медленно, но верно превращалась для меня всё сильнее и сильнее в игру соло.

Короче, было круто. Движуха мне нравилась всегда, даже когда онлайна вокруг меня было очень мало. Я любил вселенную варкрафт в целом: это была моя первая игра (я про третью часть reign of chaos) и было прикольно следить за тем, что с ней происходит в будущем. Времена менялись, серверы менялись, менялись события. Но вовка как и линукс были, в общем-то, единственными вещами на моих компьютерах, которые не только остались приятными воспоминаниями, но и вылились в нечто прикладное, на долгое время поменяв как и моё мышление, так и образ жизни.

В какой-то момент я стал просто играть на любом частном сервачке андедом каждые новогодние каникулы. Никто из знакомых, с кем раньше я играл, больше в вовку не играл. Даже не вспомню, в какой момент это произошло. Просто бац, и всё. В какой-то момент, от нечего делать, я вспомнил про mangos и решил поинтересоваться, во что же в итоге превратилась игра, которая когда-то давала мне кучу положительных эмоций.

Несколько вечеров за гуглом и уже играю на своём сервере. Нагуглить небольшую инструкцию по запуску cmangos c мускулом было несложно. Не рокетсаенс. Парочка запросов в гугл. Это не какой-то прям рокетсаенс уровня запуска спутника на орбиту земли с помощью тетрадки матанализа. Естественно на просторах гитхаба нашёлся кто-то, кто запустил cmangos в докере и заботливо подготовил docker-compose.yml https://github.com/jrtashjian/cmangos-docker C этих наработок я и начал работу.

Но дальше было интереснее.

Так получилось, что ежедневной работы с k8s у меня не так уж и много. Поэтому в сложившихся условиях я решил подумать над тем, что многие называют "пет-прожектом" и вдохновлённо рассказывают всем вокруг (даже если об этом никто не просит). Хорошая идея, подумал я. Тоже буду рассказывать об этом :) Руку набивать на чём-то надо. Но и банально на собеседовании будет о чём поговорить.

Запихнуть wow в k8s мне придумалось не сразу. Тут, на самом деле, довольно шкурный интерес был в самом начале. Так как (простите за повторение) каждый день k8s я не тыкаю, я вообще сначала думал в качестве факультатива поиграться рамках запуска условного бложика на вордпрессе или ещё чего-то такого. Но, глядя на знакомых DevOps и SRE-инженеров, мне показалось это что-то скучным. Слишком скучным. Ну, запустить вордпресс в кубере несложно. Не такой уж и рокет саенс. Мне же хотелось от этого процесса не сколько получить какой-то осязаемый результат вида чего-то такого, что можно сразу брать и использовать где-то, а скорее получить такой опыт, который в текущих условиях я не получу. Хотелось чего-то такого, чего и поизучать вдоволь можно, и знания эти не запылятся прямо сразу, да и сами штуки прикольные. В общем, я думал.

Думал столько, пока я случайно не вспомнил про cmangos. Далее всё было как в тумане. Несколько подходов к k8s, достаточно приличное количество вечеров в любимой консоли и вот я уже снова играю на пустом сервере. Всё бы ничего, но под ложечкой появилось ощущение, что всё равно что-то не то.

И тут меня осенило. Если у меня нет практики продакшена в k8s каждый день, да и сам CManGOS вряд-ли уже для меня станет действительно продакшеном (я уже молчу, что если попаду под внимание Blizzard всю мою лавочку быстренько прикроют), то почему бы не хотя бы в каком-нибудь виде не запроектировать этот сетап так, как будто ещё чуть-чуть и завтра мы идём в продакшен менять индустрию приватных серверов WoW Vanilla?

И ровно с этого момента я точно понял, что мне надо делать. Конечно, идея WoW Vanilla в k8s звучит странно. В основном, ещё когда я показывал друзьям фотки того, как WoW крутится в кубе на ноутбуке и я в игру играю с дестктопа, я получал веселую реакцию типа "ваау, ну ты ваще". Многим действительно непонятно, зачем я потратил приличное (да, как мне кажется) количество времени на то, что вряд-ли кем-то серьёзно будет использоваться.

Но это и не надо, чтобы прям действительно пользовалось в том виде, что есть. Цель у моего материала не та, чтобы кто-то взял копипасту консольных команд и запустил где-то у себя кластерок с сервачком. Не такая уж и проблема такое провернуть, на самом деле.

Цель - не только сделать сухую и мало кому интересную портянку из копипаст команд терминала. Цель - сделать добротный анализ имеющихся сервисов и вообразить, а что нужно сделать на основе имеющихся материалов, чтобы стать лучше всех среди приватных серверов. Так сказать, Смертокрылом индустрии. Считай, задрот сегодня - СТО завтра. Прям буквально. Не хватает чего-то важного в инфраструктуре и сервисах - помечаем, чего именно не хватает и как можно исправить (в идеале, с большим бюджетом и без).

Я видел команды, где сложно было договориться как об подходах к построению инфраструктуры, так и банально о взаимодействию между собой. Как и многие, не всегда получается действительно качественно повлиять на процесс так, чтобы никогда не делать фигни. Все мы неидеальны, времени всегда нет. Но в какой-то момент, запуская в очередной раз кластер и клиент игры, я подумал: а как бы я сделал, чтоб всё было заебись? Онлайн 99.99999%? Борьба с нагрузкой, отсутствие дисконнектов, патчи cmangos, деплой, алертинг, мониторинг и реагирование на инциденты? Ровно с этого момента я и понял, зачем я запустил wow в кубе и долго над этим медитировал.

В итоге, нафига это всё?

Ну, а почему бы и нет?

Дисклеймер:

Часть модных вещей для k8s, которые многие используют, может отстуствовать в целевом описании проекта. Я прошу понять меня и простить, а ещё лучше - написать, что можно улучшить, в комментарии. Я обязательно сделаю ревью и внесу дополнения в соответствующие места статьи. Интересно сделать не сколько статичный материал, а динамически развивающийся кусок тайного знания, который сможет многим помочь делать системы вокруг себя лучше. Тем более, что большинство вещей из статьи (как минимум Linux и WoW) не у одного у меня занимают последнее место в сердечке :)

Что будем делать?

Всё просто.

Для начала, мы рассмотрим то, из чего родился современный cmangos. В интернете, конечно же, полно материалов. Но я считаю, что для полноты контекста для начала неплохо было бы понять, а как так вышло, что сейчас для запуска сервера необходима лишь бд, кучка ассетов да непосредственно код сервера. На какую-то последнюю инстанцию в данном вопросе претендовать не могу: код cmangos не писал. Но какую-то усреднёную картину дать смогу.

Далее мы запустим игровой сервер у себя на компьютере. Конечно, как наши предшественники, вручную мы это делать не будем. Мы не будем ни бороться с зависимостями, ни подбирать удачную комбинацию библиотек. Ничего такого мы делать не будем. Мы рассмотрим архитектуру проекта современного cmangos как в целом, так и о некоторых реализациях работы онлайн игры. Потом всё это мы запустим в docker-compose у себя на ноутбуке (ссылки на код и авторов обязательно вставлю)

После этого начнется первый этап становления нами СТО. Мы будем делать MVP. У нас нет команды, нет инфраструктуры, да вообще особо ничего нет. Есть только интернет, ноутбук и жгучее желание покрасноглазить. Тут-то мы и подойдём к кубернетесу вплотную. MVP мы будем стараться делать такой, чтобы в любой момент взять и перенести конфигурацию кластера куда-нибудь в другое место: будь то облако или какой-либо онпремис система виртуализации. У меня есть небольшая домашняя лаборатория с Proxmox. Сначала разольём серверы Terraform'ом. Потом возьмем в руки kubespray и начнем разливать кластер кубернетеса. Тут же я буду описывать все грабли которые я наловил. Просто для того, чтобы они остались и никто не натыкался на них также как и я.

Конечным результатом MVP будет возможность поиграть в вовку с друганами через интернет или в локальной сети у себя дома (если, конечно, у вас есть друганы с кем поиграть). Никаких отдельных наворотов здесь не будет, иначе эта статья могла бы и не выйти. Тем не менее, я ожидаю эту часть статьи наиболее технически наполненной. Результатов работы будет несколько, ровно таких, которые были у меня: один вариант творческий "как есть" и топорный, второй уже будет более причесанный.

А вот далее мы начнем воображать себя CТO. Допустим, мы получили инвестиции и желание стать первым приватным серверов вов ванилла в мире. Теперь-то мы окинем наши труды критическим взглядом. Для начала мы вспомним, как можно делать дела хорошо. Потом мы этим свежим взглядом посмотрим на те сервисы, что у нас есть и составим технический список, что необходимо улучшить (и его приоретизируем). Мы постараемся заняться системным дизайном и подумать об узких местах нашего сетапа и попробуем предвосхитить их. Попробуем подключить cmangos к кластеру MySQL и пособираем немного граблей. Попишем немного helm-чартов. После списка улучшений мы попробуем составить роадмап, по которому в идеале надо двигаться, и основываясь на нём мы попробуем составить команду мечты, которая сделает это вместе с нами. Повторюсь, ваши комментарии я буду читать и стараться оперативно добавлять интересные и полезные идеи в статью.

И да. Я здесь рассматриваю только проект со стороны инфраструктуры. Мы не будем делать никаких дополнений к вовке или вклиниваться в логику работы сервера, придумывая очередной хардмод из дьяблы. Мы просто возьмём существующие исходники и геймплей и старнанём с них.

Финал нашей работы будет не только роадмап, когда же мы станем Алекстразой онлайн-гейминга, но и сколько примерно это может стоить. Примерно, конечно же. Ясное дело, что k8s тут лишь инструмент, и что в реальной жизни вряд-ли кто-то стал его использовать для запуска какого-то легаси опенсорса, да ещё который и переделывать надо для удобоваримого использования. Для меня это будет достаточно интересный, на мой взгляд, опыт замоделировать всё и сразу. Надеюсь, вам он тоже будет интересен.