Руководство по хостингу сервера

Хостить локальный песочный сервер для экспериментов легко, но настроить крупный продакшен-сервер, поддерживающий сотни игроков, немного сложнее. Это руководство организовано по «уровням», соответствующим сложности.

Уровень 0: Локальный песочный сервер

Готовые сборки сервера не следует использовать для собственного контента

Единственные изменения, которые вы можете внести в готовую сборку сервера, — это через файл server_config.toml. Если вы хотите изменить свой сервер, добавив собственный контент или правила. Вам понадобится нормальная среда разработки с вашими изменениями, а затем собрать собственную сборку.. В противном случае, вероятно, получится сломанный сервер, и мы не сможем оказать поддержку по таким проблемам.

  1. (Только Windows) Скачайте и установите последнюю версию Microsoft Visual C++ Redistributable. (Устраняет ошибки «Unable to load DLL libsodium» и подобные)
  2. Скачайте и установите среду выполнения .NET 10, расположенную в левом нижнем столбце. Убедитесь, что берёте версию x64, если у вас Intel/AMD (или скачиваете Intel-сервер для использования на Mac с Apple Silicon), либо arm64 для чипов Snapdragon/Apple Silicon (M1, M2, M3 и т. д.) под вашу операционную систему. Убедитесь, что вы случайно НЕ устанавливаете «ASP.NET Core Runtime», устанавливайте именно «.NET Runtime». В Linux рекомендуется использовать менеджер пакетов вашего дистрибутива (apt, dnf, pacman и т. д.), чтобы найти и установить dotnet.
  3. Скачайте последнюю стабильную версию сервера со страницы наших сборок или, если вам нужны последние сборки testing/vulture, скачайте с этой страницы для вашей операционной системы. Если вы ищете другой форк, спросите у этого форка, есть ли у них страница сборок сервера. В противном случае обратитесь к разделу Собственный код ниже.
  4. Распакуйте скачанный zip в какой-нибудь каталог, можно использовать любую программу для архивов, например 7Zip, Winrar или даже встроенную в вашу операционную систему.
  5. (Только Mac и Linux) Выполните chmod +x Robust.Server в терминале внутри папки, куда вы распаковали сервер. Это нужно выполнить один раз, а затем повторять каждый раз, когда скачиваете новое обновление сервера.
  6. Запустите run_server.bat (Windows) или ./Robust.Server через терминал в macOS/Linux) и подождите, пока в окне консоли не появится «Ready». НЕ закрывайте окно консоли, пока не закончите играть на своём сервере.
  7. Откройте лаунчер Space Station 14 и нажмите Direct Connect To Server, введите localhost в качестве IP-адреса и нажмите подключиться. Также можно добавить его в избранное, нажав кнопку Add Favorite с тем же IP-адресом.
  8. (Необязательно) Когда выйдет новое обновление. Вернитесь ко 2-му шагу и скопируйте папку data и server_config.toml (если вы его изменяли) из старых файлов сервера в новые, если хотите перенести сохранённые данные, такие как персонажи и время игры, со старого сервера.

Если вам трудно понять, куда нажимать, вот короткое видео. Субтитры при необходимости содержат дополнительную информацию.

Уровень 1: Пригласите друзей

Вам придётся выполнить несколько дополнительных шагов, если вы хотите, чтобы другие люди могли подключаться и играть.

Проброс портов

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

  • UDP 1212 используется для основного сетевого кода игры. Это необходимо, чтобы клиент мог подключиться к серверу. Настраивается переменной конфигурации net.port.
  • TCP 1212 — это HTTP API статуса. Оно также необходимо, чтобы лаунчер мог подключиться к серверу. Оно не нужно для подключения голым клиентом. Настраивается переменной конфигурации status.bind (принимает строку вроде *:1212 или 127.0.0.1:3000).

Подробнее о том, как пробросить порты и что делать при возникновении проблем, см.: Проброс портов

После проброса портов вы можете воспользоваться этим сайтом, чтобы узнать свой публичный IP-адрес. Если у вас есть и IPV4, и IPV6, попробуйте оба, если один не сработает.

Дайте его друзьям и скажите им подключиться напрямую. Если проброс портов выполнен правильно, они смогут подключиться.

Info

Если у вас есть IPV6-адрес (выглядит примерно так: fd11:5ee:bad:c0de::ab3:3d03), обязательно заключайте его в квадратные скобки ([fd11:5ee:bad:c0de::ab3:3d03]) в меню прямого подключения.

Настройте свой сервер

