Перейти к содержимому

Свой сервер

Если сервер не работает

Всё, что сервер может сказать, он пишет в консоль и в logs/server.log. Начните с лога.

Если сервер не может запуститься, он объясняет почему, пишет Closing in 10 seconds и завершается с кодом 1. Служба systemd видит это как сбой, а не как обычную остановку.

Сообщение Что случилось Что сделать
Cannot listen on port … (…): the port is already in use (…). … Порт занят. Чаще всего это вторая копия сервера, которую забыли остановить. Остановите другую копию или задайте другой порт.
Cannot listen on port … (…): … failed: …. Closing. Порт не открылся по другой причине, в строке — слова системы. Прочитайте их. Проверьте, что [server] address — адрес этой машины.
[server] address = "…" is not an IP address (…); the server cannot listen. … В address (или NODE_IP) не адрес. Верните "::".
Error parsing config file value: …: the table […] appears twice. … Таблица в server.toml записана дважды, обычно это второй [listing]. Перенесите ключи в первую таблицу, вторую удалите.
Error parsing config file value: …: the key … is given twice. … Одна настройка дважды в одной таблице. Удалите одну из строк.
Error parsing config file value: …: … -- the line reads … Другая ошибка в файле, строка процитирована. Исправьте строку или удалите server.toml, чтобы сервер написал новый.
[network] timers must satisfy lag_grace_sec < seat_takeover_sec <= seat_release_sec <= disconnect_sec … Четыре таймера идут не по порядку. Исправьте их в server.toml или в переменных NODE_NETWORK_*.
TLS: cannot write … (…); the certificate pair is generated on the first start, … Сервер не может записать сертификат туда, куда указывают настройки. Укажите в [network] tls_cert и tls_key файлы в папке, куда можно писать. В Docker см. ниже.

Если сервер запустился, но какая-то его часть — нет, в логе будет started, but … failed — what they do may not work, а строки выше скажут почему. Сервер при этом продолжает работать.

Лаунчер пишет, что не может достучаться до сервера, или сервер не появляется в списке.

  1. Порт должен быть открыт и для TCP, и для UDP. TCP нужен для входа и всего надёжного, UDP — для позиций машин. Проверьте брандмауэр на машине и проброс порта на роутере.
  2. Проверяйте снаружи. Подключение из своей сети ничего не говорит о роутере. Попросите друга или воспользуйтесь сервисом проверки портов.
  3. [server] address должен быть "::". Тогда сервер слушает все адреса, и лог это подтверждает: listening on [::]:30814 (tcp, tls 1.3, dual-stack: IPv4 + IPv6).
  4. В Docker пробрасывайте тот порт, на котором сервер работает: -p 30814:30814/tcp и -p 30814:30814/udp или тот, что задан в NODE_PORT. Порт, указанный в метаданных образа, роли не играет.

Игроки из той же сети, что и сервер, заходят по локальному адресу, например 192.168.1.20:30814.

Игрок пишет, что лаунчер показал TLS handshake failed: unexpected eof while reading. Часто это сразу несколько игроков из одного места или все с одного VPN. Сервер ограничивает, сколько подключений с одного адреса могут одновременно проходить вход, и закрывает лишние до рукопожатия. В логе сервера это видно под тегом Net.

  • Лимит — [network] max_connections_per_ip, по умолчанию 32. Поднимите его, если многие игроки приходят с одного адреса: клуб, NAT оператора, выход VPN.
  • [network] connection_limit_exempt — диапазоны адресов без лимита на адрес. По умолчанию это локальные и частные сети: так покрывается VPN или прокси на той же машине, что и сервер.
  • Фоновые опросы списка серверов из лаунчеров тоже считаются подключениями.

Каждое подключение, которое сорвалось до входа, сервер пишет в лог под тегом Net с адресом и причиной: тайм-аут, не TLS 1.3, вообще не TLS, клиент закрыл соединение.

Сервер останавливается сразу после запуска с TLS: cannot write /opt/node/node_key.pem (…). Внутри образа папка программы только для чтения, а сертификат по умолчанию пишется туда. Перенесите его в папку данных:

Окно терминала
-e NODE_TLS_CERT=/data/tls/node_cert.pem
-e NODE_TLS_KEY=/data/tls/node_key.pem

Образ создаёт /data/tls при каждом запуске. Эти два файла — личность сервера, берегите их.

server.toml не читается. Так и задумано: образ ставит NODE_PROVIDER_DISABLE_CONFIG=true, и все настройки идут из переменных NODE_*. Если хочется файл, задайте NODE_PROVIDER_DISABLE_CONFIG=false — тогда сервер будет читать и писать /data/server.toml.

«Permission denied» при запуске, или скопированные файлы не подхватываются. Сервер работает от пользователя 10001. Выполните sudo chown -R 10001:10001 data и перезапустите контейнер.

Консоль не отвечает. У контейнера без терминала консоли нет. Запустите его с терминалом (-it или stdin_open и tty в Compose) и подключитесь через docker attach.

См. Попасть в список. Чаще всего дело в порте: NodeMP должен достучаться до сервера снаружи, прежде чем покажет его.

Найдите в logs/server.log его строки netstats, по одной каждые 15 секунд. rtt — время туда и обратно в миллисекундах, loss — доля потерянных пакетов с позициями. Если цифры высокие у одного игрока, а у остальных всё хорошо, дело в его соединении — пришлите ему страницу Плохое соединение. Если плохо у всех, проблема в канале самого сервера.