SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-09-06

Cara Host Ollama di VPS dengan Selamat

Model 7B memerlukan 8 GB RAM dan memberi 4 hingga 10 token sesaat pada CPU. Ketahui cara jalankan Ollama di 127.0.0.1:11434 tanpa mendedahkan port 11434 kepada umum.

Apa yang anda bina

Satu model bahasa berwajaran terbuka yang berjalan pada pelayan milik anda, dijawab melalui API HTTP dan, jika mahu, halaman sembang dalam pelayar anda. Ollama ialah komponen yang memuat turun model, memuatkannya ke dalam memori, dan melayani permintaan pada http://127.0.0.1:11434. Pemasangannya hanya memerlukan satu arahan. Segala kerumitan terletak pada bahagian lain: memilih model yang boleh dimuatkan oleh VPS anda ke dalam RAM, dan tidak mendedahkan pelayan inferens tanpa pengesahan kepada seluruh internet secara tidak sengaja.

Dua amaran jujur terlebih dahulu. VPS yang hanya menggunakan CPU akan menjalankan model kecil dengan perlahan, dan tiada pengesahan terbina dalam pada API tersebut. Kedua-duanya dibincangkan secara terperinci di bawah, kerana di sinilah pengguna sering menghadapi masalah.

Realiti saiz dalam angka yang jelas

Jejak memori sesuatu model adalah lebih kurang sama dengan saiz failnya, ditambah kira-kira satu gigabait untuk overhead masa jalan (runtime), dan sedikit lagi untuk tetingkap konteks (context window). Model lalai Ollama adalah terkuantisasi 4-bit (dilabel sebagai Q4), yang memerlukan kira-kira setengah gigabait RAM bagi setiap bilion parameter. Jadi, pengiraannya mudah dan ia menentukan segala-galanya.

Model 3B seperti llama3.2:3b adalah muat turun bersaiz ~2 GB dan memerlukan sekitar 4 GB RAM kosong untuk dijalankan. Model 7B atau 8B seperti mistral:7b atau llama3.1:8b bersaiz ~5 GB pada cakera dan memerlukan kira-kira 8 GB RAM, atau 16 GB untuk prestasi yang selesa. Model 13B atau 14B memerlukan kira-kira 16 GB. Apa-apa model dalam julat 30B hingga 70B memerlukan pelayan dengan RAM yang besar atau, secara realistiknya, GPU. Pada VPS CPU, model tersebut sama ada tidak akan dimuatkan atau akan menjawab dengan begitu perlahan sehingga tidak berguna.

Sekarang tentang kelajuan, kerana ini adalah bahagian yang sering dipandang remeh oleh orang ramai. Inferens CPU dihadkan oleh lebar jalur memori (memory bandwidth), bukan kelajuan jam (clock speed), dan VPS vCPU kongsi mempunyai lebar jalur yang sederhana. Jangkakan kelajuan dalam angka tunggal hingga angka dua digit rendah token sesaat: model 7-8B Q4 mungkin mencapai 4 hingga 10 token sesaat, manakala model 3B mencapai 10 hingga 25. GPU adalah kira-kira sepuluh kali ganda lebih pantas. Angka-angka ini sengaja diberikan secara kasar; tindakan yang jujur adalah dengan mengukur pelayan anda sendiri, yang ditunjukkan dalam langkah pelaksanaan di bawah. Percayalah pada eval rate anda, bukan pada angka dalam mana-mana artikel, termasuk artikel ini.

Kesimpulan praktikalnya: model terkuantisasi kecil pada CPU benar-benar berguna untuk draf, meringkaskan, dan klasifikasi jika anda boleh menerima kelajuannya. Untuk apa-apa yang lebih besar atau lebih pantas, sediakan bajet untuk instans GPU.

Untuk menimbang model tertentu dengan pelayan tertentu, anggarkan jejak memorinya di sini:

ToolLLM VRAM and model-size calculator

Memasang Ollama

Terdapat dua cara yang bersih. Skrip rasmi adalah yang paling mudah pada VPS kosong:

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

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

