Cara Menjalankan Ollama di VPS dengan Aman
Model 7B memerlukan sekitar 8 GB RAM dan berjalan 4 hingga 10 token per detik pada CPU. Gunakan 127.0.0.1:11434/v1, tanpa membuka port 11434.
Yang akan Anda bangun
Satu model bahasa open-weight yang berjalan pada server milik Anda, menerima permintaan melalui HTTP API, dan, jika diinginkan, menyediakan halaman chat di browser. Ollama bertugas mengunduh model, memuatnya ke memori, dan menyediakan layanan untuk permintaan pada http://127.0.0.1:11434. Instalasinya hanya memerlukan satu perintah. Bagian yang sulit justru ada di tempat lain: memilih model yang benar-benar dapat dimuat VPS Anda ke RAM, serta tidak sengaja mempublikasikan inference server tanpa autentikasi ke seluruh Internet.
Berikut dua peringatan penting. VPS yang hanya menggunakan CPU menjalankan model kecil dengan lambat, dan API ini sama sekali tidak memiliki autentikasi bawaan. Keduanya dibahas secara terperinci di bawah karena keduanya merupakan sumber masalah yang serius.
Pemeriksaan realistis ukuran, dengan angka sederhana
Jejak memori model kira-kira sama dengan ukuran filenya, ditambah sekitar satu gigabita overhead runtime, serta tambahan untuk context window. Model default Ollama menggunakan kuantisasi 4-bit (berlabel Q4), yang membutuhkan sekitar setengah gigabita RAM untuk setiap satu miliar parameter. Jadi, perhitungannya sederhana dan menentukan semuanya.
Model 3B seperti llama3.2:3b berukuran sekitar 2 GB untuk diunduh dan membutuhkan sekitar 4 GB RAM kosong agar dapat berjalan. Model 7B atau 8B seperti mistral:7b atau llama3.1:8b berukuran sekitar 5 GB di disk dan membutuhkan sekitar 8 GB RAM, atau 16 GB agar dapat berjalan dengan nyaman. Model 13B atau 14B membutuhkan sekitar 16 GB. Model dengan ukuran 30B hingga 70B memerlukan server dengan RAM besar atau, secara realistis, GPU. Pada VPS berbasis CPU, model tersebut mungkin tidak muat atau akan menghasilkan jawaban sangat lambat sehingga tidak berguna.
Selanjutnya, perhatikan kecepatannya karena aspek ini sering diremehkan. Inferensi CPU dibatasi oleh bandwidth memori, bukan kecepatan clock, sedangkan VPS dengan vCPU bersama memiliki bandwidth yang terbatas. Perkirakan kecepatan satu digit hingga dua digit rendah dalam token per detik: model Q4 7B-8B mungkin menghasilkan 4 hingga 10 token per detik, sedangkan model 3B menghasilkan 10 hingga 25 token per detik. GPU kira-kira sepuluh kali lebih cepat. Angka ini sengaja dibuat sebagai perkiraan kasar. Langkah yang tepat adalah mengukur server Anda sendiri, seperti ditunjukkan pada langkah run di bawah. Andalkan eval rate Anda sendiri, bukan angka dalam artikel mana pun, termasuk artikel ini.
Kesimpulan praktisnya: model kecil terkuantisasi pada CPU benar-benar berguna untuk membuat draf, meringkas, dan melakukan klasifikasi jika Anda dapat menerima kecepatannya. Untuk model yang lebih besar atau lebih cepat, siapkan anggaran untuk instance GPU.
Untuk membandingkan model tertentu dengan server tertentu, perkirakan jejak memorinya di sini:
Instal Ollama
Ada dua cara yang bersih. Script resmi adalah cara paling sederhana pada VPS tanpa layanan lain:
curl -fsSL https://ollama.com/install.sh | shCara ini membuat system user bernama ollama, menginstal binary ke /usr/local/bin/ollama, dan mendaftarkan systemd service bernama ollama.service yang dijalankan saat boot serta melakukan bind pada 127.0.0.1:11434. Pastikan service sudah berjalan:
systemctl status ollama
ollama --versionJika Anda sudah menjalankan Docker, gunakan container:
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. Prefix ini mengikat port hanya ke localhost. Jika menulis -p 11434:11434, port akan dipublikasikan pada semua interface. Inilah kesalahan yang diperingatkan dalam bagian keamanan. Pilih salah satu metode instalasi. Jangan menjalankan script dan container secara bersamaan karena kedua proses akan berebut port.
Unduh 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 menampilkan prompt >>>. Ketik pertanyaan. Token pertama mungkin memerlukan waktu beberapa detik saat bobot dimuat dari disk ke RAM, kemudian jawaban ditampilkan secara bertahap. Ketik /bye untuk keluar dari chat; Ollama tetap berjalan di latar belakang.
Lihat model yang dimuat dan cara model tersebut menggunakan sumber daya:
ollama psKolom PROCESSOR menunjukkan kondisi sebenarnya. 100% CPU berarti GPU tidak digunakan, dan inilah penyebab proses berjalan lambat. Ukur kecepatan sebenarnya dengan flag verbose:
ollama run --verbose llama3.2:3b "Write two sentences about Linux."Baris eval rate yang dicetak di bagian akhir menunjukkan jumlah token per detik pada hardware ini. Gunakan angka tersebut sebagai dasar perencanaan.
Model berada di mana, dan berapa kapasitas disk yang perlu dibeli
Model yang dipasang oleh skrip dan dijalankan sebagai service berada di home milik pengguna ollama:
sudo du -sh /usr/share/ollama/.ollama/modelsJika dijalankan secara interaktif sebagai pengguna Anda sendiri, model berada di ~/.ollama/models. Di dalam container, model berada di named volume ollama. Hal ini penting karena bobot yang telah dikuantisasi dapat cepat memenuhi disk: model 3B berukuran ~2 GB, model 7-8B berukuran ~5 GB, dan model 14B berukuran ~9 GB. Jika Anda mengunduh empat model untuk membandingkannya, kapasitas 20 GB dapat terpakai tanpa disadari. Sesuaikan kapasitas disk dengan model yang ingin dipertahankan, lalu hapus model lainnya menggunakan ollama rm <model>. Jika VPS yang sama sudah menjalankan sesuatu yang juga membutuhkan banyak ruang, seperti PhotoPrism atau Immich yang menyimpan pustaka foto, kurangi kapasitas tersebut dari ruang kosong terlebih dahulu. Anggap kapasitas yang tersisa sebagai anggaran ruang nyata untuk model.
Jalankan sebagai service yang Anda kelola
Skrip instalasi sudah mendaftarkan ollama.service, sehingga service tersebut akan dimulai ulang saat boot tanpa konfigurasi tambahan. Pengaturan yang biasanya perlu diubah adalah durasi model tetap berada di memori dan, pada beberapa konfigurasi, alamat bind. Keduanya ditempatkan dalam systemd drop-in agar tidak ditimpa saat Ollama diperbarui:
sudo systemctl edit ollama.serviceTambahkan konfigurasi ini di bawah header [Service] yang ditampilkan editor:
[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"OLLAMA_KEEP_ALIVE menentukan durasi model tetap berada di memori setelah permintaan terakhir (default 5 menit). Naikkan nilainya pada server yang Anda kueri sepanjang hari agar bobot model tidak dimuat ulang setiap kali. Pada server dengan RAM terbatas, tetapkan nilainya ke 0 agar RAM dibebaskan segera setelah permintaan selesai. systemctl edit memuat ulang berkas unit untuk Anda, sehingga service perlu dimulai ulang agar perubahan diterapkan:
sudo systemctl restart ollamaPoin keamanan yang paling penting
Secara default, Ollama melakukan bind ke 127.0.0.1:11434. Karena itu, hanya proses pada VPS itu sendiri yang dapat mengaksesnya. Default tersebut sudah benar. Pertahankan.
API ini tidak memiliki autentikasi. Sama sekali tidak ada. Tidak ada API key, login, rate limit, atau allow-list. Siapa pun yang dapat mengakses port 11434 dapat menjalankan model apa pun yang telah Anda pull, melakukan pull model baru, menghapusnya, serta membebani CPU atau GPU hingga 100% tanpa batas waktu. Pemindai seperti Shodan mengindeks ribuan instance Ollama yang terbuka. Instance yang terekspos dapat ditemukan dan disalahgunakan dalam hitungan jam.
Jadi, inilah satu-satunya kesalahan yang tidak boleh dilakukan: jangan setel OLLAMA_HOST=0.0.0.0 lalu buka port 11434 pada firewall. Tindakan itu mengekspos inference server tanpa autentikasi ke seluruh Internet. Tidak ada konfigurasi yang dapat membuat 11434 mentah pada 0.0.0.0 aman, karena Ollama tidak menyediakan apa pun untuk dikonfigurasi; autentikasi memang tidak tersedia. Ini adalah aturan untuk service tertentu, bukan larangan untuk membuka port: relay RustDesk yang di-host sendiri untuk desktop jarak jauh memang harus menerima trafik publik agar dapat berfungsi, dan hal itu dimungkinkan karena relay tersebut memiliki autentikasi berbasis key sendiri serta daftar port yang singkat dan terdokumentasi. Ollama tidak memiliki semua itu.
Ada tiga cara aman untuk mengakses model dari tempat selain server tersebut:
- Tetap gunakan akses lokal. Jika satu-satunya pemanggil adalah program lain pada VPS yang sama, skrip cron, bot, atau MCP server yang menghubungkan tool Anda ke model, biarkan bind pada
127.0.0.1dan minta program tersebut memanggilhttp://127.0.0.1:11434. Tidak ada yang terekspos dan tidak diperlukan hal lain. - Akses melalui tunnel privat. Hubungkan VPS ke VPN WireGuard yang Anda kelola sendiri, tetapkan
OLLAMA_HOSTke alamat tunnel tersebut, 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. - Tempatkan reverse proxy dengan autentikasi di depannya. Lakukan TLS termination dan wajibkan password atau token pada nginx, Traefik, atau Caddy, lalu teruskan proxy ke
127.0.0.1:11434. Ollama tetap menggunakan bind localhost. Proxy menjadi satu-satunya layanan yang listening pada port publik. Bentuk konfigurasi ini sama seperti menempatkan sertifikat Let's Encrypt pada nginx di depan layanan lokal apa pun.
Opsi reverse proxy tersebut persis seperti yang akan digunakan UI chat pada bagian berikutnya, dengan login yang sebenarnya.
Tambahkan UI chat dengan Open WebUI di balik TLS
Open WebUI adalah antarmuka chat yang di-host sendiri. Jalankan dalam 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 VPS Linux. Flag ini menempatkan container dalam namespace jaringan host, sehingga 127.0.0.1 di dalam container adalah loopback milik host itu sendiri dan container dapat mengakses Ollama melalui 127.0.0.1:11434 tanpa membuat Ollama listen pada interface lain. Resep jaringan bridge yang akan Anda lihat di tempat lain, yaitu --add-host=host.docker.internal:host-gateway dengan OLLAMA_BASE_URL=http://host.docker.internal:11434, tidak berfungsi di sini: nama tersebut mengarah ke gateway bridge Docker, sedangkan service yang terikat ke 127.0.0.1 pada host tidak dapat diakses melalui bridge. Akibatnya, Open WebUI hanya berhenti dan melaporkan bahwa Open WebUI tidak dapat terhubung ke Ollama.
Konsekuensi penggunaan jaringan host adalah Open WebUI kini listen pada port host 8080 di semua interface; pemetaan -p diabaikan, dan Docker menampilkan peringatan tentang hal tersebut. Karena itu, tutup 8080 pada firewall host dan firewall provider, lalu jadikan reverse proxy TLS sebagai satu-satunya akses publik. Pada kunjungan pertama, Open WebUI meminta Anda membuat akun admin. Akun tersebut menjadi lapisan autentikasi Anda, jadi gunakan password yang kuat.
Untuk membuka chat dari laptop melalui HTTPS, tempatkan reverse proxy TLS di depan 127.0.0.1:8080. Jika Anda sudah merutekan beberapa aplikasi Docker pada server tersebut, Traefik dengan TLS otomatis untuk banyak aplikasi adalah pilihan yang paling sesuai: satu blok label menerbitkan sertifikat dan merutekan chat.example.com ke Open WebUI. Aturan dari bagian keamanan tetap berlaku. Proxy mengelola port publik dan login, sedangkan Ollama tetap berada di localhost dan 8080 milik Open WebUI sendiri tetap diblokir oleh firewall.
Gunakan endpoint yang kompatibel dengan OpenAI dari kode Anda
Ollama menyediakan sebagian API chat OpenAI pada /v1. Karena itu, sebagian besar pustaka klien OpenAI dapat digunakan setelah dua hal diubah: URL dasar dan key sementara.
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, string apa pun dapat digunakan. model harus berupa nama model yang sudah Anda pull. Nama yang tidak dikenal menghasilkan model "x" not found, try pulling it first. Pemanggilan curl biasa menggunakan prinsip yang 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"}]}'Cara ini juga digunakan untuk menghubungkan model ke tooling agent dan editor. Jika Anda sudah melakukan pengembangan di server tersebut, model lokal dapat mendukung script dan plugin bersama Claude Code yang berjalan di VPS di dalam tmux. Dengan demikian, pekerjaan penyusunan draf yang murah dan privat tidak perlu menggunakan API berbayar, sementara penalaran yang lebih berat tetap ditangani model yang di-hosting.
Mode kegagalan, dengan string persis yang akan Anda lihat
Proses “Killed” di tengah pembuatan output. Anda menjalankan model besar, lalu terminal menampilkan Killed atau log server menampilkan llama runner process has terminated: signal: killed. Linux OOM killer menghentikannya karena model membutuhkan RAM lebih besar daripada kapasitas server. Konfirmasikan penyebabnya dengan sudo dmesg | grep -i oom. Anda akan melihat baris seperti Out of memory: Killed process ... (ollama). Solusinya adalah menggunakan model yang lebih kecil atau dengan kuantisasi lebih agresif, llama3.2:3b alih-alih model 13B, atau menambahkan swap agar beban yang hanya sedikit melebihi kapasitas RAM fisik tetap berjalan dengan lambat, bukan berhenti. Swap mengubah crash seketika menjadi respons yang lambat. Swap tidak membuat model 70B praktis dijalankan pada 4 GB. Proses akan berhenti tanpa pesan jika Anda tidak sedang memantau terminal. Pada server yang Anda kueri dari tempat lain, memasang unit OnFailure= pada ollama.service yang mengirim pemberitahuan ke server ntfy yang Anda kelola untuk peringatan push akan memberi tahu Anda saat proses berhenti, tanpa harus menunggu hingga permintaan berikutnya.
"Error: model requires more system memory". Ollama menolak memulai model dan menampilkan Error: model requires more system memory (X GiB) than is available (Y GiB). Ini adalah versi yang lebih aman dari crash di atas: Ollama menghitung kebutuhan memori lalu berhenti, alih-alih membiarkan OOM killer menghentikannya. Ollama juga menampilkan dua nilainya. Pilih model yang kebutuhannya lebih rendah daripada RAM bebas Anda (periksa dengan free -h), kurangi panjang context, atau pindah ke VPS yang lebih besar. Tidak ada flag yang dapat membuat model ini muat jika memorinya memang tidak mencukupi.
Token pertama memerlukan waktu sangat lama, lalu kembali normal. Model yang masih cold tidak mencetak apa pun selama lima hingga tiga puluh detik, lalu melakukan streaming secara normal. Jeda tersebut terjadi karena bobot model dimuat dari disk ke RAM untuk pertama kalinya, dan media penyimpanan yang lambat akan memperburuknya. Setelah dimuat, model tetap berada di memori selama durasi OLLAMA_KEEP_ALIVE, sehingga prompt kedua langsung mendapatkan respons. Jika pemuatan pertama berlangsung lebih lama daripada timeout di salah satu bagian jalur pemanggilan, Anda akan mendapatkan error, bukan respons yang lambat. Menentukan lapisan yang melaporkan context deadline exceeded membantu Anda mengetahui apakah client, proxy, atau proses pemuatan kehabisan waktu tunggu. Naikkan nilai tersebut jika jeda ini mengganggu, dan gunakan ollama ps untuk melihat apakah model sedang dimuat.
Semuanya berjalan lambat. Kecepatannya sepuluh token per detik atau kurang, tanpa error apa pun. Itu adalah inferensi CPU yang berjalan sesuai karakteristiknya. ollama ps menampilkan 100% CPU, yang berarti tidak ada GPU. Ini bukan bug. Tidak ada pengaturan yang dapat memperbaikinya karena batasnya adalah bandwidth memori, bukan kesalahan konfigurasi. Gunakan model yang lebih kecil, terima kecepatannya, atau pindah ke instance GPU. Ukur kecepatan aktual Anda dengan --verbose sebelum menyimpulkan bahwa ada sesuatu yang rusak.
Koneksi ditolak dari mesin lain. Dari laptop, Anda mendapatkan curl: (7) Failed to connect to <ip> port 11434: Connection refused. Ini adalah perilaku yang sesuai desain: Ollama hanya melakukan bind ke localhost. Jangan "memperbaikinya" dengan melakukan bind ke 0.0.0.0 karena itulah kesalahan eksposur yang dijelaskan di atas. Akses model melalui VPN atau melalui proxy yang menerapkan autentikasi.
Anda mengekspos 11434 ke Internet. Jika Anda menetapkan OLLAMA_HOST=0.0.0.0, membuka firewall, lalu melihat pull model yang tidak pernah Anda mulai atau penggunaan CPU mencapai 100% oleh client yang tidak dikenal, server Anda telah ditemukan dan digunakan pihak lain. Ini adalah kesalahan utama, bukan kasus yang jarang terjadi. Kembalikan bind ke 127.0.0.1 atau alamat VPN, tutup 11434 pada firewall, dan tempatkan autentikasi di depannya. Anggap semua hal yang dapat dijangkau melalui alamat tersebut selama port terbuka telah diakses oleh pihak asing.
Pencadangan dan upgrade
State yang perlu dipertahankan sedikit. Model dapat diunduh ulang, jadi satu-satunya data yang layak dicadangkan adalah volume data Open WebUI, akun, riwayat chat, pengaturan, dan drop-in systemd yang Anda buat. Cadangkan volume tersebut dengan container sementara:
docker run --rm -v open-webui:/data -v "$PWD":/backup alpine \
tar czf /backup/open-webui.tgz -C /data .Upgrade Ollama dengan menjalankan ulang skrip instalasi; upgrade Open WebUI dengan docker pull ghcr.io/open-webui/open-webui:main, lalu buat ulang container. Jangan melakukan pin versi untuk jangka panjang: kualitas model dan runtime berubah cepat, jadi baca catatan rilis dan lakukan benchmark ulang pada server Anda sendiri daripada mengandalkan angka dari kuartal sebelumnya.
FAQ
Apakah saya benar-benar dapat menjalankan LLM pada VPS yang hanya menggunakan CPU?
Ya, dengan batasan tertentu. Model kecil terkuantisasi dalam rentang 3B hingga 8B dapat berjalan pada CPU dan benar-benar berguna untuk menyusun draf, membuat ringkasan, serta melakukan klasifikasi, tetapi prosesnya lambat, yaitu pada kisaran satu digit hingga dua digit rendah token per detik pada vCPU bersama. Model 13B ke atas sangat lambat atau bahkan tidak dapat dimuat ke RAM. Untuk kecepatan yang lebih tinggi atau model yang lebih besar, Anda memerlukan instance GPU.
Berapa banyak RAM yang diperlukan setiap model?
Sebagai perkiraan untuk model default terkuantisasi 4-bit, siapkan sekitar 0.5 GB RAM per miliar parameter untuk bobot, ditambah sekitar 1 GB overhead dan sedikit tambahan untuk konteks. Jadi, model 3B memerlukan sekitar 4 GB ruang kosong, model 7-8B sekitar 8 GB, dan model 14B sekitar 16 GB. Periksa ruang yang tersedia dengan free -h dan sisakan kapasitas untuk sistem operasi serta layanan lain pada server.
Apakah Ollama memiliki autentikasi API?
Tidak. Ollama tidak memiliki autentikasi bawaan, kunci API, atau pembatasan laju. Siapa pun yang dapat menjangkau port 11434 memiliki kendali penuh atas Ollama. Karena itu, Ollama terikat ke 127.0.0.1 secara default, dan Anda tidak boleh mengekspos 11434 ke Internet pada 0.0.0.0. Akses Ollama secara lokal, melalui VPN privat, atau melalui reverse proxy yang menambahkan login.
Bagaimana cara menambahkan antarmuka chat web?
Jalankan Open WebUI dalam Docker dengan --network=host agar Open WebUI menggunakan loopback host dan dapat menjangkau Ollama native pada http://127.0.0.1:11434, lalu tempatkan reverse proxy TLS di depan port 8080 untuk akses dari laptop Anda. Pastikan 8080 tetap tertutup pada firewall agar hanya proxy yang dapat diakses publik. Akun admin Open WebUI menyediakan login, dan Anda menetapkan kata sandinya saat pertama kali menjalankan Open WebUI.
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, gunakan string apa pun sebagai kunci API karena kunci itu diabaikan, dan tetapkan model ke nama model yang sudah Anda pull. Kode OpenAI yang sudah ada biasanya dapat berjalan tanpa perubahan, selain pada URL dasar dan kunci API.