Настройки сервера можно менять через файл конфигурации server_config.toml. Этот файл — TOML, что по сути INI только лучше специфицирован, несколько мощнее, легче неправильно использовать и назойливее самоуверен (комментариям НУЖНА собственная строка).

У настроек есть один ключ, под который они попадают, а затем имя. Так, если я скажу game.lobbyenabled, это идёт под заголовок [game], вот так:

[game]
lobbyenabled = true

Понятно? Хорошо.

Некоторые разумные значения по умолчанию, которые стоит задать для вашего сервера, если вы действительно собираетесь хостить его как следует:

Warning

Пожалуйста, прочитайте комментарии здесь, чтобы чётко понимать, что вы делаете.

[net]
# Снижение тикрейта до 30 практически незаметно,
# но резко снижает нагрузку на сервер, клиент и сеть.
tickrate = 30

[game]
# Изменяет имя сервера, отображаемое в лобби и лаунчере.
hostname = "Foo Station"
# Включает лобби, вместо того чтобы сразу бросать клиентов в игру.
lobbyenabled = true

[auth]
# Принудительно включает аутентификацию, чтобы ВСЕ подключающиеся клиенты имели полноценный аккаунт.
# Иначе разрешён вход гостем.
# Возможные значения: 0 (необязательно), 1 (требуется), 2 (отключено)
mode = 1

См. Справочник по файлам конфигурации для более подробного руководства по конфигурации сервера.

Права администратора

По умолчанию права администратора не заданы. Привилегированный администратор может выдавать разрешения другим администраторам командой permissions в консоли внутри игры, но здесь возникает проблема курицы и яйца. Чтобы получить начальные права администратора +HOST на своём сервере, можно воспользоваться одним из следующих трёх методов:

Danger

Права +HOST чрезвычайно опасны для выдачи и должны предоставляться только людям, у которых уже есть доступ к вашему компьютеру или серверу.

Выдача кому-либо +HOST позволяет ему полностью захватить ваш сервер и/или компьютер.

  • Если вы подключаетесь к игровому серверу через localhost (IP 127.0.0.1 или ::1), игра автоматически выдаст вам полные права хоста. Это можно отключить с помощью CVar console.loginlocal.
  • Если вы установите CVar console.login_host_user в своё имя пользователя, вам будут выданы права хоста при подключении.
  • Вы можете использовать команду promotehost из консоли сервера (например, promotehost PJB), чтобы временно выдать подключённому клиенту права хоста.

Уровень 2: Сервер с собственным кодом

Сначала вам нужно настроить среду разработки, чтобы собрать сервер с собственным кодом. После этого можете продолжить.

Далее нужно собрать сам инструмент упаковки:

dotnet build Content.Packaging --configuration Release

Затем с помощью упаковщика можно выполнить тяжёлую работу. Команда ниже упакует сервер с использованием hybrid-acz (чтобы лаунчер мог скачать ваш собственный контент) для 64-битных систем Linux. Если вы хотите сделать для Windows, замените linux-x64 на win-x64. Если у вас процессор ARM64, замените x64 на arm64. Доступные цели компиляции перечислены в этой статье. (Примечание: поддерживаются не все из этих целей. Нужны КАК МИНИМУМ 64 бита.)

dotnet run --project Content.Packaging server --hybrid-acz --platform linux-x64

Info

Учтите, что если вы запускаете старый сервер до появления упаковки Content или вам нужен устаревший скрипт (больше не поддерживается), используйте вместо этого python Tools/package_server_build.py --hybrid-acz

Проверьте папку release/ на наличие упакованного сервера для вашей собственной кодовой базы. С этого момента вы можете следовать шагам уровня 0, пропустив шаг 3, так как у вас уже есть zip сервера. (Файл клиента можно игнорировать)

Уровень 3: «Продакшен»-сервер

Это, конечно, не будет обрабатывать автоматические перезапуски (в случае падения) или обновления так, как это делал бы Watchdog. Также это не разместит ваш сервер публично на хабе, так как реклама по умолчанию отключена. Если вы хотите, чтобы ваш сервер был в списке на хабе, прочитайте раздел Конфигурация голого сервера ниже.

Для других служб, таких как SS14.Watchdog, вам ТАКЖЕ понадобится среда выполнения ASP .NET Core 10 (входит в .NET 10 SDK).

Настройка правил

