vreme čitanja : 14 minutes

Dva Pro pretplate, jedna mašina, jedna bankovna kartica i nula mrežnih konflikata. Kako mi je Docker omogućio da uduplim moj kapacitet oblačnog inferencije bez kupovine drugog računara.

Увод

Koristim Ollama Pro već nekoliko meseci da napajam svoje OpenCode sesije oblackim modelima. Stvar je u tome što, čak i sa Pro pretplatom, brzo smo ograničeni zbog rate limiting kada pokrenemo više agente paralelno. Očigledno rešenje: druga pretplata.

Ali tu je drama.

Ollama svaku mašinu identifikuje jedinstvenim SSH ključem — njena poznata Device Key. Dve instance na istom OS dele istu identitet, a nemoguće je povezati dva Pro naloga na istom uređaju. I kao što verovatno sumnjate, ne bih kupio drugi laptop samo iz tog razloga.

Решење: да лажемо. Да заставимо Олама да мисли да се извршава на два različita рачунара, иако деле ист CPU, ист RAM и ист мрежни конекција. Docker će nam ponuditi savršenu izolacionu bušku.

@startuml
!theme plain
skinparam BoxPadding 10
skinparam DefaultFontSize 12

left to right direction

node "физичка машина" {
  frame "Ollama инстанца A (Нативна)" as Native {
    database "Идентитет
/usr/share/ollama/.ollama/id_ed25519" as KeyA
    portin "API\n:11434" as PortA
  }

  frame "Ollama Instanca B (Docker)" as Docker {
    database "Идентитет
~/ollama-b-data/id_ed25519" as KeyB
    portin "API\n:11435" as PortB
  }
}

cloud "Ollama oblak" {
  actor "Pro nalog A\n(email 1)" as AccountA
  actor "Pro B nalog\n(email 2)" as AccountB
}

KeyA --> AccountA : "SSH ključ A"
KeyB --> AccountB : "SSH ključ B"
PortA --> AccountA : "Zahtevi A"
PortB --> AccountB : "Захтеви B"

note bottom of Docker
  Conteneur isolé : identité SSH distincte,
  port réseau distinct, volume persistant
end note
@enduml

Zašto dvaput isto?

Pre nego što me nazvete duševno bolesnim, slušajte me da vam objašnjam slučaj upotrebe.

Sa jednom Pro pretplatom, mogu da pokrenem model kao`deepseek-v4-pro:cloud`У сесії OpenCode. Проблема се јавља када желим две симултанне сессии. Квоте ограничења темпа доведу до тога да друга сесија застаје или је потпуно одбијена.

Sa dva nezavisna Pro pretplate:

  • Sesija OpenCode 1 → Profesionalni račun A`localhost:11434`)

  • Sesija OpenCode 2 → Pro Račun B`localhost:11435`)

Svaka sesija ima svoj kvotu, svoj kontekst i ne ometava drugog. To je ljudsko multiprocesiranje.

Dva Pro pretplate = dva različita e‑maila. Ista bankarska karta radi — sistem plaćanja Ollama ne blokira više pretplata iz istog plaćnog sredstva. Proverio sam.

Srce problema: Device Key

Kada instalirate Ollama, par SSH ed25519 ključeva se generiše u direktorijumu identiteta:

$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...

Ovaj ključ se prenosi na servere Ollama tokom`ollama signin`. Она је та која каже « овај рачунар pripada Pro nalogu ». Ако ваша две инстанце деле исту датотеку.id_ed25519, они деле исту идентитет. Крај игры.

Prevara : dati nasoj drugoj instanzi svoj direktorijum za identitet, izolovan u Docker volumen.

Sve na svom mestu — korak po korak

preduvjet

  • Funkcionalna nativna instalacija Ollama (službeni skript`curl | sh`)

  • Docker instaliran i funkcionalan

  • Portainer ili docker-compose za rozvrštanje

  • Два акаунта Ollama са два различита имејла

