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):
| Model | RAM 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 |
| 14B | 16 GB |
| 32B | 32 GB |
| 70B | 64 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 runmenjawab 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-webuidijadwalkan
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
Posting Komentar