По умолчанию сервер поставляется без правил. Чтобы задать собственные правила для своего сервера:

  1. Сделайте форк проекта, если ещё не сделали (а значит, также настройте среду разработки)
  2. Добавьте файл руководства со своими правилами в каталог Resources/ServerInfo/Guidebook/ServerRules. Следуйте формату DefaultRules.xml
  3. Добавьте запись-прототип руководства в Resources/Prototypes/Guidebook/rules.yml, указывающую на только что созданный вами текстовый файл руководства.
  4. Установите CCVar server.rules_file в ID, который вы задали в прототипе руководства, созданном на предыдущем шаге.

Публичный сервер на хабе — добавление вашего сервера в список лаунчера

  1. Прочитайте правила серверов на хабе, прежде чем размещать свой сервер на хабе. Реклама на хабе означает принятие правил хаба.

  2. Выберите теги для своего сервера на основе стандартных тегов.

  3. Добавьте следующие строки в вашу конфигурацию сервера:

    [hub]
    advertise = true
    # Раскомментируйте, чтобы изменить URL сервера, рекламируемый в списке мастер-серверов.
    # Используйте это, если хотите URL ss14s:// или настроили сервер за обратным прокси или вроде того.
    # По умолчанию "ss14://[публичный IP сервера]:сетевой порт"
    # server_url = "ss14://..."
    tags = "" # список тегов через запятую
    

Если при попытке рекламирования возникает ошибка, прочитайте раздел по устранению неполадок ниже

Конфигурация сборки голого сервера

Если вы действительно хотите настроить более постоянный сервер, вам придётся где-то переразместить загрузки клиента. Подойдёт любое место, доступное по обычному URL.

Вам нужно будет отредактировать файл конфигурации сервера (server_config.toml), добавив в него следующее:

[build]
# Расположение для скачивания всей сборки клиента в виде zip по HTTP- (или HTTPS-) URL.
download_url = ""

Настройки производительности

Вот несколько настроек, которые, вероятно, стоит включить на сервере для повышения производительности:

Переменные окружения для включения полного динамического PGO, что кардинально повышает производительность ценой незначительно большего времени запуска:

DOTNET_TieredPGO: 1
DOTNET_TC_QuickJitForLoops: 1
DOTNET_ReadyToRun: 0

Переменная окружения для включения операций AVX во всей кодовой базе. В зависимости от процессора это может ухудшить производительность вместо улучшения, иначе может улучшить производительность атмосферы.

ROBUST_NUMERICS_AVX: true

Переменные окружения можно задавать из Watchdog, см. ниже.

Уровень 4: Продакшен-сервер с Watchdog

Это для тех, кто запускает собственную кодовую базу и сервер, и/или тех, кто хочет более надёжное решение для хостинга.

SS14.Watchdog (кодовое имя Ian) — это наша обёртка для хостинга серверов, похожая на TGS для BYOND (но пока гораздо проще). Она занимается автообновлениями, мониторингом, автоматическими перезапусками и администрированием. Рекомендуем использовать её для нормальных развёртываний.

Установка

Обратитесь к этому за инструкциями по сборке и настройке Watchdog.

Конфигурация сборки сервера

Лаунчеру нужно скачать бинарник клиента, чтобы запустить игру. Информацию об этом бинарнике клиента он получает от игрового сервера через info API.

Информация, возвращаемая этим API, настраивается двумя способами: build.json и переменные конфигурации build.*.

build.json — это файл, который система сборки автоматически кладёт рядом с исполняемым файлом сервера. Именно так сервер узнаёт информацию о сборке, когда вы просто скачиваете zip голого сервера. (учтите, что это НЕ делает package_release_build.py, так как он полагается на дополнительную информацию о сборке. gen_build_info.py делает это отдельным шагом)

Второй вариант — указать переменные конфигурации (из командной строки или файла конфигурации, работает и то, и другое):

[build]
# "Идентификатор" вашей кодовой базы. Используется лаунчером для управления установками.
# Старайтесь делать его уникальным среди разных кодовых баз.
# Ничего не сломается, если это не так (или если есть злонамеренный субъект),
# но лаунчер БУДЕТ вынужден перезагружать файлы чаще, чем это необходимо.
fork_id = ""

# Строка версии текущей сборки, работающей на сервере.
# Она лишь побуждает лаунчер перезагрузить файлы, если отличается.
version = ""

# Версия движка для скачивания.
# Версии движка размещаем мы, и они, вероятно, будут доступны вечно.
# По крайней мере, пока не выяснится, что они уязвимы к каким-либо эксплойтам, тогда мы можем их убрать.
engine_version = ""

# Расположение для скачивания всей сборки клиента в виде zip по HTTP/HTTPS-URL.
download_url = ""

