server.properties - это вся конфигурация ванильного сервера Minecraft и первый слой конфигурации Paper. Это плоский список примерно из шестидесяти пяти пар «ключ - значение»: сервер записывает его при первом запуске, читает один раз при старте и больше не трогает. Большинство ключей вам не понадобятся никогда. Около десятка определяют, каково на сервере играть, а три-четыре решают, переживёт ли он встречу с чужими людьми.
Здесь собраны все ключи, которые есть в актуальной версии, сгруппированные по назначению, с их значениями по умолчанию и теми значениями, которые стоит выставить вместо них. Если ключ появился или исчез в какой-то версии, это отмечено: файл в 1.16 и в 1.21 - не один и тот же, а руководство, которое делает вид, что это не так, отправляет вас искать ключи, которых нет.
Как работает файл и как его безопасно править#
Это файл свойств Java. Значит, одна пара key=value на строку, без кавычек вокруг значений, без пробелов вокруг = и с # для комментариев. Из этого вытекают два неприятных следствия:
- Двоеточие внутри значения нужно экранировать обратной косой чертой, поэтому тип уровня по умолчанию записан как
level-type=minecraft\:normal, а неminecraft:normal. Если вставить форму без экранирования, на некоторых версиях вы молча получите мир по умолчанию. - Обратную косую черту в пути в стиле Windows нужно удваивать.
Файл читается ровно один раз, при запуске сервера. Правка во время работы сервера ничего не меняет, а /reload файл не перечитывает - /reload перезагружает только конфигурацию плагинов и ничего больше. Измените файл, затем перезапустите сервер. Бывает и наоборот: несколько команд пишут в файл сами, так что /whitelist on выставляет на диске white-list=true. Если вы правите файл при работающем сервере, эта запись может затереть ваше изменение, поэтому сначала остановите сервер.
#Minecraft server propertiesmotd=§6The Longhouse §8| §fsurvival 1.21max-players=24difficulty=normalview-distance=8simulation-distance=6spawn-protection=0white-list=trueenforce-whitelist=true§ - это знак параграфа, с которого в Minecraft начинаются старые цветовые коды. Обычно работает и сам символ §, вписанный буквально, но экранированная запись переживёт любой редактор и любую кодировку, так что используйте её. В MOTD доступны только старые шестнадцать цветов: ни hex-цвета, ни JSON в этом поле нет. Значок сервера вообще не свойство: это PNG размером 64 на 64 с именем server-icon.png в корне сервера. Подробно о форматировании - в статье MOTD, значок и resource pack.
В RE:NODE этот файл правится в файловом менеджере панели, где есть подсветка синтаксиса и сохранение на месте, либо по SFTP с учётными данными, которые создаются отдельно для каждого сервера. В любом случае после правки перезапустите сервер, чтобы изменение вступило в силу.
Ключи, от которых зависит, каково играть#
Если вы отредактируете всего восемь строк, пусть это будут эти.
| Ключ | По умолчанию | Чем заменить |
|---|---|---|
motd | A Minecraft Server | Что-нибудь, по чему сервер узнают в списке |
max-players | 20 | Сколько потянут ваши память и CPU |
difficulty | easy | normal для сервера выживания, hard, если вы серьёзно |
gamemode | survival | Обычно не трогают |
pvp | true | false на строительном или семейном сервере |
view-distance | 10 | 8 для большинства серверов, 6 при большой нагрузке |
simulation-distance | 10 | 6, иногда 5 |
spawn-protection | 16 | 0, если спавн не является общественной постройкой |
difficulty принимает peaceful, easy, normal или hard по названию в версиях 1.14 и новее; старые версии использовали числа от 0 до 3. Значение применяется из этого файла при каждом запуске, поэтому команда /difficulty меняет его только до следующего перезапуска. peaceful не просто прекращает спавн враждебных мобов: он убирает уже появившихся и не даёт голоду убивать игрока, а это куда более серьёзная перемена, чем большинство подразумевает.
spawn-protection - это квадрат, а не круг: значение задаёт радиус в блоках, так что 16 защищает область 33 на 33 вокруг спавна мира от строительства всеми, кто не оператор. Защита включена по умолчанию и сбивает с толку тех, у кого не получается поставить первый дом. На частном сервере выставьте 0. К тому же она вообще не действует, пока нет хотя бы одного оператора, и поэтому кажется, что она включается сама в тот день, когда вы назначаете оператором себя.
allow-flight=false вопреки названию не имеет отношения к античиту. Он определяет, выгонит ли сервер игрока, который дольше примерно пяти секунд находится в воздухе без распознанной причины. Любому плагину, дающему полёт, и любому серверу, где много летают на элитрах, нужно значение true, и читерам оно не помогает, потому что настоящие летающие читы этой проверкой и так не ловятся.
player-idle-timeout=0 - это число минут, через которое бездействующего игрока выгоняют, а 0 означает «никогда». На загруженном сервере с малым числом слотов значение 20 освобождает места. Отсчёт идёт от последнего действия игрока, а не от последнего движения.
Генерация мира и сам мир#
| Ключ | По умолчанию | Что делает |
|---|---|---|
level-name | world | Папка, в которой лежит мир |
level-seed | пусто | Seed для мира, которого ещё нет |
level-type | minecraft\:normal | Пресет генератора |
generator-settings | {} | JSON для плоских миров и миров из одного биома |
generate-structures | true | Деревни, крепости, вся сгенерированная архитектура |
max-world-size | 29999984 | Предел радиуса границы мира, в блоках |
allow-nether | true | false полностью закрывает Незер |
hardcore | false | Сложность зафиксирована на hard, смерть переводит в наблюдатели |
initial-enabled-packs | vanilla | Data pack, включённые в новом мире |
initial-disabled-packs | пусто | Data pack, выключенные в новом мире |
level-name - это переключатель, который часто упускают. Укажите папку, которой не существует, и при следующем запуске сервер создаст там новый мир, оставив старый нетронутым на диске. Так начинают новый сезон, ничего не удаляя, и так же случайно «теряют» мир, опечатавшись в названии. Верните прежнее значение, и исходный мир вернётся.
level-seed действует только в момент создания мира. Когда level.dat уже существует, seed в нём зафиксирован, и правка этой строки не даёт вообще ничего. level-type принимает minecraft:normal, minecraft:flat, minecraft:large_biomes, minecraft:amplified и minecraft:single_biome_surface начиная с 1.19; до появления пространств имён это были простые слова default, flat, largebiomes, amplified. Не забывайте про экранированное двоеточие.
generate-structures=false стоит знать ради одного случая: сервер, где нужны пещеры, руды и биомы, но не нужны деревни, храмы и крепости, которые можно грабить. Комната с порталом в Энд при этом не исчезает в том смысле, который важен: без крепостей до Энда не добраться без плагина или портала, построенного вручную, так что выключайте это осознанно.
initial-enabled-packs и initial-disabled-packs действуют только при создании мира. Data pack, добавленные позже, кладутся в world/datapacks/ и управляются командой /datapack - см. руководство по data pack.
Игровых правил в этом файле нет. keepInventory, doFireTick, randomTickSpeed, mobGriefing и остальные хранятся в level.dat и задаются командой /gamerule, а значит, переживают перезапуск сами по себе и здесь их не выставить. В шпаргалке по серверным командам перечислены те, что стоит менять.
Ключи производительности и какие из них действительно важны#
| Ключ | По умолчанию | Примечания |
|---|---|---|
view-distance | 10 | Сколько чанков отправляется каждому игроку. Самый мощный рычаг |
simulation-distance | 10 | Сколько чанков вокруг игрока обновляется по тикам. С версии 1.18 |
entity-broadcast-range-percentage | 100 | Как далеко клиентам отправляются сущности |
network-compression-threshold | 256 | Размер пакета, начиная с которого пакеты сжимаются |
max-tick-time | 60000 | Сторожевой таймер: через сколько миллисекунд сервер завершит сам себя |
max-chained-neighbor-updates | 1000000 | Предел цепочки редстоуна, уменьшает лаги от подавления обновлений |
sync-chunk-writes | true | Синхронная запись чанков на диск |
use-native-transport | true | Сетевой слой epoll в Linux. Оставьте включённым |
region-file-compression | deflate | С версии 1.20.5. Есть также none и lz4 |
pause-when-empty-seconds | 60 | С версии 1.21.2. Останавливает тики, когда на сервере никого нет |
rate-limit | 0 | Сколько пакетов в секунду до кика. 0 - выключено |
view-distance - число, которое люди должны менять первым и трогать последним. Каждый чанк внутри радиуса генерируется, загружается, хранится в памяти и отправляется каждому игроку, который может его видеть, поэтому стоимость растёт квадратично: переход с 10 на 8 убирает около трети загруженной области, а с 10 на 6 - почти две трети. На сервере с 2 ГБ и больше чем парой игроков разумный выбор по умолчанию - 8, а 6 - то, к чему вы опускаетесь, когда страдает частота тиков. Ниже 5 играть уже неприятно, потому что становятся заметны туман и внезапное появление объектов.
simulation-distance, появившийся в 1.18, разделил прежнее единственное число на два. View distance - это то, что игроки видят; simulation distance - то, что действительно обновляется по тикам: мобы, посевы, редстоун, воронки, печи. На практике оно ограничено view distance, и понижать именно его дешевле, потому что игрок видит на восемь чанков, а работать из них должны только шесть. Подвох - фермы: всё, что находится за пределами simulation distance каждого игрока онлайн, перестаёт работать, так что значение 4 тихо сломает железную ферму, которую кто-то построил у края своей прорисовки.
network-compression-threshold=256 сжимает любой пакет больше 256 байт. Значение -1 полностью отключает сжатие, обменивая нагрузку на канал на нагрузку на CPU, и подходит только для локальной сети - например, за прокси на том же хосте. 0 сжимает вообще всё и почти всегда хуже.
max-tick-time - это сторожевой таймер, а не настройка производительности. Если один тик длится дольше 60 секунд, сервер решает, что завис, сохраняет трассировку потоков и завершает работу. У Paper есть собственная версия того же механизма с ранним предупреждением. Значение -1 отключает сторожевой таймер, что иногда полезно, пока вы отлаживаете загрузку огромного мира, но как постоянное состояние плохо: вы лишаетесь отчёта о сбое, который показывает, что именно зависло.
pause-when-empty-seconds появился в 1.21.2 и по-настоящему полезен на маленьком сервере: через заданное число секунд без единого игрока сервер перестаёт обновлять мир по тикам, и нагрузка на CPU падает почти до нуля. Как только кто-то заходит, работа возобновляется мгновенно. Но вместе с этим останавливаются задания по расписанию и фермы, зависящие от времени, поэтому поставьте 0, если у вас что-то должно работать и при пустом сервере.
Всё, что лежит за пределами этого файла, - собственная конфигурация Paper, и именно там находятся более крупные выигрыши: радиусы активации сущностей, спавн мобов отдельно для каждого игрока, реализация редстоуна и скорость отправки чанков. Их разбирает руководство по оптимизации Paper, а статья о том, почему падает TPS, объясняет, как понять, какой из них вам нужен.
Доступ, аутентификация и модерация#
| Ключ | По умолчанию | Что делает |
|---|---|---|
online-mode | true | Проверять каждого игрока через Mojang |
white-list | false | Заходить могут только игроки из списка |
enforce-whitelist | false | Выгонять игроков не из списка, уже находящихся на сервере |
enforce-secure-profile | true | Требовать подписанный чат |
prevent-proxy-connections | false | Отклонять игроков, чей провайдер не совпадает |
accepts-transfers | false | С версии 1.20.5. Принимать пакеты переноса |
op-permission-level | 4 | Уровень, который выдаёт /op |
function-permission-level | 2 | Уровень, с которым выполняются функции и data pack |
broadcast-console-to-ops | true | Показывать операторам команды из консоли |
broadcast-rcon-to-ops | true | Показывать операторам команды из RCON |
log-ips | true | Записывать адреса игроков в лог |
hide-online-players | false | Скрывать выборку игроков в списке серверов |
enable-status | true | Вообще отвечать на пинг списка серверов |
text-filtering-config | пусто | Путь к конфигурации фильтра чата |
enforce-secure-profile=true требует от клиентов подписанного Mojang профиля чата. Выключение позволяет подключаться некоторым пиратским и модифицированным клиентам и тоже относится к тому, что делают не по той причине. На серверной части за прокси обычно ставят false, потому что этим занимается прокси.
white-list и enforce-whitelist - пара, которая ведёт себя странно. Включение whitelist сразу перестаёт пускать новых игроков, но не трогает тех, кто уже подключён; убирает их именно enforce-whitelist=true. Операторы обходят whitelist полностью, если принудительная проверка не включена. Порядок работы описан в статье whitelist и права, а сам файл индексируется по UUID, а не по имени.
log-ips=false стоит рассмотреть, если вы не хотите хранить адреса игроков в логах, которые уходят на сторону, когда кто-то просит помочь с отладкой. Вы лишаетесь возможности связать альтернативный аккаунт по адресу, а это настоящий инструмент модерации, так что тут компромисс, а не чистая победа. Более широкий вопрос разбирается в статье логи, которые стоит хранить.
prevent-proxy-connections=true спрашивает ответ аутентификации Mojang, не похоже ли соединение игрока на VPN или прокси, и отклоняет его, если похоже. Для законных игроков в некоторых мобильных и корпоративных сетях это даёт ложные срабатывания, так что инструмент грубый.
Query, RCON и удалённое управление#
| Ключ | По умолчанию | Что делает |
|---|---|---|
enable-query | false | Отвечать по протоколу query GameSpy4 |
query.port | 25565 | UDP-порт для query |
enable-rcon | false | Включить удалённую консоль |
rcon.port | 25575 | TCP-порт для RCON |
rcon.password | пусто | Обязателен, если RCON включён |
enable-jmx-monitoring | false | Отдавать метрики JVM через JMX |
Query - это протокол только для чтения, который по UDP отвечает на вопросы «кто онлайн, какая версия, какая карта». Им пользуются сайты со списками серверов и боты статуса. Включение ничего не стоит, кроме открытого UDP-порта, и в отличие от пинга списка серверов он может сообщить полный список игроков.
RCON - это удалённая консоль: обычное TCP-соединение, пароль и затем произвольные команды сервера. Из «обычного TCP» и «произвольных команд сервера» следуют два факта. Пароль передаётся открытым текстом, а тот, кто его знает, получает на вашем сервере уровень 4. Никогда не выставляйте 25575 в интернет без чего-либо перед ним, используйте длинный случайный пароль и по возможности предпочитайте консоль панели. Материал RCON без риска короткий, и пяти минут на него не жалко. В тарифах RE:NODE выделения под query и RCON добавляются на вкладке Network, а пароль RCON генерируется для каждого сервера, а не выбирается вами.
Resource pack#
| Ключ | По умолчанию | Что делает |
|---|---|---|
resource-pack | пусто | Прямая ссылка на скачивание .zip |
resource-pack-sha1 | пусто | SHA-1 этого файла, hex в нижнем регистре |
resource-pack-prompt | пусто | Текст в формате JSON, показываемый в окне согласия |
resource-pack-id | пусто | С версии 1.20.3. UUID пакета |
require-resource-pack | false | Отключать игроков, отказавшихся от пакета |
URL должен быть прямой ссылкой на файл: страница общего доступа Dropbox или Google Drive отдаёт HTML, а не zip, и клиент молча не справляется. SHA-1 на практике не необязателен: без него клиенты кэшируют по URL и не замечают, что вы заменили пакет, так что обновление пакета требует либо нового имени файла, либо правильного хеша. Вычислите его командой sha1sum pack.zip и вставьте hex в нижнем регистре.
require-resource-pack=true превращает отказ в отключение от сервера - это правильная настройка для сервера, игра на котором зависит от собственных текстур, и неправильная для сервера, где они всего лишь украшение. Поле prompt принимает исходный текстовый компонент JSON, тот же формат, что и у /tellraw, так что обычный текст нужно обернуть: {"text":"Please accept our pack"}.
Ключи, о которых вы прочтёте, но которых больше нет#
Старые руководства полны настроек, которые сервер убрал, а поиск их съедает целый вечер.
max-build-heightудалён в 1.17, когда высота мира стала свойством измерения, а не сервера.snooper-enabledисчез вместе с телеметрией, которой управлял.announce-player-achievementsстал игровым правиломannounceAdvancements.- Числовые значения вроде
difficulty=1заменены названиями в 1.14, хотя старые файлы всё ещё принимаются. resource-pack-hashдавным-давно вытеснен ключомresource-pack-sha1.
И наоборот, некоторые ключи новее руководства, которое вы читаете: simulation-distance - это 1.18, enforce-secure-profile - 1.19, accepts-transfers и region-file-compression - 1.20.5, bug-report-link - 1.21, pause-when-empty-seconds - 1.21.2. Если ключа нет в файле, созданном вашим сервером, значит, его нет в вашей версии, и добавление вручную ничего не даст.
Рабочий пример: сервер выживания на двадцать игроков и 4 ГБ#
Вот весь server.properties, который работает, с убранными значениями по умолчанию, чтобы были видны принятые решения:
motd=§aThe Longhouse §8» §fSurvival SMPmax-players=24difficulty=normalpvp=trueview-distance=8simulation-distance=6spawn-protection=0allow-flight=trueplayer-idle-timeout=30level-name=worldlevel-seed=white-list=trueenforce-whitelist=trueonline-mode=trueenable-command-block=falseop-permission-level=2enable-rcon=falseenable-query=truenetwork-compression-threshold=256Рассуждения по порядку: читаемый MOTD; на несколько слотов больше привычных двадцати, потому что 4 ГБ это тянут; сложность normal, поскольку на easy цикл выживания становится тривиальным; view и simulation distance урезаны до того, что комфортно помещается в 4 ГБ кучи; защита спавна выключена, чтобы можно было строить рядом с ним; полёт разрешён, потому что элитры существуют, а ложные выгоны хуже самой настройки; кик за простой через тридцать минут; whitelist включён и принудителен до того, как адрес попадёт куда-либо; командные блоки выключены, потому что в руках оператора уровня 2 они превращаются в дыру для удалённого выполнения кода; и op-permission-level=2, чтобы /op выдавал инструменты строительства, а не /stop.
Эта комбинация плюс плагин прав и ночной backup - сервер, который можно оставить работать. Всё, что дальше, - тонкая настройка: это руководство по Paper и, для размера кучи, руководство по JVM.
FAQ#
Почему моё изменение в server.properties ничего не сделало?
Файл читается только при запуске. Перезапустите сервер. Если вы правили его при работающем сервере, проверьте файл ещё раз после перезапуска: сервер может переписать его при остановке и затереть то, что вы напечатали.
Чем отличается view distance от simulation distance?
View distance - это то, как далеко клиенту отправляются чанки, то есть она определяет, что видят игроки, и почти всю нагрузку на память. Simulation distance - то, как далеко чанки реально обновляются по тикам, то есть она определяет, появляются ли мобы, растут ли посевы и работает ли редстоун. Понижать simulation distance дешевле и менее заметно, но фермы за её пределами перестают работать.
Можно ли задать здесь игровые правила вроде keepInventory?
Нет. Игровые правила живут в мире, а не в server.properties. Задайте их один раз командой /gamerule keepInventory true, и они сохранятся между перезапусками, потому что хранятся в level.dat.
Как сменить seed мира на существующем сервере?
Никак. Seed фиксируется при генерации мира. Смените level-name на новую папку и задайте level-seed, и сервер создаст новый мир при следующем запуске, оставив старый на диске.
Безопасно ли поднимать max-players выше 20?
Сама настройка не обеспечивает ничего, кроме числа. Ограничивают вас память под загруженные чанки и одно ядро на тик. Поднимайте значение вместе с понижением view distance и следите за временем тика, а не за числом игроков.
Игнорирует ли Paper какие-то из этих настроек?
Paper читает их все и добавляет поверх собственные слои в bukkit.yml, spigot.yml и config/paper-*.yml. Некоторые из них там переопределяются - в частности view и simulation distance для каждого мира, лимиты спавна мобов и радиусы исчезновения, - поэтому если изменение здесь на Paper как будто не действует, проверьте, не задаёт ли то же самое файл Paper.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.