Ja sam koristio verziju`0.20.2`— ta koja je pružena zvaničnim skriptom i odgovarajuća Docker slika.

Корак 1 : Створите волуме

Jednostavni direktorijum na gazdi će služiti kao trajni volumen za identitet instance B :

mkdir -p ~/ollama-b-data

Ovaj direktorijum će biti montiran u Docker kontejneru kao`/root/.ollama`, gde Ollama čuva svoje identitetne ključeve, svoju istoriju i svoje modele.

Корак 2: покрени Docker контејнер

# docker-compose.yml
services:
  ollama-instance-b:
    image: ollama/ollama:0.20.2
    container_name: ollama-instance-b
    ports:
      - "11435:11434"
    volumes:
      - /home/cheroliv/ollama-b-data:/root/.ollama
    environment:
      - OLLAMA_HOST=0.0.0.0
    restart: always

Šta se deje ovde :

  • luka11435домаћина је мапирано на11434unutrašnji deo kontejnera. Zato, instanca Docker sluša na`:11435`bez sukoba sa nativnom instancom koja zauzima`:11434`.

  • volumen`~/ollama-b-data`je montirano na`/root/.ollama`— tamo će se SSH identitet sačuvati.

  • `OLLAMA_HOST=0.0.0.0`omogućuje kontejneru da prihvata vanjske konekcije

Разврстао сам свој стек пре Portainer-а, али једноставан`docker compose up -d`функционише једнако dobro.

Корак 3: Преузети јавни кључ

Контејнер будучи празан при првом покретању, Ollama аутоматски генерише нову пару SSH-ключева у волуму. Преуземемо јавни ключ :

$ docker exec ollama-instance-b cat /root/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDDQ+dvnfmuo49q5O8LOlvgZ39SKORFw47ry9k4H2jPc

Proveravam da je ovaj ključ različit od onog nativne instance:

# Instance native
$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGyF...(différente)

# Instance Docker
$ cat ~/ollama-b-data/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDDQ...(différente)

Dva različita ključa, dva odvojena identiteta. Igra je završena.

Ako vaš kontejner se ponovo pokrene, on ponovo koristi ključeve prisutne u volumu. Identitet je stalni. Nećete izgubiti vezu sa Pro nalogom.

Korak 4: Sačuvajte ključ na Ollama.com

Smer https://ollama.com/settings/keys → Dodaj SSH ključ. Zalepimo javni ključ Docker instance i potvrdimo.

Zatim, povežemo ovaj identitet sa nalogom Pro B:

$ docker exec -it ollama-instance-b ollama signin

Preglednik se otvara, prijavimo se koristeći e‑mail naloga B, a token je povezan sa SSH ključem kontejnera. Proveravamo da je sve u redu:

$ docker exec -it ollama-instance-b ollama signin
User: cherolivpro

Korak 5: Testirati sa besplatnim malim modelom

Pre nego što izgovorim cenu Pro pretplate, želim da budem siguran da cevovod radi. Povučem mali lokalni i besplatan model da proverim konektivnost:

$ docker exec ollama-instance-b ollama pull qwen3:0.6b
pulling manifest
pulling 7f4030143c1c: 100% ▕██████████████████▏ 522 MB
success

$ curl -s http://localhost:11435/api/tags
{"models":[{"name":"qwen3:0.6b","model":"qwen3:0.6b",...}]}

luka`11435`Odgovara, model je serviran. Instanca B je živa.

Jednom da se uverim, pređem na pull pravog modela cloud Pro :

$ docker exec ollama-instance-b ollama pull deepseek-v4-pro:cloud
pulling manifest
pulling 31c3059e137e: 100% ▕██████████████████▏  344 B
success

344 bajtova za manifest modela u oblačnom okruženju — normalno, inferencija se vrši na strani servera, a ne lokalno. I evo konačnog testa :

