SSD Nodes Learn
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-07-24

Come creare un server Minecraft su VPS Ubuntu

Guida completa per installare Paper su Ubuntu 24.04 con Java 21. Configura systemd, apri la porta 25565 e gestisci i backup senza corrompere il mondo.

Cosa stai costruendo

Un server Minecraft Java Edition stabile: Paper su Ubuntu 24.04, eseguito come utente dedicato minecraft tramite systemd con Restart=on-failure, whitelist attiva, porta 25565 aperta in entrambi i firewall situati tra i giocatori e la JVM, e backup eseguiti senza corrompere il mondo da proteggere. Il server consiste in un file jar e un comando java; tutto ciò che distingue un server su cui i tuoi amici giocano per un anno da uno che smette di funzionare dopo il primo weekend dipende da quel comando, ed è questo che spiega questa guida.

Due avvertenze importanti prima di procedere con l'acquisto. Primo, Minecraft richiede molta memoria e utilizza principalmente un singolo thread: un VPS da 1 GB non permetterà di avviare un server giocabile, e un core veloce è preferibile a quattro core lenti. Secondo, si tratta della Java Edition. I giocatori Bedrock — console, smartphone, app Windows Bedrock — non possono connettersi a un server Java; Bedrock richiede un software server differente sulla porta UDP 19132, oppure il plugin Geyser, che non è oggetto di questa guida.

Ti serve un nuovo VPS KVM con Ubuntu 24.04 con privilegi root o sudo, e circa trenta minuti di tempo.

Dimensionamento: di cosa ha realmente bisogno il server per gli amici

La RAM è il parametro fondamentale. I valori reali sono inferiori a quelli suggeriti nei forum dei modpack:

  • 2 GB sono sufficienti per la versione vanilla con 2–5 giocatori e una distanza di visualizzazione modesta. Giocabile, ma senza margini di espansione.
  • 4 GB è la dimensione ideale per un server tra amici: circa dieci giocatori contemporanei su Paper con alcuni plugin, con risorse sufficienti per il sistema operativo.
  • 8 GB e oltre sono indicati per i modpack e per oltre 20 giocatori; in questo caso è necessario considerare anche la velocità della CPU single-core, poiché il loop principale del gioco gira su un singolo thread.

Anche lo spazio su disco aumenta man mano che i giocatori esplorano: un mondo survival molto esplorato può raggiungere diversi gigabyte. Prevedere spazio sufficiente sia per il mondo che per i relativi backup.

Vanilla o Paper? Paper è un sostituto diretto del file jar ufficiale: mantiene gli stessi mondi e gli stessi client, senza necessità di mod lato client. Paper riscrive i processi server più lenti — caricamento chunk, ticking delle entità, hopper — e aggiunge un'API per i plugin. L'unico motivo per usare la versione vanilla è la necessità di meccaniche vanilla identiche per farm di redstone tecniche che le ottimizzazioni di Paper potrebbero alterare; per tutti gli altri, Paper offre più giocatori per gigabyte. Tutte le configurazioni indicate sopra sono valide per entrambi.

Step 1: install Java 21

Minecraft 1.20.5 e ogni release successiva (tutte le 1.21.x) richiede Java 21. Ubuntu 24.04 include il pacchetto nei repository predefiniti; la versione headless esclude le librerie desktop non necessarie al server:

sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version

Risultato corretto: la prima riga deve riportare openjdk version "21.0.x". Se riporta 17 o 11, è installata un'altra JRE che ha la precedenza; risolvi il problema con sudo update-alternatives --config java e seleziona l'opzione contenente java-21.

Saltare questo controllo causa l'errore più comune cercato su Google durante la gestione di un server Minecraft. Con Java 17, il file jar del server si interrompe 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.0

I numeri indicano l'incompatibilità: la class file version 65.0 corrisponde a Java 21, la 61.0 a Java 17, la 60.0 a Java 16. Indipendentemente dalla coppia visualizzata, la soluzione è la stessa — installa la JRE più recente ed esegui nuovamente update-alternatives.

Step 2: un utente dedicato, mai root

Il server esegue il codice dei plugin e analizza l'input di rete proveniente da chiunque raggiunga la porta. Se si verifica una vulnerabilità, un compromesso eseguito come root prende il controllo del VPS; un compromesso eseguito come minecraft prende il controllo solo di un mondo di gioco.

sudo adduser --system --group --home /opt/minecraft minecraft

