Как прокачать Minecraft сервер с помощью Angie
Давненько мы с ребятами технарями открыли свой minecraft сервер, чисто почилить и разгрузить мозги. Без донатов и монетизации. Ведь когда копаешь или что-то создаешь, невольно отвлекаешься от рутины и морально отдыхаешь.
Всё это дело у нас работало в рамках — self-hosting на Raspberry pi 5 (SSD Hat + 8 RAM).
ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ ЧИТАТЬ ПЕРВЫМ В MAX
Время шло, количество игроков в онлайне подрастало, домашнего аптайма не хватало (то свет выключат, то малина выпендривается, то по ресурсам в полку уходим). В общем было принято решение, взять нормальный железный сервак в дата-центре и перенести всё туда.
Далеко идти было не нужно, обратились к спецам за консультацией. По итогу спецы посоветовали выбрать готовую сборку в рамках услуги «Выделенные сервера». Так и сделали.
Выбор пал на bare-metal, на него была хорошая скидка и по начинке нам его полностью хватало, i7, 2x2TB диска, 32 RAM, гигабитная сетка. И по цене всего 4800р в месяц. Не сервер, а конфета за такие деньги!
Сервер нам подключили и предоставили в течение часа, а еще через час весь наш minecraft инстанс успешно был мигрирован на новое железо. Диски же сконфигуряли в зеркальный рейд, чтобы было понадежнее.
Сразу стало как-то посвободнее, графики по нагрузкам выровнялись, запас по ресурсам имелся неплохой, онлайн 100 и выше игроков тащило спокойно, без лагов и багов.
Тут и сказочке конец, но нет! В какой-то момент мы начали испытывать проблемы с набегом игроков и ботов из недружественных стран.
Возвращаться на cloudflare и фильтровать чудаков по стране — не вариант (мы давно с него съехали), подключать что-то местное — дорого.
Тем более проект не приносил никаких денег, все в рамках энтузиазма админов, которые всё оплачивали из своего кармана.
Но мыж инженеры! Как говорится — а что если?
Взяли и разом прикрыли лавочку. Нет, мы не ввели whitelist, мы сделали намного хитрее. Мы сделали связку из Angie → Minecraft, и уже средствами Angie отфильтровывали злодеев. Связка получилась ТОПовая.
Реализация
Angie был вынесен на отдельную, небольшую виртуальную машину и через модуль stream уже делал proxy_pass на нашу железяку.
То есть айпи адрес балансировщика был привязан к домену. А айпишник bare-metal вообще нигде не фигурировал и не торчал в интернет привлекая всякие Shodan и т.п. сканера.
Почему был выбран Angie а не Nginx? Потому что в Nginx из коробки нет модуля stream, а собирать его – фу! А в angie все эти модули есть, выбирай и ставь одной командой.
Ну и тем более Angie более гибкий, установил его и сразу работаешь. А не как с Linux, установил и потом еще 6 месяцев напильником обтачиваешь. Мы ценим своё время и у нас есть выбор.
А вот и сам конфиг angie:
/etc/angie/streams-enabled/minecraft.conf
stream {
####################################################
# 1. GeoIP база
####################################################
geoip2 /etc/angie/geoip/GeoLite2-Country.mmdb {
$geoip2_country_code default=ZZ source=$remote_addr country iso_code;
}
####################################################
# 2. Разрешённые страны (оставь свои)
####################################################
map $geoip2_country_code $allow_country {
default 0;
RU 1;
KZ 1;
}
####################################################
# 3. Лимиты соединений
####################################################
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 3; # максимум 3 коннекта с одного IP
####################################################
# 4. Upstream до Minecraft (Paper)
####################################################
upstream mc_backend {
server xxx.xxx.xxx.xxx:25565;
}
####################################################
# 5. Основной сервер
####################################################
server {
listen 0.0.0.0:25565 proxy_protocol;
server_name: mc.bashdays.ru;
proxy_pass mc_backend;
proxy_protocol on;
# Отключаем нежелательные страны
if ($allow_country = 0) {
return 444;
}
# Ограничение скорости
proxy_download_rate 10m;
proxy_upload_rate 512k;
# Таймауты
proxy_connect_timeout 10s;
proxy_timeout 3600s;
# Логирование
access_log /var/log/angie/minecraft_access.log;
error_log /var/log/angie/minecraft_error.log;
}
}
Я его прокомментировал, чтобы каждый блок отдельно не описывать.
Базу данных от MixMind нужно установить отдельно:
mkdir -p /etc/angie/geoip
wget https://git.io/GeoLite2-Country.mmdb -O /etc/angie/geoip/GeoLite2-Country.mmdb
Да, важно! Чтобы minecraft сервер видел настоящие IP адреса игроков, а не IP адрес балансировщика, в конфиге minecraft сервера нужно прописать:
config/paper-global.yml
proxies:
proxy-protocol: true
На этом теперь точно всё. Злодеев гибко фильтруем по странам (без включения whitelist на самом minecraft сервере и модов), всегда есть возможность быстренько накидать кастомный LUA скрипт под ситуацию. Получилось очень даже хорошо!
Пищу для размышлений я тебе подкинул, нестандартные решения показал. Ну а дальше все зависит от твоей фантазии, как воспользоваться этой информаций.
PS: Да, можешь прикрутить SSL и шифровать трафик между Angie и клиентами (пользователями) игрового сервера, но предварительно нужно собрать кастомный клиент под это. Это всё возможно, было бы желание.
Если делать нечего, можешь покопать, сервер доступен по адресу: mc.bashdays.ru, версия: 1.21.8