একই মেশিনে Docker ব্যবহার করে দুটি Ollama Pro সাবস্ক্রিপশন একত্রিত করা
Publié le 08 May 2026
দুটি Pro সদসysetা, একটি পিসি, একটি ব্যাংক কার্ড, এবং নেটওয়ার্ক সংঘাত শূন্য। কীভাবে Docker আমাকে আমার ক্লাউড অনুমান কাপাসিটি দ্বিগুণ করতে অনুমতি দিয়েছে, একটি দ্বিতীয় পিসি কেনা ছাড়া।
পরিচয়
আমি বেশ কিছু মাস থেকে Ollama Pro ব্যবহার করছি আমার OpenCode সেশনগুলিকে ক্লাউড মডেল দ্বারা চালানোর জন্য। কিন্তু সত্য হচ্ছে, Pro সাবস্ক্রিপশন থাকলেও, একাধিক এজেন্ট সমান্তরালে চালালে rate limiting দ্রুত সীমাবদ্ধতায় পড়ে। স্পষ্ট সমাধান: একটি দ্বিতীয় সাবস্ক্রিপশন।
কিন্তু এখানে, এটি দুর্ভাগ্য।
Ollama প্রতিটি মেশিনকে একটি অনন্য SSH কী দিয়ে চিহ্নিত করে — এর বিখ্যাত Device Key। একই অপারেটিং সিস্টেমের দুটি ইনস্ট্যান্স একই পরিচয় ভাগ করবে, এবং একই ডিভাইসে দুটি Pro অ্যাকাউন্টকে জোড়া দেওয়া সম্ভব নয়। এবং kuten আপনি অনুমান করেছেন, আমি শুধুমাত্র এই原因েই একটি দ্বিতীয় ল্যাপটপ কিনার জন্য যাচ্ছিলাম না।
সমাধান : ঘষ। উল라마কে মনে করাবেন যে এটি দুটি ভिन्न মেশিনে চলছে, তবে প্রকৃতভাবে তারা একই সিপিইউ, র্যাম এবং নেটওয়ার্ক সংযোগ শেয়ার করে। ডকার আমাদের জন্য একটি সম্পূর্ণ বিছিন্ন বুবল তৈরি করবে।
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 11) ]
@startuml
...
... ( skipping 131 lines )
...
BackgroundColor white
BorderColor black
}
skinparam StereotypeN {
BackgroundColor white
BorderColor black
}
skinparam UseCaseStereoType {
FontColor black
FontName Verdana
}
skinparam BoxPadding 10
skinparam DefaultFontSize 12
left to right direction
node "ভৌত মেশিন" {
frame "Ollama ইনস্ট্যান্স A (স্থানীয়)" as Native {
database "অন্যাতন\n/usr/share/ollama/.ollama/id_ed25519" as KeyA
portin "API
^^^^^
Syntax Error? (Assumed diagram type: component)
@startuml
!theme plain
skinparam BoxPadding 10
skinparam DefaultFontSize 12
left to right direction
node "ভৌত মেশিন" {
frame "Ollama ইনস্ট্যান্স A (স্থানীয়)" as Native {
database "অন্যাতন\n/usr/share/ollama/.ollama/id_ed25519" as KeyA
portin "API
:11434" as PortA
}
frame "Ollama ইনস্ট্যান্স B (Docker)" as Docker {
database "ব্যক্তিত্ব\n~/ollama-b-data/id_ed25519" as KeyB
portin "API\n:11435" as PortB
}
}
cloud "ওললামা ক্লাউড" {
actor "প্রো অ্যাকাউন্ট A\n(ইমেইল 1)" as AccountA
actor "প্রো B অ্যাকাউন্ট
(ইমেইল 2)" as AccountB
}
KeyA --> AccountA : "কী SSH A"
KeyB --> AccountB : "এসএসএই কী B"
PortA --> AccountA : "অনুরোধ A"
PortB --> AccountB : "প্রশ্নাবলি B"
note bottom of Docker
Conteneur isolé : identité SSH distincte,
port réseau distinct, volume persistant
end note
@enduml
কেন একই জিনিসকে দুবার করা হয়?
আপনি আমাকে মানসিক Bogoli বলার আগে, আমাকে usagesের ক্ষেত্র আপনাকে ব্যাখ্যা করতে দিন
একটি Pro সাবস্ক্রিপশন দিয়ে, আমি একটি মডেল চালু করতে পারি যেমন`deepseek-v4-pro:cloud`একটি OpenCode সেশনে। সমস্যা তখন উঠে আসে যখন আমি দুই সমকালীন সেশন চাই। রেট লিমিটিং কোটা nedeniyle দ্বিতীয় সেশনের গতি ধীর হয় বা তা সম্পূর্ণরূপে প্রত্যাখ্যান করা হয়।
দুটি স্বাধীন প্রো সাবস্ক্রিপশন সঙ্গে :
-
সেশন OpenCode 1 → অ্যাকাউন্ট প্রো A`localhost:11434`)
-
সেশন OpenCode 2 → প্রো বি অ্যাকাউন্ট`localhost:11435`)
প্রতিটি সেশনের নিজস্ব কোটা এবং নিজস্ব প্রসঙ্গ রয়েছে, এবং এটি অন্য সেশনে বाधা দেয় না। এটি মানবিক মাল্টি-প্রসেসিং।
|
দুটি প্রো সাবস্ক্রিপশন = দুটি ভিন্ন ইমেইল। একই ব্যাংক কার্ড কাজ করে — ওলামা পেমেন্ট সিস্টেম একই পেমেন্ট পদ্ধতির থেকে একাধিক সাবস্ক্রিপশন ব্লক করে না। আমি যাচাই করেছি। |
সমস্যার হৃদয় : ডিভাইস কী
আপনি Ollama ইনস্টল করলে, একটি SSH ed25519 কী জোড়া শনাক্তকরণ ডিরেকটরিতে তৈরি হয়:
$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
এই কীটি Ollama সার্ভারে আপলোড করা হয় যখন`ollama signin`. ওই বলে, "এই মেশিনটি কোনও Pro অ্যাকাউন্টের"." যদি আপনার দুটি ইন্সট্যান্স একই ফাইলটি শেয়ার করে`id_ed25519`, তারা একই পরিচয়টি ভাগ করে। গেম শেষ।
পারেড : আমাদের দ্বিতীয় উদাহরণকে তার নিজস্ব পরিচয় ডিরেক্টরি দিতে হবে, যা একটি Docker ভলিউমে isolate করা আছে।
সেটআপ — ধাপে ধাপে
পূর্বশর্ত
-
Ollama-এর একটি কার্যকরী নেটিভ ইনস্টলেশন (আधিকারিক স্ক্রিপ্ট)
curl | sh) -
ডকার ইনস্টল করা হয়েছে এবং কাজ করছে
-
ডিপ্লয়মেন্টের জন্য পোর্টেইনার বা ডকার-কম্পೋಜ
-
দুটি Ollama অ্যাকাউন্ট, দুটি আলাদা ইমেইল
আমি সংস্করণটি ব্যবহার করেছি`0.20.2`— এই অফিসিয়াল স্ক্রিপ্ট द्वारा প্রদত্ত এবং মিলে যাওয়া Docker ইমেজ।
ধাপ ১: ভলিউম তৈরি করুন
একটি সাধারণ ডিরেক্টরি হোস্টে থাকবে উদাহরণ B‑এর পরিচয়ের জন্য একটি স্থায়ী ভলিউম :
mkdir -p ~/ollama-b-data
এই ফোল্ডারটি ডকার কন্টেইনারে mount করা হবে, যেমন`/root/.ollama`, waarin Ollama তার পরিচয় কী সংরক্ষণ করে, তার ইতিহাস এবং এর মডেল।
ধাপ 2: ডッカー কন্টেইনার চালু করুন
# 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`নেটিভ উদাহরণের সাথে কোনো দ্বন্দ্ব নেই যা দখল করছে`:11434`.
-
বলিউম`~/ollama-b-data`উপর মাউন্ট করা হয়েছে`/root/.ollama`— এটাই যেখানে SSH পরিচয় সংরক্ষিত হবে।
-
`OLLAMA_HOST=0.0.0.0`কন্টেইনারের বাহ্যিক সংযোগ গ্রহণ করতে অনুমতি দেয়।
আমি এই স্ট্যাকটি পোর্টাইনারের মাধ্যমে স্থাপন করেছি, কিন্তু একটি সহজ`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 অ্যাকাউন্টের সাথে সংযুক্তি হারবেন না। |
ধাপ ৪ : কী সংরক্ষণ করুন Ollama.com-এ
নির্দেশনা https://ollama.com/settings/keys → SSH কী যোগ করুন। ডকার ইন্সট্যান্সের পাবলিক কীটি পেস্ট করুন এবং নিশ্চিত করুন।
একে, এই পরিচয়টি Pro B অ্যাকাউন্টে সংযুক্ত করা ہے :
$ docker exec -it ollama-instance-b ollama signin
ব্রাউজারটি খুলে, আমরা অ্যাকাউন্ট B-এর ইমেইল দিয়ে সংযোগ করি এবং টোকেনটি কনটেইনারের SSH কী সঙ্গে যুক্ত হয়। আমরা যাচাই করি যে সব ঠিক আছে:
$ docker exec -it ollama-instance-b ollama signin
User: cherolivpro
স্টেপ ৫: একটি ছোট বিনামূল্য মডেল দিয়ে পরীক্ষা করুন
প্রো সাবস্ক্রিপশনের মূল্য বিবেচনা করার আগে, আমি নিশ্চিত হতে চাই যে পাইপটি কাজ করছে। আমি সংযোগ যাচাই করতে একটি ছোট স্থানীয় এবং মুক্ত মডেলটি টেনে আনা ছাই :
$ 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 জীবিত।
একbart নিশ্চিত হওয়ার পর, আমি সত্য ক্লাউড Pro মডেলের pull-এ পরিবর্তন করি:
$ docker exec ollama-instance-b ollama pull deepseek-v4-pro:cloud
pulling manifest
pulling 31c3059e137e: 100% ▕██████████████████▏ 344 B
success
344 বাইট ক্লাউড মডেলের ম্যানিফেস্টের জন্য — স্বাভাবিকভাবে, inference সার্ভার‑সাইডে হয়, স্থানীয়ভাবে নয়। এবং এখানে সর্বোচ্চ পরীক্ষা :
$ 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 }
}
নমস্কার, তুইও, instance B
এপিআই-এর ফাঁদ `/v1/models
আমি একটি মুর্খ বিস্তারের জন্য ২০ মিনিট হারিয়েছি। যখন আমি প্রোভাইডারটি কনফিগার করেছি`ollama-b`OpenCode-এ, মডেল নির্বাচনকারীতে কিছুই দেখায়নি। কোনো কিছু না। কোনো কাজও না।
কারণ? L’API`/v1/models`বি ইনস্ট্যান্স থেকে ফেরত আসত`{"object":"list","data":null}`বদলে`{"object":"list","data":[]}`কোনো মডেলটি পুল করা হয়নি. মান`null`OpenCode পার্সিং পার্শকে क्र্যাশ करিয়ে দিল, যা প্রদর্শককে দেখাননি।
সমাধান : OpenCode কনফিগারেশনে মডেলগুলি স্পশ্ট</tool_call> ঘোষণা করা, বরং গতিশীল খুঁজিবারের উপর নির্ভর করার_LOCATION.replace না।
{
"$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 তৎক্ষণেই প্রদানকারী B এবং তার মডেলগুলো দেখে। একটি সেশন রিস্টার্ট, এবং সিলেক্টর`/models`দুইটি উদাহরণকে পাশাপাশি দেখায়
|
আপনি আপনার কাস্টম প্রদানকারীটি দেখতে পাচেন না যদি`/models`, ne perdez pas trois heures à redémarrer votre terminal. Déclarez les modèles manuellement dans`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
প্রতিটি সেশনের নিজের কোটা, নিজের রেট লিমিট রয়েছে, এবং তারা একে অপরের পায়ে ঘষবেন না। একই মেশিন, একই নীল কার্ড, দুটি ইমেল আলাদা।
এবং সবচেয়ে ভালো? ডকার কনটেইনারটি`restart: always`এটি সিস্টেম রিবুটের পর কোনো ম্যানুয়াল হস্তক্ষেপ ছাড়া সাশ্রয়ী থাকে।
শেখে পাওয়া পাঠ
-
Docker সবকিছুকে পৃথক করে, এমনকি পরিচয়কেও— একটি সহজ bind mount de volume কন্টেইনারের নিজস্ব SSH কী সেট দিতে পর্যাপ্ত, এটি Ollama এর চোখে কোনো ভিন্ন ফিজিক্যাল মেশিন থেকে আলাদা নয়।
-
দুই ইমেইল, একই CB— Ollama একই পরিশোধ পদ্ধতির থেকে একাধিক সাবস্ক্রিপশন ব্লক করে না। শুধুমাত্র ইমেইল আলাদা হতে হবে।
-
প্রারম্ভে বিনামূল্যে টেস্ট করুন, পরে পরিশোধ করুন — 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: nullOpenCode-কে ভাঙ্গে— আপনি একটি কাস্টম provider কনফিগার করেন ও`"models": {}`, OpenCode API এর মাধ্যমে মডেলগুলি খুঁজে বের করার চেষ্টা করে। যদি API প্রতিক্রিয়া দেয়`data: null`, প্রোভাইডার দেখা দেয় না। মডেলগুলো স্পষ্টভাবে ঘোষণা করুন। -
দুইটি অ্যাকাউন্ট, এটি মানবিক মাল্টি-প্রসেসিং— একটি Pro অ্যাকাউন্ট = একটি সক্রিয় OpenCode সession। দুই অ্যাকাউন্ট = দুটি প্যারালেল সেশন। যদি কেউ একই সময়ে çeşitli Gradle প্রকল্পকে পরিচালনা করে, সেটা গেম চেঞ্জার।