--system crea un account senza password che non può effettuare il login tramite SSH, con /opt/minecraft come directory home e di lavoro. Ogni comando che interagisce con il server da questo momento in poi viene eseguito come questo utente.

Step 3: scarica il server jar dalla fonte ufficiale

Esistono solo due fonti affidabili per il server jar: la pagina ufficiale di download di minecraft.net per la versione vanilla, e la pagina download di papermc.io per Paper. I "download hub" di terze parti che riimpacchettano i server jar sono un canale noto per la distribuzione di malware. Un server jar è codice arbitrario che verrà eseguito 24/7 su un server esposto a Internet.

Copia il link di download dell'ultima build dalla pagina ufficiale (l'URL cambia con ogni versione e build, quindi non utilizzare un link statico), 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.

Step 4: primo avvio, EULA e auto-amministrazione

Esegui il server in modalità interattiva una volta prima di configurare systemd. Il primo avvio richiede due operazioni che solo una console live può gestire correttamente.

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

Il processo termina dopo pochi secondi — Paper impiega qualche istante in più per applicare le patch — e il log termina con la riga tipica:

[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; è un controllo della licenza. Il comando ha scritto eula.txt accanto al file jar. Leggi l'EULA tramite il link se non l'hai già fatto, quindi imposta il flag:

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

Esegui nuovamente lo stesso comando java. Questa volta viene generato il mondo — richiede uno o due minuti al primo avvio — e il processo si ferma a:

[Server thread/INFO]: Done (9.204s)! For help, type "help"

Ora hai una console attiva. Usala per la seconda operazione: digita op YourMinecraftName (il tuo username esatto in-game) e il server ti aggiungerà a ops.json. In questo modo, quando non ci sarà una console collegata, potrai eseguire tutti i comandi admin direttamente dal gioco. Digita poi stop per salvare ed uscire correttamente.

Step 5: server.properties, e perché online-mode deve rimanere true

La prima esecuzione ha generato anche server.properties. La maggior parte dei valori predefiniti è corretta; queste righe richiedono invece una scelta deliberata:

online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually know

online-mode=true costringe il server a verificare ogni username in entrata tramite i server di sessione di Mojang, confermando la proprietà dell'account da parte del giocatore. Impostarlo su false — l'opzione per i "cracked server" — significa che il server accetta l'identità dichiarata dal client: chiunque può connettersi con qualsiasi nome, incluso il tuo. Poiché i permessi di op e le whitelist sono basati sul nome, un malintenzionato può ottenere i tuoi privilegi di operatore. L'unico motivo valido per impostarlo su false è l'uso di un proxy di autenticazione come Velocity, che gestisce autonomamente la verifica dei giocatori. Su un server standard, deve rimanere true.

view-distance è il parametro con il maggiore impatto sulle prestazioni del file — il consumo di CPU e RAM cresce approssimativamente con il quadrato del valore. 8 è un valore predefinito sensato per un VPS; 10 è il valore predefinito vanilla ed è sensibilmente più pesante.

white-list=true insieme a enforce-whitelist=true impedisce l'accesso a utenti estranei; la sezione dedicata alla sicurezza spiega che questa impostazione non è opzionale. Aggiungi i giocatori tramite il comando /whitelist add TheirName in-game avendo i permessi di op.

Step 6: memory flags — perché -Xms e -Xmx devono coincidere

La JVM alloca il proprio 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 l'espansione graduale aumenta il carico del garbage collector durante il gioco. Su un VPS da 4 GB, la combinazione corretta è:

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx non è la memoria totale utilizzata dal processo. La JVM aggiunge un overhead off-heap — thread stacks, JIT caches, direct buffers — di circa mezzo gigabyte o più, e Ubuntu richiede memoria libera. La regola generale: -Xmx deve essere al massimo la RAM del VPS meno 1 GB. Se superi questo limite, si verificano due tipi di errore. Se l'allocazione fallisce all'avvio, il server non parte e restituisce:

Error: Could not reserve enough space for object heap

Questo errore è esplicito e immediato. La versione peggiore avviene quando il server si avvia correttamente ma crasha dopo ore, quando l'heap si riempie sotto carico e l'OOM killer del kernel termina il processo più pesante — la JVM. Non apparirà nulla nei log del server; le prove si trovano in sudo dmesg | grep -i oom, in una riga simile a Out of memory: Killed process 1234 (java). Se il servizio si riavvia in modo "casuale", controlla prima lì e riduci -Xmx.

Per Paper, il progetto raccomanda gli Aikar's flags — un set di parametri G1GC ottimizzati (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 e altri) che riduce le pause del garbage collection su heap di grandi dimensioni. Genera la riga completa dalla documentazione di Paper; su un heap da 2–4 GB il guadagno è modesto, ma i flag non causano problemi.

Step 7: un'unità systemd con Restart=on-failure

Un server avviato manualmente si chiude quando termina la sessione SSH e rimane spento 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.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

Risultato corretto: status mostra active (running), e il journal — che ora contiene l'output della console del server — termina di nuovo alla riga Done.

Ci sono due scelte deliberate in quell'unità. Restart=on-failure riavvia il server dopo un crash ma non dopo un stop pulito, rendendo possibile la manutenzione. E TimeoutStopSec=120 è più importante di quanto sembri: systemctl stop invia SIGTERM, il server Minecraft lo riceve e salva ogni mondo prima di uscire; su un mondo di grandi dimensioni, il salvataggio richiede tempo. Il timeout predefinito di systemd può inviare SIGKILL alla JVM durante il salvataggio, causando la corruzione dei file di regione. Imposta un tempo di due minuti.

Se il servizio va in flapping 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 un processo sta già occupando la porta 25565 — quasi sempre si tratta della precedente esecuzione in foreground ancora attiva in un'altra sessione SSH. Individualo con sudo ss -tlnp | grep 25565 e ferma quella copia; non eseguire mai due server sulla stessa porta.

Step 8: aprire la porta 25565 su entrambi i firewall

Minecraft Java utilizza esclusivamente TCP 25565 (UDP è solo il protocollo query opzionale, disabilitato di default). Sul VPS:

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

Questo è il primo firewall. La maggior parte dei provider VPS utilizza un secondo firewall a livello di rete nel pannello di controllo; è questo che spesso viene dimenticato. Apri anche la porta TCP 25565 lì. Il sintomo di una configurazione incompleta è generico: il client si blocca su "Connecting to the server..." e fallisce con Connection timed out: no further information — nessuna connessione rifiutata, nessun errore del server e nessun log nel journal, poiché i pacchetti non sono mai arrivati. Verifica da una macchina esterna al VPS con nc -vz your.server.ip 25565; succeeded indica che entrambi i firewall sono aperti, un blocco indica che almeno uno è chiuso.

Mentre configuri ufw, nota che lo stesso server esegue SSH su un IP pubblico. I tentativi di brute-force inizieranno a comparire nei log entro poche ore; configura Fail2ban per SSH su Ubuntu 24.04 prima di dimenticartene.

Ora connettiti: Multiplayer, Direct Connection, l'IP del server. Poiché hai eseguito l'operazione nel passaggio 4, i comandi in-game sono immediatamente attivi — /whitelist add FriendName per ogni giocatore, /gamemode creative se questo è l'obiettivo.

Step 9: whitelist, perché internet scansiona la porta 25565

Lasciare un server Minecraft aperto su internet non è un rischio teorico: scanner automatizzati scansionano continuamente tutto lo spazio IPv4 alla ricerca della porta 25565. Progetti di griefing hanno mappato centinaia di migliaia di server aperti in questo modo. Un server senza whitelist riceve accessi non autorizzati entro pochi giorni o addirittura ore. La whitelist del passaggio 5 risolve il problema: online-mode=true verifica l'identità, mentre la whitelist limita l'accesso solo alle identità selezionate. Questa combinazione costituisce l'intero modello di sicurezza ed è sufficiente per un server tra amici.

Per l'accesso alla console senza il gioco — ad esempio per backup scriptati o cron job — abilita RCON in server.properties (enable-rcon=true, un rcon.password robusto, porta 25575) e compila il client mcrcon dal codice sorgente su GitHub direttamente sul VPS; il pacchetto non è presente 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.

Step 10: backup che non corrompono il mondo

L'unica regola: non copiare mai la directory del mondo mentre il server sta scrivendo i dati. I file della regione vengono riscriviti continuamente durante il gioco; una tar che avviene durante una scrittura produce un archivio con chunk incompleti. Quando ripristinerai il backup — l'unico momento in cui deve funzionare — il log sarà pieno di errori di caricamento dei chunk e il terreno presenterà dei buchi. Esistono due metodi per evitare questo problema.

Stop-copy-start è il metodo più semplice, ma richiede un minuto di downtime:

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 mantiene tutto in world, quindi sposta gli altri due in quella cartella.)