# Хэш SHA256 указанных выше zip-файлов клиента.
hash = ""

Учтите, что SS14.Watchdog задаёт бо́льшую часть этого за вас, если вы настроили его с автообновлениями (в зависимости от провайдера обновлений). Примечательно, что он не может предоставить engine_version или версию fork_id, поэтому лучше указать первое в build.json (ваша система сборки должна быть не хламом для этого), а второе — в файле конфигурации.

Уровень 5: Большой продакшен-сервер

Вещи, которые не нужны для маленьких/приватных серверов, но настоятельно рекомендуются для форков или более крупных продакшен-серверов.

Продвинутый проброс портов

При желании можно поставить HTTP API статуса за обратный прокси. Это рекомендуется для продакшен-серверов, так как тогда можно использовать HTTPS (поставьте его за nginx и включите HTTPS). Учтите, что при этом нужно задать переменную конфигурации status.connectaddress, чтобы указать UDP-адрес, к которому должен подключаться основной сетевой код. Она должна выглядеть так: udp://server.spacestation14.io:1212 (для нашего сервера, разумеется, подставьте свои параметры).

Настройка PostgreSQL

SS14 использует базу данных SQL для хранения серверных данных, таких как игровые слоты. По умолчанию автоматически используется база данных SQLite, чего достаточно для локального тестирования и небольших серверов. Однако если вы хотите иметь возможность совместно использовать базу данных между несколькими серверами и т. п., сервер также поддерживает подключение к PostgreSQL. Поддержка MySQL/MariaDB пока не планируется, но мы примем вклад.

Соответствующие свойства конфигурации вместе со значениями по умолчанию:

# Файл конфигурации сервера
[database]
# Тип используемой базы данных. Сейчас может быть "sqlite" или "postgres".
engine = "sqlite"

# Путь для хранения базы данных при использовании SQLite. Учтите, что это НЕ путь на диске.
# Он относителен каталога данных сервера, который задаётся --data-dir при запуске сервера из командной строки (или автоматически задаётся SS14.Watchdog)
sqlite_dbpath = "preferences.db"

# Конфигурация базы данных PostgreSQL, должна быть самоочевидна.
pg_host = "localhost"
pg_port = 5432
pg_database = "ss14"
pg_username = ""
pg_password = ""

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

Метрики Prometheus

SS14 поддерживает хостинг сервера метрик, который может собирать Prometheus, и с его помощью вы сможете строить навороченные графики в Grafana или вроде того. Наши дашборды Grafana можно найти здесь — вдруг они окажутся полезны.

Чтобы настроить это, можно использовать следующие переменные конфигурации:

[metrics]
enabled = true
# Адрес, к которому привязать сервер метрик; используйте "*" для всех локальных интерфейсов
host = "localhost"
# Порт, к которому привязать сервер метрик
port = 44880

Затем это можно собирать с помощью следующей конфигурации Prometheus (например):

global:
  scrape_interval: 1s
  evaluation_interval: 1s

scrape_configs:
  - job_name: "wizards_den_us_west"
    static_configs:
      - targets: ["localhost:44880"]

Логирование в Loki

SS14 также поддерживает отправку структурированных данных логов в Loki. Поскольку это современный DevOps-хлам, сайт не говорит, что оно на самом деле делает, но в сочетании с Grafana вы сможете просматривать и фильтровать логи, возможно, более разумным способом, чем простые текстовые файлы.

Нет, для работы этого не нужна настроенная Promtail. SS14 отправляет данные напрямую в Loki.

Чтобы настроить это, можно использовать следующие переменные конфигурации:

[loki]
enabled = true
# HTTP-адрес сервера Loki.
address = "http://localhost:3100"
# Имя этого сервера, включается во все сообщения логов.
name = "wizards_den_us_west"
# Параметры для HTTP Basic аутентификации, если Loki у вас настроен за ней.
# Если не указаны, аутентификация не будет предпринята.
# username = ""
# password = ""

Политика конфиденциальности

Это не юридическая консультация

Эта функциональность и документация предоставляются исключительно по принципу «как есть». Мы намерены максимально упростить для хостов серверов соблюдение юридических требований, но ничто здесь не заменяет разговор с настоящим юристом, если до этого дойдёт.

Лаунчер, если настроен, может показывать запрос политики конфиденциальности, когда игрок пытается подключиться к вашему серверу. Вероятно, это желательно для всех крупных серверов.

