Войти Добавить свой сервер

ГайдДля владельцев серверов

Как настроить NuVotifier и проверить его: пошаговая инструкция

Установка NuVotifier на Paper или в сети Velocity, открытие порта, проверка и разбор каждой ошибки из лога. Проверено на Paper 26.3 и Velocity 4.2.

Редакция ServerList Опубликовано 11 мин чтения
Консоль сервера[NuVotifier] Votifier enabled on port 8192[NuVotifier] Using protocol v2 tokensGot a protocol v2 vote record from ServerList.net for Steve[VotingPlugin] Steve voted, 2 rewards

Плагин NuVotifier принимает голоса от списков серверов. Вы устанавливаете его на сервер или на прокси, открываете один порт TCP и сообщаете каждому списку свой адрес, порт и либо открытый ключ v1, либо токен v2. Наград он сам не выдаёт, поэтому вам понадобится ещё плагин наград вроде VotingPlugin, а весь путь стоит проверить один раз, прежде чем звать игроков голосовать командой /vote.

Мы писали это с обоих концов провода. serverlist.net отправляет голоса всем карточкам с настроенным Votifier (сейчас их 95), а для этого руководства мы запустили NuVotifier на свежем сервере Paper 26.3 и на прокси Velocity 4.2, отправили ему корректные голоса и намеренно испорченные и переписали то, что выводила консоль. Каждая приведённая ниже строка лога взята из этого стенда, а токены и адреса заменены примерами.

  1. Положите nuvotifier.jar в папку plugins и перезапустите сервер.
  2. Запишите порт (по умолчанию 8192), токен и открытый ключ, которые создаёт NuVotifier.
  3. Откройте этот порт для TCP у хостинга или в файрволе.
  4. Добавьте адрес, порт и токен (или ключ) в карточку на serverlist.net.
  5. Отправьте тест через проверку Votifier и следите за консолью.
  6. Установите VotingPlugin и назначьте награду для сайта голосования ServerList.net.

Что NuVotifier делает и чего не делает

NuVotifier слушает порт TCP. Когда список подключается, он читает одно сообщение с голосом, проверяет его вашим ключом или токеном и запускает событие голоса внутри сервера. В голосе четыре элемента: название сервиса списка (наше ServerList.net), ник, который ввёл игрок, IP-адрес голосующего и время.

Не менее важно то, чего он не делает:

  • Он не выдаёт награды. Награды выдаёт плагин наград, который слушает это событие.
  • Он не проверяет, существует ли игрок. Ники проверяет список, а плагин наград решает, что делать с неизвестными.
  • Он работает только по TCP. Порт, открытый лишь для UDP, оставляет Votifier недоступным.
  • Он ничего не отправляет обратно списку v1, и поэтому тестировать приходится иначе.

Официальный релиз по-прежнему 2.7.3 от июля 2021 года, один jar для Paper, Spigot, BungeeCord, Velocity и Sponge. В нашем тесте он загрузился и принимал голоса на Paper 26.3 и Velocity 4.2.0 без изменений. На Java 25 он выводит блок предупреждений, в том числе WARNING: sun.misc.Unsafe::objectFieldOffset has been called by. Это касается будущего изменения в Java, а не ошибки, и голоса продолжали работать.

Официальный релиз не поддерживает Folia. Эту поддержку даёт форк azuvotifier, который до сих пор обновляется (версия 3.3.6, ноябрь 2025 года): он говорит на том же протоколе, поэтому списки обращаются с ним как с NuVotifier.

Ключ v1 или токен v2

Списки могут общаться с NuVotifier по двум версиям протокола, и можно оставить включёнными обе.

v1 (открытый ключ)v2 (токен)
Что вы даёте спискуСодержимое rsa/public.keyТокен из config.yml
Чем защищён голосШифруется вашим открытым ключом RSAПодписывается HMAC-SHA256 с токеном плюс новый запрос (challenge) при каждом соединении
Можно ли повторно отправить перехваченный голосДаНет, каждый запрос работает один раз
Узнаёт ли список, сработало лиНет. NuVotifier читает 256 байт и закрывает соединение без ответаДа. NuVotifier отвечает {"status":"ok"} или ошибкой с причиной
Кто поддерживаетПочти все спискиСписки, реализовавшие протокол NuVotifier, включая serverlist.net

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