Save-off esegue il backup a server attivo: tramite RCON, invia save-off (ferma l'autosaver), poi save-all flush (forza la scrittura su disco e attendi), crea l'archivio tar, quindi invia save-on. Questo è il metodo da inserire in cron alle 5:00.

In ogni caso, un backup salvato sullo stesso VPS del server non è un vero backup — trasferisci gli archivi fuori dal server tramite scp o rclone e mantieni più di una copia. Poiché non sarai a monitorare la console quando si verificherà un guasto, imposta un controllo esterno sulla porta: Uptime Kuma su un altro server che esegue un controllo TCP sulla porta 25565 ti avviserà che il server è offline prima dei giocatori.

Plugins e aggiornamenti

Su Paper, un plugin è un file jar inserito in /opt/minecraft/plugins/ e seguito da un riavvio: l'installazione si conclude qui. Scarica i plugin solo dalle pagine ufficiali dei progetti (Hangar, Modrinth, SpigotMC). Il motivo è lo stesso del server jar: ogni plugin esegue codice arbitrario come utente minecraft.

L'aggiornamento del server consiste in: arresto, backup, sostituzione di server.jar con la build per la nuova versione di Minecraft, avvio. Due avvertenze. Gli aggiornamenti del mondo sono unidirezionali: un mondo aperto con una versione più recente non sarà aperto in una versione precedente; per questo sono necessari i backup. Inoltre, i plugin spesso arrivano con giorni o settimane di ritardo rispetto al rilascio di Minecraft; verifica la compatibilità prima di installare una nuova versione appena disponibile.

Se preferisci gestire tutto tramite container — fissaggio della versione, accettazione della EULA e flag di memoria come variabili d'ambiente — l'immagine itzg/minecraft-server è ampiamente utilizzata per eseguire lo stesso server Paper tramite Docker Compose sul tuo VPS con la medesima gestione di firewall e backup.

FAQ

Quanta RAM richiede un server Minecraft?

2 GB sono sufficienti per la versione vanilla con 2–5 giocatori; 4 GB sono ideali per un server tra amici con circa dieci giocatori su Paper con alcuni plugin; i modpack e i server con oltre 20 giocatori richiedono 8 GB o più. Indipendentemente dalle dimensioni del VPS, imposta -Xmx al valore massimo di RAM totale meno 1 GB — la JVM utilizza memoria oltre l'heap, e superare questo limite causa Error: Could not reserve enough space for object heap o un OOM kill silenzioso.

Perché i miei amici non riescono a connettersi al mio server Minecraft?

Un blocco del client che termina con Connection timed out: no further information indica quasi sempre un 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. Conferma che il server sia in ascolto usando sudo ss -tlnp | grep 25565 sulla macchina, quindi testa la connessione dall'esterno con nc -vz your.server.ip 25565.

Devo impostare online-mode=false in server.properties?

No. Con online-mode=false il server salta completamente l'autenticazione Mojang, quindi chiunque può connettersi con qualsiasi username — incluso il nome di un op, ereditandone i permessi — e le skin e gli UUID stabili smettono di funzionare. L'unico uso legittimo è dietro un proxy di autenticazione come Velocity che verifica i giocatori autonomamente. Per un server standard deve rimanere true.

Paper è migliore del server Minecraft vanilla?

Per quasi tutti, sì: Paper è un file jar sostitutivo che carica i mondi vanilla, accetta client non modificati, gestisce il tick delle entità e il caricamento dei chunk in modo molto più efficiente e aggiunge l'ecosistema dei plugin. L'eccezione sono le community di redstone tecnica che necessitano di un comportamento vanilla identico, poiché alcune ottimizzazioni di Paper lo alterano. Su un VPS di piccole dimensioni, l'efficienza di Paper garantisce RAM extra effettiva.

Come posso fare il backup di un mondo Minecraft senza corromperlo?

Non archiviare mai la directory del mondo mentre il server sta scrivendo al suo interno — una copia eseguita durante la scrittura di un region-file produce chunk corrotti che si scoprono solo al momento del ripristino. Arresta il server, crea un tar delle directory del mondo e riavvia il server, oppure mantienilo attivo usando save-off, save-all flush, tar e save-on tramite RCON. Successivamente, sposta l'archivio dal VPS.

#minecraft#game-server#java#ubuntu#self-hosting