Как это работает: игровой сервер предоставляет три параметра, которые лаунчер проверит как можно раньше в рукопожатии при подключении:

  • Link: ссылка на HTTP(S)-URL, где размещена ваша политика конфиденциальности.
  • Identifier: уникальное значение, идентифицирующее политику конфиденциальности конкретной группы серверов, чтобы однозначно её различать.
  • Version: уникальное значение, идентифицирующее версию вашей политики конфиденциальности, позволяющее распознавать изменения.

Чтобы настроить это, следует задать следующие три CVar в вашей конфигурации:

[status]
privacy_policy_link = "https://example.com/privacy"
# Задайте уникальное значение для сообщества вашего сервера.
# НЕ КОПИРУЙТЕ ЭТО.
privacy_policy_identifier = "example_server_identifier"
# Это может быть что угодно, но дата, возможно, наиболее понятна человеку.
# Меняйте её каждый раз, когда обновляете свою политику конфиденциальности!
privacy_policy_version = "2024-11-30"

Подробности

Info

Этот раздел призван помочь вам лучше понять, как лаунчер взаимодействует с вашим игровым сервером, пока эта функция включена.

Когда игрок впервые подключается к вашему серверу с включённой этой системой, ему показывают ссылку на политику конфиденциальности и возможность принять её или отклонить.

  • Если он нажимает на ссылку, привязанная политика конфиденциальности откроется в браузере.
  • Если он нажимает «принять», лаунчер продолжит обычные процедуры подключения (скачивание ресурсов, запуск клиента, подключение к игровому серверу и т. д.)
  • Если он нажимает «отклонить», подключение немедленно прерывается. В этом случае никакого дальнейшего контакта с вашим сервером не произойдёт, кроме одного HTTP GET к конечной точке /info API сервера.

Если он нажимает «принять», согласие (на основе идентификатора и версии) сохраняется в базе данных лаунчера, и позже ему больше не будут показывать этот запрос.

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

Устранение неполадок

Не удаётся рекламировать на хабе / люди не могут подключиться

Люди не могут подключиться к вашему серверу ИЛИ вы получаете следующую ошибку в консоли сервера:

[ERRO] hub: Error status while advertising server: [UnprocessableEntity] "Unable to contact status address"

Это означает, что ваш сервер недоступен из внешнего интернета. Убедитесь, что вы следовали руководству по пробросу портов.

Блокировка интернета по странам для auth/хаба

В некоторых странах (например, в России) сейчас действуют интернет-блокировки, которые могут мешать вашему серверу подключаться к службам хаба. Если это для вас проблема, можно попробовать задать следующие свойства конфигурации для использования резервных служб:

[auth]
server = "https://auth.fallback.spacestation14.com/"

[hub]
hub_urls = "https://hub.fallback.spacestation14.com/"

Эти конфигурации не влияют на игроков: лаунчер и игровой клиент по умолчанию используют резервные варианты везде, где это возможно.

SS14.Watchdog

Сервер перезапускается каждые 30 секунд

Это означает, что сервер неправильно взаимодействует с Watchdog, и Watchdog вынужден предполагать, что сервер завис или вроде того. Это происходит, если BaseUrl в конфигурации Watchdog задан неправильно или иначе недоступен для игрового сервера.

System.IO.FileNotFoundException: Could not load file or assembly 'Mono.Posix.NETStandard, Version=1.0.0.0, Culture=neutral (…)

Текущая рабочая теория — это вызвано неправильными настройками dotnet publish. Приведённый ниже набор результатов тестов должен помочь объяснить.

dotnet publish -c Release -r linux-x64 --no-self-contained SS14.Watchdog -o test
 RESULT: Mono.Posix.NETStandard.dll included, System.dll not included (as expected)

dotnet publish -c Release -r linux-x64 SS14.Watchdog -o test
 RESULT: Mono.Posix.NETStandard.dll included, System.dll included

dotnet publish -c Release SS14.Watchdog -o test
 RESULT: Mono.Posix.NETStandard.dll not included, System.dll not included

Поскольку Watchdog использует Mono.Posix.NETStandard.dll, чтобы помечать исполняемые файлы как исполняемые в Linux и Mac OS X, важно иметь его в этих ОС.

Запуск сервера в MacOS или Linux

Откройте терминал в распакованном каталоге сборки (в нём должен быть файл Robust.Server.) Введите ./Robust.Server и нажмите Enter. Если на экран выводится куча всего и там не написано error, значит сервер работает.

Дополнительное устранение неполадок

Устранение неполадок

Полезные ссылки

Все важные ссылки с этой страницы в одном удобном месте.

Subpages