SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-07-24

Cara host Ollama di VPS dengan selamat

Gunakan VPS untuk hos LLM secara peribadi. Model 7B memerlukan 8 GB RAM dan memberikan 4 hingga 10 token sesaat pada CPU melalui port 11434.

Apa yang anda bina

Satu model bahasa open-weight tunggal yang berjalan pada pelayan milik anda, dijawab melalui HTTP API dan, jika mahu, halaman sembang dalam pelayar anda. Ollama adalah komponen yang memuat turun model, memuatkannya ke dalam memori, dan melayani permintaan pada http://127.0.0.1:11434. Pemasangan hanya memerlukan satu arahan. Segala perkara sukar terletak pada bahagian lain: memilih model yang mampu dimuatkan ke dalam RAM VPS anda, dan memastikan anda tidak mendedahkan pelayan inferens tanpa pengesahan kepada seluruh internet secara tidak sengaja.

Dua amaran penting terlebih dahulu. VPS yang hanya menggunakan CPU akan menjalankan model kecil dengan perlahan, dan API tersebut tidak mempunyai pengesahan terbina dalam sama sekali. Kedua-dua perkara ini dibincangkan secara terperinci di bawah, kerana kedua-duanya adalah punca masalah utama.

Semakan realiti saiz, dalam angka mudah

Jejak memori sesuatu model adalah lebih kurang saiz failnya, ditambah kira-kira satu gigabait untuk overhead masa larian, dan tambahan sedikit untuk tetingkap konteks. Model lalai Ollama adalah kuantisasi 4-bit (berlabel Q4), yang memerlukan kira-kira setengah gigabait RAM bagi setiap satu bilion parameter. Oleh itu, pengiraannya adalah mudah dan ia menentukan segalanya.

Model 3B seperti llama3.2:3b mempunyai saiz muat turun ~2 GB dan memerlukan sekitar 4 GB RAM kosong untuk dijalankan. Model 7B atau 8B seperti mistral:7b atau llama3.1:8b adalah ~5 GB pada cakera dan memerlukan sekitar 8 GB RAM, atau 16 GB untuk prestasi yang selesa. Model 13B atau 14B memerlukan kira-kira 16 GB. Apa-apa sahaja dalam julat 30B-hingga-70B memerlukan mesin dengan RAM besar atau, secara realistiknya, GPU — pada VPS CPU, ia sama ada tidak muat atau akan menjawab terlalu lambat sehingga tidak berguna.

Seterusnya adalah kelajuan, kerana ini adalah bahagian yang sering dipandang rendah. Inferens CPU dihadkan oleh lebar jalur memori, bukan kelajuan jam, dan VPS vCPU kongsi mempunyai lebar jalur yang sederhana. Jangkakan kadar token tunggal hingga dua angka rendah sesaat: model 7-8B Q4 mungkin mencapai 4 hingga 10 token sesaat, manakala model 3B adalah 10 hingga 25 token sesaat. GPU adalah kira-kira sepuluh kali ganda lebih pantas. Angka ini adalah anggaran kasar — langkah yang jujur adalah dengan mengukur mesin anda sendiri, seperti yang ditunjukkan dalam langkah larian di bawah. Percayai eval rate anda, bukan angka dalam mana-mana artikel, termasuk yang ini.

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

Untuk membandingkan model tertentu dengan mesin tertentu, anggarkan jejak memorinya di sini:

ToolLLM VRAM and model-size calculator

Pasang Ollama

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

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

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

systemctl status ollama
ollama --version

Jika anda sudah menjalankan Docker, gunakan kontena sebagai ganti:

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

Perhatikan awalan 127.0.0.1: pada pemetaan port. Itu mengikat port 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 dua proses akan berebut 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 dalam cakera (kira-kira 2 GB untuk model ini). run memuatkan lapisan tersebut ke dalam memori dan menyediakan anda pada prompt >>>. Taip satu soalan. Token pertama mungkin mengambil masa beberapa saat sementara pemberat dimuatkan dari cakera ke RAM, kemudian jawapan akan dipaparkan secara aliran. Taip /bye untuk keluar daripada sembang; Ollama akan terus berjalan di latar belakang.