На serverlist.net используйте v2. Оставляйте v1 включённым, пока он нужен другим спискам, которыми вы пользуетесь. На 18 октября 2026 года Votifier был настроен у 97 из наших 218 карточек: у 68 с ключом v1 и у 29 с токеном v2 (сейчас: 68 и 27).

Установка на Paper

  1. Скачайте nuvotifier.jar со страницы релизов NuVotifier на GitHub или с его страницы на SpigotMC и положите в папку plugins сервера.

  2. Запустите сервер. При первом запуске NuVotifier выводит ваш токен и адрес, на котором слушает:

    [Votifier] Your default NuVotifier token is e4qk2v9m1r7t0p5s3a8d6f2h1j.
    [Votifier] Votifier enabled on socket /0.0.0.0:8192.
  3. Остановите сервер и откройте plugins/Votifier/config.yml. Без комментариев стандартный файл выглядит так:

    host: 0.0.0.0
    port: 8192
    disable-v1-protocol: false
    tokens:
      default: e4qk2v9m1r7t0p5s3a8d6f2h1j
    forwarding:
      method: none
      pluginMessaging:
        channel: nuvotifier:votes
  4. Проверьте host. По умолчанию берётся server-ip из server.properties, а если оно пусто, то 0.0.0.0. На нашем тестовом сервере в server-ip стоял 127.0.0.1, поэтому NuVotifier молча слушал 127.0.0.1:8192, куда ни один список никогда не дотянется. Читайте строку Votifier enabled on socket после каждого перезапуска. Там должно быть 0.0.0.0 или адрес, доступный из интернета.

  5. Задайте port равным порту, который выдаёт хостинг. Это должен быть свободный порт TCP, и он не может совпадать с игровым портом.

  6. Оставьте disable-v1-protocol: false, если не все используемые вами списки поддерживают v2.

  7. Перезапустите сервер полностью. В нашем тесте токен, удалённый из config.yml, продолжал работать после /nvreload до следующего перезапуска, так что после смены токенов не полагайтесь на перезагрузку.

NuVotifier ищет токен по названию сервиса списка и в крайнем случае берёт default. Отдельный токен для каждого списка звучит аккуратно, но не работает ни для одного названия сервиса с точкой, в том числе для нашего. Paper читает ServerList.net: в tokens как раздел ServerList с ключом net внутри. Чтение TOML в Velocity оставляет кавычки вокруг "ServerList.net" частью имени, а без кавычек конфигурация не загружается вообще. В любом случае поиск промахивается, и NuVotifier проверяет наш голос по default, так что если вы дали нам отдельный токен, каждый голос заканчивается ошибкой неверной подписи. Дайте нам токен default. Ключи v1 лежат в plugins/Votifier/rsa/, и ваш сервер покидает только public.key.

Установка в сети Velocity или BungeeCord

В сети голоса приходят на прокси, единственный адрес, который известен спискам. Установите один и тот же nuvotifier.jar на прокси и на каждый бэкенд, который должен принимать голоса. Конфигурация прокси лежит в plugins/nuvotifier/config.toml в Velocity и в plugins/NuVotifier/config.yml в BungeeCord.

Пересылка голосов на бэкенды

Plugin messaging: простой выбор для одного прокси. Голоса идут на бэкенды по собственному соединению игрока.

На прокси (config.toml в Velocity):

host = "0.0.0.0"
port = 8192

[forwarding]
method = "pluginMessaging"

[forwarding.pluginMessaging]
channel = "nuvotifier:votes"
cache = "file"
onlySendToJoinedServer = false

На каждом бэкенде (plugins/Votifier/config.yml) отключите собственный слушатель бэкенда, задав порт -1, и включите пересылку:

port: -1
forwarding:
  method: pluginMessaging
  pluginMessaging:
    channel: nuvotifier:votes

