Cara Membuat Server Minecraft di VPS Ubuntu 24.04
Panduan menjalankan server Paper Minecraft di VPS Ubuntu 24.04 dengan Java 21, systemd, firewall port 25565, whitelist, dan pencadangan world yang aman.
Yang Anda bangun
Server Minecraft Java Edition yang tetap aktif: Paper pada Ubuntu 24.04, berjalan sebagai pengguna khusus minecraft di bawah systemd dengan Restart=on-failure, whitelist aktif, port 25565 terbuka pada kedua firewall yang berada di antara pemain dan JVM, serta pencadangan dilakukan dengan cara yang tidak merusak world yang ingin dilindungi. Server ini sendiri hanya terdiri dari satu jar dan satu perintah java. Semua hal yang membedakan server yang dimainkan teman-teman Anda selama setahun dari server yang mati pada akhir pekan pertama berkaitan dengan perintah tersebut. Itulah yang dibahas dalam panduan ini.
Dua peringatan penting sebelum Anda mengeluarkan uang. Pertama, Minecraft membutuhkan banyak memori dan sebagian besar prosesnya berjalan pada satu thread: VPS 1 GB tidak dapat menjalankan server yang nyaman dimainkan, dan satu core yang cepat lebih baik daripada empat core yang lambat. Kedua, ini adalah Java Edition. Pemain Bedrock, konsol, ponsel, dan aplikasi Windows Bedrock tidak dapat bergabung ke server Java. Bedrock memerlukan software server yang berbeda pada UDP 19132, atau plugin Geyser, yang tidak dibahas di sini.
Anda memerlukan KVM VPS Ubuntu 24.04 yang baru dengan akses root atau sudo, serta waktu sekitar tiga puluh menit.
Ukuran: kebutuhan nyata server untuk teman
RAM adalah faktor yang paling penting. Angka yang realistis lebih rendah daripada yang biasanya disarankan di forum modpack:
- 2 GB dapat menjalankan vanilla untuk 2–5 pemain pada jarak tampilan sedang. Masih dapat dimainkan, tetapi tanpa ruang cadangan.
- 4 GB adalah ukuran yang nyaman untuk server teman: sekitar sepuluh pemain bersamaan pada Paper dengan beberapa plugin, serta masih menyisakan cukup RAM untuk OS.
- 8 GB dan lebih cocok untuk modpack dan lebih dari 20 pemain. Pada kondisi ini, Anda juga perlu memperhatikan kecepatan CPU single-core karena loop utama game berjalan pada satu thread.
Ukuran world juga bertambah di disk saat pemain menjelajah. World survival yang sering dijelajahi dapat mencapai beberapa gigabyte. Karena itu, sisakan ruang untuk world dan backup-nya.
Vanilla atau Paper? Paper adalah pengganti drop-in untuk jar resmi: world dan client tetap sama, serta tidak memerlukan mod pada sisi client. Paper menulis ulang jalur server yang paling lambat, termasuk pemuatan chunk, pemrosesan entity, dan hopper, serta menambahkan API plugin. Satu-satunya alasan untuk menjalankan vanilla adalah jika Anda memerlukan mekanisme vanilla yang identik hingga tingkat bit untuk farm redstone teknis yang dapat terpengaruh oleh optimisasi Paper. Untuk pengguna lain, Paper dapat mendukung lebih banyak pemain dengan jumlah gigabyte yang sama. Semua langkah di bawah ini berlaku untuk keduanya.
Langkah 1: instal Java 21
Minecraft 1.20.5 dan semua rilis setelahnya (seluruh 1.21.x) memerlukan Java 21. Ubuntu 24.04 menyediakannya di repositori default, sedangkan build headless tidak menyertakan pustaka desktop yang tidak akan digunakan server:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -versionHasil yang benar: baris pertama menampilkan openjdk version "21.0.x". Jika menampilkan 17 atau 11, JRE lain terinstal dan menjadi pilihan utama; perbaiki dengan sudo update-alternatives --config java, lalu pilih entri yang memuat java-21.
Jika pemeriksaan ini dilewati, Anda kemungkinan akan menemukan error server Minecraft yang paling banyak dicari. Dengan Java 17, jar server langsung berhenti dengan pesan:
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.0Angka tersebut menunjukkan ketidakcocokan versinya: class file version 65.0 adalah Java 21, 61.0 adalah Java 17, dan 60.0 adalah Java 16. Apa pun pasangan yang ditampilkan, perbaikannya sama: instal JRE yang lebih baru, lalu jalankan kembali update-alternatives.
Langkah 2: gunakan user khusus, jangan pernah root
Server mengeksekusi kode plugin dan memproses input jaringan dari siapa pun yang dapat mengakses port tersebut. Jika terjadi masalah, kompromi yang berjalan sebagai root akan menguasai VPS Anda; kompromi yang berjalan sebagai minecraft hanya akan menguasai dunia game.
sudo adduser --system --group --home /opt/minecraft minecraft--system membuat akun tanpa kata sandi yang tidak dapat login melalui SSH, dengan /opt/minecraft sebagai direktori home dan direktori kerja. Mulai dari sini, setiap perintah yang berinteraksi dengan server dijalankan sebagai user ini.
Langkah 3: unduh server jar dari sumber resmi
Hanya dua tempat yang boleh menyediakan server jar: halaman unduhan server resmi di minecraft.net untuk vanilla, dan halaman unduhan di papermc.io untuk Paper. "Pusat unduhan" pihak ketiga yang mengemas ulang server jar telah lama menjadi jalur penyebaran malware. Server jar berisi kode arbitrer yang akan Anda jalankan 24/7 pada mesin yang terhubung ke Internet.
Salin tautan unduhan untuk build saat ini dari halaman resmi. URL berubah pada setiap versi dan build, sehingga menuliskan URL tetap di sini akan membuatnya cepat usang. Kemudian jalankan:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Hasil yang benar: sebuah server.jar berukuran sekitar 50 MB yang dimiliki oleh minecraft, dikonfirmasi dengan ls -lh /opt/minecraft/server.jar.
Langkah 4: menjalankan pertama kali, EULA, dan memberikan hak operator kepada diri sendiri
Jalankan server secara interaktif satu kali sebelum menyentuh systemd. Proses pertama ini memiliki dua tujuan yang hanya dapat ditangani dengan baik melalui konsol aktif.
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiProses tersebut berhenti dalam beberapa detik. Paper memerlukan beberapa saat tambahan untuk menerapkan patch terlebih dahulu, lalu log berakhir dengan baris yang akan dilihat semua orang:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.Ini bukan error, melainkan pemeriksaan lisensi. Proses tersebut menulis eula.txt di sebelah file jar. Baca EULA yang ditautkan jika Anda belum membacanya, lalu ubah flag tersebut:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtJalankan kembali perintah java yang sama. Kali ini server membuat world. Pada boot pertama, proses ini memerlukan waktu satu atau dua menit, lalu server mencapai status:
[Server thread/INFO]: Done (9.204s)! For help, type "help"Sekarang Anda memiliki konsol aktif. Gunakan konsol tersebut untuk tujuan kedua: ketik op YourMinecraftName (username persis yang digunakan dalam game). Server akan menambahkan Anda ke ops.json. Dengan demikian, saat tidak ada konsol yang terhubung, Anda dapat menjalankan semua perintah admin dari dalam game. Setelah itu, ketik stop untuk menyimpan dan keluar dengan bersih.
Langkah 5: server.properties, dan alasan online-mode tetap true
Proses pertama juga menulis server.properties. Sebagian besar nilai default sudah sesuai. Baris berikut perlu ditentukan secara sengaja:
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 membuat server memverifikasi setiap username yang bergabung ke server session Mojang untuk membuktikan bahwa pemain tersebut memiliki akun terkait. Jika diatur ke false, yaitu sakelar "cracked server", server menerima begitu saja identitas yang diberikan setiap client. Siapa pun dapat bergabung menggunakan nama apa pun, termasuk nama Anda. Karena ops dan whitelist menggunakan nama sebagai identitas, peniru dapat masuk dengan izin operator Anda. Satu-satunya alasan yang sah untuk menonaktifkannya adalah jika server berada di belakang proxy autentikasi seperti Velocity, yang memverifikasi pemain secara mandiri. Pada server biasa, nilainya harus tetap true.
view-distance adalah pengaturan performa paling penting dalam file ini. Penggunaan CPU dan RAM meningkat kira-kira sebanding dengan kuadrat nilainya. Nilai 8 merupakan default yang sesuai untuk VPS. Nilai 10 adalah default vanilla dan membutuhkan sumber daya yang jauh lebih besar.
white-list=true plus enforce-whitelist=true menutup server bagi orang yang tidak dikenal. Bagian keamanan di bawah menjelaskan bahwa pengaturan ini wajib diterapkan. Tambahkan pemain dengan /whitelist add TheirName dalam game sebagai op.
Langkah 6: flag memori, alasan -Xms dan -Xmx harus sama
JVM mengalokasikan heap antara -Xms (ukuran awal) dan -Xmx (batas maksimum). Pada game server khusus, tetapkan keduanya ke nilai yang sama: heap pada akhirnya akan mencapai batas maksimum, dan memperbesarnya secara bertahap hanya menambah aktivitas garbage collector selama permainan berlangsung. Pada VPS 4 GB, pasangan yang tepat adalah:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx bukan total memori yang digunakan proses. JVM menambahkan overhead di luar heap, stack thread, cache JIT, dan buffer langsung, yang jumlahnya sekitar setengah gigabyte atau lebih. Ubuntu juga membutuhkan ruang. Aturan praktisnya: -Xmx maksimal sebesar RAM VPS dikurangi 1 GB. Jika nilainya terlalu besar, salah satu dari dua kegagalan berikut akan terjadi. Jika alokasi gagal sejak awal, server menolak untuk start dengan pesan:
Error: Could not reserve enough space for object heapPesan ini jelas dan langsung muncul. Versi yang lebih sulit dideteksi dapat start dengan normal lalu berhenti beberapa jam kemudian, ketika heap penuh karena beban dan OOM killer milik kernel memilih proses terbesar pada server, yaitu JVM. Tidak ada pesan yang muncul di log server. Buktinya ada di sudo dmesg | grep -i oom, pada baris seperti Out of memory: Killed process 1234 (java). Jika service Anda restart secara "acak", periksa bagian tersebut terlebih dahulu, lalu turunkan -Xmx.
Untuk Paper, proyek ini mendokumentasikan flag Aikar, yaitu kumpulan konfigurasi G1GC yang disetel (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 dan sekitar selusin flag lainnya) untuk mengurangi fluktuasi jeda garbage collection pada heap yang lebih besar. Buat baris lengkapnya dari dokumentasi Paper. Pada heap 2–4 GB, peningkatannya tidak besar, tetapi flag tersebut aman digunakan.
Langkah 7: unit systemd dengan Restart=on-failure
Server yang dijalankan secara manual berhenti saat sesi SSH Anda berakhir dan tetap tidak berjalan setelah reboot. Tulis /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 -fHasil yang benar: status menampilkan active (running), dan journal, yang kini berisi output konsol server, kembali berakhir pada baris Done.
Ada dua pilihan yang disengaja dalam unit tersebut. Restart=on-failure menjalankan kembali server setelah crash, tetapi tidak setelah stop yang bersih, sehingga pemeliharaan tetap dapat dilakukan. Selain itu, TimeoutStopSec=120 lebih penting daripada yang terlihat: systemctl stop mengirim SIGTERM, server Minecraft menangkapnya dan menyimpan setiap world sebelum berhenti, dan penyimpanan tersebut memerlukan waktu pada world yang besar. Batas waktu default systemd dapat mengirim SIGKILL ke JVM saat proses penyimpanan belum selesai. Inilah yang menyebabkan file region rusak. Berikan waktu dua menit.
Jika service terus restart dan journal menampilkan:
[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?berarti ada proses lain yang sudah menggunakan port 25565. Hampir selalu penyebabnya adalah proses yang sebelumnya dijalankan di foreground masih aktif dalam sesi SSH lain. Temukan proses tersebut dengan sudo ss -tlnp | grep 25565 dan hentikan salinan itu. Jangan pernah menjalankan dua server pada satu port.
Langkah 8: buka port 25565 pada kedua firewall
Minecraft Java hanya menggunakan TCP 25565 (UDP hanya digunakan untuk protokol query opsional, yang secara default dinonaktifkan). Pada VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableItulah firewall pertama. Sebagian besar penyedia VPS menjalankan firewall kedua pada tingkat jaringan melalui panel kontrol, dan firewall inilah yang sering terlupakan. Buka TCP 25565 di sana juga. Jika hanya salah satu dari kedua firewall yang dibuka, gejalanya sangat tidak spesifik: klien berhenti pada pesan "Connecting to the server..." lalu gagal dengan Connection timed out: no further information. Tidak ada penolakan koneksi, error server, atau apa pun di journal karena paket tidak pernah sampai. Verifikasi dari mesin di luar VPS dengan nc -vz your.server.ip 25565. succeeded berarti kedua firewall sudah terbuka. Jika koneksi berhenti, setidaknya salah satu firewall belum terbuka.
Selagi berada di ufw, perhatikan bahwa mesin yang sama menjalankan SSH pada IP publik. Dalam beberapa jam, log brute-force akan mulai dipenuhi pesan. siapkan Fail2ban untuk SSH di Ubuntu 24.04 sebelum Anda lupa.
Sekarang hubungkan ke server: Multiplayer, Direct Connection, lalu masukkan IP server. Karena Anda memberikan hak op kepada diri sendiri pada langkah 4, perintah dalam game langsung dapat digunakan. /whitelist add FriendName untuk setiap pemain, /gamemode creative jika itu rencananya.
Langkah 9: whitelist, karena Internet menemukan port 25565
Membiarkan server Minecraft terbuka ke Internet bukan risiko teoretis: pemindai massal terus menyapu seluruh ruang IPv4 untuk mencari port 25565, proyek griefing amatir telah memetakan ratusan ribu server terbuka dengan cara ini, dan server tanpa whitelist akan dikunjungi pihak yang tidak diundang dalam hitungan hari, terkadang jam. Whitelist dari langkah 5 adalah solusinya: online-mode=true membuktikan identitas, sedangkan whitelist membatasi akses hanya untuk identitas yang Anda pilih. Keduanya merupakan keseluruhan model keamanan dan sudah memadai untuk server yang digunakan bersama teman.
Untuk mengakses konsol tanpa membuka game, menjalankan backup terjadwal, atau menggunakan cron job, aktifkan RCON di server.properties (enable-rcon=true, gunakan rcon.password yang kuat, port 25575) dan build client kecil mcrcon dari source GitHub-nya langsung di VPS; client tersebut tidak tersedia di repositori Ubuntu. Jangan membuka port 25575 pada firewall apa pun: RCON mengirimkan password dalam teks biasa, sehingga aksesnya harus tetap terbatas pada loopback.
Langkah 10: backup yang tidak merusak dunia
Aturan utamanya: jangan pernah menyalin direktori world saat server sedang menulis ke dalamnya. File region terus ditulis ulang selama permainan berlangsung; tar yang berjalan bersamaan dengan proses penulisan dapat menghasilkan arsip berisi chunk yang hanya tertulis sebagian. Saat arsip tersebut dipulihkan, tepat ketika backup harus berfungsi, log akan dipenuhi error saat memuat chunk dan terrain akan memiliki lubang. Dua metode dapat mencegah hal ini.
Stop-copy-start adalah metode sederhana, dengan downtime selama satu menit:
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 memisahkan dimensi ke dalam world, world_nether, dan world_the_end; server vanilla menyimpan semuanya di world, jadi letakkan dua lainnya di sana.)
Save-off membuat backup saat server tetap berjalan: melalui RCON, jalankan save-off (menghentikan autosaver), lalu save-all flush (memaksa semua data ditulis ke disk dan menunggu hingga selesai), buat tar, lalu jalankan save-on. Gunakan versi ini dalam cron pada pukul 5 pagi.
Apa pun metodenya, backup yang disimpan pada VPS yang sama dengan server bukanlah backup. scp atau rclone arsip tersebut ke luar server, dan simpan lebih dari satu salinan. Karena Anda tidak akan terus memantau konsol saat terjadi masalah, pasang pemeriksaan eksternal pada port tersebut: Uptime Kuma di server lain yang menjalankan pemeriksaan TCP ke 25565 akan memberi tahu bahwa server tidak aktif sebelum pemain Anda menyadarinya.
Plugin dan upgrade
Pada Paper, plugin adalah file jar yang ditempatkan ke dalam /opt/minecraft/plugins/, lalu server di-restart. Hanya itu langkah instalasinya. Dapatkan plugin hanya dari halaman proyek resminya (Hangar, Modrinth, SpigotMC), dengan alasan yang sama seperti pada server jar: setiap plugin adalah kode arbitrer yang berjalan sebagai pengguna minecraft.
Upgrade server dilakukan dengan urutan: hentikan server, buat backup, ganti server.jar dengan build untuk versi Minecraft yang baru, lalu jalankan server. Perhatikan dua hal. Upgrade world berlangsung satu arah. World yang dibuka oleh versi yang lebih baru tidak dapat dibuka oleh versi yang lebih lama. Karena itu, backup sangat penting. Selain itu, plugin sering terlambat mendukung rilis Minecraft baru selama beberapa hari atau minggu. Periksa kompatibilitas sebelum menggunakan rilis baru pada hari pertama.
Jika Anda ingin mengelola semua hal ini sebagai container, termasuk pin versi, penerimaan EULA, dan flag memori sebagai variabel lingkungan, image itzg/minecraft-server yang banyak digunakan akan menjalankan server Paper yang sama melalui Docker Compose pada VPS Anda dengan disiplin firewall dan backup yang sama.
FAQ
Berapa banyak RAM yang diperlukan server Minecraft?
2 GB dapat menjalankan vanilla untuk 2–5 pemain; 4 GB cukup nyaman untuk server teman sekitar sepuluh pemain yang menggunakan Paper dengan beberapa plugin; modpack dan lebih dari 20 pemain memerlukan 8 GB atau lebih. Berapa pun ukuran VPS, atur -Xmx maksimal sebesar total RAM dikurangi 1 GB. JVM menggunakan memori di luar heap, dan nilai yang terlalu besar berakhir dengan Error: Could not reserve enough space for object heap atau OOM kill tanpa pesan.
Mengapa teman saya tidak dapat terhubung ke server Minecraft?
Client yang macet lalu berakhir dengan Connection timed out: no further information hampir selalu menunjukkan masalah firewall. Ada dua firewall: ufw pada VPS dan firewall jaringan provider di control panel. TCP 25565 harus dibuka pada keduanya. Pastikan server benar-benar listening dengan sudo ss -tlnp | grep 25565 pada server, lalu uji dari luar dengan nc -vz your.server.ip 25565.
Apakah saya harus mengatur online-mode=false dalam server.properties?
Tidak. Dengan online-mode=false, server sepenuhnya melewati autentikasi Mojang. Siapa pun dapat bergabung menggunakan username apa pun, termasuk nama seorang op, lalu mewarisi izinnya. Skin dan UUID yang stabil juga tidak berfungsi dengan benar. Satu-satunya penggunaan yang sah adalah di belakang proxy yang melakukan autentikasi, seperti Velocity, yang memverifikasi pemain secara mandiri. Untuk server biasa, nilainya tetap true.
Apakah Paper lebih baik daripada server Minecraft vanilla?
Untuk hampir semua orang, ya. Paper adalah file jar pengganti langsung yang memuat world vanilla dan menerima client tanpa modifikasi. Paper juga memproses tick entity dan memuat chunk jauh lebih efisien serta menyediakan ekosistem plugin. Pengecualiannya adalah komunitas redstone teknis yang memerlukan perilaku vanilla hingga tingkat bit, karena beberapa optimisasi Paper mengubah perilaku tersebut. Pada VPS kecil, efisiensi Paper secara efektif menyediakan RAM tambahan tanpa biaya.
Bagaimana cara mencadangkan world Minecraft tanpa merusaknya?
Jangan pernah mengarsipkan direktori world saat server sedang menulis ke dalamnya. Proses penyalinan yang berlangsung bersamaan dengan penulisan region file dapat menghasilkan chunk rusak yang baru diketahui saat pemulihan. Hentikan server, gunakan tar untuk mengarsipkan direktori world, lalu jalankan server kembali. Alternatifnya, biarkan server tetap berjalan dengan save-off, save-all flush, tar, dan save-on melalui RCON. Setelah itu, pindahkan arsip dari VPS.