Ollama + Open WebUI: Menjalankan LLM Lokal di VPS

Kenapa LLM lokal

Ada tiga alasan praktis menjalankan LLM di server sendiri. Pertama, privasi: prompt dan dokumen yang Anda tempel tidak dikirim ke penyedia pihak ketiga. Kedua, biaya: tidak ada tagihan per token, yang ada hanya biaya VPS yang memang sudah Anda bayar. Ketiga, kendali: modelnya tetap sama dari hari ke hari, tidak berubah diam-diam karena update penyedia.

Komprominya juga harus jujur. Model lokal yang muat di VPS murah tidak sepintar model frontier seperti GPT-5 atau Claude. Untuk tugas seperti merangkum dokumen, menulis draf, menjawab pertanyaan umum, dan membantu coding sederhana, model 7–8 miliar parameter sudah sangat bisa dipakai. Untuk riset mendalam atau penalaran berlapis, model API tetap unggul. Anggap LLM lokal sebagai asisten harian, bukan pengganti segalanya.

Syarat server

Pilih VPS dengan RAM yang cukup, karena model bahasa berjalan di RAM (atau VRAM kalau ada GPU, tapi sebagian besar VPS murah tidak punya GPU). Patokan kasar untuk model terkuantisasi (format yang dipakai Ollama secara default):

ModelRAM minimal yang nyaman
3B (mis. llama3.2:3b, qwen2.5:3b)4 GB
7–8B (mis. llama3.1:8b, qwen2.5:7b)8 GB, idealnya 16 GB
14B16 GB
32B32 GB
70B64 GB ke atas

Aturan praktisnya: jangan paksakan model besar di RAM kecil. Model 8B yang responsif jauh lebih berguna daripada model 70B yang merangkak karena kehabisan memori dan memakai swap. CPU juga berpengaruh: 4 vCPU sudah cukup untuk pemakaian pribadi, lebih banyak lebih cepat saat menghasilkan token.

Sistem operasi yang dipakai di sini Ubuntu 24.04. Pastikan server sudah diperbarui dan port yang tidak perlu tertutup sebelum memasang apa pun yang menghadap internet.

sudo apt update && sudo apt upgrade -y

Langkah 1: Pasang Ollama

Ollama adalah runtime yang membuat menjalankan model lokal semudah satu perintah. Pasang dengan skrip resmi:

curl -fsSL https://ollama.com/install.sh | sh

Setelah selesai, periksa servisnya berjalan:

ollama --version
sudo systemctl status ollama

Secara default Ollama mendengarkan di 127.0.0.1:11434, artinya hanya bisa diakses dari dalam server itu sendiri. Ini perilaku yang bagus — jangan ubah ke 0.0.0.0 tanpa alasan, karena siapa pun yang bisa mencapai port itu bisa memakai model Anda gratis.

Langkah 2: Unduh dan uji model

Unduh model sesuai RAM. Untuk VPS 8–16 GB, titik awal yang aman adalah model 8B:

ollama pull llama3.1:8b

Lalu uji langsung dari terminal:

ollama run llama3.1:8b "Jelaskan Docker dalam tiga kalimat sederhana."

Kalau jawabannya keluar dengan kecepatan wajar, fondasi sudah benar. Perintah lain yang akan sering dipakai:

ollama list        # model yang sudah diunduh
ollama ps          # model yang sedang dimuat di memori
ollama rm nama:tag # hapus model yang tidak dipakai

Satu catatan penting: model yang tidak sedang dipakai akan dibongkar dari memori setelah beberapa menit tidak aktif, dan pertanyaan berikutnya akan terasa lambat di awal karena model dimuat ulang. Itu normal, bukan error.

Memilih model lain juga mudah. qwen2.5:7b kuat untuk instruksi umum dan coding ringan, llama3.2:3b cocok untuk VPS 4 GB, dan nomic-embed-text berguna kalau nanti Anda ingin membangun pencarian dokumen (RAG). Jangan mengunduh semua model sekaligus — tiap model 8B memakan sekitar 5 GB disk.

Langkah 3: Pasang Open WebUI dengan Docker