Сообщения плагинов требуют подключённого игрока, поэтому бэкенд, на котором никого нет, получит свои голоса позже: прокси кеширует их (по умолчанию в файле, до 10 дней) и передаёт, когда кто-то заходит. По умолчанию каждый бэкенд получает каждый голос, так что если на каждом работает плагин наград, голосующему платят на каждом. Используйте onlySendToJoinedServer = true с сервером joinedServerFallback, excludedServers или собственную настройку прокси в VotingPlugin.

Proxy forwarding отправляет каждый голос по сети в собственный NuVotifier бэкенда, подписав его токеном бэкенда. Игроки онлайн не нужны, но кеша нет: голос, который не удался после пяти повторов, отбрасывается. Именно эту схему мы тестировали. На каждом бэкенде дайте NuVotifier собственный порт, скопируйте его токен default и задайте disable-v1-protocol: true. На прокси:

[forwarding]
method = "proxy"

[forwarding.proxy.survival]
address = "10.0.0.12"
port = 8193
token = "the survival backend's default token"

Добавьте по одному блоку на каждый бэкенд. Название служит только меткой. В нашем тесте голос v1 и голос v2, отправленные на прокси, дошли до Paper как голоса v2 за секунду:

[nuvotifier]: Successfully forwarded vote Vote (from:ServerList.net username:Steve address:203.0.113.7 timeStamp:1792283636000 additionalData:null) to /127.0.0.1:8192.

Затем мы вписали неверный токен в запись бэкенда на прокси. Список по-прежнему получал от прокси {"status":"ok"}, а бэкенд отклонял каждую копию, и прокси продолжал повторять попытки:

[nuvotifier]: Unable to send vote to /127.0.0.1:8192. Will retry sending in 1 second(s).
[nuvotifier]: Unable to send vote to /127.0.0.1:8192. Will retry sending in 2 second(s).

Так что в сети зелёный тест доказывает только работу прокси. Проверьте и консоль бэкенда. При любом способе закройте бэкенды файрволом так, чтобы к их игровым портам и портам Votifier имел доступ только прокси, иначе кто угодно сможет присылать им поддельные голоса.

Откройте порт

Votifier нужен один порт TCP, доступный из интернета.

  • Игровые хостинги. Добавьте второй порт в панели (часто это выделение во вкладке Network) и укажите его в port NuVotifier. Оставьте host: 0.0.0.0.
  • VPS или выделенный сервер. Откройте порт в файрволе, например sudo ufw allow 8192/tcp, и в сетевом файрволе провайдера, если он есть.
  • Docker. Опубликуйте порт рядом с игровым, например -p 8192:8192.
  • Защита от DDoS. Сервисы, которые защищают игровой адрес, обычно пересылают только порт Minecraft, поэтому направьте Votifier на собственный IP машины. Из 97 карточек с Votifier на 18 октября 2026 года 68 использовали для Votifier другой хост, чем для игры, и у 49 из них это был обычный IP-адрес.

Большинство серверов в итоге оказываются на порту, отличном от 8192. На ту же дату стандартный порт использовали только 19 из этих 97 (сейчас: 18), а всего портов было 70 разных. Два использовали 25575, стандартный порт RCON, что работает, только пока RCON выключен или перенесён.

Чтобы проверить порт снаружи, выполните это с другой машины или из другой сети:

nc -v 203.0.113.10 8192

NuVotifier приветствует каждое соединение строкой вроде VOTIFIER 2 mmdin5k3bh10u2fommgp3hahkv. Если вы её видите, порт открыт и за ним работает NuVotifier. В Windows команда PowerShell Test-NetConnection 203.0.113.10 -Port 8192 для открытого порта показывает TcpTestSucceeded : True, без приветствия.

Добавьте данные в карточку на serverlist.net

