Уже в эту субботу в московском офисе Avito пройдёт чемпионат по PostgreSQL. Это соревнование по управлению базами данных с практическими задачами. Мы реализовали его на платформе, полностью собранной из опенсорс-компонентов. Протестировали уже на двух внутренних соревнованиях (получилось интересно), и теперь готовимся к тому, чтобы провести #PGHACK для всех желающих постгресменов (мы ещё принимаем заявки на участие, ссылка в конце текста). В этом посте я расскажу о том, как мы готовили платформу для чемпионата.
Коротко об игре
Подробно я рассказывал об игре в этом посте. Если говорить коротко, это как CTF, только про Postgres.
Как это работает?
Платформа собрана из опенсорсных компонентов, проверенных временем. Всё это я собирал и отлаживал сам, кроме настройки OpenVPN. Расскажу о составляющих подробнее.
Игровая сеть VPN
Для построения игровой сети используется Open VPN — решение довольно стандартное для таких задач. Никакого дополнительного ПО на ноутбуках игроков не требуется, так как к сети они будут подключаться с виртуальных машин с предустановленным VPN. Ключ от игровой сети (и все следующие задания) участники возьмут в таск трекере. Выполнение задач проверит чекер.
Таск-трекер
Пользователь авторизуется в игре с выданным ему логином и паролем, после этого он видит свой уникальный ключ к VPN для настройки виртуальной машины и трекер со списком задач, которые ему будет необходимо решить. Во время чемпионата включится лидерборд, на котором можно будет наблюдать за изменением количества очков у других участников.
Чекер
Чекер ходит по виртуальным машинам игроков и проверяет результаты — в принципе, так же, как на CTF. Под капотом у него Fabric, который изначально предназначен для параллельного выполнения задач на множестве серверов/компьютеров. Мы не стали делать новый компонент: Fabric обеспечивает максимально честный и действительно параллельный процесс проверки — это у него в крови.
Виртуальные машины
На виртуальных машинах, которые подключаются к VPN, установлены база данных и приложение. В них решаются задачи. Виртуальные машины собираются автоматически с помощью Packer от HashiCorp. Процесс провижна тоже автоматический. Для этого используется Ansible, поэтому виртуалку можно пересобирать любое количество раз. Правильность этого решения подтвердил процесс подготовки — мы полностью исключили рутинные операции и старались минимизировать изменения и уточнения.
Подготовка заданий
Часть заданий была придумана сразу, часть изменилась во время обсуждения и тестовых прогонов. Мы завели в Confluence табличку, в которую можно было добавить свою задачу и описать её решение. Было важно придумать задания с однозначными решениями. Проверка должна быть быстрой, простой и автоматической: иначе параллельно проверить 50-60 участников (на такое количество игроков рассчитывалась система) было бы проблематично. Какие-то задачи даже упрощали. В некоторых — отказывались от малораспространенных решений в пользу стандартных методов работы.
Изначально планировали, что заложим времени столько же, сколько на нормальный честный CTF — около 8 часов. Но поняли, что этого довольно много. В итоге #PGHACK будет длиться около 4 часов, не считая время на настройку окружения. Как показала практика, postgres-гроссмейстер может решить все задачи за 2 часа.
Подготовка игрового приложения
Первая версия сайта мини-Avito была сделана во время новогодних каникул на Flask. Она не имеет ничего общего с технологиями, которые используются на реальном сайте, но пытается быть на него похожей — это тоже доска объявлений.
В процессе работы из приложения был полностью выпилен ORM, и оно стало вызывать функции базы данных. Игровой dataset мы взяли у коллег-аналитиков, которые пару месяцев назад проводили свой конкурс. Это “живые” объявления с полностью убранными персональными данными. Весит около 4 Гб, поэтому мы не можем выполнять большие сложные запросы на виртуальных машинах. Проверки решений задач сделаны лёгкими и быстрыми.
Допущенные ошибки
На первом этапе подготовки мы планировали быть в тренде: собрать платформу из микросервисов на разных языках — Go, Python, PHP. Но мы от этого отказались: для участников разбираться в большом количестве непонятных микросервисов было бы сложно, и игра превратилась бы не в починку Postgres, а в ковыряние микросервисов — кто куда ходит, что делает.
Была еще одна трендовая мысль — использовать Docker. Отказались, т.к. поняли, что большинство DBA не готовы к его применению: они работают с другими системами и в других плоскостях. Пришли к классической виртуалке, как и в большинстве CTF.
На бою выяснили, что чекер должен быть серверным. Изначально он ходил по SSH на игровую виртуалку и выполнял команды на её стороне. На первой тестовой игре мы выяснили, что те наши ребята, у которых была хорошая база знаний по Linux, отлавливали эти команды и могли бы обмануть чекер. Поэтому он стал серверным, и большая часть проверок перенеслась туда.
Список open-source компонентов платформы PGHACK
Packer — https://www.packer.io
Ansible — https://www.ansible.com
VirtualBox — https://www.virtualbox.org
OpenVPN — https://openvpn.net
Fabric — http://www.fabfile.org
Flask — http://flask.pocoo.org
и, конечно же, PostgreSQL — https://www.postgresql.org!
Что потом
Мы не планируем останавливаться только лишь на проведении одного чемпионата #PGHACK. Хочется, чтобы это стало регулярным мероприятием для postgres-комьюнити. Поэтому подробного разбора задач не будет.
После мероприятия появится фотоотчет на нашей странице в FB. Кстати, регистрация на чемпионат ещё открыта: заполняйте заявку до вечера 31 августа и участвуйте в #PGHACK!
Автор: pkorobeinikov