Come creare un server Minecraft su un VPS
Guida a Paper su Ubuntu 24.04: RAM, Java 25, systemd, porta 25565, whitelist, backup sicuri del mondo e correzione degli errori piu comuni.
Cosa stai realizzando
Un server Minecraft Java Edition sempre disponibile: Paper su Ubuntu 24.04, eseguito come utente dedicato minecraft tramite systemd con Restart=on-failure, con whitelist attiva, porta 25565 aperta in ufw e nel firewall di rete del provider, se disponibile, e backup eseguiti senza corrompere il mondo che devono proteggere. Il server consiste in un jar e in un comando java; tutto ciò che distingue un server su cui i tuoi amici giocano per un anno da uno che si arresta definitivamente il primo fine settimana ruota attorno a quel comando. Questa guida tratta proprio questi aspetti.
Due avvertenze prima di spendere denaro. Primo: Minecraft richiede molta memoria ed è principalmente single-threaded. Un VPS da 1 GB non esegue un server con prestazioni adeguate, mentre un core veloce è preferibile a quattro core lenti. Secondo: questo è Java Edition. I giocatori su Bedrock, console, telefoni e sull'app Windows Bedrock non possono connettersi a un server Java. Bedrock richiede un software server diverso sulla porta UDP 19132 oppure il plugin Geyser, che non rientra nell'ambito di questa guida.
Servono un VPS KVM Ubuntu 24.04 appena installato con accesso root o sudo e circa trenta minuti.
Dimensionamento: di cosa ha realmente bisogno un server per amici
La RAM è il dato più importante e i valori reali sono inferiori a quelli indicati nei forum dei modpack:
- 2 GB eseguono il gioco vanilla per 2–5 giocatori con una distanza di visualizzazione moderata. È giocabile, ma senza margine.
- 4 GB sono la dimensione ideale per un server per amici: circa dieci giocatori contemporaneamente su Paper con alcuni plugin, lasciando memoria sufficiente per il sistema operativo.
- 8 GB e oltre sono adatti ai modpack e a più di 20 giocatori. In questo caso è necessario considerare anche la velocità della CPU su un singolo core, perché il ciclo principale del gioco viene eseguito su un solo thread.
Anche lo spazio su disco occupato dal mondo aumenta quando i giocatori esplorano. Un mondo survival molto esplorato può raggiungere diversi gigabyte, quindi lascia margine per il mondo e per i relativi backup.
Vanilla o Paper? Paper è un sostituto diretto del jar ufficiale: utilizza gli stessi mondi e gli stessi client e non richiede mod lato client. Riscrive i percorsi più lenti del server, come il caricamento dei chunk, l'elaborazione delle entità e il funzionamento degli hopper, e aggiunge un'API per i plugin. L'unico motivo per eseguire vanilla è la necessità di meccaniche vanilla identiche a livello di bit per farm tecniche di redstone che le ottimizzazioni di Paper possono modificare; per tutti gli altri casi, Paper supporta più giocatori per gigabyte. Tutto ciò che segue funziona con entrambe le opzioni.
Passaggio 1: installare Java 25
Minecraft 26.1 e tutte le release successive richiedono Java 25; Java 21 supporta solo la serie precedente dalla 1.20 alla 1.21.11. Ubuntu 24.04 distribuisce Java 25 tramite i repository degli aggiornamenti e della sicurezza. Installare il JRE completo, non la build -headless: la guida all'installazione di Java di Paper sconsiglia le varianti headless perché non includono le dipendenze richieste da Paper.
sudo apt update && sudo apt install -y openjdk-25-jre
java -versionRisultato corretto: la prima riga è openjdk version "25.0.x". Se mostra 21, 17 o 11, è installato un altro JRE che ha la precedenza; correggere il problema con sudo update-alternatives --config java e selezionare la voce che contiene java-25.
Saltare questo controllo causa in seguito l'errore del server Minecraft più cercato su Google. Con Java 21, il file jar del server termina immediatamente con:
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
compiled by a more recent version of the Java Runtime (class file version 69.0),
this version of the Java Runtime only recognizes class file versions up to 65.0I numeri identificano l'incompatibilità: la versione del file di classe 69.0 corrisponde a Java 25, 65.0 a Java 21 e 61.0 a Java 17. Qualunque sia la coppia visualizzata, la correzione è la stessa: installare il JRE più recente ed eseguire nuovamente update-alternatives.
Passaggio 2: un utente dedicato, mai root
Il server esegue il codice dei plugin ed elabora dati di rete provenienti da chiunque possa raggiungere la porta. Se qualcosa va storto, una compromissione eseguita come root prende il controllo del VPS; una eseguita come minecraft prende il controllo di un mondo di gioco.
sudo adduser --system --group --home /opt/minecraft minecraft--system crea un account senza password che non può accedere tramite SSH, con /opt/minecraft come directory home e directory di lavoro. Da questo momento, ogni comando che interagisce con il server viene eseguito con questo utente.
Passo 3: scaricare il server jar dalla fonte ufficiale
Il server jar deve provenire esclusivamente da una di queste due fonti: la pagina ufficiale per il download del server su minecraft.net per Vanilla oppure la pagina dei download su papermc.io per Paper. I «download hub» di terze parti che riconfezionano i server jar sono da anni un canale diffuso per il malware. Un server jar contiene codice arbitrario che state per eseguire 24/7 su un server esposto a Internet.
Copiate dalla pagina ufficiale il link per il download della build corrente. L'URL cambia a ogni versione e build, quindi inserirne uno fisso qui lo renderebbe rapidamente obsoleto. Quindi:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Risultato corretto: un server.jar di circa 60 MB, di proprietà di minecraft, verificato con ls -lh /opt/minecraft/server.jar.
Passaggio 4: primo avvio, EULA e assegnazione dei privilegi operatore
Esegui il server in modo interattivo una volta prima di configurare systemd. Il primo avvio svolge due sole attività che una console attiva gestisce correttamente.
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiIl processo termina entro pochi secondi. Prima, Paper impiega qualche istante aggiuntivo per applicare le proprie patch. Il log termina con la riga che tutti incontrano:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.Non si tratta di un errore, ma di un controllo della licenza. L'avvio ha creato eula.txt accanto al file jar. Leggi l'EULA collegata, se non l'hai ancora fatto, quindi modifica il flag:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtEsegui di nuovo lo stesso comando java. Questa volta il server genera il mondo, impiegando uno o due minuti al primo avvio, quindi raggiunge questo stato:
[Server thread/INFO]: Done (9.204s)! For help, type "help"Ora hai una console attiva. Usala per la seconda attività: digita op YourMinecraftName (il tuo nome utente esatto nel gioco). Il server ti aggiunge a ops.json, così in seguito, quando non sarà collegata alcuna console, potrai eseguire tutti i comandi di amministrazione direttamente dal gioco. Digita quindi stop per salvare e uscire correttamente.
Passaggio 5: server.properties e perché online-mode resta true
La prima esecuzione ha scritto anche server.properties. La maggior parte dei valori predefiniti va bene; queste sono le righe su cui conviene prendere una decisione consapevole:
online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually knowonline-mode=true fa verificare al server ogni nome utente che accede tramite i server di sessione di Mojang, dimostrando che il giocatore possiede l'account. Impostarlo su false, l'opzione "cracked server", significa che il server accetta l'identità dichiarata da qualsiasi client: chiunque può accedere con qualsiasi nome, incluso il tuo. Poiché gli operatori e le whitelist si basano sul nome, un utente che si spaccia per te accede con le tue autorizzazioni di operatore. L'unico motivo legittimo per impostarlo su false è usare un proxy di autenticazione come Velocity, che verifica autonomamente i giocatori. Su un server normale resta true, senza eccezioni.
view-distance è il principale parametro per le prestazioni nel file. Il consumo di CPU e RAM cresce approssimativamente con il suo quadrato. 8 è un valore predefinito ragionevole per un VPS; 10 è il valore predefinito di vanilla e richiede sensibilmente più risorse.
white-list=true più enforce-whitelist=true impedisce l'accesso agli utenti sconosciuti; come spiega la sezione sulla sicurezza più avanti, non è un'opzione. Aggiungi i giocatori in gioco con /whitelist add TheirName come operatore.
Passaggio 6: flag della memoria, perché -Xms e -Xmx devono coincidere
La JVM alloca l'heap tra -Xms (dimensione iniziale) e -Xmx (limite massimo). Su un server di gioco dedicato, impostali allo stesso valore: l'heap raggiungerà comunque il limite massimo e aumentarlo gradualmente causa solo ulteriore attività del garbage collector durante il gioco. Su un VPS da 4 GB, la coppia corretta è:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx non indica la memoria totale utilizzata dal processo. La JVM aggiunge l'overhead off-heap, gli stack dei thread, le cache JIT e i buffer diretti, per un totale di circa mezzo gigabyte o più. Anche Ubuntu ha bisogno di memoria disponibile. La regola pratica è: -Xmx al massimo la RAM del VPS meno 1 GB. Se superi questo valore, si verifica uno di due errori. Se l'allocazione non riesce all'avvio, il server rifiuta di partire con:
Error: Could not reserve enough space for object heapQuesto errore è chiaro e immediato. Il caso più problematico si verifica quando il server si avvia normalmente e si arresta dopo alcune ore, quando l'heap si riempie sotto carico e l'OOM killer del kernel sceglie il processo più grande del sistema, cioè la JVM. Nel log del server non compare nulla. L'evidenza si trova in sudo dmesg | grep -i oom, con una riga come Out of memory: Killed process 1234 (java). Se il servizio si riavvia in modo apparentemente casuale, controlla prima quel file e riduci -Xmx.
Per Paper, il progetto documenta i flag di Aikar, un set ottimizzato per G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 e una dozzina di flag correlati) che rende più regolari le pause del garbage collector sugli heap più grandi. Genera la riga completa dalla documentazione di Paper. Su un heap da 2–4 GB, il beneficio è modesto, ma i flag non causano problemi.
Passaggio 7: un'unità systemd con Restart=on-failure
Un server avviato manualmente termina con la sessione SSH e resta inattivo dopo un riavvio. Scrivi /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fRisultato corretto: status mostra active (running) e il journal, che ora contiene l'output della console del server, termina di nuovo alla riga Done.
Nell'unità sono presenti due scelte intenzionali. Restart=on-failure riavvia il server dopo un arresto anomalo, ma non dopo un stop completato correttamente, così la manutenzione resta possibile. Anche TimeoutStopSec=120 è più importante di quanto sembri: systemctl stop invia SIGTERM, il server Minecraft lo intercetta e salva tutti i mondi prima di terminare. Su un mondo di grandi dimensioni, il salvataggio richiede tempo. Il timeout predefinito di systemd può inviare SIGKILL alla JVM durante il salvataggio. È proprio così che i file delle regioni si danneggiano. Imposta due minuti.
Se il servizio si riavvia continuamente e il journal mostra:
[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?allora qualcosa sta già usando la porta 25565. Quasi sempre si tratta dell'esecuzione in primo piano avviata in precedenza e ancora attiva in un'altra sessione SSH. Trovala con sudo ss -tlnp | grep 25565 e arresta quella copia; non eseguire mai due server sulla stessa porta.
Passaggio 8: apri la porta 25565 su entrambi i firewall
Minecraft Java usa soltanto TCP 25565 (UDP serve esclusivamente per il protocollo di query opzionale, disattivato per impostazione predefinita). Sul VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableQuesto è il primo firewall. Molti provider VPS offrono anche un secondo firewall a livello di rete nel pannello di controllo. Quando è attivo, viene spesso dimenticato. Su SSD Nodes si tratta dell'add-on Advanced Firewall Groups, un'opzione a pagamento che puoi assegnare durante il checkout o dal dashboard. Se il tuo server ne dispone, apri anche lì TCP 25565. Il sintomo di una regola mancante in uno dei due firewall è molto generico: il client resta bloccato su "Connecting to the server..." e termina con Connection timed out: no further information. Non compare alcun rifiuto, nessun errore del server e nulla nel journal, perché i pacchetti non sono mai arrivati. Verifica da una macchina esterna al VPS con nc -vz your.server.ip 25565. succeeded indica che tutti i firewall presenti lungo il percorso consentono il traffico. Un blocco prolungato di solito significa che uno di essi sta ancora scartando i pacchetti, anche se un host troppo occupato per accettare connessioni può causare un timeout. Verifica quindi che il server sia in ascolto con ss direttamente sul server.
Mentre sei in ufw, considera che lo stesso server esegue SSH su un IP pubblico e che nel giro di poche ore inizieranno a comparire numerosi tentativi di brute force nei log. Configura Fail2ban per SSH su Ubuntu 24.04 prima di dimenticartene.
Ora connettiti: Multiplayer, Direct Connection, inserisci l'IP del server. Poiché nel passaggio 4 hai assegnato a te stesso i privilegi di op, i comandi in gioco funzionano subito: /whitelist add FriendName per ogni giocatore e /gamemode creative se questo è il piano.
Passo 9: whitelist, perché Internet individua la porta 25565
Lasciare un server Minecraft aperto a Internet non è un rischio teorico: gli scanner automatici esaminano continuamente l'intero spazio IPv4 alla ricerca della porta 25565, i progetti amatoriali di griefing hanno mappato in questo modo centinaia di migliaia di server aperti e un server senza whitelist riceve visitatori indesiderati entro pochi giorni, talvolta poche ore. La whitelist del passaggio 5 risolve il problema: online-mode=true verifica l'identità, mentre la whitelist limita l'accesso alle identità scelte. Questo costituisce l'intero modello di sicurezza ed è sufficiente per un server destinato agli amici.
Per accedere alla console senza usare il gioco e per eseguire backup tramite script e un processo cron, abilita RCON in server.properties (enable-rcon=true, una rcon.password complessa, porta 25575) e compila il piccolo client mcrcon dal relativo codice sorgente GitHub direttamente sul VPS; il pacchetto non è disponibile nei repository di Ubuntu. Non aprire la porta 25575 in alcun firewall: RCON invia la password in chiaro, quindi deve rimanere accessibile solo tramite loopback.
Passaggio 10: backup che non corrompono il mondo
La regola è una sola: non copiare mai una directory del mondo mentre il server la sta scrivendo. I file delle regioni vengono riscritti continuamente durante il gioco; un tar che si sovrappone a una scrittura produce un archivio con chunk scritti solo parzialmente. Quando sarà necessario ripristinarlo, proprio nel momento in cui un backup deve funzionare, il log si riempirà di errori durante il caricamento dei chunk e nel terreno compariranno buchi. Due procedure evitano il problema.
Stop-copy-start è la soluzione più semplice, al costo di un minuto di indisponibilità:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world
sudo systemctl start minecraft(Dalla versione 26.1, Paper mantiene tutte e tre le dimensioni in world/dimensions/, come fa vanilla, quindi world contiene l’intero mondo. Un server Paper che usa ancora la versione 1.21.11 o precedente le separa in world, world_nether e world_the_end; in quel caso aggiungi queste due directory al tar.)
Save-off esegue il backup mentre il server è attivo: tramite RCON, esegui save-off (arresta il salvataggio automatico), quindi save-all flush (forza la scrittura completa su disco e attendi), crea il tar e infine esegui save-on. Questa è la versione da inserire in cron alle 5 del mattino.
In ogni caso, un backup che si trova sullo stesso VPS del server non è un backup: scp o rclone gli archivi al di fuori del server e conserva più di una copia. Inoltre, non potrai controllare la console quando si verifica un problema. Configura quindi un controllo esterno sulla porta: Uptime Kuma su un altro server che esegua un controllo TCP sulla porta 25565 ti avvisa che il server è inattivo prima che se ne accorgano i giocatori.
Plugin e aggiornamenti
In pratica, un plugin è un file jar copiato in /opt/minecraft/plugins/ seguito da un riavvio: l'installazione consiste in questo. Scarica i plugin esclusivamente dalle pagine ufficiali dei relativi progetti (Hangar, Modrinth, SpigotMC), per lo stesso motivo del file jar del server: ogni plugin è codice arbitrario eseguito con l'utente minecraft.
L'aggiornamento del server consiste nel fermarlo, eseguire un backup, sostituire server.jar con la build per la nuova versione di Minecraft e riavviarlo. Occorre prestare attenzione a due aspetti. Gli aggiornamenti dei mondi sono irreversibili: un mondo aperto con una versione più recente non può essere aperto con una versione precedente. Anche per questo i backup sono indispensabili. Inoltre, spesso i plugin supportano una nuova release di Minecraft solo dopo alcuni giorni o settimane. Verifica quindi la compatibilità prima di installare una release il giorno stesso della pubblicazione. Il passaggio da 1.21.11 a 26.1 o versioni successive richiede anche Java 25 (passaggio 1) e sposta le directory Nether ed End di Paper in world/dimensions/.
Se preferisci gestire tutto in un container, con blocco della versione, accettazione dell'EULA e flag di memoria definiti come variabili d'ambiente, l'immagine itzg/minecraft-server, ampiamente utilizzata, esegue lo stesso server Paper tramite Docker Compose sul tuo VPS, mantenendo le stesse procedure per firewall e backup.
FAQ
Quanta RAM richiede un server Minecraft?
2 GB sono sufficienti per eseguire il server vanilla con 2–5 giocatori; 4 GB offrono un margine adeguato per un server per circa dieci amici basato su Paper e con alcuni plugin; modpack e più di 20 giocatori richiedono 8 GB o più. Indipendentemente dalla memoria del VPS, imposta -Xmx a un valore non superiore alla RAM totale meno 1 GB, perché la JVM utilizza memoria anche oltre l'heap e un valore eccessivo causa Error: Could not reserve enough space for object heap o un arresto OOM silenzioso.
Perché i miei amici non riescono a connettersi al server Minecraft?
Un client che resta bloccato e termina con Connection timed out: no further information indica in genere un problema di firewall: ufw sul VPS e il firewall di rete del provider, se attivo nel pannello di controllo. TCP 25565 deve essere aperto in ogni firewall presente nel percorso. Verifica che il server sia effettivamente in ascolto usando sudo ss -tlnp | grep 25565 sul sistema, quindi esegui un test dall'esterno con nc -vz your.server.ip 25565.
Devo impostare online-mode=false in server.properties?
No. Con online-mode=false il server ignora completamente l'autenticazione Mojang. Chiunque può quindi accedere usando qualsiasi nome utente, anche quello di un operatore, e acquisire i relativi permessi. Inoltre, le skin e gli UUID stabili non funzionano correttamente. L'unico utilizzo legittimo è dietro un proxy che esegue l'autenticazione, come Velocity, e verifica direttamente i giocatori. In un server normale deve restare true.
Paper è migliore del server Minecraft vanilla?
Per quasi tutti, sì. Paper è un file jar sostituibile direttamente che carica i mondi vanilla e accetta client non modificati. Gestisce le entità e carica i chunk in modo molto più efficiente, oltre ad aggiungere l'ecosistema dei plugin. L'eccezione riguarda le comunità tecniche che usano redstone e richiedono un comportamento vanilla identico a livello di singolo bit, perché alcune ottimizzazioni di Paper lo modificano. Su un VPS di piccole dimensioni, l'efficienza di Paper equivale di fatto a disporre di RAM aggiuntiva senza costi.
Come posso eseguire il backup di un mondo Minecraft senza danneggiarlo?
Non archiviare mai la directory del mondo mentre il server vi sta scrivendo. Una copia eseguita durante la scrittura di un file region può produrre chunk corrotti, rilevabili solo al momento del ripristino. Puoi arrestare il server, creare un archivio tar delle directory del mondo e riavviarlo, oppure mantenerlo attivo usando save-off, save-all flush, tar e save-on tramite RCON. Sposta quindi l'archivio fuori dal VPS.