2013 год – Карты, деньги, два программиста
По темпам и объему проделанных работ, этот год опередил оба предыдущих. Было введено дополнение «Stygian Abyss» и начата работа над аддоном «High Seas» (которого, к тому моменту, не было нигде, кроме официальных серверов). Количество установленных апдейтов было выше, чем за оба первых года, вместе взятых.
Интересным моментом тут было то, что мы уже существенно опередили в своем развитии используемый нами эмулятор, и дергать что-то в плане кода оттуда стало уже невозможно. Самым интересным моментом стало заселение новых территорий мобами. Опишу как это происходило — включалась запись видео, я заходил на персонажа на официальном сервере, и проходил каждый тайл (клетку) шаг за шагом, обходя все доступные территории и локации. Проплывая, пробегая, выполняя квесты для доступа в закрытые части карты.
Так я бегал от агрессивных мобов днями напролет. Классический паровозик.
Где-то после недели каждодневных многочасовых забегов был создан пул видео, который использовался для заселения у нас на шарде. И если это кажется легким — то нет. На это ушло еще около недели от 5 часов в день. Сложность заключалась в том, чтобы правильно настраивать и выставлять спавны — площадь респавна так, чтобы мобы не вылезали за свои ареалы обитания, правильно подбирать мобов и их количество исходя из видео. Правильно определять, насколько они могут уйти от места возрождения и могут ли вообще, будут ли они реагировать группой на угрозу одному из них, или же нет. Как часто они будут появляться после своего убийства, и будет-ли вариативность мобов на спавне, когда каждый спавн выдает немного разные виды существ, миксуя их.
В дополнение к FAQ, о котором уже шла речь, для более комфортного вхождения в игру новых игроков, не знакомых с миром Ультимы, были отсняты видеоролики, показывающие все аспекты игры и обучающие базовым вещам. На момент публикации этого лонга, количество их просмотров находится примерно на уровне 45 тысяч. Попутно с публикацией роликов мы закрыли старую версию форума, по причине того, что она уже плохо справлялась с возросшей нагрузкой — эта часть сайта еще на момент 2010 года была архаизмом, и с ростом количества информации и размера баз данных все начало существенно тормозить. Конвертировав базы данных, нам удалось сменить движок форума без потери данных и зарегистрированных пользователей (никаких готовых скриптов для этого тогда не было).
Тут же надо добавить, что это был первый год, когда над дизайном портала работал отдельно нанятый дизайнер и верстальщик — это было достижением, потому что до сего момента я занимался всем сам, ибо лишних денег не было. Человек так же был из наших пользователей и работал дизайнером упаковок товаров массового потребления. Еще немного спустя я заказал разработку новой системы мониторинга, отображающую количество онлайна игры на сайте, и главное, она легко масштабировалась под любое количество серверов и работала с любыми играми (а на тот момент у нас уже появился сервер CS) . Помню, как сейчас, за это было отдано 100 долларов.
А мониторинг у нас появился потому, что онлайн начал переваливать за отметку в 150 человек, и потихоньку начали появляться иностранные игроки. Смешные цифры, казалось бы, но не для Ultima Online. И вместе с появлением мониторинга, появились и проблемы. Все больше стало заметно, что наш штатный найденный кодер воюет не в ту сторону временами, и проблем с качеством обновлений стало как-то подозрительно много. Я списывал это на то, что пока мы ставили те системы, которые у него уже были написаны и протестированы на его сервере — все было плюс-минус гладко. Когда нужно было писать самому, времени на отладку ему давалось мало, и возникали проблемы на лайв-сервере. Тон общения из более или менее дружеского, каким-то непонятным для меня образом, скатился в холодный и деловой. В чем было дело, я догадался случайно, когда во время разговора он упомянул, что знает парня, который сообщил об одной из ошибок под наше следующее обновление. Внезапно произошло озарение и до меня в полной мере дошло — а ведь человек держит и СВОЙ сервер.
Поспрашивав по игрокам, оказалось, что очень много людей стали мигрировать от него к нам, и за последние пару месяцев у нас оказалась чуть ли не половина его шарда. Речь конечно и в конечном итоге, шла о потере денег с его стороны, но ситуация, как оказалось, была несколько пикантнее. Как выяснилось позже, наш кодер на своем сервере не брезговал «рисовать» предметы за деньги богатым буратинам, и суммы там были весьма приличные. Были они приличные потому, что 40-летние бизнесмены жаждали убивать нищих школьников не на скилле, а деньгами, а админ сервера не скупился на прайс за свои услуги.
После этого состоялся разговор, в котором с моей стороны было объявлено, что как только всё, что уже было отдано в работу и за что уже были заплачены деньги будет закончено, каждый идет своей дорогой. С моей стороны это было прыжком в никуда, по нескольким причинам. Первая состояла в том, что сервер в момент своего стремительного роста оставался без программиста. Вторая заключалась в том, что дальше в сборку, с точки зрения кода, могут быть напиханы куча скрытых бекдоров и уязвимостей, которые приведут в итоге к тому, что сервер перестанет работать, или придется делать откаты на очень и очень большие сроки, если человек применит фантазию. С этого момента весь код проходил ревью отдельно. И видимо не зря, потому что, когда ех-кодер понял, что ловить тут нечего и надо было суетиться заранее, он начал очень настойчиво предлагать выдать ему роли выше плеерских, на том основании, что ему очень нравится смотреть за тем, как играют люди, и все, что он хочет — это просто летать в инвизе и наслаждаться подглядываниями, как заправской фетишист.
Начались поиски нового человека, способного писать код, и знакомого с используемым нами эмулятором. Опять же через игроков я вышел на человека, работающего над относительно известным, но ныне уже закрытым сервером Ультимы. Благодаря ему мы худо-бедно отработали оставшиеся два месяца в этом году, однако замена ему начала подбираться с первого же дня знакомства. Человек был игроманом, причем в терминальной стадии. Увлечением его был только покер, и ничего кроме.
Добавить к этому нечего, к сожалению.
Наши редкие разговоры по скайпу состояли в основном из того, что я пол часа слушал на заднем плане крики его жены, плачущего ребенка. Постоянно приходилось повторять свои просьбы по два раза потому, что он не мог оторваться от очередного турнира, и не понимал, что ему говорят. Оставляло тягостное впечатление, но деваться было некуда. Кодил, надо сказать, он весьма так себе, поэтому все ТЗ сводилось к исправлению совсем простых тикетов от наших игроков. Еще больше усугубляло положение то, что оплата у него была почасовая, и я прекрасно осознавал, на что в действительно уходят наши часы.
Год мы закончили с тем, что взяли красивую цифру в 20 тысяч учетных записей, и заодно, почувствовав весь груз ответственности переработали подход к резервированию и бэкапам. Теперь у нас был рейд-массив с двойным резервированием, бэкапы на два удаленных сервера, и хранилище копий и сборок на отдельном носителе вне сети. Вдобавок к этому — перенесли всю кодовую базу в систему контроля версий Subversion. Казалось — мы уже совсем взрослые и работаем серьезно, но начало следующего года показало, что в плане сетевой инфраструктуры нам еще очень далеко до серьезных проектов.
2014 год – Империя наносит ответный удар
В начале года наш коннект до сервера сказал — пуф, все! Плохо понимая, в чем проблема, я посмотрел загрузку канала, и понял, что его больше нет с нами. Все резервные бэкапы шли на вдс-ку в датацентре, но сам сервер физически все еще располагался просто в квартире, пусть и обложенный бесперебойниками и резервным каналом от другого провайдера. Это позволяло в обычные дни держать аптайм за 99.8% в год, но обычные дни закончились. Стало понятно, что идет DDoS.
По ту сторону экрана тем летним днем.
И раньше временами возникали атаки, но это было школьные досы с условно двух машин, которые легко рубились либо провайдером, либо настройками на стороне сервера, поэтому серьезных проблем они никогда не доставляли. Посмотрев еще раз на грустную загрузку канала в потолок, я на всякий случай позвонил провайдеру, который не менее грустно заявил, что айпишник придется блэкхолить, иначе у них ляжет железка, работающая на пол района. Что делать на тот момент понимал мало, поэтому связался с одним из наших постоянных игроков-айтишников имеющего много регалий, который по совместительству преподавал информатику в одном из ведущих институтов Самары, а также был одним из разработчиков ныне канувшего в лету дистрибутива фряхи FrenzyBSD (его имя есть и в Википедии). Поговорив с ним по телефону, и поняв, с чем я столкнулся, а также выслушав советы, стал понятен план действий. И в этом же разговоре был забавный момент, который остался в памяти — я рассказывал, как и что у меня настроено и работает, после чего состоялся примерно следующий диалог:
- А точно это работает так и так?
Я говорю — точно.
- А ну-ка сделай так и так.
Я делаю.
- Но ведь так не может работать, как ты это сделал?
- Я не знаю.
План действий, после некоторых попыток решить проблему самостоятельно свелся в итоге к поиску хостинга, предоставляющего защиту от атак. Надо сказать, что тогда существовало буквально полторы конторы, которые этим занимались, и в этих полутора в половине был четко обозначен отказ по размещению игровых серверов, а в остальной все стоило денег, рассчитанных под крупный бизнес или топовые сервера линейки, а не бичей с парой сотен человек. Потянуть это мы не могли, поэтому начался поиск разношерстных ребят из серой зоны. В основном тогда люди либо перепродавали услуги по защиты от Ddos-ов, проксируя трафик через французского хостера OVH, либо пользовались своим служебным положением, и в обход кассы проксировали через датаценрты, в которых работали.
На неделю мы приткнулись к первым ребятам, нас оттуда попросили из-за высокой нагрузки, и мы нашли вторых. Миниатюрная девушка из Питера, работница одного крупного ДЦ, разместила у себя на балконе несколько стоек забитых списанным железом с работы, закидав это шумоизоляцией и кондеями, провела два оптоволокна оттуда же, и продавала услуги хостинга и защиты через интернет. Мы переехали к ней на балкон. Еще неделю мы были с ней на постоянной связи, она же пребывала в режиме мемной горящий собаки, которая говорила, что все нормально. Однако наша история закончилась на том, что железка, которая фильтрует атаки скоро выйдет с балкона, и канал на 10 гигабит у нее из-за нас забит полностью, что создает проблемы для других клиентов. У нас же при этом были постоянные проблемы с подключением, и, по сути, сервер больше не работал, чем работал. Закончились наши взаимоотношения тем, что в какой-то момент без предупреждения она отключила нас. Хорошо, что у нас были бэкапы.
И хотя часть людей донатила прямо в оффлайн, поддерживая нас и говоря — мне вообще ничего не надо, но вот вам на решение проблем, денег осталось совсем мало. Ровно на попробовать еще один заход и найти спасение. Спасением стал окончательный переход во взрослую жизнь — потратив все и добавив из своего кармана мы купили свой первый стоечный сервер, и отвезли его в один из немногих на тот момент Tier 3 датацентров Москвы, который предоставлял защиту от атак.
Тот самый сервер с наклейкой колакейшена из того самого датацентра. А еще лицензионной наклейкой винды, которая была куплена на авито с рук у мутного типа. Сценка была один в один как закуп в радиомагазине из «Иван Васильевич меняет профессию».
Платили мы там порядка 10к рублей в месяц, но зато после нескольких недель очень нестабильной работы все наконец-то нормализовалось. Как позже сказали в ДЦ, на пиках нам прилетало более 15 гигабит в секунду UDP-флуда с десятков тысяч адресов, помимо еще отдельных атак на порт сервера. По состоянию на 10 лет назад — это было весьма прилично.
Одновременно с этим, смахивая пот со лба, шел поиск нормального кодера в команду. И снова один из игроков посоветовал обратиться к «хорошему парню» и поговорить. У него так же был свой сервер в настоящем и несколько в прошлом. Я грустно вздохнул после череды грабель, но делать было нечего, и я списался с ним. Разговор буквально начался так:
- Привет, мне дали твою аську. А еще я создал домен твоего сервера, но в. ru, и часть твоего трафика идет ко мне. В качестве знакомства, давай я поставлю переадресацию на тебя?
- Привет, о, я знаю тебя. А еще я слил БД твоего кривого магазина из прошлого века, и у меня есть почты твоих донатеров, давай в качестве знакомства я не буду спамить на них?
Сразу стало понятно, что нас ждет долгая мужская дружба, которая к слову, продолжается до сих пор.
Посмотрев наш код, он спросил следующее — а откуда у тебя эти куски? Я говорю — вот, работал с парнем. А ты знаешь, сколько людей он кинул? И что эти куски кода — тоже украдены? В общем, история прояснилась окончательно. По мимо рисовок на сервере у себя, наш прошлый парень так же разводил админов, получая доступ к кодовой базе, и продавал оттуда все, что можно продать. Бонусом — его ищут несколько людей у себя в городе, потому что их развели на деньги. Из плюсов этой истории — к нам перекочевала часть кода с сервера человека-легенды в комьюнити, который в соло в свое время сделал больше, чем все комьюнити всех эмуляторов на тот момент, насчитывающее несколько десятков тысяч человек, но чей сервер к моменту нашего старта уже был закрыт.
Минусом стало то, что, прошерстив по нашим пользователям и знакомым-знакомых, стало понятно, что атаки, которые к слову еще шли на тот момент, были организованы им, в отместку за упавший онлайн у него и то, что развести нас не успели. После чего произошла интересная ситуация, которая в итоге привела к закрытию все еще работающего сервера этого человека. Как-то, когда меня спрашивали, кто и за что нас досит, я сказал, что по тому, что удалось узнать, ситуация выглядит «вот так и так». Буквально вечером того же дня у парня упал сайт и сервер, еще через три дня он написал мне, и попросил прекратить досить его, а он «поможет с тем, чтобы атаки на нас закончились». На этом кровавые разборки вест и ист сайда прекратились, но мы выжили, а он нет.
Наконец-то настало затишье. Я с большим удовольствием тратил все наши деньги на нового кодера, а он с большим удовольствием вносил нововведения и правки. Отличительной особенностью стало то, что в коем-то веке, все, что попадало на сервер действительно тестировалось, и проблем на лайф-сервере было совсем мало. Плюс были приняты некоторые решения, из разряда «честных» — об удалении неактивных персонажей, с геймтаймом менее 15 минут, либо без заходов в игру в течении 3х месяцев (если геймтайм был больше). Это позволило держать цифры реальными, и не отображать фиктивную информацию, которая так активно «набивалась» у многих конкурентов. Введено ограничение на количество одновременно запущенных окон с одного IP, что также значительно повлияло на «фиктивность» онлайна в лучшую сторону. Минусом стало то, что после чистки одноразовых учеток, наши псевдо 20к учетных записей превратились в настоящие 10к.
Плюс к этому, мы ввели поддержку 3D клиента игры, на что ушло достаточно много времени. Не обошлось и без проблем, первую неделю сервер работал достаточно нестабильно, из-за закравшейся ошибки, связанной с обработкой подключений через этот клиент. Забегая вперед, скажу, что за годы его поддержка и работоспособность была доведена до состояния, которое не имеет аналогов ни на одном действующем или когда-либо работающем сервере, кроме непосредственно официального. Ортодоксальный подход — это игра на классическом 2D который и проповедуют все, но мы решили, что должен быть выбор.
Ну а год мы закончили на высокой ноте — зимой было проведено первое в истории российско-украинского (а может и в мире) комьюнити Ультимы Онлайн слияние двух крупных шардов от разных админов с разной аудиторией, с переносом и сохранением персонажей, игрового прогресса и имущества. Второй сервер принадлежал нашему новому кодеру, у которого на тот момент не было уже ни сил, ни времени поддерживать крупный и работающий сервер на плаву, и на должном уровне. Слиянию предшествовала долгая подготовка и переговоры на уровне администраций проектов, ведь все должно было пройти максимально гладко, как для переносимых игроков, так и для коренных жителей сервера. Была проделана очень большая работа, занявшая около месяца, учтены особенности и различия обеих площадок. Так, шард Heaven's Gate (loveuo) стал частью Inceptum.
2015 – Через тернии в «грин зону»
В середине января, спустя примерно месяц после объединения, фиксируется максимальный за все время среди всех российских и украинских серверов ненакрученный (рисованный) онлайн. Знаю я это потому, что за годы много раз беседовал с настоящими и бывшими админами, и прекрасно знаю, что реальный живой онлайн с тем, который указан на сайтах не имеет вообще ничего общего. Поэтому настоящий онлайн на многих серверах мне был известен из первых рук. Тем временем, счетчик онлайна более получаса держится на отметке в пол тысячи, часть сторонних сервисов по проверке онлайна фиксирует у себя результат в 516. Живой онлайн в это время показывает порядка 120 человек с оригинальными ip-адресами. Сервер держится в топ 3 мира среди всех остальных площадок ультимы.
С онлайном пришли и ошибки. Маунты превращающиеся в доски для крафта, дельфины, плавающие по суше, удаление всех вещей из банка персонажа, перчатки стирающие чара, турниры, превращающиеся из 1 на 1 в FFA из-за багов, смерти в сейф-зонах.
Скрин из лички Дискорда уже этого года, но он хорошо иллюстрирует тот иногда случающийся ад, который специально не придумаешь.
Но все это были ошибки с нашей стороны, которые как правило, появлялись сразу после крупных обновлений и устранялись в тот же день. А еще были ошибки, которые намеренно искали наши пользователи, и которые были весьма интересными в реализации и сложными для понимания и отслеживания с нашей стороны. Тут надо пояснить, что понять, как работает ошибка, и исправить ошибку — это разные вещи. Исправить баг можно даже без понимания того, откуда, как и почему он появился. Иногда без понимания — через костыли. И все будет работать нормально. Но я всегда был против такого подхода, и мы всегда разбирались, как, что и почему у нас происходило. Иногда на это уходили недели.
Вот лишь некоторые из них — однажды сервер упал со странной ошибкой, разобравшись в которой, стало понятно, что кто-то отправил специально сформированный пакет, который говорил задействовать 65-ое по счету заклинание из книги магии. Но их в игре и данной книге всего 64. Однако никаких проверок на то, что кто-то может попробовать применить, скажем 65, не было. Не было их потому, что никаким образом в игре этого сделать не получится. Поэтому сервер честно пытался обработать несуществующее заклинание и падал. А как-то раз мы не могли разобраться в том, каким образом у нас умирает несуществующий моб, что так же приводило к крашу сервера.
Лишь спустя продолжительное время в попытках отловить баг, ситуация прояснилась — данный моб с небольшим шансом умел псевдо-закапываться в землю. Делалось это через исчезновение моба, и его новый спавн в нужной точке. Но однажды совпало так, что игрок успел повесить дот яда на моба, и тот исчез, «закопавшись». Однако таймер яда никуда не исчез, и продолжал свой отсчет, итогом которого стала попытка убийства жука, которого к тому моменту уже не существовало. Еще случай — мы нашли игрока, который бегал по т.н. «грин зоне» области карты, которая является тестовой, игроки к ней доступа не имеют (обычно можно найти много всего интересного или сильно нажиться в зависимости от того, что там тестируют и размещают админы конкретных шардов). Однако наш — вполне себе имел. Дело было вот в чем — перед данным участком карты, по краям с одной из сторон, шел густой лес из деревьев, которые непроходимы для персонажей. Однако в игре есть заклинание телепортации, которое позволяет чару прыгать на небольшие расстояния в свободную зону, на которой он может поместиться.
Так вот, из-за допущенных разработчиками клиента игры ошибок, именно на том клочке леса и на очень редких деревьях можно было пролететь через просветы между деревьями с помощью телепортов и вставать на клетки, стоя чуть выше основания ствола. Спустя множество попыток, человек определил путь, финальным скачком по которому был прыжок за границы доступной простому игроку карты. Надо сказать, что до сих пор на 95% работающих серверов этот путь не закрыт. А у нас в его конце лежит книга, нажав на которую открывается браузер с этим видео
Только вместо контейнеров — елки.
А еще в какой-то момент, у нас сработал один из триггеров системы безопасности (вы помните про логи, да?) — в мире появился предмет, который продается ингейм со специальных камней-магазинов. Но проблема заключалась в том, что куплен он не был, тем не менее, он точно был с такого камня. Разобравшись в логах, мы нашли персонажа, которому эту удалось. Однако понять каким образом это было сделано мы до сих пор не могли, а человек был не дурак, и не спешил повторять свои подвиги. В итоге телепортировав его в тюрьму, и появившись перед ним, я начал грозно вопрошать — жизнь или бан? Человек, ничего не понимая ответил по-испански.
В конечном счете с помощью общения в скайпе и гугл-транслита, оказалось, что схема была следующей — человек предположил, что для данного камня было некое админ-меню, ведь как-то мы добавляем туда товары. Дальше он предположил, что, возможно перебрав все ID кнопок, которые гипотетически могли бы быть задействованы в меню и прожав на это айди мимо клиента игры (ведь физически оно не отображалось), ему удастся добиться какого-то эффекта в плане взаимодействия с камнем на уровне выше плеерского. Так вот, в чем заключалась ошибка — если меню было вызвано администратором, оно отображало кнопку для управления товарами ингейм. Если же меню было вызвано плеером, кнопки оно не отображало, но технически меню оставалось все тем же. Так вот, проверка на уровень прав у нас использовалась только на моменте отображения кнопки, но не на ее фактическое нажатие. И это было единственное такое меню, где мы похоже когда-то забыли добавить многоуровневую проверку, а испанец, судя по всему, перетыкал хитрым скриптом уже с сотню окошек, пока не дошел до момента, при котором его подход наконец-то сработал. Как вы, наверное, уже догадались — скриптом путем перебора айди кнопок, он прожал на отсутствующую для него кнопку управления данным типом вендоров, и открыл админ-панель, с которой легко мог взаимодействовать, ведь проверки именно на это не было.
Кроме онлайна, разумеется, пришли и лишние деньги. И, как и всегда — они шли в дело. Впервые полностью, а не кусками, были обновлены сайт и форум портала с полной сменой CMS (веб-движок портала и сайта) и версий всего на свете, от PHP до MySQL. Все было сделано с нуля, базы и аккаунты были конвертированы и перенесены. На этом моменте всё легаси, что у нас имелось, было снесено и заменено новыми современными решениями, по причине того, что количество костылей, заставляющих наши старые движки работать и взаимодействовать друг с другом уже превышало все немыслимые значения. Шаред хостинг был заменен выделенным железом. Плюс к этому был заказан и полностью переработан дизайн и цветовая гамма сайта, а протокол сменился на защищенный — появился «зеленый» замочек https. И надо сказать, работало все это очень хреново и медленно по сравнению с тем, что настраивалось и оптимизировалось на протяжении всех этих лет.
Люди спрашивали — как можно было сделать настолько плохо, что новый форум работает раз в 10 медленнее старого. Грустно осознавая, что все наши труды на которые был потрачен вагон денег и нервов, идут ко дну в потоке негативных отзывов о работе сайта, я вышел на одного очень известного человека в\на Украине, работающего на очень хорошей должности в айти, обладавшим всеми возможными мировыми сертификатами всех возможных уровней от всех возможных вендоров (и они у него действительно были). Запросив достаточно крупную сумму денег, он сказал — это все для детей, я сделал бы это за 5 минут еще в 80-х. После чего на протяжении часа рассказывал мне, насколько он хорош, и насколько нам повезло, что уделяет свой час за такую смешную сумму, и насколько глупо вообще обращаться с такими пустяками к таким мастодонтам как он. Следующие пол часа я слушал, над насколько серьезными проектами он работал, и какие серьезные задачи он решал у очень серьезных людей. Я честно терпел, хотя к тому моменту от количества высокомерия и несущественности разговора относительно конкретно моей проблемы уже начал потихоньку выходить из себя.
Категория «Мемы за 300» описывающая ситуацию.
В общем, как, наверное, вы уже поняли — по итогу он не сделал ничего, хотя пытался. Сказав что-то вроде — у вас ребята проблемы с производительностью железа, он пропал в тумане истории с моими деньгами и шлейфом пафоса. История же закончилась тем, что, взяв себя в руки, и открыв гугл, за несколько дней я самостоятельно решил все проблемы, оптимизировав наш centOS с сайтом до состояния, при котором все стало работать по скорости так же, как и некогда легаси-костыли.
И наконец, под конец года, понимая, что с резко возросшей нагрузкой глупо класть все яйца в одну корзину мы постарались добиться максимальной «распределенности» инфраструктуры проекта. Нужно было исключить узкие места, с которыми время от времени возникали проблемы, выбирая лучшие из доступных решений. До этого года мы размещались только в России. А зимой уже были «разбросаны» по России, США и Франции. В каждой из этих стран находится хотя бы одна часть, отвечающая за работоспособность проекта в целом — сервер, виртуальные машины, бэкапы, DNS-резолверы и иже с ним.
* Продолжение следует в третьей части.