Cara Host Ollama di VPS dengan Aman
Pelajari cara instalasi Ollama di VPS. Gunakan port 11434 secara lokal dan pastikan model 7B dengan kebutuhan 8 GB RAM berjalan optimal tanpa celah keamanan.
Apa yang Anda bangun
Sebuah model bahasa open-weight tunggal yang berjalan pada server milik Anda, diakses melalui HTTP API dan, jika diinginkan, halaman chat di browser Anda. Ollama adalah komponen yang mengunduh model, memuatnya ke dalam memori, dan melayani permintaan pada http://127.0.0.1:11434. Proses instalasi hanya memerlukan satu perintah. Kesulitan utama terletak pada hal lain: memilih model yang kapasitas RAM VPS Anda mampu menampungnya, dan memastikan Anda tidak secara tidak sengaja memublikasikan server inferensi tanpa autentikasi ke seluruh internet.
Dua peringatan penting. VPS yang hanya menggunakan CPU akan menjalankan model kecil dengan lambat, dan API ini tidak memiliki fitur autentikasi bawaan sama sekali. Keduanya dibahas secara detail di bawah ini, karena keduanya adalah penyebab masalah bagi pengguna.
Realitas ukuran dalam angka nyata
Penggunaan memori sebuah model kira-kira sama dengan ukuran filenya, ditambah sekitar satu gigabyte untuk overhead runtime, ditambah sedikit lagi untuk context window. Model default Ollama menggunakan kuantisasi 4-bit (berlabel Q4), yang membutuhkan sekitar setengah gigabyte RAM untuk setiap satu miliar parameter. Perhitungannya sederhana dan menentukan segalanya.
Model 3B seperti llama3.2:3b memiliki ukuran unduhan ~2 GB dan membutuhkan sekitar 4 GB RAM kosong untuk berjalan. Model 7B atau 8B seperti mistral:7b atau llama3.1:8b berukuran ~5 GB di disk dan membutuhkan sekitar 8 GB RAM, atau 16 GB agar lebih lancar. Model 13B atau 14B membutuhkan sekitar 16 GB. Model dalam rentang 30B-hingga-70B memerlukan mesin dengan RAM besar atau, secara realistis, GPU — pada CPU VPS, model tersebut tidak akan muat atau akan menjawab sangat lambat sehingga tidak berguna.
Sekarang mengenai kecepatan, karena ini adalah bagian yang sering diremehkan. Inferensi CPU dibatasi oleh bandwidth memori, bukan clock speed, dan vCPU VPS yang digunakan bersama memiliki bandwidth yang terbatas. Perkirakan kecepatan satu digit hingga dua digit rendah token per detik: model 7-8B Q4 mungkin mencapai 4 hingga 10 token per detik, model 3B mencapai 10 hingga 25 token per detik. GPU kira-kira satu orde besaran lebih cepat. Angka ini sengaja dibuat kasar — langkah yang tepat adalah mengukur mesin Anda sendiri, seperti yang ditunjukkan pada langkah menjalankan di bawah ini. Percayalah pada eval rate Anda, bukan angka dalam artikel mana pun, termasuk artikel ini.
Kesimpulan praktisnya: model kuantisasi kecil pada CPU sangat berguna untuk membuat draf, meringkas, dan klasifikasi jika Anda dapat menerima kecepatannya. Untuk kebutuhan yang lebih besar atau lebih cepat, siapkan anggaran untuk instance GPU.
Untuk membandingkan model tertentu dengan mesin tertentu, estimasikan penggunaan memorinya di sini:
Install Ollama
Ada dua cara bersih. Skrip resmi adalah yang termudah pada VPS kosong:
curl -fsSL https://ollama.com/install.sh | shIni membuat user sistem bernama ollama, menginstal binary ke /usr/local/bin/ollama, dan mendaftarkan service systemd bernama ollama.service yang berjalan saat boot dan mengikat 127.0.0.1:11434. Pastikan layanan sudah berjalan:
systemctl status ollama
ollama --versionJika Anda sudah menjalankan Docker, gunakan container sebagai gantinya:
docker run -d --name ollama \
-p 127.0.0.1:11434:11434 \
-v ollama:/root/.ollama \
--restart always \
ollama/ollamaPerhatikan prefix 127.0.0.1: pada pemetaan port. Itu mengikat port hanya ke localhost. Menggunakan -p 11434:11434 akan mempublikasikannya ke setiap interface, yang merupakan kesalahan yang diperingatkan pada bagian keamanan. Pilih satu metode instalasi; jangan menjalankan skrip dan container secara bersamaan, atau dua proses akan berebut port.
Pull dan jalankan model pertama Anda
ollama pull llama3.2:3b
ollama run llama3.2:3bpull mengunduh layer model ke disk (sekitar 2 GB untuk model ini). run memuatnya ke memori dan membuka prompt >>>. Ketik sebuah pertanyaan. Token pertama mungkin membutuhkan waktu beberapa detik saat bobot dimuat dari disk ke RAM, kemudian jawaban akan muncul secara bertahap. Ketik /bye untuk keluar dari chat; Ollama tetap berjalan di latar belakang.
Lihat apa yang dimuat dan bagaimana penggunaannya:
ollama psKolom PROCESSOR menunjukkan informasi yang akurat. 100% CPU berarti tidak ada GPU yang digunakan, dan itulah penyebab lambatnya proses. Ukur kecepatan sebenarnya dengan flag verbose:
ollama run --verbose llama3.2:3b "Write two sentences about Linux."Baris eval rate yang dicetak di akhir adalah jumlah token per detik pada perangkat keras ini. Gunakan angka tersebut sebagai acuan perencanaan.
Lokasi penyimpanan model dan kebutuhan kapasitas disk
Model yang diinstal melalui skrip dan dijalankan sebagai layanan tersimpan di direktori home pengguna ollama:
sudo du -sh /usr/share/ollama/.ollama/modelsJika dijalankan secara interaktif menggunakan user Anda sendiri, model tersimpan di ~/.ollama/models. Di dalam container, model tersimpan di named volume ollama. Hal ini penting karena ukuran weight yang terkuantisasi bertambah dengan cepat: model 3B berukuran ~2 GB, 7-8B berukuran ~5 GB, dan 14B berukuran ~9 GB. Mengunduh empat model untuk perbandingan akan menghabiskan 20 GB tanpa disadari. Sesuaikan ukuran disk dengan jumlah model yang ingin Anda simpan, dan hapus sisanya menggunakan ollama rm <model>.
Jalankan sebagai layanan yang Anda kendalikan
Skrip instalasi telah mendaftarkan ollama.service, sehingga layanan akan memulai ulang secara otomatis saat booting. Pengaturan yang perlu diubah adalah durasi model tetap berada di memori, dan pada beberapa konfigurasi, alamat bind — keduanya dimasukkan ke dalam systemd drop-in agar pembaruan Ollama tidak menimpa pengaturan tersebut:
sudo systemctl edit ollama.serviceTambahkan ini di bawah header [Service] yang ditampilkan editor:
[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"OLLAMA_KEEP_ALIVE adalah durasi model tetap berada di memori setelah permintaan terakhir (default 5 menit). Tingkatkan nilai ini pada sistem yang menerima kueri sepanjang hari untuk menghindari pemuatan ulang bobot setiap saat; atur ke 0 pada sistem dengan sumber daya terbatas untuk membebaskan RAM segera setelah permintaan selesai. systemctl edit memuat ulang file unit untuk Anda, jadi lakukan restart untuk menerapkan perubahan:
sudo systemctl restart ollamaPoin keamanan yang paling penting
Secara default Ollama melakukan bind ke 127.0.0.1:11434, sehingga hanya proses di dalam VPS itu sendiri yang dapat menjangkaunya. Pengaturan default tersebut sudah benar. Tetap gunakan pengaturan tersebut.
API ini tidak memiliki autentikasi. Tidak ada sama sekali. Tidak ada API key, tidak ada login, tidak ada pembatasan rate limit, dan tidak ada daftar izin (allow-list). Siapa pun yang dapat menjangkau port 11434 dapat menjalankan model apa pun yang telah Anda unduh, mengunduh model baru, menghapusnya, dan membebani CPU atau GPU Anda hingga beban penuh tanpa batas waktu. Pemindai seperti Shodan mengindeks ribuan instansi Ollama yang terbuka, dan instansi yang terekspos dapat ditemukan serta disalahgunakan dalam hitungan jam.
Berikut adalah satu kesalahan yang tidak boleh dilakukan: jangan mengatur OLLAMA_HOST=0.0.0.0 dan membuka port 11434 pada firewall Anda. Hal tersebut mempublikasikan server inferensi tanpa autentikasi ke seluruh internet. Konfigurasi apa pun tidak akan membuat port 11434 pada 0.0.0.0 menjadi aman, karena tidak ada fitur autentikasi di dalam Ollama — fitur autentikasi tersebut memang tidak tersedia.
Ada tiga cara aman untuk menjangkau model dari perangkat lain selain mesin tersebut:
- Tetap gunakan koneksi lokal. Jika satu-satunya pemanggil adalah program lain di VPS yang sama — seperti skrip cron, bot, atau server MCP yang menghubungkan alat Anda ke model — biarkan bind tetap pada
127.0.0.1dan biarkan program tersebut memanggilhttp://127.0.0.1:11434. Tidak ada yang terekspos dan tidak ada hal lain yang diperlukan. - Gunakan terowongan (tunnel) privat. Hubungkan VPS ke VPN WireGuard yang Anda host sendiri, atur
OLLAMA_HOSTke alamat tunnel (misalnya10.8.0.1, bukan0.0.0.0), dan hanya peer VPN yang dapat terhubung. Internet publik tetap tidak dapat melihat apa pun pada port 11434. - Gunakan reverse proxy dengan autentikasi di depannya. Lakukan terminasi TLS dan wajibkan kata sandi atau token pada nginx, Traefik, atau Caddy, lalu proxy ke
127.0.0.1:11434. Ollama tetap menggunakan bind localhost; proxy adalah satu-satunya yang mendengarkan pada port publik. Ini serupa dengan memasang sertifikat Let's Encrypt pada nginx di depan layanan lokal apa pun.
Opsi reverse-proxy adalah hal yang akan diberikan oleh UI chat pada langkah berikutnya, lengkap dengan sistem login yang nyata.
Tambahkan UI chat dengan Open WebUI, di balik TLS
Open WebUI adalah antarmuka chat self-hosted. Jalankan menggunakan Docker dan arahkan ke Ollama lokal:
docker run -d \
--name open-webui \
--network=host \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-v open-webui:/app/backend/data \
--restart always \
ghcr.io/open-webui/open-webui:mainFlag --network=host adalah detail penting pada Linux VPS. Flag ini memasukkan container ke dalam network namespace host, sehingga 127.0.0.1 di dalam container adalah loopback milik host sendiri. Container dapat menjangkau Ollama di 127.0.0.1:11434 tanpa Ollama perlu mendengarkan pada interface lain. Metode bridge-network yang Anda lihat di tempat lain — --add-host=host.docker.internal:host-gateway dengan OLLAMA_BASE_URL=http://host.docker.internal:11434 — tidak berfungsi di sini: nama tersebut merujuk ke gateway bridge Docker. Service yang terikat pada 127.0.0.1 di host tidak dapat dijangkau melalui bridge, sehingga Open WebUI akan gagal terhubung ke Ollama.
Konsekuensi dari host networking adalah Open WebUI kini mendengarkan pada port host 8080 di setiap interface; semua mapping -p diabaikan, dan Docker akan menampilkan peringatan mengenai hal tersebut. Oleh karena itu, tutup 8080 pada firewall host maupun provider, dan biarkan TLS reverse proxy menjadi satu-satunya pintu publik. Pada kunjungan pertama, Open WebUI akan meminta Anda membuat akun admin — akun tersebut berfungsi sebagai lapisan autentikasi Anda, jadi gunakan kata sandi yang kuat.
Untuk membuka chat dari laptop Anda melalui HTTPS, pasang TLS reverse proxy di depan 127.0.0.1:8080. Jika Anda sudah mengarahkan beberapa aplikasi Docker pada server tersebut, Traefik dengan TLS otomatis untuk banyak aplikasi adalah pilihan terbaik: satu blok label akan menerbitkan sertifikat dan mengarahkan chat.example.com ke Open WebUI. Aturan dari bagian keamanan tetap berlaku — proxy memegang port publik dan login, sementara Ollama tetap berada di localhost dan 8080 milik Open WebUI tetap terlindungi firewall.
Gunakan endpoint yang kompatibel dengan OpenAI dari kode Anda
Ollama menggunakan subset dari API chat OpenAI pada /v1, sehingga sebagian besar pustaka klien OpenAI dapat berfungsi setelah mengubah dua hal: base URL dan kunci sembarang.
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
model="llama3.2:3b",
messages=[{"role": "user", "content": "Name three Linux distributions."}],
)
print(resp.choices[0].message.content)api_key diperlukan oleh pustaka klien tetapi diabaikan oleh Ollama, jadi Anda dapat menggunakan string apa pun. model harus berupa nama model yang sudah Anda unduh; nama yang tidak dikenal akan mengembalikan model "x" not found, try pulling it first. Cara kerja pemanggilan curl biasa adalah sama:
curl http://127.0.0.1:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"llama3.2:3b","messages":[{"role":"user","content":"Hello"}]}'Ini juga merupakan cara untuk menghubungkan model ke alat agen dan editor. Jika Anda sudah melakukan pengembangan di mesin tersebut, model lokal dapat mendukung skrip dan plugin bersamaan dengan Claude Code yang berjalan di VPS di dalam tmux, menjaga pekerjaan draf yang murah dan privat tetap terpisah dari API berbayar sementara penalaran berat tetap menggunakan model terhosting.
Mode kegagalan, dengan string persis yang akan Anda lihat
Proses "Killed" di tengah pembuatan. Anda menjalankan model besar dan terminal mencetak Killed, atau log server menunjukkan llama runner process has terminated: signal: killed. Linux OOM killer menghentikannya karena model membutuhkan RAM lebih besar daripada kapasitas perangkat. Konfirmasi penyebabnya dengan sudo dmesg | grep -i oom, di mana Anda akan melihat baris seperti Out of memory: Killed process ... (ollama). Solusinya adalah menggunakan model yang lebih kecil atau dengan kuantisasi lebih berat — llama3.2:3b alih-alih 13B — atau menambah swap agar beban yang sedikit melebihi RAM fisik dapat berjalan lambat alih-alih mati. Swap mengubah crash instan menjadi jawaban yang lambat; swap tidak membuat model 70B menjadi praktis pada 4 GB.
"Error: model requires more system memory". Ollama menolak menjalankan model dan mencetak Error: model requires more system memory (X GiB) than is available (Y GiB). Ini adalah versi sopan dari crash di atas: Ollama melakukan perhitungan dan berhenti sebelum OOM killer melakukannya. Ollama bahkan memberikan dua angka kepada Anda. Pilih model yang persyaratannya di bawah RAM bebas Anda (cek dengan free -h), perkecil panjang konteks, atau pindah ke VPS yang lebih besar. Tidak ada flag yang dapat membuat model tersebut muat — memori tersebut nyata.
Token pertama memakan waktu lama, lalu berjalan normal. Model yang baru dimuat tidak mencetak apa pun selama lima hingga tiga puluh detik, lalu mengalir secara normal. Jeda tersebut adalah proses pemuatan bobot dari disk ke RAM untuk pertama kalinya, dan penyimpanan yang lambat memperburuk kondisi ini. Setelah dimuat, model tetap berada di memori selama OLLAMA_KEEP_ALIVE, sehingga prompt kedua dijawab secara instan. Tingkatkan nilai tersebut jika jeda tersebut mengganggu Anda, dan gunakan ollama ps untuk melihat apakah sebuah model sedang dimuat.
Semuanya sangat lambat. Sepuluh token per detik atau kurang, tanpa ada error sama sekali. Itu adalah inferensi CPU yang bekerja sebagaimana mestinya. ollama ps menunjukkan 100% CPU, yang berarti tidak ada GPU. Ini bukan bug dan tidak ada pengaturan yang dapat memperbaikinya, karena batasannya adalah bandwidth memori, bukan kesalahan konfigurasi. Gunakan model yang lebih kecil, terima kecepatannya, atau pindah ke instance GPU — dan ukur kecepatan asli Anda dengan --verbose sebelum memutuskan ada yang rusak.
Connection refused dari mesin lain. Dari laptop Anda, Anda mendapatkan curl: (7) Failed to connect to <ip> port 11434: Connection refused. Ini bekerja sesuai desain: Ollama hanya mengikat (bind) ke localhost. Jangan "memperbaikinya" dengan mengikat ke 0.0.0.0, yang merupakan kesalahan eksposur di atas. Akses model melalui VPN atau melalui proxy autentikasi sebagai gantinya.
Anda mengekspos 11434 ke internet. Jika Anda mengatur OLLAMA_HOST=0.0.0.0, membuka firewall, dan sekarang melihat penarikan model yang tidak pernah Anda mulai atau CPU mencapai 100% oleh klien tidak dikenal, Anda telah ditemukan dan digunakan. Ini adalah kesalahan utama, bukan kasus khusus. Ikat kembali ke 127.0.0.1 atau alamat VPN, tutup 11434 pada firewall, dan pasang autentikasi di depannya. Asumsikan apa pun yang dapat dijangkau pada alamat tersebut saat terbuka telah dikueri oleh orang asing.
Backups and upgrades
Data yang hilang sangat sedikit. Model dapat diunduh kembali, jadi satu-satunya hal yang perlu dicadangkan adalah volume data Open WebUI — akun, riwayat chat, pengaturan — dan file systemd drop-in yang Anda buat. Cadangkan volume tersebut menggunakan kontainer sementara:
docker run --rm -v open-webui:/data -v "$PWD":/backup alpine \
tar czf /backup/open-webui.tgz -C /data .Perbarui Ollama dengan menjalankan kembali skrip instalasi; perbarui Open WebUI dengan docker pull ghcr.io/open-webui/open-webui:main kemudian buat ulang kontainer tersebut. Jangan mengunci versi untuk jangka panjang: kualitas model dan runtime berubah dengan cepat, jadi bacalah catatan rilis dan lakukan benchmark ulang pada perangkat Anda sendiri daripada mempercayai angka dari kuartal sebelumnya.
FAQ
Bisakah saya menjalankan LLM pada VPS yang hanya memiliki CPU?
Bisa, namun terbatas. Model kuantisasi kecil dalam rentang 3B hingga 8B dapat berjalan pada CPU dan sangat berguna untuk pembuatan draf, peringkasan, dan klasifikasi — hanya saja berjalan lambat, dengan kecepatan satu hingga dua digit token per detik pada vCPU bersama. Model berukuran 13B ke atas akan berjalan sangat lambat atau tidak akan muat di RAM sama sekali. Untuk kecepatan tinggi atau model yang lebih besar, Anda memerlukan instansi GPU.
Berapa banyak RAM yang dibutuhkan setiap model?
Aturan umum untuk model kuantisasi 4-bit default: sekitar 0.5 GB RAM per satu miliar parameter untuk bobot (weights), ditambah sekitar 1 GB overhead dan sedikit tambahan untuk konteks. Jadi, model 3B membutuhkan sekitar 4 GB ruang kosong, model 7-8B sekitar 8 GB, dan model 14B sekitar 16 GB. Periksa sisa kapasitas Anda dengan free -h dan sisakan ruang untuk sistem operasi serta proses lainnya di server.
Apakah API Ollama terautentikasi?
Tidak. Ollama tidak memiliki autentikasi bawaan, API key, atau pembatasan rate limit — siapa pun yang dapat menjangkau port 11434 memiliki kontrol penuh. Itulah alasan mengapa Ollama mengikat 127.0.0.1 secara default dan mengapa Anda tidak boleh mengekspos port 11434 pada 0.0.0.0 ke internet. Akseslah secara lokal, melalui VPN pribadi, atau melalui reverse proxy yang menambahkan fitur login.
Bagaimana cara menambahkan antarmuka chat berbasis web?
Jalankan Open WebUI di Docker dengan --network=host agar dapat berbagi loopback host dan menjangkau Ollama asli pada http://127.0.0.1:11434, lalu pasang TLS reverse proxy di depan port 8080 untuk akses dari laptop Anda. Biarkan 8080 tertutup pada firewall agar proxy menjadi satu-satunya pintu publik. Akun admin Open WebUI menyediakan fitur login, dan Anda dapat mengatur kata sandinya pada saat peluncuran pertama.
Bagaimana cara memanggilnya dari aplikasi saya sendiri?
Gunakan endpoint yang kompatibel dengan OpenAI pada http://127.0.0.1:11434/v1. Arahkan SDK OpenAI apa pun ke URL dasar tersebut, masukkan string apa pun sebagai API key karena tidak akan digunakan, dan atur model ke nama model yang telah Anda unduh. Kode OpenAI yang sudah ada biasanya dapat berjalan tanpa perubahan selain pada URL dasar dan key.