Ini akan mencipta pengguna sistem bernama ollama, memasang binari ke /usr/local/bin/ollama, dan mendaftarkan servis systemd bernama ollama.service yang bermula semasa but dan mengikat 127.0.0.1:11434. Sahkan ia sedang berjalan:

systemctl status ollama
ollama --version

systemctl status ollama

Jika anda sudah menjalankan Docker, gunakan kontena sebaliknya:

docker run -d --name ollama \
  -p 127.0.0.1:11434:11434 \
  -v ollama:/root/.ollama \
  --restart always \
  ollama/ollama

docker run -d -v ollama:/root/.ollama -p 127.0.0.1:11434:11434 --name ollama ollama/ollama

Perhatikan awalan 127.0.0.1: pada pemetaan port. Ia mengikat port tersebut kepada localhost sahaja. Menulis -p 11434:11434 sebaliknya akan menerbitkannya pada setiap antara muka, iaitu kesilapan yang diberi amaran dalam bahagian keselamatan. Pilih satu kaedah pemasangan; jangan jalankan skrip dan kontena pada masa yang sama, atau kedua-dua proses akan berebut untuk menggunakan port tersebut.

Muat turun dan jalankan model pertama anda

ollama pull llama3.2:3b
ollama run llama3.2:3b

pull memuat turun lapisan model ke cakera (kira-kira 2 GB untuk model ini). run memuatkannya ke dalam memori dan memaparkan gesaan >>>. Taipkan soalan. Token pertama mungkin mengambil masa beberapa saat sementara pemberat dimuatkan dari cakera ke RAM, kemudian jawapan akan distrim. Taipkan /bye untuk keluar daripada sembang; Ollama akan terus berjalan di latar belakang.

Lihat perkara yang dimuatkan dan cara ia dimuatkan:

ollama ps

Lajur PROCESSOR menunjukkan keadaan sebenar. 100% CPU bermaksud tiada GPU digunakan, dan itulah punca kelambatan tersebut. Ukur kelajuan sebenar dengan bendera verbose:

ollama run --verbose llama3.2:3b "Write two sentences about Linux."

Baris eval rate yang dicetak pada penghujung adalah kelajuan token sesaat anda pada perkakasan ini. Itu adalah angka yang perlu dijadikan rujukan untuk perancangan.

Lokasi penyimpanan model dan anggaran ruang cakera

Model yang dipasang melalui skrip dan dijalankan sebagai servis disimpan di dalam direktori home pengguna ollama:

sudo du -sh /usr/share/ollama/.ollama/models

Apabila dijalankan secara interaktif sebagai pengguna anda sendiri, model tersebut disimpan di dalam ~/.ollama/models. Di dalam kontena, model disimpan di dalam volum bernama ollama. Perkara ini penting kerana saiz pemberat terkuantisasi (quantized weights) meningkat dengan cepat: model 3B adalah sekitar 2 GB, 7-8B sekitar 5 GB, dan 14B sekitar 9 GB. Jika anda memuat turun empat model untuk perbandingan, anda telah menggunakan 20 GB tanpa disedari. Tentukan saiz cakera berdasarkan model yang ingin anda simpan, dan padamkan selebihnya menggunakan ollama rm <model>. Jika VPS yang sama sudah menjalankan aplikasi yang menggunakan ruang storan yang besar, seperti PhotoPrism atau Immich yang menyimpan pustaka foto, tolak saiz tersebut daripada ruang kosong yang ada dan anggap baki ruang sebagai bajet sebenar untuk model anda.

Jalankan sebagai servis yang anda kawal

Skrip pemasangan telah pun mendaftarkan ollama.service, jadi ia akan bermula semula semasa but tanpa memerlukan langkah tambahan. Tetapan yang wajar diubah ialah tempoh model kekal dalam ingatan (resident), dan pada sesetengah persediaan, alamat bind. Kedua-duanya diletakkan dalam fail drop-in systemd supaya naik taraf Ollama tidak menimpa tetapan tersebut:

sudo systemctl edit ollama.service

Tambahkan ini di bawah pengepala [Service] yang dipaparkan oleh editor anda:

[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"

OLLAMA_KEEP_ALIVE ialah tempoh model kekal dalam ingatan selepas permintaan terakhir (lalai 5 minit). Tingkatkan nilainya pada mesin yang anda gunakan sepanjang hari untuk mengelakkan pemuatan semula pemberat setiap kali; tetapkan kepada 0 pada mesin dengan sumber terhad untuk mengosongkan RAM sebaik sahaja permintaan selesai. systemctl edit memuatkan semula fail unit untuk anda, jadi mulakan semula servis untuk menggunakan perubahan tersebut:

sudo systemctl restart ollama

Aspek keselamatan yang paling penting

Secara lalai, Ollama mengikat 127.0.0.1:11434, jadi hanya proses pada VPS itu sendiri yang boleh mencapainya. Tetapan lalai itu adalah betul. Kekalkannya.

API ini tidak mempunyai pengesahan. Tiada langsung. Tiada kunci API, tiada log masuk, tiada had kadar, dan tiada senarai kebenaran. Sesiapa sahaja yang boleh mencapai port 11434 boleh menjalankan mana-mana model yang telah anda tarik, menarik model baharu, memadamkannya, dan membebankan CPU atau GPU anda pada tahap maksimum tanpa henti. Pengimbas seperti Shodan mengindeks ribuan instans Ollama yang terbuka, dan instans yang terdedah akan ditemui serta disalahgunakan dalam masa beberapa jam sahaja.

Jadi, inilah satu kesilapan yang tidak boleh dilakukan: jangan tetapkan OLLAMA_HOST=0.0.0.0 dan buka 11434 dalam firewall. Tindakan itu menerbitkan pelayan inferens tanpa pengesahan kepada seluruh Internet. Tiada jumlah konfigurasi yang dapat menjadikan 11434 mentah pada 0.0.0.0 selamat kerana Ollama tidak menyediakan apa-apa yang boleh dikonfigurasikan; pengesahan memang tidak wujud. Ini ialah peraturan untuk servis khusus ini, bukannya larangan membuka port dalam semua keadaan: relay RustDesk yang dihos sendiri untuk desktop jauh perlu menerima trafik awam supaya dapat berfungsi, dan hal itu dibenarkan kerana relay tersebut menyediakan pengesahan berasaskan key sendiri serta senarai port yang pendek dan didokumenkan. Ollama tidak mempunyai mana-mana ciri tersebut.

Terdapat tiga cara selamat untuk mencapai model dari luar pelayan tersebut:

  • Kekalkannya secara setempat. Jika pemanggil tunggal ialah program lain pada VPS yang sama, skrip cron, bot, atau pelayan MCP yang menghubungkan alatan anda kepada model, biarkan ikatan pada 127.0.0.1 dan minta program tersebut memanggil http://127.0.0.1:11434. Tiada apa-apa yang terdedah dan tiada perkara lain yang diperlukan.
  • Capai melalui terowong peribadi. Letakkan VPS pada VPN WireGuard yang anda hoskan sendiri, tetapkan OLLAMA_HOST kepada alamat terowong (contohnya 10.8.0.1, bukan 0.0.0.0), dan hanya rakan setara VPN yang boleh menyambung. Internet awam tetap tidak melihat apa-apa pada 11434.
  • Letakkan reverse proxy yang mempunyai pengesahan di hadapan. Tamatkan TLS dan wajibkan kata laluan atau token pada nginx, Traefik, atau Caddy, kemudian proksi ke 127.0.0.1:11434. Ollama mengekalkan ikatan localhost-nya; proksi adalah satu-satunya entiti yang mendengar pada port awam. Ini adalah bentuk yang sama seperti meletakkan sijil Let's Encrypt pada nginx di hadapan mana-mana servis setempat.

Pilihan reverse proxy adalah perkara yang akan diberikan oleh UI sembang kepada anda seterusnya, dengan log masuk sebenar disertakan.

Menambah UI sembang dengan Open WebUI, di sebalik TLS

Open WebUI ialah antara muka sembang yang dihoskan sendiri. Jalankannya dalam Docker dan halakan ia ke Ollama tempatan:

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:main

Flag --network=host merupakan perincian penting pada VPS Linux. Ia meletakkan kontena dalam ruang nama rangkaian hos, jadi 127.0.0.1 di dalam kontena adalah loopback hos itu sendiri dan kontena tersebut mencapai Ollama pada 127.0.0.1:11434 tanpa Ollama perlu mendengar pada mana-mana antara muka lain. Resipi rangkaian bridge yang anda akan 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 diselesaikan kepada gateway bridge Docker, dan servis yang terikat pada 127.0.0.1 di hos tidak boleh dicapai merentasi bridge, jadi Open WebUI hanya menunggu sambil melaporkan ia tidak dapat menyambung ke Ollama.

Tukar ganti penggunaan rangkaian hos ialah Open WebUI kini mendengar pada port 8080 hos pada setiap antara muka; sebarang pemetaan -p akan diabaikan, dan Docker akan mencetak amaran mengenainya. Jadi, tutup 8080 pada kedua-dua firewall hos dan pembekal, dan biarkan reverse proxy TLS menjadi satu-satunya pintu awam. Pada lawatan pertama, Open WebUI meminta anda mencipta akaun admin, akaun tersebut adalah lapisan pengesahan anda, jadi pilih kata laluan yang kuat.

Untuk membuka sembang daripada komputer riba anda melalui HTTPS, letakkan reverse proxy TLS di hadapan 127.0.0.1:8080. Jika anda sudah menghalakan beberapa aplikasi Docker pada pelayan tersebut, Traefik dengan TLS automatik merentasi banyak aplikasi adalah pilihan yang paling kemas: satu blok label mengeluarkan sijil dan menghalakan chat.example.com ke Open WebUI. Peraturan daripada bahagian keselamatan masih terpakai, proxy memiliki port awam dan log masuk, manakala Ollama kekal pada localhost dan 8080 milik Open WebUI kekal di bawah kawalan firewall.

Gunakan endpoint yang serasi dengan OpenAI daripada kod anda

Ollama menggunakan subset API sembang OpenAI pada /v1, jadi kebanyakan pustaka klien OpenAI berfungsi selepas menukar dua perkara: URL asas dan kunci 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 sebarang rentetan (string) boleh digunakan. model mestilah nama model yang telah anda tarik (pull); nama yang tidak dikenali akan mengembalikan model "x" not found, try pulling it first. Panggilan curl biasa menggunakan konsep 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"}]}'

Ini juga cara anda menyambungkan model ke dalam alat ejen dan editor. Jika anda sudah membangunkan perisian pada pelayan tersebut, model tempatan boleh menyokong skrip dan pemalam di samping Claude Code yang berjalan pada VPS di dalam tmux, memastikan kerja draf yang murah dan peribadi tidak menggunakan API berbayar, sementara penaakulan berat kekal menggunakan model yang dihoskan.

Mod kegagalan, berserta rentetan tepat yang akan anda lihat

Proses “Killed” semasa penjanaan. Anda memulakan model besar dan terminal memaparkan Killed, atau log pelayan menunjukkan llama runner process has terminated: signal: killed. Pembunuh OOM Linux menghentikannya kerana model tersebut memerlukan lebih banyak RAM daripada yang tersedia pada pelayan. Sahkan puncanya dengan sudo dmesg | grep -i oom. Anda akan melihat baris seperti Out of memory: Killed process ... (ollama). Penyelesaiannya ialah menggunakan model yang lebih kecil atau dikuantisasi dengan lebih agresif, menggunakan llama3.2:3b dan bukannya 13B, atau menambah swap supaya beban yang hanya melebihi RAM fizikal dapat selesai dengan perlahan dan bukannya gagal. Swap menukar ranap serta-merta kepada jawapan yang lambat. Swap tidak menjadikan model 70B praktikal pada 4 GB. Proses ini gagal secara senyap kecuali anda kebetulan memantau terminal. Pada pelayan yang anda semak dari lokasi lain, melampirkan unit OnFailure= pada ollama.service yang menghantar pemberitahuan kepada pelayan ntfy yang anda hos untuk makluman push membolehkan anda mengetahui saat proses itu terhenti, bukannya hanya menyedarinya apabila permintaan seterusnya dibuat.

"Error: model requires more system memory". Ollama enggan memulakan model dan mencetak Error: model requires more system memory (X GiB) than is available (Y GiB). Ini adalah versi sopan bagi ranap di atas: Ollama telah melakukan pengiraan dan berhenti sebelum OOM killer bertindak. Ia malah memberikan anda dua nombor tersebut. Pilih model yang keperluannya di bawah RAM bebas anda (semak dengan free -h), kecilkan panjang konteks, atau beralih ke VPS yang lebih besar. Tiada flag yang boleh menjadikan model itu muat, memori tersebut adalah nyata.

Token pertama mengambil masa sangat lama, kemudian semuanya kembali normal. Model yang masih sejuk tidak mencetak apa-apa selama lima hingga tiga puluh saat, kemudian menstrim seperti biasa. Jeda itu berlaku kerana weights dimuatkan dari cakera ke RAM buat kali pertama, dan storan yang perlahan memburukkannya. Selepas dimuatkan, model kekal dalam memori sepanjang tempoh OLLAMA_KEEP_ALIVE, jadi prompt kedua dijawab serta-merta. Jika proses pemuatan pertama melebihi nilai timeout di mana-mana bahagian laluan panggilan, anda akan menerima ralat dan bukannya jawapan yang lambat. Menentukan lapisan yang melaporkan context deadline exceeded membantu anda mengetahui sama ada client, proxy atau proses pemuatan itu sendiri yang kehabisan masa. Tingkatkan nilai tersebut jika jeda itu mengganggu, dan gunakan ollama ps untuk melihat sama ada model sedang dimuatkan.

Semuanya menjadi perlahan. Sepuluh token sesaat atau kurang, tanpa sebarang ralat. Itu adalah inferens CPU yang melakukan tugasnya seperti biasa. ollama ps menunjukkan 100% CPU, bermakna tiada GPU. Ini bukan pepijat dan tiada tetapan yang boleh membaikinya, kerana hadnya adalah lebar jalur memori, bukan salah konfigurasi. Gunakan model yang lebih kecil, terima kelajuan tersebut, atau beralih ke instans GPU, dan ukur kadar sebenar anda dengan --verbose sebelum membuat keputusan bahawa ada sesuatu yang rosak.

Sambungan ditolak dari mesin lain. Dari komputer riba anda, anda mendapat curl: (7) Failed to connect to <ip> port 11434: Connection refused. Ini berfungsi seperti yang direka: Ollama hanya mengikat (bind) pada localhost. Jangan "baiki" perkara ini dengan mengikat 0.0.0.0, yang merupakan kesilapan pendedahan tepat seperti di atas. Capai model tersebut melalui VPN atau melalui proksi pengesahan.

Anda mendedahkan 11434 kepada internet. Jika anda menetapkan OLLAMA_HOST=0.0.0.0, membuka firewall, dan kini melihat penarikan model yang tidak pernah anda mulakan atau CPU berada pada 100% oleh klien yang tidak dikenali, anda telah ditemui dan digunakan. Ini adalah kesilapan utama, bukan kes terpencil. Ikat semula ke 127.0.0.1 atau alamat VPN, tutup 11434 pada firewall, dan letakkan pengesahan di hadapan. Anggap apa sahaja yang boleh dicapai pada alamat tersebut semasa ia terbuka telah disoal oleh orang asing.

Sandaran dan naik taraf

Hanya terdapat sedikit data yang perlu dikekalkan. Model boleh dimuat turun semula, jadi perkara yang perlu disandarkan hanyalah volum data Open WebUI, akaun, sejarah sembang, tetapan, dan sebarang fail drop-in systemd yang anda tulis. Sandarkan volum tersebut menggunakan kontena sementara:

docker run --rm -v open-webui:/data -v "$PWD":/backup alpine \
  tar czf /backup/open-webui.tgz -C /data .

Naik taraf Ollama dengan menjalankan semula skrip pemasangan; naik taraf Open WebUI dengan docker pull ghcr.io/open-webui/open-webui:main diikuti dengan penciptaan semula kontena. Jangan tetapkan versi untuk jangka masa panjang: kualiti model dan runtime berubah dengan pantas, jadi baca nota keluaran dan lakukan penanda aras semula pada pelayan anda sendiri dan jangan hanya mempercayai angka dari suku tahun lepas.

FAQ

Bolehkah saya benar-benar menjalankan LLM pada VPS yang hanya menggunakan CPU?

Ya, dengan batasan tertentu. Model terkuantisasi kecil dalam julat 3B hingga 8B boleh dijalankan pada CPU dan sangat berguna untuk draf, meringkaskan teks, serta klasifikasi, cuma kelajuannya perlahan, iaitu pada kadar satu angka hingga dua angka rendah token sesaat pada vCPU kongsi. Sebarang model bersaiz 13B ke atas akan menjadi sangat perlahan atau tidak akan dimuatkan langsung ke dalam RAM. Untuk kelajuan sebenar atau model yang lebih besar, anda memerlukan instance GPU.

Berapakah jumlah RAM yang diperlukan oleh setiap model?

Peraturan kasar untuk model terkuantisasi 4-bit lalai: kira-kira 0.5 GB RAM bagi setiap bilion parameter untuk pemberat (weights), ditambah kira-kira 1 GB untuk overhead dan sedikit lagi untuk konteks. Jadi, model 3B memerlukan kira-kira 4 GB ruang kosong, model 7-8B memerlukan kira-kira 8 GB, dan model 14B memerlukan kira-kira 16 GB. Semak ruang kepala (headroom) anda dengan free -h dan pastikan ada ruang yang mencukupi untuk sistem pengendalian serta aplikasi lain pada pelayan tersebut.

Adakah API Ollama mempunyai pengesahan?

Tidak. Ollama tidak mempunyai pengesahan terbina dalam, kunci API, atau had kadar (rate limit); sesiapa sahaja yang boleh mencapai port 11434 mempunyai kawalan penuh ke atasnya. Itulah sebabnya ia mengikat 127.0.0.1 secara lalai dan sebab anda tidak boleh mendedahkan 11434 pada 0.0.0.0 kepada internet. Capai ia secara setempat, melalui VPN peribadi, atau melalui reverse proxy yang menambah lapisan log masuk.

Bagaimanakah cara untuk menambah antara muka sembang web?

Jalankan Open WebUI dalam Docker dengan --network=host supaya ia berkongsi loopback hos dan mencapai Ollama asli pada http://127.0.0.1:11434, kemudian letakkan reverse proxy TLS di hadapan port 8080 untuk akses daripada komputer riba anda. Pastikan 8080 ditutup pada firewall supaya proxy menjadi satu-satunya pintu masuk awam. Akaun pentadbir Open WebUI sendiri menyediakan log masuk, dan anda menetapkan kata laluannya semasa pelancaran pertama.

Bagaimanakah cara untuk memanggilnya daripada aplikasi saya sendiri?

Gunakan endpoint yang serasi dengan OpenAI pada http://127.0.0.1:11434/v1. Halakan mana-mana SDK OpenAI ke URL asas tersebut, masukkan sebarang rentetan sebagai kunci API kerana ia akan diabaikan, dan tetapkan model kepada nama model yang telah anda tarik (pull). Kod OpenAI sedia ada biasanya boleh dijalankan tanpa perubahan selain daripada URL asas dan kunci API.