Συνδυασμός Δύο Συνδρομών Ollama Pro στην Ίδια Μηχανή με Docker
Δημοσιεύτηκε 08 May 2026
Δύο συνδρομές Pro, ένας υπολογιστής, μία πιστωτική κάρτα, και μηδενικές συγκρούσεις δικτύου. Πώς το Docker μου επέτρεψε να διπλασιάσω την ικανότητά μου για inference στο cloud χωρίς να αγοράσω έναν δεύτερο υπολογιστή.
Εισαγωγή
Χρησιμοποιώ το Ollama Pro από polla μήνες για να τροφοδοτώ τις συνεδρίες μου OpenCode σε μοντέλα cloud. Το πρόβλημα είναι ότι, ακόμα και με μια συνδρομή Pro, γρήγορα περιορίζόμαστε από τον rate limiting όταν τρέχουμε πολλούς agents παράλληλα. Η προφανής λύση : μια δεύτερη συνδρομή.
Αλλά εκεί, είναι το δράμα.
Ollama αναγνωρίζει κάθε συσκευή με ένα μοναδικό κλειδί SSH — η διάσημη Device Key. Δύο instances στον ίδιο λειτουργικό σύστημα θα μοιράζονταν την ίδια ταυτότητα, και είναι αδύνατο να συνδέσεις δύο λογαριαγές Pro στην ίδια συσκευή. Και όπως υποοείσθε, δεν ήθελα να αγοράσω ένα δεύτερο laptop μόνο για αυτό.
Η λύση: να γλυτώσουμε. Να πείσουμε το Ollama ότι τρέχει σε δύο διαφορετικές μηχανές, ενώ στην πράξη κοινόχρηστοι τον ίδιο CPU, την ίδια RAM και την ίδια δικτυακή σύνδεση. Το Docker θα μας προσφέρει ένα τελεαίο μπαμπάκι απομόνωσης.
@startuml
!theme plain
skinparam BoxPadding 10
skinparam DefaultFontSize 12
left to right direction
node "Φυσική Μηχανή" {
frame "Ollama Instance A (Native)" as Native {
database "Ταυτότητα\n/usr/share/ollama/.ollama/id_ed25519" as KeyA
portin "API\n:11434" as PortA
}
frame "Ollama Instance B (Docker)" as Docker {
database "Ταυτότητα\n~/ollama-b-data/id_ed25519" as KeyB
portin "API\n:11435" as PortB
}
}
cloud "Ollama Cloud" {
actor "Pro Λογαριασμός A\n(email 1)" as AccountA
actor "Pro Λογαριασμός B\n(email 2)" as AccountB
}
KeyA --> AccountA : "Κλειδί SSH A"
KeyB --> AccountB : "Κλειδί SSH B"
PortA --> AccountA : "Αιτήματα A"
PortB --> AccountB : "Αιτήματα B"
note bottom of Docker
Απομονωμένος контейνερ: ξεχωριστή ταυτότητα SSH,
ξεχωριστό θυρίδα δικτύου, μόνιμος τόμος
end note
@enduml
Γιατί δύο φορές το ίδιο;
Πριν με χαρακτηρίσετε ως άρρωγος ψυχικά, αφήστε μου να σας εξηγήσω τη περίπτωση χρήσης.
Με μια μόνο Pro συνδρομή, μπορώ να εκκινήσω ένα μοντέλο όπως`deepseek-v4-pro:cloud`σε μια συνεδρία OpenCode. Το πρόβλημα εμφανίζεται όταν θέλω δύο συγχρονές συνεδρίες. Τα όρια του rate limiting κάνουν ώστε η δεύτερη συνεδρία να υστερεί ή να απορριπτετα εξολοκλήρως.
Με δύο ανεξάρτητες συνδρομές Pro:
-
Session OpenCode 1 → Λογαριασμός Pro A (
localhost:11434) -
Συνεδρία OpenCode 2 → Λογαριασμός Pro B`localhost:11435`)
Κάθε σύσκεψη έχει το δικό της quota, το δικό της πλάκτιο, και δεν ενοχλεί την άλλη. Αυτό είναι άνθρωπο multi-processing.
|
Δύο συνδρομές Pro = δύο διαφορετικά emails. Η ίδια τραπεζική κάρτα δουλεύει — το σύστημα πληρωμών του Ollama δεν εμποδίζει τις πολλαπλές συνδρομές από τον ίδιο τρόπο πληρωμής. Έλεγξα. |
Η καρδιά του προβλήματος: Η Device Key
Όταν εγκαθιστάτε το Ollama, ζεύγος κλειδιών SSH ed25519 δημιουργείται στον κατάλογο ταυτότητας :
$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
Αυτό το κλειδί ανεβάζεται στους διακομιστές του Ollama κατά το`ollama signin`. Αυτή λέει « αυτή η μηχανή ανήκει σε έναν λογαριασμό Pro ». Αν οι δύο σας επιθέματα μοιράζονται το ίδιο αρχείο`id_ed25519`, μοιράζουν την ίδια ταυτότητα. Τέλος του game.
Η παρέδα: δώστε στη δεύτερη παρουσία μας το δικό της φάκελο ταυτότητας, απομονωμένο σε έναν βόλο Docker.
Προετοιμασία — Βήμα Βήμα
προαπαιτούμενα
-
Μια εγγενής εγκατάσταση του Ollama που λειτουργεί (επίσημο script`curl | sh`)
-
Το Docker είναι εγκατεστημένο και λειτουργικό
-
Portainer ή docker-compose για την ανάπτυξη
-
Δυο λογαριασμοί Ollama με δυο διαφορετικά email
Χρησιμοποίησα την έκδοση`0.20.2`— αυτό που παρέχεται από το επίσημο script και την αντίστοιχη εικόνα Docker.
Βήμα 1 : Δημιουργήστε τον όγκο
Ένας απλός κατάλογος στον υπολογιστή θα λειτουργήσει ως σταθερός τόμος για την ταυτότητα της παρουσίας B:
mkdir -p ~/ollama-b-data
Αυτό το φάκελος θα ενσωματωθεί στο Docker container ως`/root/.ollama`, όπου το Ollama αποθηκεύει τα κλειδιά ταυτότητας του, το ιστορικό του και τα μοντέλα του.
Βήμα 2 : Εκκίνηση του Docker Container
# 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
Τι συμβαίνει εδώ:
-
Ο λιμένας11435του host είναι αντιστοιχισμένο στο11434εσωτερικό του κοντέινερ. Άρα, η instancia Docker ακούει σε`:11435`χωρίς σύγκρουση με το εγγενές παράδειγμα που καταλαμβάνει`:11434`.
-
Το όγκος`~/ollama-b-data`τοποθετείται σε`/root/.ollama`— Αυτό είναι όπου θα αποθηκευτεί η ταυτότητα SSH.
-
`OLLAMA_HOST=0.0.0.0`επιτρέπει στον κοντέινερ να αποδέχεται εξωτερικές συνδέσεις.
Εγώ έχω αναπτύξει αυτή τη στοίβα μέσω του Portainer, αλλά ένας απλός`docker compose up -d`λειτουργεί τόσο καλά.
Βήμα 3 : Ανάκτηση του δημόσιου κλειδιού
Εφόσον ο κοντέйнερ είναι κενός στην πρώτη εκκίνηση, το Ollama δημιουργεί αυτόματα ένα νέο ζευγάρι κλειδιών SSH στο όγκο. Ανακτούμε το δημόσιο κλειδί :
$ docker exec ollama-instance-b cat /root/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDDQ+dvnfmuo49q5O8LOlvgZ39SKORFw47ry9k4H2jPc
Επιβεβαιώνω ότι αυτή η κλειδί είναι διαφορετική από αυτή της εγγενούς παρουσίας:
# 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)
Δύο διαφορετικά κλειδιά, δύο ξεχωριστές ταυτότητες. Το παιχνίδι τελείωσε.
|
Εάν το κοντέινερ σας επανεκκινήσει, το επαναχρησιμοποιεί τα κλειδιά που βρίσκονται στον τόπο. Η ταυτότητα είναι διαρκής. Δεν χάσετε τη σύνδεση με τον λογαριασμό Pro. |
Βήμα 4: Αποθήκευση του Κλειδιού στο Ollama.com
Κατεύθυνση https://ollama.com/settings/keys → Προσθήκη κλειδιού SSH. Επικολλούμε το δημόσιο κλειδί της Docker instance και επιβεβαιώνουμε.
Στη συνέχεια, συνδέουμε αυτή τη ταυτότητα στον λογαριασμό Pro B :
$ docker exec -it ollama-instance-b ollama signin
Ο περιηγητής ανοίγει, συνδεόμαστε με το email του λογαριασμού B, και το token συνδέεται με το κλειδί SSH του κοντέινερ. Ελέγχουμε ότι όλα είναι OK :
$ docker exec -it ollama-instance-b ollama signin
User: cherolivpro
Βήμα 5 : Δοκιμή με Μικρό Δωρεάν Μοντέλο
Πριν να ρίξω την τιμή μιας συνδρομής Pro, θέλουμε να βεβαιωθώ ότι η σύνδεση λειτουργεί. Κάνουμε pull ένα μικρό τοπικό και δωρεάν μοντέλο για να επαληθεύσω τη σύνδεση:
$ 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",...}]}
Ο λιμάνι`11435`απαντά, το μοντέλο είναι εξυπηρετημένο. Το παράδειγμα B είναι ζωντανό.
Μόλις αισθάνομαι βέβαιος, περνώ στο pull του αληθινού μοντέλου cloud Pro :
$ docker exec ollama-instance-b ollama pull deepseek-v4-pro:cloud
pulling manifest
pulling 31c3059e137e: 100% ▕██████████████████▏ 344 B
success
344 bytes για το manifest ενός cloud μοντέλου — φυσιολογικά, η σύσταση γίνεται στην πλευρά του διακομιστή, όχι τοπικά. Και εδώ είναι ο τελικός τεστ:
$ 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 }
}
Χαίρετε και εσένα, παράδειγμα B.
Η παγίδα του API `/v1/models
Έχασα 20 λεπτά σε έναν ανόητο λεπτομέρεια. Όταν ρυθμίσα τον παρόχον.`ollama-b`Στο OpenCode, τίποτα δεν εμφανιζόταν στο επιλογέα μοντέλων. Τίποτα. καθόλου.
Ο λόγος; Η API`/v1/models`επιστρέφε από την περίπτωση B`{"object":"list","data":null}`αντί για`{"object":"list","data":[]}`όταν κανένας μοντέλο δεν είχε ληφθεί. Η τιμή`null`προκαλούσε το parsing στο OpenCode να πεθάνει, το οποίο δεν εμφάνιζε τον provider.
Η λύση: να δηλώσετε τα μοντέλα explicitement στην ρύθμιση του OpenCode αντί να βασίζεστε στη δυναμική ανακάλυψη.
{
"$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)" }
}
}
}
}
Με αυτή την ρητή δηλώση, το OpenCode βλέπει αμέσως το provider B και τα μοντέλα του. Μια επανεκκίνηση της.session, και ο επιλογέας`/models`εμφανίζει τα δύο παραδείγματα παράλληλα.
|
Αν δεν βλέπετε τον προσαρμοσμένο παροχέα σας στο`/models`, Μην χάνετε tria ώρες επανεκκινώντας το τερματικό σας. Δηλώστε τα μοντέλα χειροκίνητα στο`opencode.json`— Αυτό λύσει το πρόβλημα αμέσως. |
Αποτέλεσμα: Δύο Συνεδρίες, Δύο Λογαριασμοί, Μηδενική σύγκρουση
Τελικά, μπορώ να εκκινήσω δύο συνεδρίες OpenCode ταυτόχρονα:
Session 1 → /models → Ollama (local) → deepseek-v4-pro:cloud → Compte A
Session 2 → /models → Ollama Instance B (Docker) → deepseek-v4-pro:cloud → Compte B
Κάθε συνεδρία έχει το δικό της ποσόριο, το δικό της rate limit, και δεν πατούν τα πόδια τους. Ιδική μηχανή, ίδια μπλε κάρτα, δύο διαφορετικά email.
Και το καλύτερο; Ο Docker container είναι`restart: always`. Αντοέχει στα επανεκκινήσεις του συστήματος χωρίς χειροκίνητη παρέμβαση.
Μαθήματα που εκμάθησαν
-
Το Docker απομονώνει όλα, ακόμα και την ταυτότητα— Ένας απλός bind mount του όγκου αρκεί για να δώσει σε έναν κοντέινερ το δικό του σύνολο κλειδιών SSH, κάτι που τον κάνει αβίαστο από μια διαφορετική φυσική μηχανή στα μάτια του Ollama.
-
Δύο emails, ίδια CBΤο Ollama δεν εμποδίζει τις πολλαπλές συνδρομές από την ίδια μέθοδο πληρωμής. Μόνο το email πρέπει να είναι μοναδικό.
-
Δοκιμή δωρεάν πριν πληρώσετε — 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. -
/v1/models` με
data: nullσπάει το OpenCode— Αν ρυθμίζετε ένα προσαρμοσμένο παροχέα με`"models": {}`, Το OpenCode προσπαθεί να ανακαλύψει τα μοντέλα μέσω του API. Αν το API απαντήσει`data: null`, ο παρόχος δεν εμφανίζεται. Δηλώστε τα μοντέλα ρητά. -
Δύο λογαριασμοί, αυτό είναι ανθρώπινη πολυεπεξεργασία— Ένας λογαριασμός Pro = μια ενεργή συνεδρία OpenCode. Δύο λογαριασμοί = δύο παραλληλές συνεδρίες. Για κάποιον που χειρίζεται ταυτόχρονα πολλά έργα Gradle, είναι ένα game changer.
Για να πάμε περαιτέρω
Άρθρο δημοσιεύτηκε το 2026-05-08