Lihat apa yang dimuatkan dan bagaimana ia digunakan:

ollama ps

Lajur PROCESSOR menunjukkan maklumat sebenar. 100% CPU bermaksud tiada GPU digunakan, dan itulah punca kelambatan berlaku. Ukur kelajuan sebenar dengan flag verbose:

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

Baris eval rate yang dicetak di akhir adalah kadar token sesaat pada perkakasan ini. Itu adalah angka yang perlu digunakan untuk perancangan.

Lokasi model, dan jumlah cakera yang perlu dibeli

Model yang dipasang oleh skrip dan dijalankan sebagai perkhidmatan berada di dalam home user ollama:

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

Jika dijalankan secara interaktif sebagai user anda sendiri, model berada di ~/.ollama/models. Di dalam container, model berada dalam named volume ollama. Perkara ini penting kerana berat quantized bertambah dengan cepat: model 3B adalah ~2 GB, 7-8B adalah ~5 GB, dan 14B adalah ~9 GB. Jika anda memuat turun empat model untuk perbandingan, anda telah menggunakan 20 GB tanpa disedari. Tentukan saiz cakera berdasarkan jumlah model yang ingin disimpan, dan padamkan selebihnya dengan ollama rm <model>.

Jalankan sebagai perkhidmatan yang anda kawal

Skrip pemasangan telah mendaftarkan ollama.service, jadi ia akan dimulakan semula semasa boot tanpa sebarang tindakan tambahan. Tetapan yang perlu diubah adalah tempoh model kekal dalam memori, dan pada sesetengah tetapan, alamat bind — kedua-duanya perlu dimasukkan ke dalam systemd drop-in supaya naik taraf Ollama tidak memadam tetapan tersebut:

sudo systemctl edit ollama.service

Tambah bahagian ini di bawah pengepala [Service] yang dipaparkan oleh editor:

[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"

OLLAMA_KEEP_ALIVE adalah tempoh model kekal dalam memori selepas permintaan terakhir (lalai ialah 5 minit). Tingkatkan nilai ini pada pelayan yang menerima permintaan sepanjang hari untuk mengelakkan pemuatan semula weight setiap kali; tetapkan kepada 0 pada pelayan dengan sumber terhad untuk membebaskan RAM sebaik sahaja permintaan selesai. systemctl edit memuat semula fail unit untuk anda, jadi mulakan semula untuk melaksanakan perubahan:

sudo systemctl restart ollama

Titik keselamatan yang paling penting

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

API ini tidak mempunyai pengesahan. Tiada langsung. Tiada kunci API, tiada log masuk, tiada had kadar, tiada senarai benar. Sesiapa sahaja yang boleh mencapai port 11434 boleh menjalankan sebarang model yang telah anda muat turun, memuat turun model baharu, memadamnya, dan membebankan CPU atau GPU anda pada beban penuh tanpa had. Pengimbas seperti Shodan mengindeks ribuan instans Ollama yang terbuka, dan instans yang terdedah akan ditemui dan disalahgunakan dalam masa beberapa jam.

Oleh itu, ini adalah satu kesilapan tunggal yang tidak boleh dilakukan: jangan tetapkan OLLAMA_HOST=0.0.0.0 dan buka port 11434 dalam firewall anda. Itu akan menerbitkan pelayan inferens tanpa pengesahan ke seluruh internet. Sebarang konfigurasi tidak akan menjadikan 11434-pada-0.0.0.0 selamat, kerana tiada apa yang boleh dikonfigurasi dalam Ollama — pengesahan memang tidak wujud.

Terdapat tiga cara selamat untuk mencapai model dari lokasi selain daripada mesin tersebut:

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

Pilihan reverse-proxy adalah apa yang akan diberikan oleh UI sembang seterusnya, dengan log masuk sebenar disertakan.

Tambah UI sembang dengan Open WebUI, di belakang TLS

Open WebUI ialah antara muka sembang hos-sendiri. Jalankan ia dalam Docker dan sambungkan 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 adalah butiran penting pada Linux VPS. Ia meletakkan kontena dalam namespace rangkaian hos, supaya 127.0.0.1 di dalam kontena adalah loopback hos itu sendiri dan kontena boleh mencapai Ollama pada 127.0.0.1:11434 tanpa Ollama perlu mendengar pada mana-mana antara muka lain. Kaedah 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 kepada gateway bridge Docker, dan servis yang terikat pada 127.0.0.1 pada hos tidak boleh dicapai melalui bridge, jadi Open WebUI akan gagal menyambung ke Ollama.

Kesan sampingan penggunaan host networking ialah Open WebUI kini mendengar pada port 8080 hos pada setiap antara muka; sebarang pemetaan -p akan diabaikan, dan Docker akan memaparkan amaran mengenainya. Oleh itu, tutup 8080 pada firewall hos dan pembekal, dan biarkan reverse proxy TLS menjadi satu-satunya pintu awam. Pada lawatan pertama, Open WebUI akan meminta anda mencipta akaun admin — akaun tersebut adalah lapisan pengesahan anda, jadi pilih kata laluan yang kuat.

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

Gunakan endpoint serasi OpenAI daripada kod anda

Ollama menggunakan subset API sembang OpenAI pada /v1, jadi kebanyakan perpustakaan 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 perpustakaan klien tetapi diabaikan oleh Ollama, jadi sebarang string boleh digunakan. model mestilah nama model yang telah anda muat turun; 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 adalah cara untuk menyambungkan model ke alatan ejen dan editor. Jika anda sudah membangun di mesin tersebut, model tempatan boleh menyokong skrip dan plugin bersama Claude Code yang berjalan pada VPS di dalam tmux, memastikan kerja draf yang murah dan peribadi tidak menggunakan API berbayar manakala penaakulan berat kekal dengan model hos.

Mod kegagalan, dengan rentetan teks tepat yang akan anda lihat

Proses "Killed" semasa penjanaan. Anda memulakan model besar dan terminal mencetak Killed, atau log pelayan menunjukkan llama runner process has terminated: signal: killed. Linux OOM killer menghentikannya kerana model memerlukan lebih banyak RAM daripada yang ada pada mesin tersebut. Sahkan punca dengan sudo dmesg | grep -i oom, di mana anda akan melihat baris seperti Out of memory: Killed process ... (ollama). Penyelesaiannya ialah menggunakan model yang lebih kecil atau yang mempunyai kuantisasi lebih tinggi — llama3.2:3b berbanding 13B — atau menambah swap supaya beban yang melebihi RAM fizikal dapat diselesaikan secara perlahan berbanding terhenti sepenuhnya. Swap menukarkan kegagalan serta-merta kepada jawapan yang perlahan; ia tidak menjadikan model 70B praktikal pada 4 GB.

"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 yang lebih sopan bagi kegagalan di atas: Ollama telah melakukan pengiraan dan berhenti daripada membiarkan OOM killer melakukannya. Ia juga memberikan anda dua nombor tersebut. Pilih model yang keperluan memorinya adalah di bawah RAM bebas anda (semak dengan free -h), pendekkan panjang konteks, atau beralih ke VPS yang lebih besar. Tiada flag yang boleh memuatkan model tersebut — memori adalah had fizikal yang nyata.

Token pertama mengambil masa yang lama, kemudian ia lancar. Model yang baru dimuatkan tidak mencetak apa-apa selama lima hingga tiga puluh saat, kemudian mula mengalir secara normal. Jeda tersebut adalah proses memuatkan pemberat (weights) dari cakera ke dalam RAM buat kali pertama, dan storan yang perlahan memburukkan lagi keadaan. Sebaik sahaja dimuatkan, model akan kekal dalam memori selama OLLAMA_KEEP_ALIVE, jadi prom kedua akan dijawab secara serta-merta. Tingkatkan nilai tersebut jika jeda itu mengganggu anda, dan gunakan ollama ps untuk melihat sama ada model sedang dimuatkan atau tidak.

Semuanya sekadar perlahan. Sepuluh token sesaat atau kurang, tanpa sebarang ralat. Itu adalah inferens CPU yang berfungsi seperti biasa. ollama ps menunjukkan 100% CPU, bermaksud tiada GPU. Ini bukan pepijat dan tiada tetapan yang boleh memperbaikinya, 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 memutuskan sebarang kerosakan.

Connection refused 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 "perbaiki" ia dengan mengikat 0.0.0.0, yang merupakan kesilapan pendedahan di atas. Akses model melalui VPN atau melalui proksi pengesahan sebagai ganti.

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

Sandaran dan naik taraf

Terdapat sedikit data keadaan yang perlu disimpan. Model boleh dimuat turun semula, jadi satu-satunya perkara yang perlu disandarkan adalah volum data Open WebUI — akaun, sejarah sembang, tetapan — dan mana-mana fail systemd drop-in 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 kemudian bina semula kontena tersebut. Jangan bergantung pada versi lama untuk jangka masa panjang: kualiti model dan masa larian berubah dengan pantas, jadi baca nota keluaran dan lakukan ujian penanda aras semula pada mesin anda sendiri daripada mempercayai angka suku tahun lepas.

FAQ

Bolehkah saya menjalankan LLM pada VPS yang hanya mempunyai CPU?

Ya, tetapi dengan had tertentu. Model kuantisasi kecil dalam julat 3B hingga 8B boleh berjalan pada CPU dan sangat berguna untuk draf, ringkasan, dan klasifikasi — cuma ia perlahan, pada kadar satu digit hingga dua digit token sesaat pada vCPU kongsi. Apa-apa model dari 13B ke atas adalah sangat perlahan atau tidak akan muat dalam RAM sama sekali. Untuk kelajuan sebenar atau model yang lebih besar, anda memerlukan instans GPU.

Berapakah jumlah RAM yang diperlukan oleh setiap model?

Peraturan kasar untuk model kuantisasi 4-bit lalai: kira-kira 0.5 GB RAM bagi setiap satu bilion parameter untuk pemberat, ditambah kira-kira 1 GB untuk 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. Semak baki memori anda dengan free -h dan sediakan ruang untuk sistem operasi dan proses lain pada pelayan.

Adakah API Ollama mempunyai pengesahan?

Tidak. Ollama tidak mempunyai pengesahan terbina, kunci API, atau had kadar — sesiapa yang boleh mengakses port 11434 mempunyai kawalan penuh ke atasnya. Itulah sebabnya ia mengikat 127.0.0.1 secara lalai dan mengapa anda tidak boleh mendedahkan port 11434 pada 0.0.0.0 ke internet. Akses ia secara lokal, melalui VPN peribadi, atau melalui reverse proxy yang menambah log masuk.

Bagaimanakah cara untuk menambah antara muka sembang web?

Jalankan Open WebUI dalam Docker dengan --network=host supaya ia berkongsi loopback hos dan dapat mengakses Ollama asli pada http://127.0.0.1:11434, kemudian letakkan TLS reverse proxy di hadapan port 8080 untuk akses dari komputer riba anda. Pastikan 8080 ditutup pada firewall supaya proxy menjadi satu-satunya pintu awam. Akaun admin Open WebUI menyediakan fungsi log masuk, dan anda menetapkan kata laluan pada 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 OpenAI SDK ke URL asas tersebut, masukkan sebarang string sebagai kunci API kerana ia diabaikan, dan tetapkan model kepada nama model yang telah anda muat turun. Kod OpenAI sedia ada biasanya boleh dijalankan tanpa perubahan kecuali pada URL asas dan kunci API.