Savo AI pagalbininkas serveryje: Ollama ir Open WebUI

Paskutinį kartą atnaujinta: 2026-09-24 · Ovanap Team, knygos „Linux nuo nulio“ autoriai (leidėjas – Ovanap, Monine AS)

Trumpas atsakymas: taip, privatų ChatGPT tipo pagalbininką galima paleisti įprastame VPS serveryje ir be vaizdo plokštės. Ollama ir Open WebUI paleidi per Docker Compose, sąsajos prievadą susieji su 127.0.0.1 ir ją publikuoji per nginx su HTTPS. Rinkis mažą modelį, kuris telpa į laisvą serverio RAM (pavyzdžiui, llama3.2:1b), o jei serveris per mažas – prijunk tiekėjo API.

Svarbiausia

  • Ollama pagal numatymą klauso adresu 127.0.0.1:11434. Adresą pakeisti galima tik kintamuoju OLLAMA_HOST (Ollama DUK).
  • llama3.2:1b Ollama bibliotekoje sveria 1,3 GB (2026-09-24 duomenimis, ollama.com). Tikslių RAM reikalavimų biblioteka neskelbia.
  • Open WebUI dokumentacija už nginx reikalauja proxy_buffering off; (buferizavimas sugadina gyvai siunčiamus atsakymus), WebSocket antraščių ir kintamojo CORS_ALLOW_ORIGIN (Open WebUI ir nginx).
  • Docker atveriami prievadai apeina ufw (Docker dokumentacija), todėl compose faile rašoma 127.0.0.1:3000:8080.
  • GPU nebūtina. Ji perka greitį, o ne galimybę paleisti modelį: procesoriumi maži modeliai atsako lėtai, bet veikia.

Kai naudojiesi AI pokalbių svetaine, trys dalykai ten ne tavo: taisyklės (ką modeliui leidžiama daryti ir kada paslauga pasikeis), duomenys (tavo klausimai keliauja į kažkieno serverį) ir sąskaita. Visą pokalbį galima perkelti į serverį, kurį valdai pats: atviras modelis veikia per Ollama (programą, kuri parsisiunčia atvirus kalbos modelius ir paleidžia juos tavo kompiuteryje), pokalbių langą suteikia Open WebUI (atvirojo kodo ChatGPT tipo sąsaja naršyklėje), abu – Docker konteineriuose, už nginx (interneto serverio, veikiančio kaip atvirkštinis tarpinis serveris: jis priima HTTPS ryšius ir perduoda juos vidinei paslaugai).

Šiame straipsnyje parodysime, kaip tai paruošti Ubuntu Server 26.04 LTS VPS serveryje, sąžiningai aptarsime RAM ir greitį, o svarbiausia – vieną Docker klaidą, dėl kurios visa sistema atsiveria internetui. Darome prielaidą, kad jau turi apsaugotą serverį (žr. VPS paruošimo sąrašą), įdiegtą nginx ir domeną.

Pirmiausia: ar modelis tilps? Svarbu RAM, o ne GPU

Modelis – tai milijardai skaičių (svorių), ir atsakinėjant visi jie turi gulėti atmintyje. Įsivaizduok, kad diskas yra spinta, o RAM – darbastalis: modelio skaičių lentelė turi tilpti ant stalo.

Vaizdo plokštė nėra būtina. GPU – tarsi stadionas paprastų darbininkų, vienu metu atliekančių vienodus daugybos veiksmus, todėl su ja atsakymai gerokai greitesni. Be jos darbą atlieka procesorius – lėčiau, bet veikia. Tai praktiškai įmanoma dėl kvantavimo: tas pats modelis, užrašytas mažesniu tikslumu, tarsi suspausta nuotrauka; bibliotekose matysi žymas Q4 ar Q8.

Prieš rinkdamasis – pamatuok:

free -h

Žiūrėk į stulpelį available. Taisyklė: modelis turi tilpti į available su atsarga. Ollama biblioteka tikslių RAM reikalavimų neskelbia, todėl ir mes jų neišgalvojame. Orientyru imk modelio failo dydį, o įkėlus modelį ollama ps stulpelyje SIZE parodys, kiek jis užima iš tiesų.

Maži modeliai iš Ollama bibliotekos (parsisiuntimo dydžiai 2026-09-24):

Modelis Parsisiuntimo dydis
gemma3:270m 292 MB
qwen3:0.6b 523 MB
gemma3:1b 815 MB
llama3.2:1b 1,3 GB
qwen3:1.7b 1,4 GB
llama3.2:3b 2,0 GB

