Мануал
Сервер Lineage 2 на Ubuntu
Под Linux работает только эмулятор: оригинальные серверные файлы требуют Windows и Microsoft SQL Server, и обойти это нельзя. Так что всё ниже — про L2J.
Чем этот текст является и чем не является
Это карта местности, а не скрипт для копипасты. Готовых команд, которые можно вставить в терминал и получить работающий сервер, здесь нет — и ни у кого нет, потому что имена конфигов, ключей и сборочных целей у форков L2J расходятся. Ниже — порядок шагов, названия того, что придётся править, и места, где спотыкаются чаще всего. Конкретные команды берите из инструкции своего форка.
Что должно стоять на машине
- JDK. Именно JDK, а не JRE: сборку из исходников без компилятора не сделать. Версия — по требованию вашего форка; угадывать здесь не нужно, в его инструкции она написана.
- MariaDB или MySQL. Любая из двух. Создавать базу с кодировкой под юникод сразу — менять её на живом сервере с русскими именами персонажей больно.
- Сборочный инструмент — Ant, Maven или Gradle, смотря какой форк.
- Git. Чтобы брать код из репозитория, а не архивом по ссылке с форума. Почему это важно.
- unzip и привычный вам редактор. Конфигов править придётся много и руками.
Порядок действий
- Отдельный системный пользователь под сервер. Не root. Сервер — процесс, который слушает порты из интернета, и запускать его с правами на всю машину незачем.
- Две схемы в базе и пользователь к ним. Одна под аккаунты логин-сервера, вторая под игровой мир. Пользователю дать права только на эти схемы.
- Клонировать ядро и датапак, собрать. На выходе получаются два каталога с готовыми к запуску логин-сервером и игровым сервером.
- Импортировать базу скриптом из комплекта. В датапаке для этого есть установщик; таблицы руками не создают.
- Прописать конфиги. Доступ к базе и адреса сервера — об этом ниже отдельно.
- Положить геодату. В комплект она не входит. Что это и откуда берётся.
- Открыть порты.
2106для логин-сервера,7777для игрового. Порт базы снаружи не открывать вообще. - Запустить логин-сервер, затем игровой. Первый запуск — в терминале, чтобы видеть лог целиком. В фон переводить потом, когда заработает.
Адреса: место, где ломается чаще всего
У L2J в конфигах логин-сервера и игрового сервера есть пара ключей вида
ExternalHostname и InternalHostname — внешний адрес, который сервер
сообщает клиентам, и внутренний, по которому его части находят друг друга. Имена ключей у
форков могут отличаться, смысл — нет.
Как это ломается на практике:
- В обоих полях локальный адрес. Сервер работает, вы заходите с той же машины, снаружи не заходит никто. Самая частая конфигурация у «сервера, который у меня работает, а у друга нет».
- В обоих полях внешний адрес, а сервер за NAT. Зеркально: снаружи заходят, с самой машины — нет.
- Адрес в конфиге правильный, а в клиенте — нет. У клиента свой файл настроек
в каталоге
system, и пока в нём стоит официальный адрес, игра идёт туда.
Проверять это удобно не изнутри: откройте порт 2106 любой внешней проверкой портов.
Если снаружи он закрыт, дело в файрволе или в пробросе, а не в конфиге сервера.
screen против systemd
Почти все инструкции по L2J предлагают запускать сервер в screen, и для первого
дня это нормально. Для сервера, на который ходят люди, — нет. У screen есть
единственный, зато смертельный недостаток: он не поднимает упавший процесс и не запускает его
после перезагрузки машины. Сервер падает ночью, и до утра его нет.
Правильный способ — unit-файл systemd на каждый из двух процессов, с автозапуском и перезапуском после падения. Игровой сервер должен подниматься после логин-сервера и после базы. Лог при этом уходит в журнал системы, откуда его удобнее читать, чем из прокрученного окна терминала.
Остальные грабли
- Размер кучи Java. Задаётся в скрипте запуска игрового сервера. По умолчанию стоит значение, которого хватает на тест и не хватает на людный сервер: получите падение по нехватке памяти в самый неподходящий момент.
- Лимит открытых файлов. Каждое подключение — файловый дескриптор. Системный лимит по умолчанию упирается раньше, чем кончаются ресурсы машины, и выглядит это как отказ новых подключений при живом сервере.
- Своп. На VPS с небольшой памятью его часто нет вовсе. Игровой сервер, которому не хватило памяти, в этом случае просто убивается системой без объяснений.
- Время на машине. Рассинхрон часов ломает всё, что считается по расписанию: осады, респаун эпических боссов, события. Ставьте синхронизацию времени сразу, это одна строка.
- Бэкап базы. Не «когда появится время». Первая же неудачная правка таблицы предметов на живом сервере объяснит, почему.