Перейти к содержанию

Мануал

Сервер Lineage 2 на Ubuntu

Под Linux работает только эмулятор: оригинальные серверные файлы требуют Windows и Microsoft SQL Server, и обойти это нельзя. Так что всё ниже — про L2J.

Чем этот текст является и чем не является

Это карта местности, а не скрипт для копипасты. Готовых команд, которые можно вставить в терминал и получить работающий сервер, здесь нет — и ни у кого нет, потому что имена конфигов, ключей и сборочных целей у форков L2J расходятся. Ниже — порядок шагов, названия того, что придётся править, и места, где спотыкаются чаще всего. Конкретные команды берите из инструкции своего форка.

Что должно стоять на машине

  • JDK. Именно JDK, а не JRE: сборку из исходников без компилятора не сделать. Версия — по требованию вашего форка; угадывать здесь не нужно, в его инструкции она написана.
  • MariaDB или MySQL. Любая из двух. Создавать базу с кодировкой под юникод сразу — менять её на живом сервере с русскими именами персонажей больно.
  • Сборочный инструмент — Ant, Maven или Gradle, смотря какой форк.
  • Git. Чтобы брать код из репозитория, а не архивом по ссылке с форума. Почему это важно.
  • unzip и привычный вам редактор. Конфигов править придётся много и руками.

Порядок действий

  1. Отдельный системный пользователь под сервер. Не root. Сервер — процесс, который слушает порты из интернета, и запускать его с правами на всю машину незачем.
  2. Две схемы в базе и пользователь к ним. Одна под аккаунты логин-сервера, вторая под игровой мир. Пользователю дать права только на эти схемы.
  3. Клонировать ядро и датапак, собрать. На выходе получаются два каталога с готовыми к запуску логин-сервером и игровым сервером.
  4. Импортировать базу скриптом из комплекта. В датапаке для этого есть установщик; таблицы руками не создают.
  5. Прописать конфиги. Доступ к базе и адреса сервера — об этом ниже отдельно.
  6. Положить геодату. В комплект она не входит. Что это и откуда берётся.
  7. Открыть порты. 2106 для логин-сервера, 7777 для игрового. Порт базы снаружи не открывать вообще.
  8. Запустить логин-сервер, затем игровой. Первый запуск — в терминале, чтобы видеть лог целиком. В фон переводить потом, когда заработает.

Адреса: место, где ломается чаще всего

У L2J в конфигах логин-сервера и игрового сервера есть пара ключей вида ExternalHostname и InternalHostname — внешний адрес, который сервер сообщает клиентам, и внутренний, по которому его части находят друг друга. Имена ключей у форков могут отличаться, смысл — нет.

Как это ломается на практике:

  • В обоих полях локальный адрес. Сервер работает, вы заходите с той же машины, снаружи не заходит никто. Самая частая конфигурация у «сервера, который у меня работает, а у друга нет».
  • В обоих полях внешний адрес, а сервер за NAT. Зеркально: снаружи заходят, с самой машины — нет.
  • Адрес в конфиге правильный, а в клиенте — нет. У клиента свой файл настроек в каталоге system, и пока в нём стоит официальный адрес, игра идёт туда.

Проверять это удобно не изнутри: откройте порт 2106 любой внешней проверкой портов. Если снаружи он закрыт, дело в файрволе или в пробросе, а не в конфиге сервера.

screen против systemd

Почти все инструкции по L2J предлагают запускать сервер в screen, и для первого дня это нормально. Для сервера, на который ходят люди, — нет. У screen есть единственный, зато смертельный недостаток: он не поднимает упавший процесс и не запускает его после перезагрузки машины. Сервер падает ночью, и до утра его нет.

Правильный способ — unit-файл systemd на каждый из двух процессов, с автозапуском и перезапуском после падения. Игровой сервер должен подниматься после логин-сервера и после базы. Лог при этом уходит в журнал системы, откуда его удобнее читать, чем из прокрученного окна терминала.

Остальные грабли

  • Размер кучи Java. Задаётся в скрипте запуска игрового сервера. По умолчанию стоит значение, которого хватает на тест и не хватает на людный сервер: получите падение по нехватке памяти в самый неподходящий момент.
  • Лимит открытых файлов. Каждое подключение — файловый дескриптор. Системный лимит по умолчанию упирается раньше, чем кончаются ресурсы машины, и выглядит это как отказ новых подключений при живом сервере.
  • Своп. На VPS с небольшой памятью его часто нет вовсе. Игровой сервер, которому не хватило памяти, в этом случае просто убивается системой без объяснений.
  • Время на машине. Рассинхрон часов ломает всё, что считается по расписанию: осады, респаун эпических боссов, события. Ставьте синхронизацию времени сразу, это одна строка.
  • Бэкап базы. Не «когда появится время». Первая же неудачная правка таблицы предметов на живом сервере объяснит, почему.

Дальше по разделу