Chat di terminal memang bisa, tapi tidak nyaman untuk pemakaian harian. Open WebUI memberi antarmuka chat mirip ChatGPT di browser, dan ia berbicara ke Ollama lewat API lokal.

Pasang Docker dulu kalau belum ada:

sudo apt install -y docker.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

Lalu keluar dan login lagi ke SSH agar grup docker berlaku, kemudian jalankan Open WebUI:

docker run -d \
  --name open-webui \
  -p 127.0.0.1:3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  --restart unless-stopped \
  ghcr.io/open-webui/open-webui:main

Perhatikan dua detail di perintah itu. Port di-bind ke 127.0.0.1:3000, jadi Open WebUI tidak terekspos langsung ke internet — nanti diakses lewat reverse proxy. Dan --add-host=host.docker.internal:host-gateway memungkinkan container mencapai Ollama yang berjalan di host pada http://host.docker.internal:11434.

Karena port di-bind ke 127.0.0.1, port 3000 hanya bisa diakses dari dalam VPS — http://IP-VPS:3000 dari laptop Anda tidak akan pernah tersambung. Untuk verifikasi awal, dari laptop jalankan ssh -L 3000:localhost:3000 <user>@<IP-VPS>, lalu buka http://localhost:3000 di browser (atau verifikasi dari dalam VPS dengan curl http://127.0.0.1:3000). Buat akun admin pertama, lalu masuk ke Settings → Connections dan pastikan URL Ollama mengarah ke http://host.docker.internal:11434. Setelah reverse proxy aktif, akses hanya lewat domain HTTPS.

Langkah 4: Amankan dengan reverse proxy dan HTTPS

Jangan biarkan Open WebUI terbuka tanpa login dan tanpa HTTPS. Pasang Nginx dan sertifikat Let's Encrypt:

sudo apt install -y nginx certbot python3-certbot-nginx

Contoh blok server untuk domain chat.domainanda.com (ganti dengan domain Anda):

server {
    server_name chat.domainanda.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Header Upgrade dan Connection wajib ada karena Open WebUI memakai WebSocket untuk streaming jawaban. Terakhir, terbitkan sertifikatnya:

sudo certbot --nginx -d chat.domainanda.com

Sejak titik ini, satu-satunya yang menghadap internet adalah Nginx lewat HTTPS, dan semua orang yang membuka halaman chat harus login dulu ke akun Open WebUI. Buat akun hanya untuk orang yang memang Anda izinkan.

Batasan yang perlu diterima

Pertama, kecepatan. Di VPS tanpa GPU, model 8B menghasilkan kira-kira belasan token per detik — cukup untuk chat santai, kurang nyaman untuk menghasilkan dokumen sangat panjang. Kedua, kualitas. Model kecil lebih sering berhalusinasi, terutama untuk fakta spesifik dan angka. Biasakan memverifikasi jawaban penting, dan jangan pakai LLM lokal untuk keputusan yang berisiko tanpa pengecekan. Ketiga, konteks. Model 8B umumnya punya jendela konteks 8K–128K token tergantung model; dokumen yang sangat panjang perlu dipotong atau diringkas bertahap.

Keempat, keamanan data. "Lokal" berarti data tidak dikirim ke penyedia model, tapi tetap pastikan servernya sendiri aman: SSH key-only, update rutin, dan backup volume Open WebUI (open-webui) secara berkala. Kehilangan volume itu berarti kehilangan riwayat chat dan pengaturan.

Checklist penutup

  • VPS punya RAM sesuai model yang dipilih (8B → 8 GB minimal, 16 GB nyaman)
  • Ollama terpasang dan ollama run menjawab dengan benar
  • Open WebUI berjalan lewat Docker dan terhubung ke Ollama
  • Akses lewat domain + HTTPS via Nginx, bukan port 3000 terbuka
  • Akun Open WebUI hanya untuk pengguna yang diizinkan
  • Backup volume open-webui dijadwalkan

Kalau semua tercentang, Anda punya asisten AI pribadi yang hidup di server Anda sendiri — tanpa tagihan per token, dan tanpa prompt yang keluar dari kendali Anda.

Komentar