VPS-এ OpenHands self-host করার নিরাপদ পদ্ধতি
OpenHands code লেখে ও চালায়, তাই Docker দিয়ে VPS-এ setup-এর সময় Web UI ও secret সুরক্ষিত রাখুন। Docker socket access কার্যত host-এর root access।
OpenHands কী এবং প্রথমে যে ঝুঁকিটি বুঝতে হবে
OpenHands, যার পূর্বের নাম OpenDevin, একটি স্বয়ংক্রিয় software-engineering agent। আপনি এটিকে সাধারণ ভাষায় একটি কাজ দেন, আর এটি কাজের পরিকল্পনা করে, code লেখে, command চালায়, output পড়ে এবং কাজ শেষ না হওয়া পর্যন্ত ধাপে ধাপে পরিবর্তন করে। Docker ব্যবহার করে আপনি এটিকে নিজের server-এ চালান এবং একটি language model-এর সঙ্গে সংযুক্ত করেন। VPS-এ এটি এমন একটি coding agent হয়ে ওঠে, যা আপনার অনুপস্থিতিতেও কাজ করতে পারে।
একটি বিষয় আপনার সম্পূর্ণ setup-এর ভিত্তি নির্ধারণ করবে। OpenHands শুধু code-এর পরামর্শ দেয় না, এটি code চালায়। এ জন্য এর controller container host-এর Docker socket-টি /var/run/docker.sock-এ mount করে, যাতে প্রতিটি কাজের জন্য sandbox container চালু করতে পারে। Docker socket-এর সঙ্গে যোগাযোগ করতে পারে এমন যেকোনো কিছু এমন একটি নতুন container চালু করতে পারে, যেটি আপনার সম্পূর্ণ host filesystem mount করে। এর অর্থ, socket access কার্যত মেশিনে root access-এর সমতুল্য। তাই OpenHands চালানো server-কে untrusted code চালায় এমন server হিসেবে বিবেচনা করুন। কারণ এটি সত্যিই তা-ই করে। নিচের প্রতিটি hardening সিদ্ধান্ত এই বিষয়টির ওপর ভিত্তি করে নেওয়া হয়েছে।
যা প্রয়োজন
আপনার একটি VPS প্রয়োজন, যেখানে Ubuntu 24.04 এবং সাম্প্রতিক Docker Engine চলছে। এ ছাড়া অন্তত 4 GB RAM এবং একটি language model-এর API key (OpenAI, Anthropic বা Google) প্রয়োজন। এর পরিবর্তে একই VPS-এ চালু থাকা Ollama-তে পরিবেশিত একটি local model ব্যবহার করতে পারেন। OpenHands ডজনখানেক model backend সমর্থন করে, তাই পছন্দটি আপনার। আপনি আগে কখনও container সেট আপ না করে থাকলে, VPS-এ Docker-এর মৌলিক বিষয়গুলো এই guide-এ ধরে নেওয়া ভিত্তিগুলো ব্যাখ্যা করে।
Docker দিয়ে ইনস্টল করুন
OpenHands দুটি image হিসেবে প্রকাশিত হয়: আপনি যে application image চালাবেন, এবং agent-server image, যেটি প্রতিটি task-এর sandbox চালানোর জন্য OpenHands টেনে আনে। Project-এর documentation-এ দেওয়া বর্তমান tag বসিয়ে এভাবে চালান:
docker run -it --rm --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 127.0.0.1:3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands \
docker.openhands.dev/openhands/openhands:1.8দুটি বিষয় মনে রাখলে বিভ্রান্তি এড়িয়ে প্রায় এক ঘণ্টা সময় বাঁচবে। app image এবং agent-server image-এ ইচ্ছাকৃতভাবে আলাদা version number থাকে। তাই দুটিকে একই করার চেষ্টা করবেন না। আপনার app version-এর সঙ্গে documentation-এ যে agent-server tag দেওয়া আছে, সেটিই ব্যবহার করুন। আর -p 3000:3000-এর পরিবর্তে -p 127.0.0.1:3000:3000 লক্ষ্য করুন। এই একটি পরিবর্তনেই শুধু আপনার কাছে পৌঁছানো যায় এমন Web UI এবং পুরো Internet থেকে পৌঁছানো যায় এমন Web UI-এর পার্থক্য তৈরি হয়। পরের section-এ এই বিষয়টি ব্যাখ্যা করা হয়েছে।
Web UI-কে public internet থেকে দূরে রাখুন
OpenHands তার interface port 3000-এ চালু করে। এই interface এমন একটি agent নিয়ন্ত্রণ করে, যা code চালায়। তাই এটিকে internet-এ প্রকাশ করলে যে কেউ এটি খুঁজে পেলে command চালানো process-এ remote access পাওয়ার পথ পেয়ে যায়। উপরের run command-এর মতো এটিকে loopback-এ bind করুন। এরপর SSH tunnel ব্যবহার করে laptop থেকে এতে সংযোগ করুন:
ssh -L 3000:127.0.0.1:3000 you@your-vpsতারপর নিজের machine-এ http://127.0.0.1:3000 খুলুন। Traffic আপনার বিদ্যমান SSH session-এর মধ্য দিয়ে যায়। Public internet-এ নতুন কোনো service listen করে না। সব agent-এর জন্য port প্রয়োজন হয় না: একই VPS-এর Claude Code session-গুলো terminal-এর মাধ্যমে একে অপরকে message পাঠায়। তাই আপনি কেবল SSH-ই expose করেন। একই loopback-and-tunnel পদ্ধতি আপনার host করা প্রতিটি agent dashboard-এ ব্যবহার করা ভালো। একটি tunnel-এর মাধ্যমে open-kritt-এর scanning UI-তে পৌঁছানো একইভাবে কাজ করে, তবে port 5173 ব্যবহার করে। আরও স্থায়ী setup-এর জন্য এর সামনে একটি VPN রাখুন। যেভাবেই setup করুন, box-এর সামনে default-deny firewall রাখুন, যাতে ভুল করে কিছু expose না হয়। মনে রাখবেন, কোনো firewall যদি শুধু IPv4 কভার করে, তাহলে একই port IPv6-এ খোলা থাকতে পারে। এটিই সেই IPv6 firewall gap, যার কারণে অনেকেই সমস্যায় পড়েন।
মডেল key এবং repository credential আলাদা রাখুন
OpenHands-এর মডেলের জন্য একটি API key এবং প্রায়ই আপনার repository clone ও push করার জন্য একটি token প্রয়োজন হয়। উভয়ই অর্থ ব্যয় করতে পারে এবং আপনার পরিচয়ে কাজ করতে পারে। তাই এগুলোকে password-এর মতো সুরক্ষিত রাখুন। এগুলো এমন একটি environment file-এ রাখুন, যা শুধু নির্ধারিত account পড়তে পারে। যে run command-এ এগুলো shell history ও process list-এ চলে যাবে, সেখানে কখনো রাখবেন না। git repository-এর ভেতরের কোনো file-এও রাখবেন না। মূল credential self-hosted password manager-এ রাখলে সেই server-ও শক্তভাবে সুরক্ষিত করুন। কারণ vault-এর দুর্বল স্থান সাধারণত encrypted item নয়; বরং admin token এবং backup file। Vaultwarden hardening পর্যালোচনা-এ এই বিষয়গুলোই ধাপে ধাপে দেখানো হয়েছে।
এটি এমন একটি সার্ভারে চালান যা প্রয়োজনে বাতিল করে দিতে পারেন
Controller-কে Docker socket ধরে রাখতে হয়। তাই OpenHands-কে তার host থেকে পুরোপুরি sandbox করা যায় না। বাস্তবসম্মত প্রতিকার হলো অবস্থানভিত্তিক isolation: OpenHands একটি dedicated VPS-এ চালান, যেখানে আপনার গুরুত্বপূর্ণ অন্য কোনো ডেটা বা service নেই। যে server-এ database বা website-ও চলছে, সেখানে এটি চালাবেন না। শুরু করার আগে একটি snapshot নিন। এক সপ্তাহ ধরে agent-এর লেখা code চালানো কোনো box-কে অন্ধভাবে বিশ্বাস না করে সেই snapshot থেকে rebuild করুন। সস্তা, বাতিলযোগ্য, single-purpose VPS-ই এর জন্য উপযুক্ত স্থান। এখানে OpenHands মূলত placement নিয়ন্ত্রণের সুযোগই দেয়। তাই agent থেমে আপনার অনুমতি চাওয়ার আগে কতটা কাজ করতে পারবে, সেটিও যদি নিয়ন্ত্রণ করতে চান, Claude Code-এর permission mode দেখুন। এতে নজরদারিহীন server-এ সেই দ্বিতীয় নিয়ন্ত্রণব্যবস্থা কেমন হতে পারে তা বোঝা যাবে।
এর চারপাশের সার্ভারটি শক্ত করুন
বাকি বিষয়গুলো সাধারণ server hygiene-এর অংশ। তবে এখানে এগুলোর গুরুত্ব স্বাভাবিকের চেয়ে বেশি, কারণ workload-টি স্বাভাবিকের চেয়ে বেশি ঝুঁকিপূর্ণ। root হিসেবে কাজ না করে একটি unprivileged admin user তৈরি করুন। এর জন্য unprivileged user হিসেবে service চালানো অনুসরণ করুন। SSH-কে key-only authentication-এ পরিবর্তন করুন। এরপর নিচের checklist চালিয়ে দেখুন এবং এমন জায়গায় সংরক্ষণ করুন, যেখানে আপনি পরে আবার এটি দেখতে পাবেন।
শুধু কমান্ড চালানোর বদলে প্রতিটি অংশ কীভাবে কাজ করে তা বুঝতে VPS-এ নিজের AI agent তৈরি করা দেখুন। কম code-এর platform চাইলে Dify self-host করা দিয়ে শুরু করা সহজ হবে।
FAQ
OpenHands সার্ভারে চালানো কি নিরাপদ?
সতর্কতার সঙ্গে চালালে নিরাপদ হতে পারে। তবে এটি সাধারণ web app-এর চেয়ে বেশি ঝুঁকিপূর্ণ, কারণ এটি code লিখে এবং চালায়। এর controller host-এর Docker socket ধরে রাখে, যা কার্যত মেশিনে root access-এর সমতুল্য। এটি এমন একটি dedicated, disposable VPS-এ চালান যেখানে অন্য কোনো গুরুত্বপূর্ণ data নেই। Web UI-কে loopback-এ রাখুন এবং SSH tunnel বা VPN-এর পেছনে ব্যবহার করুন। এর key-গুলো আলাদা রাখুন এবং server harden করুন। গুরুত্বপূর্ণ service-এর পাশে এটি চালাবেন না।
OpenHands-এর Docker socket প্রয়োজন কেন?
OpenHands প্রতিটি task একটি নতুন sandbox container-এ চালায়। এই container তৈরি করার জন্য এটি host-এর Docker daemon-কে অনুরোধ করে। এজন্য controller-এ /var/run/docker.sock mount করা হয়। এর ফলে controller container host-এর Docker নিয়ন্ত্রণ করতে পারে। এটি শক্তিশালী এবং ঝুঁকিপূর্ণ ক্ষমতা। তাই host-কে untrusted code চালায় এমন একটি সিস্টেম হিসেবে বিবেচনা করতে হবে।
Paid API-এর পরিবর্তে OpenHands কি local model ব্যবহার করতে পারে?
হ্যাঁ। OpenHands Ollama বা vLLM দ্বারা পরিবেশিত local model সমর্থন করে। তাই per-token cost ছাড়াই এবং কোনো data server-এর বাইরে না পাঠিয়ে এটি সম্পূর্ণ self-hosted হিসেবে চালাতে পারেন। সক্ষম coding model চালানোর জন্য পর্যাপ্ত memory-সহ একটি machine প্রয়োজন। এটি Ollama guide-এ ব্যাখ্যা করা একই sizing বিষয়।
আমার প্রধান server-এ OpenHands চালানো উচিত কি?
না। এটি agent-authored code চালায় এবং Docker socket ধরে রাখে। তাই এটি একটি আলাদা, single-purpose VPS-এ রাখুন, যেটি প্রয়োজনে পুনর্নির্মাণ করতে আপনি প্রস্তুত। Database, website বা অন্য service-এর সঙ্গে একই server-এ রাখলে agent-এর ভুল বা software-এর bug এমন resource-এ পৌঁছাতে পারে, যেগুলোতে তার কখনোই পৌঁছানোর কথা ছিল না।