Когда вы добавляете сервер, шаг «Голоса» спрашивает про Votifier. Для уже существующей карточки откройте её в панели и перейдите на вкладку «Голосование». В обоих местах одни и те же четыре части.

  1. Где слушает Votifier. Введите хост, через который доступен Votifier, часто это IP сервера, а не адрес, которым пользуются игроки, и порт Votifier, а не игровой порт. Кнопка Проверить порт стучится в этот порт и читает приветствие Votifier, не отправляя голос, так что вы сразу видите, открыт ли порт и отвечает ли за ним NuVotifier или классический Votifier.
  2. Ключ или токен. Выберите Токен NuVotifier и вставьте свой токен default или выберите Публичный ключ Votifier и вставьте всё содержимое public.key. Стандартный 2048-битный ключ представляет собой одну строку из 392 символов, которая начинается с MIIBIjANBgkq. Никогда не вставляйте private.key.
  3. Плагин наград. Эта часть показывает строку, которая нужна VotingPlugin, о ней ниже.
  4. Тестовый голос. Отправьте один перед публикацией или сохранением.

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

Тест через проверку Votifier

Проверка Votifier отправляет один настоящий голос с выбранным вами ником на введённый адрес. Она просит пройти капчу и разрешает пять тестов с одного IP-адреса каждые десять минут. Для v2 она показывает собственный ответ NuVotifier: {"status":"ok"} или ошибку из таблицы ниже. Для v1 она может показать только то, что соединение установлено и голос отправлен, так что подтверждение ищите в консоли.

Доставленный голос начинает в консоли строку вроде этой, после которой перечислены название сервиса, ник, адрес и время голоса:

[Votifier] Got a protocol v2 vote record from /203.0.113.7:50480

Если следующие строки говорят A vote was received, but you don't have any listeners available to listen for it., доставка работает, а не хватает только плагина наград.

Команда консоли testvote обходит сеть, ключ и токен и запускает событие голоса внутри вашего сервера, поэтому она проверяет награды, а не доставку. Дополнительные данные нужно писать в виде key=value:

testvote Steve serviceName=ServerList.net

Введённая как testvote Alex ServerList.net 127.0.0.1, она записала 127.0.0.1 в поле ника, а название сервиса оставила TestVote. На прокси команда называется ptestvote.

Подключите награды через VotingPlugin

VotingPlugin остаётся активно поддерживаемым вариантом (7.1.1, июль 2026 года). SuperbVote, который всё ещё упоминается в руководстве по настройке NuVotifier, последний раз обновлялся в декабре 2020 года.

  1. Положите VotingPlugin.jar в plugins рядом с NuVotifier и перезапустите сервер.

  2. Отправьте тестовый голос. VotingPlugin сам создаёт сайт для любого нового названия сервиса:

    [VotingPlugin] Received a vote from service site 'ServerList.net' by player 'Steve'!
    [VotingPlugin] VoteSite with service site 'ServerList.net' does not exist, attempting to generate...
  3. Откройте plugins/VotingPlugin/VoteSites.yml, найдите созданную запись ServerList_net и задайте ей награду. Готовая запись выглядит так:

    VoteSites:
      ServerList_net:
        Enabled: true
        Name: 'ServerList.net'
        ServiceSite: 'ServerList.net'
        VoteURL: 'https://serverlist.net/server/your-server/vote'
        VoteDelay: 24h
        DisplayItem:
          Material: 'DIAMOND'
          Amount: 1
        Rewards:
          Commands:
          - 'eco give %player% 250'
          Messages:
            Player: '&aThanks for voting on ServerList.net!'

    ServiceSite должен совпадать точно. VoteDelay: 24h соответствует нашему скользящему 24-часовому кулдауну, так что /vote next показывает правильное время. eco give предполагает плагин экономики вроде EssentialsX.

  4. Перезагрузите конфигурацию командой /av reload и проголосуйте ещё раз, указав ник игрока, который уже заходил на ваш сервер.

Этот последний шаг ловит почти всех. С настройками по умолчанию VotingPlugin игнорирует голоса за ники, которых он ни разу не видел:

[VotingPlugin] Player Steve has not joined before, disregarding vote. Reason: unknown-user. Set AllowUnjoined to true to accept.

