কিভাবে নিজের VPS-এ Octop AI অ্যাসিস্ট্যান্ট সেটআপ করবেন
Docker Compose ব্যবহার করে Octop ইনস্টল করার সঠিক নিয়ম জানুন। curl স্ক্রিপ্ট এড়িয়ে নির্দিষ্ট ভার্সন ট্যাগ ব্যবহার করে ইউজার আইসোলেশন, TLS এবং OpenAI ব্যাকএন্ড কনফিগার করুন।
Octop কী এবং কেন আপনি এটি self-host করবেন
Octop হলো একটি পরিবার বা ছোট দলের জন্য একটি self-hosted AI অ্যাসিস্ট্যান্ট। সাধারণ চ্যাট ফ্রন্ট-এন্ডের পরিবর্তে Octop-কে self-host করার কারণ হলো এটি ব্যবহারকারীদের একে অপরের থেকে আলাদা রাখে। Open WebUI আপনাকে মডেলের সামনে একটি ব্রাউজার ইন্টারফেস দেয়। Octop প্রতিটি ব্যবহারকারীর জন্য অ্যাডমিন রোল, ব্যক্তিগত ওয়ার্কস্পেস এবং ক্রেডেনশিয়াল সেট যুক্ত করে। এছাড়া এতে বিশেষজ্ঞ এজেন্টদের একটি লাইব্রেরি থাকে, যা প্রতিটি ব্যবহারকারী কাজের প্রয়োজনে পরিবর্তন করতে পারেন। এই পার্থক্যের কারণেই একটি VPS-এ একজন নয়, বরং পাঁচজন ব্যবহারকারী কাজ করতে পারেন।
প্রজেক্টটি github.com/TencentCloud/Octop-এ পাওয়া যাবে। এটি একটি একক প্রসেস যা ওয়েব ড্যাশবোর্ড, কমান্ড লাইন ইন্টারফেস, চ্যাট চ্যানেল (Feishu, DingTalk, QQ, Discord, WeCom) এবং শিডিউল করা কাজগুলো পরিচালনা করে। এর সবকিছুই ~/.octop/-এর অধীনে একটি একক SQLite ডাটাবেস দ্বারা নিয়ন্ত্রিত হয়। নিচে বর্ণিত সবকিছু v0.9.19 ট্যাগের ভিত্তিতে লেখা, যা 5 আগস্ট 2026 তারিখে রিলিজ হয়েছে। আপনি যদি বিভিন্ন প্ল্যাটফর্মের মধ্যে সিদ্ধান্ত নিতে না পারেন, তবে VPS-এ চালানো যায় এমন Open WebUI বিকল্পগুলোর তুলনা বিষয়টি আপনাকে বিস্তারিত ধারণা দেবে।
এটি নিয়ে কাজ শুরু করার আগে একটি বিষয় পরিষ্কার থাকা প্রয়োজন। Octop হলো 1.0 ভার্সনের পূর্ববর্তী সফটওয়্যার, যা একটি ভেন্ডরের GitHub অর্গানাইজেশন থেকে প্রকাশিত হয়েছে এবং আগস্ট 2026 পর্যন্ত এর স্টার সংখ্যা প্রায় 900। এটি দ্রুত পরিবর্তিত হচ্ছে, যা এর ভার্সন নম্বর থেকেই বোঝা যায়। এখানে কোনো কিছুই স্থিতিশীল আপগ্রেড পাথের নিশ্চয়তা দেয় না। তাই নির্দিষ্ট ট্যাগ ব্যবহার করুন, চেঞ্জলগ পড়ুন এবং নিয়মিত ব্যাকআপ রাখুন।
শুরু করার আগে আপনার যা প্রয়োজন
- Ubuntu 24.04 চালিত একটি VPS, যেখানে Docker Engine এবং Compose plugin ইনস্টল করা আছে। Compose সম্পর্কে নতুন হলে, Docker Compose basics for a VPS থেকে শুরু করুন।
git, কারণ আপনি একটি ইমেজ পুল করার পরিবর্তে একটি রিলিজ ট্যাগ চেক আউট করবেন।- VPS-এর দিকে নির্দেশ করা একটি ডোমেইন নাম, কারণ আপনি এর সামনে TLS (transport layer security) ব্যবহার করতে চান।
- OpenAI API সমর্থন করে এমন একটি মডেল ব্যাকএন্ড: যেমন লোকাল Ollama, একটি সেলফ-হোস্টেড গেটওয়ে, অথবা একটি পেইড কি (key)।
Octop নিজে বেশ হালকা। এটি একটি Python প্রসেস এবং একটি SQLite ফাইল। এর মূল ভার মডেল ব্যাকএন্ডের ওপর নির্ভর করে, তাই আপনি যদি একই বক্সে মডেলটি চালাতে চান, তবে মডেলের চাহিদা অনুযায়ী বক্সের রিসোর্স নির্ধারণ করুন।
কেন আমরা curl ইনস্টলার ব্যবহারের পরামর্শ দিই না
README ফাইলের শুরুতে একটি এক লাইনের ইনস্টল কমান্ড দেওয়া থাকে:
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bashআপনার গুরুত্বপূর্ণ কোনো সার্ভারে এটি ব্যবহারের পরামর্শ আমরা দিই না, এর একটি সুনির্দিষ্ট কারণ হলো: এই স্ক্রিপ্টটি রিপোজিটরিতে নেই। এটি Tencent Cloud Object Storage বাকেট থেকে পরিবেশন করা হয়। এর কোনো অংশই git tag বা commit দ্বারা নিয়ন্ত্রিত নয়, তাই আপনি আজকের স্ক্রিপ্টের সাথে গত সপ্তাহের স্ক্রিপ্টের কোনো পার্থক্য (diff) যাচাই করতে পারবেন না এবং কোনো পরিবর্তনের ইতিহাসও এখানে নেই। বাকেটটি আগামীকাল ভিন্ন কোনো বাইট পরিবেশন করতে পারে এবং প্রজেক্টের কোথাও তা রেকর্ড থাকবে না। সরাসরি bash-এ পাইপ করার অর্থ হলো, স্ক্রিপ্টের একটি লাইনও পড়ার আগেই আপনার মেশিন সেটি রান করে ফেলছে।
এই ইনস্টলারটি কন্টেইনারের পরিবর্তে সরাসরি হোস্ট মেশিনে রাইট করে। এটি uv ব্যবহার করে Python 3.12 নিয়ে আসে এবং এমন একটি এনভায়রনমেন্ট তৈরি করে যা আপনার প্যাকেজ ম্যানেজারের অজানা, ফলে পরবর্তীতে এটি মুছে ফেলা একটি ম্যানুয়াল কাজ হয়ে দাঁড়ায়।
এর চেয়ে ভালো দুটি উপায় আছে। স্ক্রিপ্টটি ডাউনলোড করুন, পড়ুন, তারপর রান করুন, এতে আপনার ত্রিশ সেকেন্ড সময় লাগবে: প্রথমে curl -fsSL <url> -o install.sh, তারপর less install.sh, এবং সবশেষে bash install.sh। অথবা Docker ব্যবহার করুন, যা এই গাইডের বাকি অংশে আলোচনা করা হয়েছে। PyPI প্যাকেজ (pip install octop) অন্তত একটি ভার্সনযুক্ত আর্টিফ্যাক্ট, যা আপনি নির্দিষ্ট কোনো রিলিজের সাথে পিন করে রাখতে পারেন।
Docker Compose ব্যবহার করে Octop ডেপ্লয় করুন, v0.9.19 ভার্সনে পিন করা
আগস্ট 2026 পর্যন্ত কোনো প্রকাশিত ইমেজ পুল করার জন্য নেই। প্রদত্ত Compose ফাইলটি রিপোজিটরি থেকে ইমেজ বিল্ড করে, তাই ভার্সন পিন করার অর্থ হলো একটি নির্দিষ্ট git tag চেকআউট করা।
git clone https://github.com/TencentCloud/Octop.git
cd Octop
git checkout v0.9.19ফাইলে সংজ্ঞায়িত সার্ভিসটি নিচে দেওয়া হলো, শুধুমাত্র প্রয়োজনীয় অংশগুলো রাখা হয়েছে:
services:
octop:
build:
context: ..
dockerfile: docker/Dockerfile
image: octop:latest
container_name: octop
restart: unless-stopped
ports:
- "${OCTOP_PORT:-8088}:${OCTOP_PORT:-8088}"
volumes:
- ${OCTOP_DATA:-~/.octop}:/data/.octop
environment:
- HOME=/data
- OCTOP_BIND_HOST=0.0.0.0
- OCTOP_PORT=${OCTOP_PORT:-8088}
- OCTOP_DEFAULT_PASSWORD=${OCTOP_DEFAULT_PASSWORD:-octop}
- OCTOP_ADMIN_USERNAME=${OCTOP_ADMIN_USERNAME:-admin}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}build: ব্লকটি লক্ষ্য করুন। image: octop:latest হলো আপনার বিল্ড করা ইমেজের নাম, কোনো রেজিস্ট্রি রেফারেন্স নয়, তাই এখানে latest বলতে আপনি সর্বশেষ যা কম্পাইল করেছেন তা বোঝায়। ডেটা পাথ ডিফল্টের ওপর ছেড়ে না দিয়ে নির্দিষ্ট কোনো লোকেশনে সেট করুন এবং প্রথমবার বুট করার আগেই অ্যাডমিন অ্যাকাউন্টের জন্য একটি শক্তিশালী পাসওয়ার্ড দিন। এটি docker/.env ফাইলে রাখুন:
OCTOP_PORT=8088
OCTOP_ADMIN_USERNAME=admin
OCTOP_DEFAULT_PASSWORD=<a long random password>
OCTOP_DATA=/srv/octop-dataএই ফাইলের বাকি অংশের চেয়ে একটি সাধারণ ভুল বেশি গুরুত্বপূর্ণ। Compose শুধুমাত্র ${...} প্লেসহোল্ডারগুলো YAML-এ বসানোর জন্য docker/.env ফাইলটি পড়ে। আপনি যদি সেই ফাইলে কোনো কি (key) যোগ করেন, তবে তা কন্টেইনারে পৌঁছাবে না যদি না সেটি Compose ফাইলের environment: সেকশনেও উল্লেখ করা থাকে। শুধুমাত্র .env ফাইলে OCTOP_ACCESS_TOKEN_TTL যোগ করলে তা নীরবে কোনো কাজই করবে না। এর বিকল্প হলো মাউন্ট করা ডেটা ডিরেক্টরির ভেতরে ~/.octop/env ফাইলে একই কিগুলো লিখে রাখা, যা Octop স্টার্টআপের সময় লোড করে। Docker Compose-এ env ফাইল এবং সিক্রেট ব্যবহারের নির্দেশিকা-তে কেন এই দুটি পদ্ধতি আলাদা তা বিস্তারিত আলোচনা করা হয়েছে।
বিল্ড করুন এবং স্টার্ট করুন:
docker compose -f docker/docker-compose.yml up -d --build
docker compose -f docker/docker-compose.yml ps
curl http://127.0.0.1:8088/api/healthএকটি সচল ইনস্ট্যান্স হেলথ চেক-এর উত্তরে {"status":"ok","version":"..."} প্রদান করবে। অন্য কিছু দেখালে, ব্রাউজারে যাওয়ার আগে docker compose -f docker/docker-compose.yml logs -f octop পড়ুন।
এখন আপনার বিল্ড করা ইমেজটিকে একটি অর্থবহ নাম দিন, কারণ পরবর্তী --build কমান্ডটি octop:latest-কে ওভাররাইট করবে এবং তখন আপনি দুটির মধ্যে পার্থক্য করতে পারবেন না:
docker image tag octop:latest octop:0.9.19প্রথমবার বুট করার সময় octop init রান হয় এবং শুরুর ক্রেডেনশিয়ালগুলো ডেটা ভলিউমে লিখে রাখে:
docker exec -it octop cat /data/.octop/credential.txtডিফল্ট ক্রেডেনশিয়াল হলো admin / octop, এবং এগুলো শুধুমাত্র প্রথমবার ইনিশিয়ালাইজেশনের সময় কার্যকর হয়। এটিই সেই কারণ যার জন্য মানুষ প্রায়ই প্রশ্ন করে: কন্টেইনার একবার স্টার্ট হওয়ার পর OCTOP_DEFAULT_PASSWORD পরিবর্তন করলে কোনো কাজ হয় না, কারণ অ্যাকাউন্টটি আগেই তৈরি হয়ে গেছে। পাসওয়ার্ড পরিবর্তন করতে হলে ড্যাশবোর্ডের ভেতরে গিয়ে পরিবর্তন করুন।
পোর্ট 8088 পাবলিশ করবেন না
উপরের ports: লাইনটি VPS-এর প্রতিটি ইন্টারফেসের সাথে বাইন্ড করে। কন্টেইনারটি শুরু হওয়ার সাথে সাথেই ড্যাশবোর্ডটি ডিফল্ট পাসওয়ার্ডসহ পাবলিক ইন্টারনেটে প্লেইন টেক্সটে উন্মুক্ত হয়ে যায়। Octop-এর নিজস্ব OCTOP_BIND_HOST ডিফল্ট হলো 127.0.0.1; Compose ফাইল এটিকে পরিবর্তন করে 0.0.0.0 করে, কারণ প্রসেসটিকে তার নিজস্ব নেটওয়ার্ক নেমস্পেসের বাইরের ট্রাফিক গ্রহণ করতে হয়। সেই পরিবর্তনটি সঠিক। পাবলিশ করা পোর্টটিই আপনাকে ঝুঁকিতে ফেলে।
docker/docker-compose.yml ফাইলের ports: লাইনটি এডিট করুন যাতে ম্যাপিংটি শুধুমাত্র লুপব্যাকে লিসেন করে:
ports:
- "127.0.0.1:${OCTOP_PORT:-8088}:${OCTOP_PORT:-8088}"এটি ঠিক করার জন্য সাধারণ ওভাররাইড ফাইল ব্যবহার করবেন না। Compose একাধিক ফাইল থেকে ports লিস্টগুলোকে প্রতিস্থাপন না করে একত্রিত (concatenate) করে, ফলে আপনি দুটি ম্যাপিংই পাবলিশ করে ফেলবেন এবং দ্বিতীয়টি বাইন্ড হতে ব্যর্থ হবে। আপনি যদি আপস্ট্রিম ফাইলটি অপরিবর্তিত রাখতে চান, তবে সিকোয়েন্সের ওপর !override ট্যাগ ব্যবহার করুন, যা অ্যাপেন্ড না করে প্রতিস্থাপন করার নথিভুক্ত পদ্ধতি। Compose কীভাবে একাধিক ফাইল মার্জ করে তার ব্যাখ্যা-তে মার্জ করার বাকি নিয়মগুলো আলোচনা করা হয়েছে।
লুপব্যাকে বাইন্ড করা এমন একটি সমস্যার সমাধান করে যা অন্যথায় ফায়ারওয়ালের ক্ষেত্রে আপনার সম্মুখীন হওয়ার কথা ছিল। Docker তার পাবলিশ করা পোর্টের রুলগুলো ufw-এর ম্যানেজ করা চেইনের আগে nat টেবিলে লিখে রাখে, তাই ufw deny 8088 পাবলিশ করা কন্টেইনার পোর্টকে আটকাতে পারে না। 127.0.0.1-এ বাইন্ড করা পোর্ট ufw-এর সেটিংস নির্বিশেষে বাইরে থেকে কখনোই অ্যাক্সেসযোগ্য হয় না, আর এই কারণেই এটি দ্বিতীয় সেরা সমাধানের চেয়ে সঠিক সমাধান।
একটি reverse proxy ব্যবহার করে TLS যুক্ত করা
Caddy হলো সবচেয়ে সহজ সমাধান, কারণ এটি স্বয়ংক্রিয়ভাবে ACME (automatic certificate management environment) এর মাধ্যমে certificate সংগ্রহ করে এবং কোনো বাড়তি কনফিগারেশন ছাড়াই WebSocket প্রক্সি করতে পারে:
octop.example.com {
reverse_proxy 127.0.0.1:8088
}nginx-এর ক্ষেত্রে কিছুটা বাড়তি সতর্কতার প্রয়োজন, কারণ Octop একটি WebSocket-এর মাধ্যমে চ্যাট স্ট্রিম করে:
server {
listen 443 ssl;
server_name octop.example.com;
ssl_certificate /etc/letsencrypt/live/octop.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/octop.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8088;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 3600s;
}
}সেখানে প্রতিটি লাইন একটি নির্দিষ্ট কাজ করে। চ্যাট WS /agents/{id}/chat/ws প্রোটোকলের মাধ্যমে চলে, তাই proxy_http_version 1.1 এবং দুটি upgrade হেডার ছাড়া nginx আপগ্রেড প্রচেষ্টার উত্তরে 400 Bad Request পাঠাবে: এতে ড্যাশবোর্ড স্বাভাবিকভাবে লোড হলেও আপনার পাঠানো প্রতিটি মেসেজ কোনো ত্রুটি ছাড়াই চিরকাল ঝুলে থাকবে। proxy_buffering off গুরুত্বপূর্ণ কারণ human-in-the-loop resume এন্ডপয়েন্ট text/event-stream রিটার্ন করে, এবং প্রক্সি বাফারে আটকে থাকা SSE (server-sent events) স্ট্রিম না হয়ে শেষে একসাথে জমা হয়। proxy_read_timeout দীর্ঘ সময় ধরে চলা টুলের কাজগুলো সামলায়, কারণ ডিফল্ট 60 সেকেন্ডের সময়সীমা পার হলে এজেন্ট মাঝপথে বন্ধ হয়ে যায় এবং upstream timed out (110: Connection timed out) লগ তৈরি হয়।
প্রক্সির পেছনে JWT অথেন্টিকেশন যেভাবে কাজ করে
Octop একটি বিয়ারার টোকেন (bearer token) দিয়ে অথেন্টিকেট করে, কুকি দিয়ে নয়। POST /api/auth/login একটি {access_token, role, user, ...} প্রদান করে এবং পরবর্তী কলগুলোতে Authorization: Bearer <access_token> বহন করে। রিভার্স প্রক্সির জন্য এটি একটি ভালো দিক: এখানে কোনো কুকি ডোমেইন, Secure ফ্ল্যাগ বা SameSite রুল নিয়ে ভুল হওয়ার সুযোগ নেই, তাই যে সেশনটি http://127.0.0.1:8088-এ কাজ করত, তা https://octop.example.com-এও একইভাবে কাজ করবে।
প্রকৃত ব্যবহারকারীদের জন্য এটি উন্মুক্ত করার আগে দুটি বিষয় জেনে রাখা জরুরি।
WebSocket ইউআরএল-এ টোকেন বহন করে। এন্ডপয়েন্টটি হলো WS /agents/{id}/chat/ws?token=<jwt>, কারণ ব্রাউজার জাভাস্ক্রিপ্ট WebSocket হ্যান্ডশেকের সময় Authorization হেডার সেট করতে পারে না। TLS ট্রানজিটের সময় সেই টোকেনটিকে সুরক্ষিত রাখে। তবে এটি আপনার নিজস্ব লগ থেকে টোকেনটিকে রক্ষা করে না: Nginx ডিফল্টভাবে সম্পূর্ণ রিকোয়েস্ট লাইন, যার মধ্যে কুয়েরি স্ট্রিংও থাকে, তা access_log-এ লিখে রাখে। ফলে একজন প্রকৃত ব্যবহারকারীর কার্যকর টোকেন সার্ভারের একটি প্লেইনটেক্সট ফাইলে জমা হয়ে যায়। আর্গুমেন্ট ছাড়া পাথটি লগ করুন। $uri হলো নরমালাইজড পাথ, যেখানে কুয়েরি স্ট্রিং আগেই বাদ দেওয়া থাকে, তাই এটি http ব্লকে রাখুন এবং সার্ভার থেকে এটিকে রেফারেন্স করুন:
log_format octop_noargs '$remote_addr [$time_local] '
'"$request_method $uri $server_protocol" '
'$status $body_bytes_sent';
access_log /var/log/nginx/octop.log octop_noargs;এখানে প্রতি সেশনের জন্য আলাদা লগআউট ব্যবস্থা নেই। OCTOP_ACCESS_TOKEN_TTL ডিফল্টভাবে 86400 থাকে, তাই লগইনের পর একটি টোকেন 24 ঘণ্টা পর্যন্ত কার্যকর থাকে। এটি বাতিল করার একমাত্র নথিভুক্ত উপায় হলো octop admin rotate-jwt-secret, যা ~/.octop/secrets/jwt_secret-এ সংরক্ষিত সাইনিং কি (signing key) পরিবর্তন করে এবং সবার জন্য বিদ্যমান সব টোকেন তাৎক্ষণিকভাবে বাতিল করে দেয়। তাই যখন কেউ টিম ছেড়ে চলে যায়, তখন নিয়ম হলো: ব্যবহারকারীকে ডিলিট করুন, সিক্রেট কি পরিবর্তন করুন, এবং বাকি ব্যবহারকারীদের পুনরায় লগইন করতে বলুন। যদি এটি জটিল মনে হয়, তবে টোকেনের মেয়াদ কমিয়ে দিন। মনে রাখবেন, এই ভেরিয়েবলটি environment: তালিকার পাশাপাশি .env-এও যোগ করতে হবে:
OCTOP_ACCESS_TOKEN_TTL=28800ব্রুট ফোর্স আক্রমণ সামলানোর ব্যবস্থা রয়েছে: OCTOP_LOGIN_MAX_ATTEMPTS ডিফল্টভাবে 5টি ব্যর্থ প্রচেষ্টায় সীমাবদ্ধ এবং OCTOP_LOGIN_LOCKOUT_SECONDS 900 সেকেন্ড নির্ধারণ করা আছে। ফলে লক হয়ে যাওয়া ব্যবহারকারীকে পনেরো মিনিট অপেক্ষা করতে হয়, ইনস্টলেশন নষ্ট হওয়ার ভয় থাকে না। Octop-এর নিজস্ব ইউজার স্টোর রয়েছে এবং v0.9.19 ভার্সনে কোনো OIDC সাপোর্ট নথিভুক্ত নেই। তাই যদি আপনার প্রকৃত সিঙ্গেল সাইন-অন (SSO) প্রয়োজন হয়, তবে এর সামনে একটি অথেন্টিকেটিং প্রক্সি বসাতে পারেন, যার জন্য একটি সেলফ-হোস্টেড Authentik সার্ভার ব্যবহার করা যেতে পারে।
Octop-কে একটি মডেল ব্যাকএন্ডের দিকে নির্দেশ করা
ড্যাশবোর্ডে প্রতিটি এজেন্টের জন্য প্রোভাইডার কনফিগার করা হয় এবং octop provider list আপনাকে দেখায় কী সেট করা আছে। Octop-এ OpenAI-সামঞ্জস্যপূর্ণ API, DashScope (Qwen) এবং Ollama-এর জন্য প্রিসেট থাকে এবং আপনার নিজস্ব SQLite ডাটাবেসের providers টেবিলে ক্রেডেনশিয়ালগুলো সংরক্ষিত হয়। এই পছন্দের ওপর নির্ভর করে আপনার খরচ এবং সার্ভার থেকে কী পরিমাণ ডেটা বাইরে যাচ্ছে।
Ollama-এর সাথে একটি লোকাল মডেল। সার্ভার থেকে কোনো ডেটা বাইরে যায় না এবং টোকেনের পরিবর্তে আপনাকে RAM খরচ করতে হয়। যে বিষয়টি সাধারণত ব্যবহারকারীদের বিভ্রান্ত করে: একটি কন্টেইনার 127.0.0.1:11434-এ হোস্টের Ollama-এর সাথে যোগাযোগ করতে পারে না, কারণ এই ঠিকানাটি কন্টেইনারের নিজস্ব লুপব্যাক। সার্ভিসে একটি হোস্ট গেটওয়ে এন্ট্রি যোগ করুন:
extra_hosts:
- "host.docker.internal:host-gateway"এরপর প্রোভাইডার বেস URL-কে http://host.docker.internal:11434/v1-এ সেট করুন, যা Ollama-এর OpenAI-সামঞ্জস্যপূর্ণ পাথ। API কী ফিল্ডে যেকোনো একটি নন-এম্পটি স্ট্রিং দিন, কারণ Ollama এটি উপেক্ষা করলেও OpenAI ক্লায়েন্টরা খালি কী পাঠাতে অস্বীকার করে। এটি কাজ করার জন্য Ollama-কে অবশ্যই লুপব্যাকের বাইরেও লিসেন করতে হবে, যার অর্থ এর systemd ইউনিটে OLLAMA_HOST=0.0.0.0:11434 থাকতে হবে। এটি ঝুঁকিপূর্ণ অংশ: Ollama-তে কোনো অথেন্টিকেশন নেই, তাই পাবলিক IP-তে 11434 পোর্ট খোলা থাকলে যে কেউ এটি ব্যবহার করতে পারবে। শুধুমাত্র Docker-এর প্রাইভেট রেঞ্জ, sudo ufw allow from 172.16.0.0/12 to any port 11434 proto tcp-কে অনুমতি দিন এবং বাকি সব ব্লক করুন। VPS-এ Ollama চালানো অংশে মডেলের সাইজিং এবং Ollama এবং vLLM-এর তুলনা অংশে কখন Ollama ব্যবহার করা আর উপযুক্ত নয় তা আলোচনা করা হয়েছে।
লোকাল মডেলের ক্ষেত্রে আরও একটি সতর্কবার্তা, কারণ এটি Octop-এর বাগ মনে হতে পারে কিন্তু আসলে তা নয়। এজেন্টরা টুল কল করার মাধ্যমে কাজ করে এবং সিস্টেম প্রম্পট, টুলের সংজ্ঞা ও হিস্ট্রি মিলিয়ে প্রম্পটটি বেশ বড় হয়। Ollama ডিফল্টভাবে ছোট কনটেক্সট উইন্ডো ব্যবহার করে, ফলে প্রম্পটের শুরুর দিকে থাকা টুলের সংজ্ঞাগুলো উইন্ডোর বাইরে চলে যায়। তখন মডেলটি টুল কল করা বন্ধ করে দেয় অথবা অস্তিত্বহীন টুল তৈরি করতে শুরু করে। num_ctx-কে 16k বা 32k-এ উন্নীত করুন এবং এমন একটি মডেল বেছে নিন যা ফাংশন কলিংয়ে দক্ষ।
একটি সেলফ-হোস্টেড গেটওয়ে। Octop এবং অন্যান্য সবকিছুর মাঝে একটি সেলফ-হোস্টেড LiteLLM গেটওয়ে স্থাপন করুন। এতে আপনি একটি বেস URL, প্রতি ব্যবহারকারীর জন্য আলাদা কী, খরচের সীমা এবং একটি কেন্দ্রীয় লগ পাবেন। এছাড়া Octop-এ কোনো কিছু পরিবর্তন না করেই আপনি এর পেছনের মডেলটি পরিবর্তন করতে পারবেন।
একটি পেইড API। এটি সেরা মানের, তবে একটি স্পষ্ট বিনিময় রয়েছে: কথোপকথনের বিষয়বস্তু আপনার সার্ভার থেকে বেরিয়ে প্রোভাইডারের কাছে পৌঁছায়, যা সেলফ-হোস্টিংয়ের মূল উদ্দেশ্যের বিপরীত। কী-টি docker/.env-এ OPENAI_API_KEY হিসেবে দিতে হয়, যা Compose ফাইলে আগে থেকেই পাস করা থাকে।
আপনি যা-ই বেছে নিন না কেন, Compose ফাইলে OCTOP_LANGFUSE_ENABLED, LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY এবং LANGFUSE_BASE_URL অন্তর্ভুক্ত থাকে। ফলে আপনি আপনার নিজস্ব Langfuse ইনস্ট্যান্সে ট্রেস পাঠাতে পারবেন এবং চ্যাট উইন্ডো থেকে অনুমান না করে এজেন্টরা আসলে কী করছে তা সরাসরি দেখতে পারবেন।
ব্যবহারকারী, রোল এবং শেয়ার্ড এজেন্ট লাইব্রেরি
প্রথমবার বুট করার সময় তৈরি করা অ্যাডমিন অ্যাকাউন্টটি অন্যদের তৈরি ও পরিচালনা করে। প্রতিটি ব্যবহারকারী তাদের নিজস্ব এজেন্ট, ওয়ার্কস্পেস এবং ক্রেডেনশিয়াল পান। ব্রাউজারে থাকা টোকেনের মাধ্যমে এই আইসোলেশন বজায় রাখা হয়। এর পাশাপাশি রয়েছে স্কিল এবং সাব-এজেন্টের একটি শেয়ার্ড পুল, যা যে কেউ ব্যবহার করতে পারে। এই ফিচারটির কারণেই পরিবারের জন্য এটি ব্যবহার করা সার্থক: একজন ব্যক্তি একবার একটি ভালো রিসার্চ এজেন্ট তৈরি করলে অন্যদের আর তা নতুন করে তৈরি করতে হয় না।
টুলিং ব্যবহারের ক্ষেত্রে সতর্ক থাকুন। Octop টুল অনুমোদন এবং শেল কমান্ড গার্ডরেলের বিজ্ঞাপন দেয় এবং উভয়ই কার্যকর। তবে যে এজেন্ট শেল কমান্ড চালায়, সেটি আপনার ডেটা ভলিউম মাউন্ট করা অবস্থায় Octop কন্টেইনারের ভেতরেই কমান্ডগুলো নির্বাহ করে। গার্ডরেলগুলো অসতর্ক প্রম্পটের ঝুঁকি কমায়। এগুলো কোনো স্যান্ডবক্স বাউন্ডারি নয়, তাই আপনি যাদের হাতে সরাসরি শেল তুলে দেবেন না, তাদের জন্য টুল অনুমোদন অপশনটি চালু রাখুন। আপনি যদি অন্যান্য অপশনের সাথে এর তুলনা করতে চান, তবে self-hosted AI এজেন্টগুলোর রাউন্ডআপ দেখুন, যেখানে প্রতিটি এজেন্ট কীভাবে এই বিষয়টি হ্যান্ডেল করে তার তুলনা দেওয়া হয়েছে।
এত দ্রুত রিলিজ হওয়া একটি প্রজেক্ট আপগ্রেড করা
The data behind this chart
[
{
"version": "v0.9.16",
"days_since_previous_release": 2
},
{
"version": "v0.9.17",
"days_since_previous_release": 3
},
{
"version": "v0.9.18",
"days_since_previous_release": 1
},
{
"version": "v0.9.19",
"days_since_previous_release": 3
}
]7 আগস্ট 2026 পর্যন্ত হিসাব অনুযায়ী রিপোজিটরির ট্যাগ তারিখগুলো এখানে দেওয়া হলো। নয় দিনে 4 টি রিলিজ এসেছে, যেখানে রিলিজের মধ্যবর্তী ব্যবধান ছিল মাত্র 1 দিন এবং v0.9.19 সংস্করণটি তার আগের ট্যাগের 3 দিন পরেই এসেছে। এই গতি প্রজেক্টটির জন্য ইতিবাচক হলেও, সরাসরি latest চালানোর জন্য এটি একটি ঝুঁকিপূর্ণ কারণ। আপডেট গ্রহণ করার আগে পরিবর্তনগুলো পড়ে নিন:
cd Octop
git fetch --tags
git tag --sort=-creatordate | head
NEW_TAG=$(git tag --sort=-creatordate | head -1)
git log --oneline "v0.9.19..$NEW_TAG"প্রতিবার আপগ্রেডের আগে ব্যাকআপ নিন। কারণ স্টার্টআপের সময় ডাটাবেস মাইগ্রেশন স্বয়ংক্রিয়ভাবে চলে এবং 1.0-এর আগের প্রজেক্টে মাইগ্রেশন ব্যর্থ হলে তা ঠিক করার দায়িত্ব আপনারই।
docker compose -f docker/docker-compose.yml stop
sudo tar czf octop-backup-$(date +%F).tgz -C /srv octop-data
docker compose -f docker/docker-compose.yml startএরপর নতুন ট্যাগটি চেকআউট করুন এবং docker compose -f docker/docker-compose.yml up -d --build দিয়ে পুনরায় বিল্ড করুন। যদি কোনো সমস্যা হয়, তবে পুরনো ট্যাগ চেকআউট করে পুনরায় বিল্ড করলে কোড ফিরে পাওয়া যাবে, কিন্তু ডাটাবেস ফিরে পেতে শুধুমাত্র tarball-ই একমাত্র ভরসা।
এই tarball-এ octop.db, config.json, JWT সাইনিং সিক্রেট এবং credential.txt থাকে, তাই এটি সার্ভারের মতোই সংবেদনশীল। এটিকে 600 মোডে রাখুন এবং একটি কপি সার্ভারের বাইরে সংরক্ষণ করুন। বড় ধরনের ইনস্টলেশনের জন্য প্রজেক্টটি docker/docker-compose.postgres.yml-ও সরবরাহ করে, যা SQLite-এর পরিবর্তে pgvector সহ PostgreSQL চালায়।
ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন
হেলথ চেক কখনোই উত্তর দেয় না। curl http://127.0.0.1:8088/api/health হ্যাং হয়ে যায় অথবা সংযোগ প্রত্যাখ্যান করে। docker compose -f docker/docker-compose.yml logs -f octop পড়ুন। যে কন্টেইনার প্রথম ইনিশিয়ালাইজেশনের সময় বন্ধ হয়ে যায়, সেটি সাধারণত ডেটা ডিরেক্টরিতে লিখতে পারে না, তাই আপনি OCTOP_DATA-এ যা সেট করেছেন তার মালিকানা (ownership) পরীক্ষা করুন।
ড্যাশবোর্ড লোড হয় কিন্তু চ্যাট হ্যাং হয়ে থাকে। পৃষ্ঠায় কোনো ত্রুটি নেই, কিন্তু কোনো উত্তরও আসে না। ব্রাউজার কনসোল খুলুন এবং wss://octop.example.com/agents/.../chat/ws-এ কোনো সংযোগ ব্যর্থ হয়েছে কি না তা দেখুন। প্রক্সি আপগ্রেড রিকোয়েস্ট ফরওয়ার্ড করছে না। proxy_http_version 1.1 এবং Upgrade ও Connection হেডারগুলো যোগ করুন।
পুরো উত্তরটি কয়েক সেকেন্ড দেরিতে একসাথে প্রদর্শিত হয়। স্ট্রিমিং কাজ করছে, কিন্তু বাফারিং চালু আছে। proxy_buffering off সেট করুন।
bind: address already in use। অন্য কোনো প্রসেস ইতিমধ্যে 8088 পোর্টটি দখল করে রেখেছে। sudo ss -tlnp | grep 8088 কমান্ডটি দিয়ে সেটি শনাক্ত করুন। আপনি যদি মূল ফাইলটি এডিট না করে ওভাররাইড ফাইলে দ্বিতীয়বার ports এন্ট্রি যোগ করেন, তবেও এই একই ত্রুটি দেখা দেবে।
সঠিক পাসওয়ার্ড প্রত্যাখ্যান করা হচ্ছে। পাঁচটি ভুল প্রচেষ্টার পর 900 সেকেন্ডের জন্য লকআউট কার্যকর হয়। পুনরায় ইনস্টল না করে এই সময়টুকু অপেক্ষা করুন।
.env-এ নতুন পাসওয়ার্ড দেওয়ার পরও কোনো কাজ হয়নি। এই ক্রেডেনশিয়ালগুলো শুধুমাত্র প্রথমবার ইনিশিয়ালাইজেশনের সময় কার্যকর হয়। ড্যাশবোর্ড থেকে এটি পরিবর্তন করুন।
এজেন্ট উত্তর দেয় কিন্তু কোনো টুল চালায় না। এটি প্রায় সবসময়ই লোকাল মডেলের সমস্যা: টুলের ডেফিনিশনের জন্য কনটেক্সট উইন্ডো খুব ছোট, অথবা মডেলটি ফাংশন কলিংয়ের জন্য উপযুক্ত নয়। num_ctx বৃদ্ধি করুন এবং টুল ব্যবহারের জন্য তৈরি কোনো মডেল ব্যবহার করে দেখুন।
FAQ
Octop কি Open WebUI-এর বিকল্প?
শুধুমাত্র যদি আপনার এর অতিরিক্ত ফিচারগুলোর প্রয়োজন হয়। Open WebUI হলো মডেলের সামনে একটি চ্যাট ইন্টারফেস এবং একজন ব্যক্তি বা বিশ্বস্ত পরিবারের জন্য এটি চমৎকার কাজ করে। Octop অ্যাডমিন রোলসহ অ্যাকাউন্ট, প্রতি ব্যবহারকারীর জন্য আলাদা ওয়ার্কস্পেস ও ক্রেডেনশিয়াল এবং বিশেষজ্ঞ এজেন্টদের একটি পরিবর্তনযোগ্য লাইব্রেরি যোগ করে, যাতে একাধিক ব্যক্তি একটি সার্ভার শেয়ার করলেও তাদের চ্যাট হিস্ট্রি আলাদা থাকে। যদি একটি অ্যাকাউন্টই আপনার জন্য যথেষ্ট হয়, তবে Open WebUI অনেক বেশি সহজ এবং পরিপক্ক একটি পছন্দ।
কেন আমার Octop-এর curl ইনস্টল স্ক্রিপ্ট ব্যবহার করা উচিত নয়?
এই স্ক্রিপ্টটি রিপোজিটরির পরিবর্তে একটি Tencent Cloud Object Storage বাকেট থেকে পরিবেশন করা হয়, তাই এটি কোনো git tag বা commit দ্বারা নিয়ন্ত্রিত নয়। আজ এটি কী করছে তা গত সপ্তাহের সাথে আপনি তুলনা করতে পারবেন না এবং bash-এ পাইপ করার মাধ্যমে পড়ার আগেই এটি রান হয়ে যায়। এটি আপনার প্যাকেজ ম্যানেজারের বাইরে নিজস্ব Python 3.12 এনভায়রনমেন্টসহ হোস্ট মেশিনে ইনস্টল হয়। তাই এটি ডাউনলোড করে আগে পড়ুন, অথবা কোনো নির্দিষ্ট tag চেক-আউট করে Docker Compose দিয়ে ডেপ্লয় করুন।
Octop কি পেইড API-এর পরিবর্তে লোকাল মডেল ব্যবহার করতে পারে?
হ্যাঁ। Octop OpenAI-সামঞ্জস্যপূর্ণ API সমর্থন করে এবং এতে Ollama প্রিসেট দেওয়া থাকে। তাই কন্টেইনারে extra_hosts: ["host.docker.internal:host-gateway"] যোগ করে এবং হোস্টে OLLAMA_HOST=0.0.0.0:11434 সেট করার পর http://host.docker.internal:11434/v1-এর দিকে পয়েন্ট করলে এটি কাজ করবে। Ollama-এর নিজস্ব কোনো অথেন্টিকেশন নেই, তাই ফায়ারওয়ালে 11434 পোর্টটি শুধুমাত্র Docker-এর অ্যাড্রেস রেঞ্জের জন্য উন্মুক্ত রাখুন। Ollama-এর num_ctx বাড়িয়ে 16k বা তার বেশি করার প্রস্তুতি রাখুন, কারণ টুল ডেফিনিশনসহ এজেন্টের প্রম্পটগুলো ডিফল্ট কনটেক্সট উইন্ডো ছাড়িয়ে যায় এবং তখন মডেল টুল কল করা বন্ধ করে দেয়।
আমার কি একটি reverse proxy প্রয়োজন, নাকি আমি 8088 পোর্ট ওপেন করতে পারি?
আপনার অবশ্যই একটি প্রক্সি প্রয়োজন। Octop-এর সাথে দেওয়া Compose ফাইলে 8088 পোর্টটি TLS ছাড়া সব ইন্টারফেসে পাবলিশ করা থাকে, যার ফলে পাসওয়ার্ড এবং বিয়ারার টোকেনগুলো ইন্টারনেটে প্লেইন টেক্সট হিসেবে আদান-প্রদান হবে। পাবলিশ করা পোর্টটি পরিবর্তন করে 127.0.0.1:8088:8088 করুন এবং সামনে Caddy বা nginx বসিয়ে একটি সার্টিফিকেট ব্যবহার করুন। nginx ব্যবহারের ক্ষেত্রে WebSocket আপগ্রেড হেডারগুলো ফরোয়ার্ড করুন এবং proxy_buffering off সেট করুন, অন্যথায় পেজ লোড হলেও চ্যাট কোনো রেসপন্স করবে না।
Octop কি প্রোডাকশনের জন্য প্রস্তুত?
এটি এখনো 1.0 ভার্সনের নিচে এবং আগস্ট 2026 পর্যন্ত প্রতি সপ্তাহে একাধিক tagged রিলিজ দিচ্ছে, তাই এটিকে চূড়ান্ত না ভেবে সম্ভাবনাময় হিসেবে বিবেচনা করুন। আপনি যদি একটি নির্দিষ্ট tag পিন করে রাখেন, প্রতিটি আপগ্রেডের আগে কমিট লগ পড়েন এবং প্রতিবার রিবিল্ডের আগে ডেটা ভলিউমের ব্যাকআপ নেন, তবে এটি একটি পরিবার বা ছোট অভ্যন্তরীণ টিমের জন্য ব্যবহারযোগ্য। এটিকে latest-এ রান করবেন না এবং এখনো এতে কোনো গ্রাহকের ডেটা রাখবেন না।