Pradžiai siūlome llama3.2:1b. Dydžiai ir žymos keičiasi, todėl dabartinį sąrašą laikome modelių priede. Nepamiršk, kad atminties reikia ir pačiai Open WebUI bei sistemai. Jei available mažiau nei modelis, rinkis mažesnį arba kelią B (apie jį žemiau).

Du sąžiningi lūkesčiai. Be GPU atsakymas bėga lyg diktuojamas tekstas – tai normalu, ne gedimas. O jei modelis vos telpa, serveris klimpsta į iškėlimo sritį (swap) ir „galvoja“ minutėmis; vaistas – mažesnis modelis.

Du keliai į tą patį pagalbininką

  • Kelias A: vietinis modelis. Ollama paleidžia modelį tavo VPS serveryje. Klausimai lieka tavo serveryje, ribas nustato atmintis ir procesorius.
  • Kelias B: tiekėjo API. Open WebUI veikia tavo serveryje, bet atsakymus pateikia tiekėjas (pavyzdžiui, OpenAI) per tavo valdomą API raktą. Mokama už žetonus. Tinka, kai serveris per mažas arba nori stipresnio modelio.

Abu keliai baigiasi toje pačioje vietoje: privačiu pokalbių langu tavo naršyklėje.

1 žingsnis: įdiek Docker Engine

Docker Engine diek iš oficialios Docker saugyklos, o ne paketą docker.io. Tikslios eilutės, atkartojančios docs.docker.com, – Docker priede. Patikra:

docker --version
sudo docker run hello-world

2 žingsnis (nebūtinas): išbandyk Ollama terminale

Nori pamatyti, kaip modelis atsako, dar nieko nestatęs? Oficialus diegimo scenarijus:

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

Ši eilutė atsisiunčia scenarijų ir iškart jį vykdo, todėl naudok ją tik iš šaltinio, kuriuo pasitiki. Norėdamas pirmiausia perskaityti, atsisiųsk jį su -o /tmp/ollama-install.sh, peržiūrėk per less ir tik tada paleisk. Rankinis diegimas be scenarijaus aprašytas Ollama priede.

ollama run llama3.2:1b

Užduok klausimą, išeik komanda /bye. Tas pats modelis per vietinį API 11434 prievade atsako ir programoms:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2:1b",
  "prompt": "Parašyk vieną sakinį apie Linux.",
  "stream": false
}'

Atsakymas – JSON lauke "response". Pagal numatymą Ollama klauso tik adresu 127.0.0.1:11434. Taip ir palik: nustatymas OLLAMA_HOST=0.0.0.0 atveria ją tinklui be jokio slaptažodžio.

Toliau aprašyta Docker sąranka paleidžia savo Ollama, tad baigęs bandyti šią išvalyk: ollama rm llama3.2:1b ir sudo systemctl disable --now ollama.

3 žingsnis: Ollama ir Open WebUI per Docker Compose

Docker Compose viename YAML faile aprašo kelis konteinerius ir paleidžia juos kartu viena komanda.

mkdir -p ~/ai-paslauga && cd ~/ai-paslauga
nano compose.yaml
services:
  ollama:
    image: ollama/ollama
    restart: unless-stopped
    volumes:
      - ollama-duomenys:/root/.ollama

  sasaja:
    image: ghcr.io/open-webui/open-webui:main
    restart: unless-stopped
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      - CORS_ALLOW_ORIGIN=https://ai.ona-svetaine.lt
    volumes:
      - sasaja-duomenys:/app/backend/data
    ports:
      - "127.0.0.1:3000:8080"
    depends_on:
      - ollama

volumes:
  ollama-duomenys:
  sasaja-duomenys:

Vietoj ai.ona-svetaine.lt įrašyk savo antrinį domeno vardą. Tada:

docker compose up -d
docker compose exec ollama ollama pull llama3.2:1b
docker compose ps

Ką daro svarbiausios eilutės:

  • Tūriai (volumes) išsaugo modelius, pokalbius ir nustatymus, kai konteineriai atnaujinami ar perkuriami.
  • OLLAMA_BASE_URL=http://ollama:11434 – konteineriai vienas kitą pasiekia paslaugos vardu, nes kiekvienas konteineris turi savo „localhost“.
  • CORS_ALLOW_ORIGIN – Open WebUI dokumentacija jį rekomenduoja už atvirkštinio tarpinio serverio, kitaip gali neveikti WebSocket ryšys.
  • restart: unless-stopped – po perkrovimo viskas pasileidžia pats. Išbandyk iš tiesų: sudo reboot, tada docker ps.

4 žingsnis: prievado klaida, kuri atveria viską

Svarbiausia eilutė visame faile: "127.0.0.1:3000:8080".

