Cara Jalankan Ollama dalam Podman Rootless pada VPS
Ketahui cara menjalankan Ollama sebagai kontena Podman tanpa root pada VPS. Panduan ini merangkumi konfigurasi lingering, fail Quadlet, label SELinux, dan akses port selamat.
Menjalankan Ollama dalam Podman tanpa root pada VPS
Untuk menjalankan Ollama dalam Podman tanpa root pada pelayan, lima perkara perlu dipenuhi yang mungkin tidak dinyatakan dalam panduan desktop. Pengguna tanpa keistimewaan (unprivileged) yang khusus perlu memiliki kontena tersebut. Ciri 'lingering' perlu diaktifkan untuk pengguna tersebut supaya kontena terus berjalan selepas anda log keluar. Fail Quadlet menyerahkan kontena kepada systemd supaya ia bermula semula selepas but semula (reboot). Direktori model perlu mempunyai label SELinux pada pengedaran yang menguatkuasakannya. API hanya mendengar pada loopback, dan anda mengaksesnya melalui terowong SSH (secure shell).
Ollama ialah pelayan untuk model bahasa besar (LLM). Ia menyimpan pemberat model pada cakera, memuatkannya ke dalam memori, dan menjawab permintaan HTTP pada port 11434. Ia tidak mempunyai log masuk, kunci API, atau akaun pengguna, jadi rangkaian adalah satu-satunya kawalan akses yang anda miliki. Podman menjalankan kontena tanpa daemon dan tanpa root, jadi apa-apa yang terlepas daripada kontena bermula sebagai pengguna biasa tanpa keistimewaan. Jika anda mahukan perbandingan runtime terlebih dahulu, baca perbezaan Podman dan Docker pada VPS. Jika anda lebih suka mengelakkan kontena sepenuhnya, memasang Ollama secara terus pada VPS adalah laluan yang lebih singkat.
SSD Nodes menyediakan Fedora antara imejnya, dan Fedora membekalkan kedua-dua Podman dan SELinux (security-enhanced Linux) secara lalai. Setiap arahan di bawah berjalan pada mana-mana pengedaran yang membawa Podman 5 atau lebih baharu.
Mengapa versi komputer riba memerlukan perubahan pada pelayan
Fedora Magazine menerbitkan panduan langkah demi langkah yang jelas mengenai tindanan ini pada 5 Ogos 2026: Menjalankan Ollama Secara Setempat dengan Podman pada Fedora Linux, oleh Yazan Monshed. Ia merupakan pengenalan yang baik untuk jam pertama anda menggunakan alatan tersebut. Panduan itu disasarkan untuk komputer riba, dan empat daripada pilihannya berkelakuan berbeza pada mesin yang mempunyai alamat IP awam.
- Ia memulakan kontena dengan
podman run -dbiasa. Kontena yang dimulakan secara manual tidak akan kembali selepas but semula, kerana tiada arahan yang menetapkannya untuk bermula secara automatik. - Ia menggunakan tag bergerak
ollama/ollama. Pada komputer riba, anda akan perasan pada hari tingkah laku tersebut berubah. Pada pelayan, tanda pertama ialah skrip yang berhenti berfungsi secara tiba-tiba pada waktu malam. - Ia menerbitkan dengan
-p 11434:11434, yang mengikat setiap antara muka. Di sebalik penghala rumah, ia tidak boleh dicapai dari internet. Pada VPS, ia menjadi API inferens awam tanpa sebarang kata laluan. - Ia berjalan sebagai pengguna log masuk anda sendiri. Pada pelayan, akaun yang memiliki kontena tersebut tidak sepatutnya memiliki apa-apa perkara lain, supaya jika berlaku pencerobohan, ia hanya akan mendarat di direktori utama yang kosong.
Tiada satu pun daripada perkara tersebut salah untuk mesin yang ia ditulis untuknya. Setiap item hanyalah keputusan yang perlu anda semak semula apabila mesin tersebut boleh dicapai dari mana-mana sahaja dan tiada sesiapa yang berada di hadapannya.
Cipta pengguna tanpa keistimewaan, dan semak subuid
Podman tanpa root memetakan ID pengguna (UID) dalaman kontena kepada blok ID yang tidak digunakan pada hos. Blok tersebut diisytiharkan dalam /etc/subuid dan /etc/subgid. Tanpanya, kontena tanpa root tidak boleh bermula sama sekali.
sudo dnf install -y podman # or: sudo apt install -y podman
sudo useradd --create-home --shell /bin/bash --comment "Ollama container owner" ollama
sudo passwd --lock ollama
grep ollama /etc/subuid /etc/subgidgrep sepatutnya memaparkan dua baris, satu daripada setiap fail, masing-masing menamakan julat 65536 ID:
/etc/subuid:ollama:100000:65536
/etc/subgid:ollama:100000:65536Nombor permulaan anda akan berbeza, dan itu tidak mengapa. Jika grep tidak memaparkan apa-apa, useradd tidak memperuntukkan julat, dan arahan podman pertama sebagai pengguna tersebut akan gagal seperti ini:
Error: cannot find UID/GID for user ollama: no subuid ranges found for user "ollama" in /etc/subuidBerikan julat yang tidak dipegang oleh pengguna lain, kemudian beritahu Podman bahawa pemetaan lamanya sudah lapuk:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 ollama
sudo -iu ollama podman system migrateMengunci kata laluan bermakna tiada sesiapa boleh log masuk sebagai ollama secara terus. Anda mencapai akaun tersebut daripada pengguna pentadbir anda dengan sudo -iu ollama.
Dayakan lingering supaya servis terus berjalan selepas log keluar
Instans systemd pengguna biasanya bermula semasa log masuk dan berhenti semasa log keluar, dan /run/user/<uid> akan dipadamkan bersamanya. Setiap kontena rootless yang dimiliki oleh pengguna tersebut akan mati pada saat yang sama. Lingering memastikan instans pengguna terus berjalan tanpa sesi yang dilampirkan.
sudo loginctl enable-linger ollama
loginctl show-user ollama --property=LingerPerintah tersebut sepatutnya memaparkan Linger=yes. Dayakan fungsi ini sebelum anda mencipta unit tersebut, kerana direktori yang diperlukan oleh unit itu, /run/user/<uid>, hanya wujud setelah lingering diaktifkan.
Terdapat satu lagi langkah yang sering tidak dijangka. sudo -iu ollama memberikan anda shell tetapi bukan session bus, jadi systemctl --user akan gagal serta-merta:
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not definedsystemd mencari user bus pada $XDG_RUNTIME_DIR/bus, dan sudo -i tidak menetapkan pemboleh ubah tersebut. Tetapkan ia secara manual dalam setiap shell pentadbir di mana anda menguruskan servis ini:
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
systemctl --user statusLokasi penyimpanan blob model dan perancangan ruang cakera
Ollama menulis pemberat (weights) ke dalam /root/.ollama/models di dalam kontena. Lakukan bind pada direktori di direktori utama (home) pengguna ke laluan tersebut supaya fail disimpan di lokasi yang boleh anda ukur: /home/ollama/ollama-data/models. Fail blob disimpan dalam models/blobs sebagai fail yang dialamatkan mengikut kandungan, manakala models/manifests menyimpan indeks kecil yang menamakannya. Jika anda menggunakan volum bernama (named volume) seperti yang disarankan dalam hantaran Fedora Magazine, struktur direktori yang sama akan wujud di bawah /home/ollama/.local/share/containers/storage/volumes/<volume>/_data.
Tentukan saiz cakera sebelum anda memuat turun sebarang fail. Saiz muat turun yang diterbitkan merupakan nilai minimum.
The data behind this chart
[
{
"label": "gemma3:4b",
"download_gb": 3.3
},
{
"label": "mistral:7b",
"download_gb": 4.4
},
{
"label": "qwen3:8b",
"download_gb": 5.2
},
{
"label": "gemma3:12b",
"download_gb": 8.1
},
{
"label": "qwen3:14b",
"download_gb": 9.3
},
{
"label": "gemma3:27b",
"download_gb": 17
},
{
"label": "qwen3:30b",
"download_gb": 19
}
]Semua 7 baris adalah angka yang diterbitkan di ollama.com/library, bukan saiz yang diukur pada cakera. Tag terkecil di sini, gemma3:4b, memuat turun 3.3 GB. Tag terbesar, qwen3:30b, memuat turun 19 GB. Imej kontena itu sendiri disimpan di atas storan Podman, jadi semak kedua-dua angka tersebut dengan podman system df dan df -h /home. Sebuah model juga memerlukan ruang RAM yang hampir sama dengan saiz failnya semasa dimuatkan, ditambah dengan ruang untuk tetingkap konteks (context window). Oleh itu, model bersaiz 19 GB tidak akan dapat dijalankan pada VPS dengan RAM 16 GB.
Sematkan tag imej dan gunakan nama registry penuh
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
mkdir -p ~/ollama-data ~/.config/containers/systemd
podman pull docker.io/ollama/ollama:0.32.9Gunakan tag versi yang telah dikeluarkan, 0.32.9 setakat Ogos 2026, dan bukan latest. Tag yang disematkan bermakna but semula pada jam 04:00 akan memberikan anda binari yang sama dengan yang telah anda uji, jadi sebarang perubahan tingkah laku adalah perubahan yang anda lakukan sendiri. Docker Hub juga menerbitkan tag -rc dan -rocm untuk versi yang sama; pilih yang biasa kecuali anda mempunyai GPU AMD.
Tulis juga hos registry. Pada Fedora, nama pendek dalam unit systemd tidak mempunyai terminal untuk memberikan gesaan, dan unit tersebut akan gagal dengan ralat:
Error: short-name "ollama/ollama" did not resolve to an alias and no unqualified-search registries are definedMenarik imej secara manual terlebih dahulu adalah pilihan tetapi berguna, kerana ia memindahkan proses muat turun bersaiz berbilang gigabait keluar daripada had masa mula (start timeout) unit tersebut.
Unit Quadlet yang kekal selepas but semula
Quadlet ialah penjana systemd untuk Podman. Anda menulis fail .container, systemd menukarkannya menjadi servis semasa but, dan podman generate systemd tidak lagi diperlukan. Simpan ini sebagai /home/ollama/.config/containers/systemd/ollama.container, yang dimiliki oleh pengguna ollama.
[Unit]
Description=Ollama API (rootless)
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/ollama/ollama:0.32.9
ContainerName=ollama
PublishPort=127.0.0.1:11434:11434
Volume=/home/ollama/ollama-data:/root/.ollama:Z
Environment=OLLAMA_KEEP_ALIVE=30m
Environment=OLLAMA_MAX_LOADED_MODELS=1
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=default.targetNama fail menetapkan nama servis, jadi ollama.container menjadi ollama.service.
systemctl --user daemon-reload
systemctl --user start ollama.service
systemctl --user status ollama.servicestatus sepatutnya menunjukkan active (running). Jangan jalankan systemctl --user enable ollama.service. Unit tersebut tidak wujud sebagai fail pada cakera, jadi systemd akan menolak:
Failed to enable unit: Unit file /run/user/1001/systemd/generator/ollama.service is transient or generated.Bahagian [Install] sudah melaksanakan tugas tersebut. Quadlet mencipta pautan mula-semasa-but itu sendiri semasa daemon-reload, itulah sebabnya arahan tersebut tidak bersifat pilihan. TimeoutStartSec=900 meliputi permulaan pertama yang masih perlu memuat turun imej, memandangkan tempoh lalai 90 saat tidak mencukupi untuk muat turun dua gigabait dan systemd akan mematikan permulaan tersebut sebagai gagal. OLLAMA_KEEP_ALIVE=30m mengekalkan model dalam memori antara permintaan dan bukannya memunggahnya selepas lima minit; pertukaran (trade-off) dijelaskan dalam mengekalkan model Ollama dalam memori. Jika mana-mana kosa kata systemd di sini baharu bagi anda, cara servis dan pemasa systemd berfungsi pada VPS meliputi unit-unit tersebut.
Mengapa direktori model memberikan ralat permission denied di bawah SELinux
Pada Fedora, RHEL, Rocky dan AlmaLinux, SELinux dikuatkuasakan secara lalai. Proses kontena berjalan dalam domain container_t, manakala direktori dalam direktori home pengguna dilabelkan sebagai user_home_t. Polisi tidak membenarkan satu pihak mengakses pihak yang lain, menyebabkan Ollama tidak dapat mencipta pepohon modelnya dan kontena tersebut terhenti. getenforce akan mencetak Enforcing pada sistem ini, dan penafian akses direkodkan:
sudo ausearch -m avc -ts recentAnda akan melihat baris yang menamakan domain dan label sasaran:
avc: denied { write } for pid=1842 comm="ollama" name="models" dev="vda1" ino=131077 scontext=system_u:system_r:container_t:s0:c214,c827 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir permlisted=0:Z pada hujung baris Volume= adalah penyelesaiannya. Ia melabel semula direktori hos kepada container_file_t dan menandakannya dengan kategori MCS (multi-category security) peribadi yang hanya dibawa oleh kontena ini. :z huruf kecil menggunakan label kongsi sebaliknya, yang merupakan pilihan yang tepat apabila dua kontena membaca direktori yang sama.
Satu amaran mengenai :Z, kerana ia bersifat destruktif dan senyap. Pelabelan semula berlaku secara rekursif. Jika anda menghalakannya ke /home/ollama, setiap fail dalam direktori home tersebut akan dilabel semula, yang akan menyebabkan akses kunci SSH untuk pengguna tersebut gagal. Sentiasa berikan :Z subdirektori khusus yang tidak mengandungi apa-apa fail lain. Named volumes tidak memerlukannya, kerana Podman melabelkannya dengan betul semasa penciptaan. Jika anda memerlukan gambaran yang lebih luas, asas SELinux untuk pelayan menerangkan konteks dan boolean. Pada Ubuntu dan Debian, AppArmor digunakan sebagai ganti, :Z tidak mempunyai fungsi di sana, dan membiarkannya dalam unit adalah tidak berbahaya.
Tutup port 11434 dan capai API melalui SSH
PublishPort=127.0.0.1:11434:11434 mengikat bahagian hos kepada loopback. Sahkannya:
ss -ltnp | grep 11434
curl http://127.0.0.1:11434Output ss mesti menunjukkan 127.0.0.1:11434. 0.0.0.0:11434 atau *:11434 bermaksud port tersebut terbuka kepada internet, dan curl mesti menjawab Ollama is running.
Berhati-hati tentang bahagian mana yang anda ikat. Alamat dalam PublishPort ialah alamat hos. Di dalam container, Ollama mesti terus mendengar pada semua antara muka, yang merupakan tetapan lalai imej. Menetapkan Environment=OLLAMA_HOST=127.0.0.1 mengikat Ollama kepada loopback container itu sendiri, dan Podman menghalakan trafik yang diterbitkan ke alamat rangkaian container sebaliknya, jadi setiap permintaan ditolak walaupun daripada hos.
Port 11434 yang terbuka merugikan anda dalam dua cara. Ollama tidak mempunyai pengesahan, jadi sesiapa sahaja yang mencapai port tersebut boleh menyenaraikan model anda melalui /api/tags, menjalankan inferens pada CPU dan kuota lebar jalur anda melalui /api/generate, menarik model baharu ke dalam cakera anda, dan memadam model yang anda miliki. Kedua, HTTP biasa ke port jauh menghantar prompt dan penyelesaian dalam teks jelas, jadi setiap mesin di sepanjang laluan boleh membacanya. Kedua-dua masalah ini hilang jika port tersebut tidak pernah keluar dari kotak.
Dari stesen kerja anda, halakan port tersebut melalui SSH:
ssh -N -L 11434:127.0.0.1:11434 you@vps.example.comKini http://127.0.0.1:11434 pada komputer riba anda ialah Ollama pelayan tersebut, di dalam penyulitan sesi SSH. Jika komputer riba anda sudah menjalankan Ollama, ikatan tempatan akan gagal dengan bind [127.0.0.1]:11434: Address already in use; gunakan -L 11435:127.0.0.1:11434 dan halakan klien anda ke 11435.
Apabila klien pelayar memerlukannya, letakkan reverse proxy dengan kata laluan di hadapannya sebagai ganti. Blok tapak Caddy hanya empat baris, dan caddy hash-password mencetak hash bcrypt yang diperlukannya:
ollama.example.com {
basic_auth {
you $2a$14$replace_with_the_generated_hash
}
reverse_proxy 127.0.0.1:11434
}Caddy mendapatkan sijil melalui TLS (transport layer security) dengan sendirinya, jadi trafik disulitkan. Uji klien anda dahulu: banyak alatan yang berhubung dengan Ollama tidak mempunyai medan untuk header Authorization, dan ia akan gagal terhadap basic auth dengan 401 Unauthorized kosong. Terowong SSH tidak mempunyai masalah sedemikian, itulah sebabnya ia menjadi cadangan lalai di sini.
Tarik model dan semak keseluruhan laluan
podman exec -it ollama ollama pull gemma3:4b
curl -s http://127.0.0.1:11434/api/tags
curl -s http://127.0.0.1:11434/api/generate -d '{"model":"gemma3:4b","prompt":"Reply with the single word: ready","stream":false}'
du -sh ~/ollama-data/models/api/tags mengembalikan JSON yang menyenaraikan gemma3:4b. /api/generate mengembalikan objek JSON dengan medan response, selepas jeda sementara pemberat dimuatkan daripada cakera. du sepatutnya melaporkan nombor yang hampir dengan saiz muat turun yang diterbitkan. Kemudian, buktikan bahagian yang menjadi fokus keseluruhan panduan ini:
sudo reboot
# reconnect, then:
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
systemctl --user is-active ollama.serviceactive bermaksud proses masih berjalan, bahagian [Install] dan daemon-reload semuanya telah melaksanakan tugas masing-masing. inactive bermaksud salah satu daripada ketiga-tiganya hilang.
Mod kegagalan, berserta rentetan yang akan anda lihat
Kontena hilang selepas but semula. Semak loginctl show-user ollama --property=Linger dahulu, kerana tanpa Linger=yes, instans systemd pengguna tidak akan bermula semasa but. Jika lingering diaktifkan, bahagian [Install] mungkin tiada dalam fail .container, atau anda telah menyunting fail tersebut tanpa menjalankan systemctl --user daemon-reload.
Error: statfs /home/ollama/ollama-data: no such file or directory. Sumber bind mount mesti wujud sebelum kontena bermula. Podman tidak mencipta direktori hos untuk anda. Jalankan mkdir -p ~/ollama-data sebagai pengguna ollama.
Permulaan gagal pada 90 saat. journalctl --user -u ollama.service menunjukkan Start operation timed out. Terminating. kerana proses menarik imej masih berjalan. Tarik imej secara manual, atau kekalkan TimeoutStartSec=900.
Kontena bermula dan terus keluar. podman logs ollama dan sudo ausearch -m avc -ts recent secara bersama memberitahu anda sama ada ia berpunca daripada label SELinux. AVC yang menamakan container_t dan user_home_t bermakna :Z tiada.
Permintaan ditolak daripada hos. curl: (7) Failed to connect to 127.0.0.1 port 11434: Connection refused dengan servis active biasanya bermaksud OLLAMA_HOST telah ditetapkan kepada alamat loopback di dalam kontena. Buang baris tersebut.
Penjanaan sangat perlahan, atau kontena dimatikan. Tanpa GPU, inferens berjalan pada CPU dan model yang besar secara semula jadinya adalah perlahan. Kontena yang mati di tengah-tengah permintaan dengan signal: killed dalam log adalah disebabkan oleh kernel out-of-memory killer, jadi pilih tag yang lebih kecil daripada carta di atas.
Mengemas kini imej yang dipinkan
Peminkan (pinning) bermaksud kemas kini adalah tindakan yang anda lakukan, bukannya sesuatu yang berlaku secara automatik. Edit Image= dalam ollama.container, kemudian muat semula dan mulakan semula:
systemctl --user daemon-reload
systemctl --user restart ollama.service
podman exec ollama ollama --versionModel disimpan dalam bind mount, jadi ia kekal tidak terjejas apabila imej ditukar. AutoUpdate=registry dalam bahagian [Container] wujud untuk pengguna yang menjalankan tag yang berubah-ubah, dan ia tidak memberikan sebarang fungsi berguna jika diletakkan bersebelahan dengan tag versi tetap, kerana kandungan tag tersebut tidak pernah berubah. Buat sandaran bagi /home/ollama/ollama-data/models/manifests dan fail .container, dan abaikan blobs: saiznya besar, dan ollama pull akan mengambilnya semula pada mesin baharu.
FAQ
Mengapakah kontena Podman rootless saya berhenti apabila saya log keluar?
Instans systemd pengguna dan direktori /run/user/<uid> miliknya akan dimatikan apabila sesi terakhir pengguna tersebut berakhir, dan setiap kontena rootless akan turut terhenti. Jalankan sudo loginctl enable-linger ollama dan pastikan loginctl show-user ollama --property=Linger memaparkan Linger=yes. Aktifkan lingering sebelum anda mencipta unit Quadlet, kerana direktori runtime yang diperlukan oleh unit tersebut hanya wujud setelah lingering diaktifkan.
Adakah saya perlu meletakkan label SELinux pada direktori model Ollama?
Pada Fedora, RHEL, Rocky dan AlmaLinux, ya, jika anda melakukan bind mount pada direktori hos. Kontena tersebut berjalan dalam domain container_t dan direktori dalam folder home dilabelkan sebagai user_home_t, maka operasi tulis akan dinafikan dan Ollama akan terhenti. Tambahkan :Z pada baris Volume= dan sediakan subdirektori khusus, kerana proses pelabelan semula bersifat rekursif dan menghalakan :Z ke seluruh direktori home akan merosakkan akses kunci SSH pengguna tersebut. Named volumes dilabelkan dengan betul oleh Podman dan tidak memerlukan sebarang tetapan tambahan.
Berapakah ruang cakera yang diperlukan oleh model Ollama?
Mulakan dengan saiz muat turun yang diterbitkan di ollama.com/library, yang berjulat daripada 3.3 GB untuk gemma3:4b sehingga 19 GB untuk qwen3:30b. Tambahkan saiz imej Podman, kemudian sediakan ruang tambahan, kerana model kedua tidak menggantikan model pertama pada cakera. Semak df -h /home sebelum melakukan pull dan du -sh ~/ollama-data/models selepasnya. Rancang keperluan RAM dengan cara yang sama: sesebuah model memerlukan memori yang hampir sama dengan saiz failnya semasa dimuatkan, ditambah dengan tetingkap konteks (context window).
Adakah selamat untuk mendedahkan port 11434 pada VPS?
Tidak. Ollama tidak disertakan dengan sebarang bentuk pengesahan, jadi sesiapa sahaja yang mencapai port tersebut boleh menyenaraikan model anda, memadamkannya, memuat turun model baharu ke dalam cakera anda, serta menjalankan inferens menggunakan CPU dan kuota lebar jalur anda. Protokol HTTP biasa melalui internet juga menghantar setiap prompt dan jawapan dalam bentuk teks jelas (cleartext). Ikat (bind) bahagian hos kepada 127.0.0.1 dengan PublishPort=127.0.0.1:11434:11434, sahkan dengan ss -ltnp | grep 11434, dan capai servis tersebut melalui terowong SSH atau reverse proxy yang memerlukan kata laluan.