Проверяйте со своим ником или задайте AllowUnjoined: true в Config.yml. Для игрока, который был офлайн, VotingPlugin объявил голос сразу, но придержал награду-команду, которую по умолчанию выдаёт, когда игрок заходит в следующий раз.

  • Игроки Bedrock. С Geyser и Floodgate ники Bedrock несут префикс, по умолчанию точку, поэтому игрок Bedrock должен голосовать как .Steve, чтобы награда его нашла. За последние 30 дней 6 % всех голосов на serverlist.net пришли с ников Bedrock, поэтому упомяните префикс в сообщении команды /vote. Настройка префикса описана в руководстве по Geyser.
  • Сети. Режим прокси в VotingPlugin настраивается в BungeeSettings.yml. Задайте там каждому бэкенду уникальное имя сервера и держите VoteSites.yml одинаковым на всех.

Что видят игроки со своей стороны и что им говорить, когда награда не пришла, написано в статье почему серверы Minecraft просят голосовать.

Ошибки и что они значат

Каждое сообщение в формате кода взято с нашего тестового стенда. «Список» означает то, что получает список v2 или наша проверка.

Сообщение и где его видноЧто оно значитЧто делать
Connection refused, у списка или в проверкеПо этому адресу и порту ничего не слушает.Найдите в строке Votifier enabled on socket настоящий порт и адрес.
Превышено время ожидания соединения, у списка или в проверкеФайрвол или хостинг сбрасывает соединение, либо адрес защищён и пересылает только игровой порт.Откройте порт TCP. Используйте собственный IP машины.
Votifier was not able to bind to /0.0.0.0:8192, в консоли при запускеПорт уже занят другой программой, часто вторым сервером или прокси на той же машине.Дайте каждому NuVotifier собственный порт.
Could not decrypt data from /203.0.113.7:46788. Make sure the public key on the list is correct., в консолиНесовпадение ключа v1. У списка старый ключ, ключ от другого сервера или обрезанный.Скопируйте public.key заново, целиком, и обновите список.
Signature is not valid (invalid token?), у списка и в консолиНесовпадение токена v2.Скопируйте токен default заново, без пробелов. Удалите любой токен, добавленный под нашим названием сервиса. В сети проверьте также записи бэкендов на прокси.
Unknown service 'ServerList.net', у списка и в консолиВ tokens нет токена default.Добавьте токен default и сообщите его списку.
This server only accepts well-formed Votifier v2 packets., в консолиВключён disable-v1-protocol, а какой-то список отправил голос v1.Переведите этот список на v2 или снова включите v1.
Challenge is not valid, у списка и в консолиСписок ответил неверным запросом. Это ошибка на стороне списка.Сообщите о ней списку.
A vote was received, but you don't have any listeners available to listen for it., в консолиДоставка работает. Не установлен плагин наград.Установите VotingPlugin.
Player Steve has not joined before, disregarding vote. Reason: unknown-user., в консолиVotingPlugin пропустил ник, которого ни разу не видел.Проверяйте с настоящим игроком или задайте AllowUnjoined: true.
Unable to send vote to /127.0.0.1:8192. Will retry sending in 1 second(s)., в консоли проксиПересылка через прокси не может доставить голос на бэкенд: неверный токен, порт или адрес.Прочитайте консоль бэкенда, там настоящая причина.

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

Частые вопросы

Какой порт должен использовать Votifier? Любой свободный порт TCP, который хостинг позволяет открыть. 8192 лишь значение по умолчанию. Он не может совпадать с игровым портом, а если вы используете RCON, избегайте 25575.

Нужен ли мне v2? Нет, мы принимаем оба. v2 лучше там, где список его поддерживает: голоса нельзя воспроизвести повторно, а список может показать вам точную ошибку. Оставляйте v1 включённым для списков, которые отправляют только v1.

Почему некоторые списки поддерживают только v1? v1 это исходный протокол Votifier, который все списки реализовали много лет назад. Протокол v2 появился вместе с NuVotifier, и каждому списку нужно добавлять его отдельно.

Стоит ли настройка усилий? Почти всё голосование идёт там, где настроен Votifier. За последние 30 дней 99,7 % всех голосов на serverlist.net пришлись на карточки с настроенным Votifier. За 30 дней до 18 октября 2026 года это 15 443 из 15 477 голосов, а оставшиеся 34 разделили между собой 11 карточек без Votifier. Голоса влияют и на вашу позицию в списке, а как это вписывается в рост сервера, объясняет руководство о первых 100 игроках.