Docker atveriami prievadai apeina ufw. Parašyk "3000:8080" be adreso – ir tavo pokalbių langas atviras visam internetui, nors sudo ufw status nieko nerodo. Su 127.0.0.1: priekyje 3000 prievadas egzistuoja tik serverio viduje. Įrodyk tai iš savo kompiuterio:

curl -I --max-time 10 http://203.0.113.10:3000

Turi baigtis Connection timed out. Šiuo atveju klaida – geras rezultatas.

5 žingsnis: nginx ir HTTPS priekyje

Sukurk failą /etc/nginx/sites-available/ai:

server {
    listen 80;
    listen [::]:80;
    server_name ai.ona-svetaine.lt;

    client_max_body_size 50M;

    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;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_buffering off;
        proxy_cache off;
    }
}

Eilutės Upgrade ir Connection praleidžia gyvą WebSocket srautą. proxy_buffering off neleidžia nginx „perkarpyti“ gyvai siunčiamų atsakymų (kitaip pokalbyje gali matytis ## ir **). client_max_body_size leidžia įkelti didesnius nei numatytasis 1 MB dokumentus. Įjunk ir apsaugok:

sudo ln -s /etc/nginx/sites-available/ai /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d ai.ona-svetaine.lt

Antriniam vardui reikia atskiro DNS A įrašo, rodančio į tavo serverį. Atidaryk https://ai.ona-svetaine.lt ir iškart susikurk administratoriaus paskyrą su stipriu slaptažodžiu. Daugiau smulkmenų – Open WebUI priede.

Kelias B: kai serveris per mažas

Išmesk ollama paslaugą ir depends_on, o Open WebUI prijunk prie tiekėjo API. Raktas guli faile ~/ai-paslauga/.env (viena eilutė OPENAI_API_KEY=...) su chmod 600 teisėmis – niekada ne compose faile, ne Git saugykloje ir ne ekrano nuotraukoje. Compose faile rašai tik ${OPENAI_API_KEY}, o docker compose .env failą perskaito pats. Open WebUI šiuos nustatymus įsimena per pirmąjį paleidimą, todėl vėlesni pakeitimai daromi per Settings → Admin → Connections. Visas failas ir pastabos apie kitus tiekėjus – API priede. Tiekėjo valdymo skydelyje nusistatyk išlaidų ribą.

Trys saugumo taisyklės

  1. Raktas lieka raktu. Tik .env faile su chmod 600. Jei nutekėjo – atšauk jį pas tiekėją.
  2. Sąsaja nėra vieša svetainė, kol nestovi už nginx su HTTPS ir stipriu administratoriaus slaptažodžiu.
  3. Modelio atsakymas nėra faktas. Maži vietiniai modeliai klysta dažniau, o skamba taip pat įtikinamai. Bet kurią modelio pasiūlytą komandą perskaityk prieš vykdydamas.

Dažni klausimai

Ar Ollama veikia VPS serveryje be vaizdo plokštės (GPU)? Veikia. Vaizdo plokštė perka greitį, o ne galimybę paleisti modelį. Serveryje tik su procesoriumi maži modeliai veikia, tik lėtai.

Kiek RAM reikia Ollama? Ollama biblioteka tikslių reikalavimų neskelbia. Laisvos RAM (available) turi būti bent tiek, kiek sveria modelio failas, ir dar šiek tiek darbui; tikrą naudojimą parodo ollama ps.

Nuo kurio mažo modelio pradėti? llama3.2:1b (1,3 GB, 2026-09-24 duomenimis) arba mažesni qwen3:0.6b ir gemma3:270m. Prieš siųsdamasis pažiūrėk bibliotekos puslapį.

Ar Open WebUI saugu atverti internetui? Tiesiogiai – ne. Susiek prievadą su 127.0.0.1, sąsają pasiek per nginx su HTTPS ir nusistatyk stiprų administratoriaus slaptažodį.

O jei serveris per silpnas vietiniam modeliui? Naudok Open WebUI su tiekėjo API (kelias B), raktą laikydamas .env faile.

Pasistatyk pats – su kiekvienu žingsniu paaiškintu

Ši sąranka – knygos „Linux nuo nulio“ kelionės tikslas. Knyga iki jo nuveda nuo nulio: terminalas, apsaugotas VPS, nginx su HTTPS, atsarginės kopijos, Docker, o tada – ši AI paslauga laboratorijoje, kurioje kiekviena komanda paaiškinta, o prie kiekvieno rizikingo žingsnio yra kelias atgal. Kadangi modeliai, diegimo eilutės ir VPS pasiūlymai keičiasi greitai, knyga remiasi internetiniu priedu, kurį nuolat atnaujiname.

Perskaityk nemokamą ištrauką (registruotis nereikia), o jei patiks – įsigyk knygą.