Zaloguj się Dodaj swój serwer

PoradnikDla właścicieli serwerów

Jak skonfigurować NuVotifier i przetestować go krok po kroku

Instalacja NuVotifiera na Paperze albo w sieci Velocity, otwarcie portu, test i znaczenie każdego błędu z logu. Sprawdzone na Paperze 26.3 i Velocity 4.2.

Redakcja ServerList Opublikowano 11 min czytania
Konsola serwera[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 to plugin, który odbiera głosy z list serwerów. Instalujesz go na serwerze albo na proxy, otwierasz jeden port TCP i podajesz każdej liście swój adres, port oraz klucz publiczny v1 albo token v2. Sam nie wydaje żadnych nagród, więc potrzebujesz też pluginu nagród, takiego jak VotingPlugin, a całą drogę warto przetestować raz, zanim powiesz graczom, żeby wpisywali /vote.

Napisaliśmy to z obu końców kabla. serverlist.net wysyła teraz głosy do 95 wpisów, a na potrzeby tego poradnika uruchomiliśmy NuVotifier na świeżym serwerze Paper 26.3 i na proxy Velocity 4.2, wysłaliśmy mu dobre głosy i celowo zepsute, a to, co wypisała konsola, przepisaliśmy. Każda cytowana niżej linijka logu pochodzi z tego zestawu, z przykładowymi tokenami i adresami w miejsce prawdziwych.

Krótka wersja

  1. Wrzuć nuvotifier.jar do folderu plugins i zrestartuj serwer.
  2. Zapisz port (domyślnie 8192), token i klucz publiczny, które generuje NuVotifier.
  3. Otwórz ten port dla TCP u hostingu albo w zaporze.
  4. Dodaj adres, port i token (albo klucz) do swojego wpisu na serverlist.net.
  5. Wyślij test z Testera Votifier i obserwuj konsolę.
  6. Zainstaluj VotingPlugin i przypisz nagrodę stronie głosowania ServerList.net.

Co NuVotifier robi, a czego nie robi

NuVotifier nasłuchuje na porcie TCP. Gdy lista się połączy, odczytuje jedną wiadomość z głosem, sprawdza ją twoim kluczem albo tokenem i uruchamia zdarzenie głosu wewnątrz serwera. Głos niesie cztery rzeczy: nazwę usługi listy (nasza to ServerList.net), nick wpisany przez gracza, adres IP głosującego i znacznik czasu.

Równie ważne jest to, czego nie robi:

  • Nie wydaje nagród. Plugin nagród nasłuchuje zdarzenia i wypłaca.
  • Nie sprawdza, czy gracz istnieje. Nicki waliduje lista, a plugin nagród decyduje, co zrobić z nieznanymi.
  • Używa tylko TCP. Port otwarty wyłącznie dla UDP sprawia, że Votifier jest nieosiągalny.
  • Nic nie odsyła liście v1, co zmienia sposób testowania.

Oficjalnym wydaniem wciąż jest 2.7.3 z lipca 2021, jeden jar dla Paper, Spigot, BungeeCord, Velocity i Sponge. W naszym teście załadował się i odbierał głosy na Paper 26.3 i Velocity 4.2.0 bez zmian. Na Javie 25 wypisuje blok ostrzeżeń, który zawiera WARNING: sun.misc.Unsafe::objectFieldOffset has been called by. Dotyczy to przyszłej zmiany w Javie, a nie błędu, i głosy nadal działały.

Oficjalne wydanie nie obsługuje Folii. Utrzymywany fork azuvotifier ją obsługuje (wersja 3.3.6, listopad 2025) i mówi tym samym protokołem, więc listy traktują go jak NuVotifier.

Klucz v1 czy token v2

Listy mogą rozmawiać z NuVotifierem w dwóch wersjach protokołu i można zostawić włączone obie.

v1 (klucz publiczny)v2 (token)
Co dajesz liścieZawartość rsa/public.keyToken z config.yml
Jak chroniony jest głosZaszyfrowany twoim kluczem publicznym RSAPodpisany HMAC-SHA256 z użyciem tokenu, plus nowe wyzwanie przy każdym połączeniu
Czy przechwycony głos można odtworzyćTakNie, każde wyzwanie działa raz
Czy lista dowiaduje się, czy się udałoNie. NuVotifier czyta 256 bajtów i zamyka połączenie bez odpowiedziTak. NuVotifier odpowiada {"status":"ok"} albo błędem z powodem
Kto to obsługujePrawie każda listaListy, które zaimplementowały protokół NuVotifiera, w tym serverlist.net

Każdy, kto ma twój klucz publiczny v1, może stworzyć ważny głos, bo szyfrowanie nim to cały protokół, więc nigdy nie wklejaj go na publicznym kanale. A to, czy klucz v1 pasował, widać w twojej konsoli i nigdzie indziej.

Na serverlist.net używaj v2. Zostaw v1 włączone, dopóki inne listy, z których korzystasz, go potrzebują. Na 18 października 2026 skonfigurowany Votifier miało 97 z naszych 218 wpisów, 68 z kluczem v1 i 29 z tokenem v2 (na żywo: 68 i 27).

Instalacja na Paper

  1. Pobierz nuvotifier.jar ze strony wydań NuVotifier na GitHubie albo z jego strony na SpigotMC i wrzuć go do folderu plugins serwera.

  2. Uruchom serwer. Przy pierwszym starcie NuVotifier wypisuje twój token i miejsce nasłuchu:

    [Votifier] Your default NuVotifier token is e4qk2v9m1r7t0p5s3a8d6f2h1j.
    [Votifier] Votifier enabled on socket /0.0.0.0:8192.
  3. Zatrzymaj serwer i otwórz plugins/Votifier/config.yml. Bez komentarzy domyślna wersja wygląda tak:

    host: 0.0.0.0
    port: 8192
    disable-v1-protocol: false
    tokens:
      default: e4qk2v9m1r7t0p5s3a8d6f2h1j
    forwarding:
      method: none
      pluginMessaging:
        channel: nuvotifier:votes
  4. Sprawdź host. Domyślnie przyjmuje server-ip z server.properties, a gdy jest puste, 0.0.0.0. Na naszym serwerze testowym server-ip miało wartość 127.0.0.1, więc NuVotifier po cichu nasłuchiwał na 127.0.0.1:8192, gdzie żadna lista nie mogła się nigdy dostać. Czytaj linijkę Votifier enabled on socket po każdym restarcie. Powinna pokazywać 0.0.0.0 albo adres osiągalny z internetu.

  5. Ustaw port na port, który daje ci hosting. Musi to być wolny port TCP i nie może być twoim portem gry.

  6. Zostaw disable-v1-protocol: false, chyba że każda lista, z której korzystasz, obsługuje v2.

  7. Zrestartuj serwer w całości. W naszym teście token usunięty z config.yml działał po /nvreload aż do następnego restartu, więc po zmianie tokenów nie ufaj przeładowaniu.

NuVotifier szuka tokenu po nazwie usługi listy i w razie braku wraca do default. Osobny token dla każdej listy brzmi porządnie, ale nie działa dla żadnej nazwy usługi z kropką, w tym naszej. Paper czyta ServerList.net: pod tokens jako sekcję o nazwie ServerList z kluczem net w środku. Czytnik TOML w Velocity zachowuje cudzysłowy wokół "ServerList.net" jako część nazwy, a bez cudzysłowów config w ogóle się nie wczytuje. Tak czy inaczej wyszukanie pudłuje i NuVotifier sprawdza nasz głos względem default, więc jeśli dostaliśmy osobny token, każdy głos kończy się nieprawidłowym podpisem. Podaj nam token default. Klucze v1 są w plugins/Votifier/rsa/, a z twojego serwera wychodzi tylko public.key.

Instalacja w sieci Velocity albo BungeeCord

W sieci głosy trafiają na proxy, czyli jedyny adres, który znają listy. Zainstaluj ten sam nuvotifier.jar na proxy i na każdym backendzie, który ma odbierać głosy. Config proxy to plugins/nuvotifier/config.toml w Velocity i plugins/NuVotifier/config.yml w BungeeCord.

Przekazywanie głosów do serwerów backendowych

Plugin messaging to prosty wybór dla jednego proxy. Głosy wędrują do backendów przez połączenie samego gracza.

Na proxy (config.toml w Velocity):

host = "0.0.0.0"
port = 8192

[forwarding]
method = "pluginMessaging"

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

Na każdym backendzie (plugins/Votifier/config.yml) wyłącz własny nasłuch backendu, ustawiając port -1, i włącz przekazywanie:

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

Wiadomości pluginowe potrzebują połączonego gracza, więc backend, na którym nikogo nie ma, dostaje swoje głosy później: proxy buforuje je (domyślnie w pliku, do 10 dni) i przekazuje, gdy ktoś wejdzie. Domyślnie każdy backend dostaje każdy głos, więc jeśli na każdym działa plugin nagród, głosujący dostaje nagrodę na każdym. Użyj onlySendToJoinedServer = true z serwerem joinedServerFallback, excludedServers albo własnej konfiguracji proxy w VotingPlugin.

Proxy forwarding wysyła każdy głos przez sieć do własnego NuVotifiera backendu, podpisany tokenem backendu. Nie wymaga graczy online, ale nie ma bufora: głos, który nadal się nie powiedzie po pięciu próbach, jest porzucany. To konfiguracja, którą testowaliśmy. Na każdym backendzie nadaj NuVotifierowi własny port, skopiuj jego token default i ustaw disable-v1-protocol: true. Na proxy:

[forwarding]
method = "proxy"

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

Dodaj jeden blok na backend. Nazwa to tylko etykieta. W naszym teście głos v1 i głos v2 wysłane na proxy dotarły do Papera jako głosy v2 w ciągu sekundy:

[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.

Potem wpisaliśmy zły token we wpisie backendu na proxy. Lista nadal dostawała od proxy {"status":"ok"}, a backend odrzucał każdą kopię i proxy ponawiało próby:

[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).

Zatem w sieci zielony test dowodzi tylko proxy. Sprawdź też konsolę backendu. W obu metodach zabezpiecz backendy zaporą tak, żeby tylko proxy miało dostęp do ich portów gry i Votifiera, bo inaczej każdy mógłby podsyłać im fałszywe głosy.

Otwórz port

Votifier potrzebuje jednego portu TCP osiągalnego z internetu.

  • Hostingi serwerów gier. Dodaj drugi port w panelu (często jako alokację w zakładce Network) i ustaw go w port NuVotifiera. Zostaw host: 0.0.0.0.
  • VPS albo serwer dedykowany. Otwórz go w zaporze, na przykład sudo ufw allow 8192/tcp, oraz w sieciowej zaporze dostawcy, jeśli taka jest.
  • Docker. Opublikuj go obok portu gry, na przykład -p 8192:8192.
  • Ochrona DDoS. Usługi chroniące adres gry zwykle przekazują tylko port Minecrafta, więc wskaż Votifierowi własny adres IP maszyny. Z 97 wpisów z Votifierem 18 października 2026 68 używało innego hosta dla Votifiera niż dla gry, a 49 z nich zwykłego adresu IP.

Większość serwerów kończy na porcie innym niż 8192. W tym samym dniu tylko 19 z tych 97 używało domyślnego (na żywo: 18), łącznie na 70 różnych portach. Dwa używały 25575, domyślnego portu RCON, co działa tylko wtedy, gdy RCON jest wyłączony albo przeniesiony.

Żeby sprawdzić port z zewnątrz, uruchom to z innej maszyny albo sieci:

nc -v 203.0.113.10 8192

NuVotifier wita każde połączenie linijką w rodzaju VOTIFIER 2 mmdin5k3bh10u2fommgp3hahkv. Jeśli ją widzisz, port jest otwarty i stoi za nim NuVotifier. W Windowsie polecenie PowerShella Test-NetConnection 203.0.113.10 -Port 8192 pokazuje TcpTestSucceeded : True dla otwartego portu, bez powitania.

Dodaj dane do wpisu na serverlist.net

Gdy dodajesz serwer, krok Głosy pyta o Votifier. Dla wpisu, który już masz, otwórz go z panelu i użyj zakładki Głosowanie. W obu miejscach są te same cztery części.

  1. Gdzie nasłuchuje Votifier. Wpisz host, który dociera do Votifiera, często IP serwera, a nie adres, którego używają gracze, oraz port Votifiera, a nie port gry. Przycisk Sprawdź port puka do tego portu i czyta powitanie Votifiera bez wysyłania głosu, więc od razu widzisz, czy port jest otwarty i czy odpowiada NuVotifier, czy klasyczny Votifier.
  2. Klucz lub token. Wybierz Token NuVotifier i wklej swój token default, albo wybierz Klucz publiczny Votifier i wklej całą zawartość public.key. Domyślny 2048-bitowy klucz to jedna linijka o długości 392 znaków, zaczynająca się od MIIBIjANBgkq. Nigdy nie wklejaj private.key.
  3. Twój plugin z nagrodami. Ta część pokazuje linijkę, której potrzebuje VotingPlugin, opisaną niżej.
  4. Testowy głos. Wyślij jeden przed publikacją albo zapisem.

Twój token i klucz są przechowywane w postaci zaszyfrowanej. Każdy głos jest najpierw zapisywany, a zaraz potem dostarczany w tle, nieudane dostawy są ponawiane, a każda próba widnieje w dzienniku dostaw w tej zakładce. Nasz poprzedni system nie zachowywał wyników dostaw, więc dodamy tu zestawienie najczęstszych błędów, gdy nowy dziennik zgromadzi pełny miesiąc.

Przetestuj w Testerze Votifier

Tester Votifier wysyła jeden prawdziwy głos, z wybranym przez ciebie nickiem, na podany adres. Prosi o captchę i pozwala na pięć testów z jednego adresu IP co dziesięć minut. Dla v2 pokazuje własną odpowiedź NuVotifiera, {"status":"ok"} albo błąd z tabeli poniżej. Dla v1 może pokazać tylko, że się połączył i wysłał głos, więc potwierdź to w konsoli.

Dostarczony głos zaczyna w konsoli linijkę taką jak ta, a po niej wymienia nazwę usługi, nick, adres i znacznik czasu głosu:

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

Jeśli kolejne linijki mówią A vote was received, but you don't have any listeners available to listen for it., dostarczanie działa i brakuje tylko pluginu nagród.

Komenda konsoli testvote pomija sieć, klucz i token i uruchamia zdarzenie głosu wewnątrz serwera, więc testuje nagrody, a nie dostarczanie. Dodatkowe szczegóły trzeba zapisać jako key=value:

testvote Steve serviceName=ServerList.net

Wpisana jako testvote Alex ServerList.net 127.0.0.1, wstawiła 127.0.0.1 w pole nicku i zostawiła nazwę usługi TestVote. Na proxy komenda to ptestvote.

Podepnij nagrody w VotingPlugin

VotingPlugin to aktywnie utrzymywany wybór (7.1.1, lipiec 2026). SuperbVote, wciąż wymieniony w poradniku konfiguracji NuVotifiera, był ostatnio aktualizowany w grudniu 2020.

  1. Wrzuć VotingPlugin.jar do plugins obok NuVotifiera i zrestartuj serwer.

  2. Wyślij testowy głos. VotingPlugin sam tworzy stronę dla każdej nowej nazwy usługi:

    [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. Otwórz plugins/VotingPlugin/VoteSites.yml, znajdź wygenerowany wpis ServerList_net i przypisz mu nagrodę. Gotowy wpis wygląda tak:

    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 musi pasować dokładnie. VoteDelay: 24h odpowiada naszemu kroczącemu 24-godzinnemu cooldownowi, więc /vote next pokazuje właściwy czas. eco give zakłada plugin ekonomii, taki jak EssentialsX.

  4. Przeładuj przez /av reload i zagłosuj ponownie nickiem gracza, który wszedł już na twój serwer.

Ten ostatni krok łapie prawie wszystkich. Przy domyślnych ustawieniach VotingPlugin ignoruje głosy na nicki, których jeszcze nie widział:

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

Testuj własnym nickiem albo ustaw AllowUnjoined: true w Config.yml. Dla gracza, który był offline, VotingPlugin ogłosił głos od razu, ale wstrzymał nagrodę w postaci komendy, którą domyślnie wydaje, gdy gracz następnym razem wejdzie.

  • Gracze Bedrocka. Przy Geyserze i Floodgate nicki z Bedrocka mają prefiks, domyślnie kropkę, więc gracz Bedrocka musi zagłosować jako .Steve, żeby nagroda go znalazła. W ostatnich 30 dniach 6% wszystkich głosów na serverlist.net pochodziło z nicków z Bedrocka, więc wspomnij o prefiksie w wiadomości z /vote. Ustawienie prefiksu opisuje poradnik o Geyserze.
  • Sieci. Tryb proxy VotingPlugin ustawia się w BungeeSettings.yml. Nadaj tam każdemu backendowi unikalną nazwę serwera i trzymaj VoteSites.yml jednakowy na wszystkich.

To, co gracze widzą po swojej stronie i co im powiedzieć, gdy nagroda przepadnie, jest w tekście dlaczego serwery Minecraft proszą o głosy.

Błędy i co znaczą

Każda wiadomość w formacie kodu pochodzi z naszego zestawu testowego. „Lista” oznacza to, co dostaje lista v2 albo nasz tester.

Wiadomość i gdzie ją widziszCo znaczyRozwiązanie
Connection refused, na liście albo w testerzeNic nie nasłuchuje na tym adresie i porcie.Sprawdź w linijce Votifier enabled on socket prawdziwy port i adres.
Przekroczono czas połączenia, na liście albo w testerzeZapora albo host zrywa połączenie, albo host to chroniony adres, który przekazuje tylko port gry.Otwórz port TCP. Użyj własnego IP maszyny.
Votifier was not able to bind to /0.0.0.0:8192, w konsoli przy starcieInny program już używa tego portu, często drugi serwer albo proxy na tej samej maszynie.Daj każdemu NuVotifierowi własny port.
Could not decrypt data from /203.0.113.7:46788. Make sure the public key on the list is correct., w konsoliNiezgodność klucza v1. Lista ma stary klucz, klucz z innego serwera albo ucięty.Skopiuj public.key jeszcze raz, w całości, i zaktualizuj listę.
Signature is not valid (invalid token?), na liście i w konsoliNiezgodność tokenu v2.Skopiuj token default jeszcze raz, bez spacji. Usuń każdy token dodany pod naszą nazwą usługi. W sieci sprawdź też wpisy backendów na proxy.
Unknown service 'ServerList.net', na liście i w konsoliW tokens nie ma tokenu default.Dodaj token default i podaj go liście.
This server only accepts well-formed Votifier v2 packets., w konsolidisable-v1-protocol jest włączone, a lista wysłała głos v1.Przełącz tę listę na v2 albo włącz z powrotem v1.
Challenge is not valid, na liście i w konsoliLista odpowiedziała złym wyzwaniem. To błąd po stronie listy.Zgłoś go liście.
A vote was received, but you don't have any listeners available to listen for it., w konsoliDostarczanie działa. Brak pluginu nagród.Zainstaluj VotingPlugin.
Player Steve has not joined before, disregarding vote. Reason: unknown-user., w konsoliVotingPlugin pominął nick, którego nigdy nie widział.Testuj z prawdziwym graczem albo ustaw AllowUnjoined: true.
Unable to send vote to /127.0.0.1:8192. Will retry sending in 1 second(s)., w konsoli proxyProxy forwarding nie może dostarczyć głosu do backendu: zły token, port albo adres.Przeczytaj konsolę backendu, żeby poznać prawdziwy powód.

Gdy błędy przychodzą seriami, NuVotifier przestaje je wypisywać po piątym w ciągu dwóch sekund, więc wysyłaj jeden test naraz.

Najczęstsze pytania

Którego portu powinien używać Votifier? Dowolnego wolnego portu TCP, który hosting pozwala otworzyć. 8192 to tylko wartość domyślna. Nie może to być port gry, a jeśli używasz RCON, unikaj 25575.

Czy potrzebuję v2? Nie, przyjmujemy oba. v2 jest lepsze tam, gdzie lista je obsługuje: głosów nie da się odtworzyć, a lista może pokazać ci dokładny błąd. Zostaw v1 włączone dla list, które wysyłają tylko v1.

Dlaczego niektóre listy obsługują tylko v1? v1 to oryginalny protokół Votifiera, który każda lista zaimplementowała lata temu. v2 pojawiło się z NuVotifierem i każda lista musi je dodać osobno.

Czy ta konfiguracja się opłaca? Prawie całe głosowanie odbywa się tam, gdzie Votifier jest skonfigurowany. W ostatnich 30 dniach 99,7% wszystkich głosów na serverlist.net trafiło do wpisów ze skonfigurowanym Votifierem. W 30 dniach do 18 października 2026 było to 15 443 z 15 477 głosów, a 11 wpisów bez Votifiera dzieliło między siebie pozostałe 34. Głosy wpływają też na twoją pozycję na liście, co poradnik o pierwszych 100 graczach umieszcza w kontekście.