$ curl -s http://localhost:11435/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"deepseek-v4-pro:cloud","messages":[{"role":"user","content":"Dis bonjour en une phrase courte."}]}'

{
  "id": "chatcmpl-480",
  "model": "deepseek-v4-pro",
  "choices": [{
    "message": { "content": "Bonjour !" },
    "finish_reason": "stop"
  }],
  "usage": { "total_tokens": 181 }
}

Zdravo i tebi, instanca B.

Ловушка API `/v1/models

Изгубих 20 минута на глупом детаљу. када сам подешио провајдер`ollama-b`U OpenCode-u, ništa se nije pojavilo u selektoru modela. Ništa. Uopšte ništa.

Razlog ? API`/v1/models`instanca B je vraćala`{"object":"list","data":null}`umesto`{"object":"list","data":[]}`kada nije bilo povučeno ni jedan model. Vrednost`null`prouzrokovao je slom parsiranja na strani OpenCode, koji nije prikazivao provider.

Решение: декларисати моделе експлицитно у конфигурацији OpenCode умesto da se oslonite na dinamičko otkrivanje.

~/.config/opencode/opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama (local)",
      "options": { "baseURL": "http://localhost:11434/v1" },
      "models": {
        "gemma4:e2b": { "name": "Gemma 4 E2B (local)" }
      }
    },
    "ollama-b": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama Instance B (Docker)",
      "options": { "baseURL": "http://localhost:11435/v1" },
      "models": {
        "qwen3:0.6b": { "name": "Qwen3 0.6B (B)" },
        "deepseek-v4-pro:cloud": { "name": "DeepSeek V4 Pro (B)" }
      }
    }
  }
}

Sa ovom eksplicitnom deklaracijom, OpenCode odmah vidi provider B i njegove modele. Restart sesije, i selektor`/models`Prikazuje obje instance pored jedne strane druge.

Ako ne vidite svoj prilagođeni provider u`/models`, Ne gubite tri sata na ponovo pokretanje terminala. Deklarišete modele ručno u`opencode.json`— Rešava problem odmah.

Резултат: Две сесије, Два налога, нула конфликата

Na kraju, mogu pokrenuti dve sesije OpenCode istovremeno:

Session 1 → /models → Ollama (local) → deepseek-v4-pro:cloud → Compte A
Session 2 → /models → Ollama Instance B (Docker) → deepseek-v4-pro:cloud → Compte B

Svaka sesija ima svoj kvotu, svoj rate limit i ne stepaju jedno drugom na nože. Ista mašina, ista plava kartica, dva različita mejla.

I najbolji? Docker kontejner je u`restart: always`. Он прежива ребуте систему без ручног вмешательства.

Научени уроци

  1. Docker izoliše sve, čak i identitet— Jednostavan bind mount toma je dovoljno da kontejneru da svoj sopstveni skup SSH ključeva, čineći ga neodvojivim od drugog fizičkog stroja u očima Ollama.

  2. Dva emaila, ista CB— Ollama ne blokira višestruke pretplate iz istog načina plaćanja. Jedino e-mail mora biti različit.

  3. Бесплатно тестирајте пре плаћања — Un ollama pull qwen3:0.6b (modèle libre, 522 Mo) permet de valider toute la chaîne réseau sans débourser un centime. Vous validez le plomberie d’abord, vous activez le Pro ensuite.

  4. /v1/models` sa data: null ometa OpenCode— Ako podesite custom provider sa`"models": {}`, OpenCode pokušava da otkrije modele putem API-a. Ako API odgovori`data: null`, provider se ne pojavljuje. Izrazite modeli eksplicitno.

  5. Два naloga, то је човечки мулти-процесинг— Jedan Pro nalog = jedna aktivna sesija OpenCode. Dva naloga = dve paralelne sesije. Za nekoga ko rukovodi više Gradle projekata u isto vreme, ovo je igra menjač.

Повезани чланци