Come creare un server Minecraft su un VPS
Configura Paper su Ubuntu 24.04 con Java 21, systemd e firewall sulla porta 25565. Dimensiona la RAM, abilita la whitelist e crea backup sicuri del mondo.
Cosa stai configurando
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, la porta 25565 aperta in entrambi i firewall tra i giocatori e la JVM, e backup eseguiti senza corrompere il mondo che devono proteggere. Il server consiste in un solo file jar e un comando java; tutto ciò che distingue un server su cui i tuoi amici giocano per un anno da uno che si arresta durante il primo fine settimana ruota attorno a quel comando, ed è questo l'argomento della guida.
Due avvertenze importanti prima di spendere denaro. Primo: Minecraft richiede molta memoria ed esegue la maggior parte del lavoro su un solo thread: un VPS con 1 GB non eseguirà un server utilizzabile, mentre un core veloce è preferibile a quattro core lenti. Secondo: questa è la Java Edition. I giocatori Bedrock, le console, i telefoni e l'app Windows Bedrock non possono collegarsi 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.
Ti serve 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 21
Minecraft 1.20.5 e tutte le release successive (incluse tutte le 1.21.x) richiedono Java 21. Ubuntu 24.04 lo include nei repository predefiniti, mentre la versione headless esclude le librerie desktop che un server non utilizzerà mai:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -versionRisultato corretto: la prima riga mostra openjdk version "21.0.x". Se mostra 17 o 11, è installato un altro JRE che ha la precedenza; correggi il problema con sudo update-alternatives --config java e seleziona la voce che contiene java-21.
Saltare questo controllo causa in seguito l'errore del server Minecraft più cercato online. Con Java 17, 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 65.0),
this version of the Java Runtime only recognizes class file versions up to 61.0I numeri indicano la mancata corrispondenza: la versione del file di classe 65.0 corrisponde a Java 21, 61.0 a Java 17 e 60.0 a Java 16. Qualunque coppia venga mostrata, la correzione è la stessa: installa il JRE più recente ed esegui 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.
Passaggio 3: scaricare il file jar del server dalla fonte ufficiale
Solo due siti dovrebbero fornirti un file jar del server: la pagina ufficiale per il download dei server su minecraft.net per Vanilla e la pagina dei download su papermc.io per Paper. I "download hub" di terze parti che riconfezionano i file jar dei server sono da anni un canale per la diffusione di malware. Un file jar del server contiene codice arbitrario che stai per eseguire 24 ore su 24, 7 giorni su 7, su un sistema esposto a Internet.
Copia il link per il download della build corrente dalla pagina ufficiale. L'URL cambia a ogni versione e build, quindi inserirne uno fisso qui lo renderebbe rapidamente obsoleto. Esegui quindi:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Risultato corretto: un server.jar di circa 50 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: aprire la porta 25565 su entrambi i firewall
Minecraft Java usa solo TCP 25565 (UDP è esclusivamente 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. La maggior parte dei provider VPS gestisce un secondo firewall a livello di rete nel pannello di controllo, che spesso viene dimenticato. Aprire anche lì TCP 25565. Se si apre una sola delle due porte, il sintomo è poco specifico: il client resta bloccato su "Connecting to the server..." e restituisce Connection timed out: no further information, senza rifiuto della connessione, errori del server o messaggi nel journal, perché i pacchetti non sono mai arrivati. Verificare da un computer esterno al VPS con nc -vz your.server.ip 25565; succeeded indica che entrambi i firewall consentono il traffico, mentre un blocco indica che almeno uno dei due non è configurato correttamente.
Mentre si configura ufw, lo stesso sistema espone SSH su un IP pubblico e nel giro di poche ore iniziano a comparire numerosi tentativi nei log. Configurare Fail2ban per SSH su Ubuntu 24.04 prima di dimenticarsene.
Ora connettersi: Multiplayer, Direct Connection, quindi l'IP del server. Poiché nel passaggio 4 si è assegnato il ruolo di operatore al proprio utente, i comandi di gioco funzionano immediatamente, /whitelist add FriendName per ogni giocatore, /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 lo ripristini, proprio nel momento in cui un backup deve funzionare, il log si riempie di errori di caricamento dei chunk e nel terreno compaiono dei buchi. Due procedure evitano questo problema.
Arresto-copia-avvio è la soluzione più semplice, al costo di un minuto di inattività:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft(Paper divide le dimensioni in world, world_nether e world_the_end; un server vanilla conserva tutto in world, quindi inserisci lì le altre due.)
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 di tutto su disco e attendi), crea il tar e infine esegui save-on. Questa è la versione da inserire in cron alle 5:00.
In ogni caso, un backup conservato 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, poiché non resterai a osservare la console quando si verifica un problema, configura un controllo esterno sulla porta: Uptime Kuma su un altro server che esegua un controllo TCP su 25565 ti informa che il server non è raggiungibile prima dei giocatori.
Plugin e aggiornamenti
Su Paper, un plugin è un file jar copiato in /opt/minecraft/plugins/, seguito da un riavvio: questa è l’intera procedura di installazione. Scarica i plugin solo dalle pagine ufficiali dei relativi progetti (Hangar, Modrinth, SpigotMC), per lo stesso motivo del file jar del server: ciascun plugin è codice arbitrario eseguito dall’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. Sono necessarie due precauzioni. Gli aggiornamenti dei mondi sono irreversibili: un mondo aperto da una versione più recente non può essere aperto da una versione precedente. Per questo i backup sono ancora più importanti. 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 primo giorno.
Se preferisci gestire tutto questo in un container, con il blocco della versione, l’accettazione dell’EULA e i flag di memoria configurati 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 regole per il firewall e i backup.
FAQ
Quanta RAM richiede un server Minecraft?
2 GB sono sufficienti per la versione vanilla con 2–5 giocatori; 4 GB offrono margine per un server privato di circa dieci giocatori su Paper con alcuni plugin; modpack e più di 20 giocatori richiedono almeno 8 GB. Indipendentemente dalle dimensioni 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 oppure un arresto OOM silenzioso.
Perché i miei amici non riescono a connettersi al mio server Minecraft?
Un client che si blocca e termina con Connection timed out: no further information indica quasi sempre un problema di firewall. I firewall sono due: ufw sul VPS e il firewall di rete del provider nel pannello di controllo. La porta TCP 25565 deve essere aperta in entrambi. Verifica che il server sia effettivamente in ascolto eseguendo sudo ss -tlnp | grep 25565 sul server, 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 con qualsiasi nome utente, incluso quello di un operatore, ereditandone i permessi. Inoltre, le skin e gli UUID stabili non funzionano correttamente. L'unico uso legittimo è dietro un proxy di autenticazione come Velocity, che verifica direttamente i giocatori. Su un server normale deve rimanere 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. Inoltre, offre l'ecosistema dei plugin. L'eccezione riguarda le comunità tecniche di redstone che richiedono un comportamento vanilla identico a livello di singoli 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 gratuitamente.
Come posso eseguire il backup di un mondo Minecraft senza corromperlo?
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. Arresta il server, crea un archivio tar delle directory del mondo e riavvia il server. In alternativa, mantienilo attivo usando save-off, save-all flush, tar e save-on tramite RCON. Poi trasferisci l'archivio fuori dal VPS.