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.
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
- Wrzuć
nuvotifier.jardo folderupluginsi zrestartuj serwer. - Zapisz port (domyślnie 8192), token i klucz publiczny, które generuje NuVotifier.
- Otwórz ten port dla TCP u hostingu albo w zaporze.
- Dodaj adres, port i token (albo klucz) do swojego wpisu na serverlist.net.
- Wyślij test z Testera Votifier i obserwuj konsolę.
- 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ście | Zawartość rsa/public.key | Token z config.yml |
| Jak chroniony jest głos | Zaszyfrowany twoim kluczem publicznym RSA | Podpisany HMAC-SHA256 z użyciem tokenu, plus nowe wyzwanie przy każdym połączeniu |
| Czy przechwycony głos można odtworzyć | Tak | Nie, każde wyzwanie działa raz |
| Czy lista dowiaduje się, czy się udało | Nie. NuVotifier czyta 256 bajtów i zamyka połączenie bez odpowiedzi | Tak. NuVotifier odpowiada {"status":"ok"} albo błędem z powodem |
| Kto to obsługuje | Prawie każda lista | Listy, 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
Pobierz
nuvotifier.jarze strony wydań NuVotifier na GitHubie albo z jego strony na SpigotMC i wrzuć go do folderupluginsserwera.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.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:votesSprawdź
host. Domyślnie przyjmujeserver-ipzserver.properties, a gdy jest puste,0.0.0.0. Na naszym serwerze testowymserver-ipmiało wartość127.0.0.1, więc NuVotifier po cichu nasłuchiwał na127.0.0.1:8192, gdzie żadna lista nie mogła się nigdy dostać. Czytaj linijkęVotifier enabled on socketpo każdym restarcie. Powinna pokazywać0.0.0.0albo adres osiągalny z internetu.Ustaw
portna port, który daje ci hosting. Musi to być wolny port TCP i nie może być twoim portem gry.Zostaw
disable-v1-protocol: false, chyba że każda lista, z której korzystasz, obsługuje v2.Zrestartuj serwer w całości. W naszym teście token usunięty z
config.ymldziałał po/nvreloadaż 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
portNuVotifiera. Zostawhost: 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.
- 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.
- 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ę odMIIBIjANBgkq. Nigdy nie wklejajprivate.key. - Twój plugin z nagrodami. Ta część pokazuje linijkę, której potrzebuje VotingPlugin, opisaną niżej.
- 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.
Wrzuć
VotingPlugin.jardopluginsobok NuVotifiera i zrestartuj serwer.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...Otwórz
plugins/VotingPlugin/VoteSites.yml, znajdź wygenerowany wpisServerList_neti 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!'ServiceSitemusi pasować dokładnie.VoteDelay: 24hodpowiada naszemu kroczącemu 24-godzinnemu cooldownowi, więc/vote nextpokazuje właściwy czas.eco givezakłada plugin ekonomii, taki jak EssentialsX.Przeładuj przez
/av reloadi 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 trzymajVoteSites.ymljednakowy 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ą widzisz | Co znaczy | Rozwiązanie |
|---|---|---|
Connection refused, na liście albo w testerze | Nic 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 testerze | Zapora 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 starcie | Inny 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 konsoli | Niezgodność 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 konsoli | Niezgodność 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 konsoli | W tokens nie ma tokenu default. | Dodaj token default i podaj go liście. |
This server only accepts well-formed Votifier v2 packets., w konsoli | disable-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 konsoli | Lista 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 konsoli | Dostarczanie działa. Brak pluginu nagród. | Zainstaluj VotingPlugin. |
Player Steve has not joined before, disregarding vote. Reason: unknown-user., w konsoli | VotingPlugin 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 proxy | Proxy 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.
Czytaj dalej
Czytaj dalej.
Głosowanie na serwery Minecraft: po co i jak to działa
Co daje głos, jak trafia z listy do twojej nagrody, zasada 24 godzin, nicki z Bedrocka i co sprawdzić, gdy nagroda za głos nie przychodzi.
Jak zdobyć pierwszych 100 graczy na serwerze Minecraft
Co nasz pinger pokazuje o nowych serwerach Minecraft i jak zdobyć pierwszych 100 graczy: najpierw powroty, potem listy, głosy, Discord i sezony.