SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

Rakazo self-hosting: VPS-এ AI বট চালানোর নিয়ম

Node 22, pnpm ও Docker Compose ব্যবহার করে আপনার নিজস্ব VPS-এ Rakazo সেটআপ করুন। Postgres ও Graphile Worker কনফিগারেশন, কি ম্যানেজমেন্ট এবং সঠিক সার্ভার সাইজিংয়ের বিস্তারিত গাইড।

Rakazo self-hosting আসলে যা যা চালায়

Rakazo self-hosting করার অর্থ হলো একটি Linux সার্ভারে পাঁচটি জিনিস চালানো: PostgreSQL, একটি Graphile Worker প্রসেস, API, ওয়েব অ্যাপ এবং প্রতিটি সক্রিয় বটের জন্য একটি করে sandbox কন্টেইনার। Rakazo হলো Grok Bot-এর একটি ওপেন-সোর্স বিকল্প, যা elie222 কর্তৃক Apache 2.0 লাইসেন্সের অধীনে প্রকাশিত হয়েছে। প্রতিটি বট তার নিজস্ব থ্রেড, নিজস্ব কম্পিউটার, নিজস্ব মেমোরি এবং নিজস্ব হিস্ট্রি পায় এবং এটি চাইলে নতুন পিয়ার বা স্বল্পস্থায়ী সাব-এজেন্ট তৈরি করতে পারে।

শেষের এই অংশটির কারণেই এটি ডেস্কটপের পরিবর্তে একটি VPS (virtual private server)-এ চালানো প্রয়োজন। যে বট মেমোরি ধরে রাখে এবং নির্ধারিত কাজ সম্পাদন করে, সেটি আপনার ঘুমের সময়ও সচল থাকা জরুরি। ল্যাপটপ স্লিপ মোডে চলে গেলে এই কিউ (queue) বন্ধ হয়ে যায়।

আগস্ট 2026 অনুযায়ী Rakazo এখনো আর্লি বেটা পর্যায়ে রয়েছে, তাই এটিকে একটি চূড়ান্ত অ্যাপ্লায়েন্সের পরিবর্তে একটি কার্যকর সেটআপ হিসেবে বিবেচনা করুন। পুরো স্ট্যাকটি TypeScript-এ তৈরি: ওয়েব অ্যাপের জন্য React 19 এবং Vite, API-এর জন্য Hono, Prisma-সহ Postgres, অ্যাকাউন্টের জন্য Better Auth এবং ব্যাকগ্রাউন্ড জবের জন্য Graphile Worker। Graphile Worker তার কিউ Postgres-এর ভেতরেই জমা রাখে, তাই এখানে Redis বা অন্য কোনো অতিরিক্ত ডেটা স্টোর চালানোর প্রয়োজন নেই। .env.example সেট করে WAKEUP_DRIVER=graphile, যার অর্থ হলো একটি বট জেগে ওঠা মানেই সেটি একটি Postgres-ভিত্তিক জব। Postgres বন্ধ করলে প্রতিটি নির্ধারিত বট অ্যাকশনও তার সাথে বন্ধ হয়ে যাবে। আপনি যদি অন্যের প্রোডাক্ট না চালিয়ে নিজের মতো করে এজেন্ট তৈরি করতে চান, তবে কম্পোনেন্ট থেকে নিজের এজেন্ট তৈরি করা হলো অন্য একটি উপায়।

কেন 1 GB-এর প্ল্যান এটি চালাতে পারবে না

প্রসেসগুলোর সংখ্যা গণনা করুন। Postgres একটি। API হলো একটি Node প্রসেস। ওয়ার্কার হলো দ্বিতীয়টি। ওয়েব অ্যাপ হলো তৃতীয়টি। স্যান্ডবক্স সুপারভাইজার হলো চতুর্থটি। এরপর প্রতিটি চলমান বটের জন্য একটি করে কন্টেইনার থাকে, যার ভেতরে একটি গ্রাফিক্যাল Linux ডেস্কটপ এবং একটি ব্রাউজার চলে।

প্রজেক্টের নিজস্ব সেলফ-হোস্ট ডকুমেন্টেশনে একটি সৎ হিসাব দেওয়া আছে: 2 vCPU এবং 4 GB র‍্যামের মেশিন API, ওয়ার্কার এবং Postgres-এর জন্য যথেষ্ট, যখন E2B বট ডেস্কটপগুলো পরিচালনা করে। এটি শুধুমাত্র কন্ট্রোল প্লেনের জন্য প্রয়োজনীয় সংখ্যা, যেখানে ভারী অংশটি অন্য কোথাও হোস্ট করা থাকে। SANDBOX_PROVIDER=docker সেট করলে সেই ডেস্কটপগুলো আপনার VPS-এ চলে আসে, তাই 4 GB তখন লক্ষ্যমাত্রা না হয়ে ন্যূনতম প্রয়োজনীয়তায় পরিণত হয়। আপনি যদি একাধিক বট চালু রাখতে চান তবে 8 GB থেকে শুরু করুন এবং বট কাজ করার সময় docker stats দিয়ে প্রকৃত ব্যবহারের পরিমাণ পরিমাপ করুন। স্যান্ডবক্সের ভেতরের ব্রাউজারটিই মেমরির ব্যবহার বাড়িয়ে দেয়, তাই স্পেক শিট দেখে এটি বোঝা সম্ভব নয়। এজেন্ট কাজের জন্য সার্ভারের আকার নির্ধারণের সাধারণ পদ্ধতির বিষয়ে, এজেন্ট VPS-এর জন্য আসলে কতটুকু RAM এবং CPU প্রয়োজন নিবন্ধে বিস্তারিত পরিমাপ পদ্ধতি আলোচনা করা হয়েছে।

একটি সেটিং পরিস্থিতি খারাপ হওয়া থেকে রক্ষা করে। .env.example-এর সাথে SANDBOX_IDLE_MS=600000 দেওয়া থাকে, যেখানে মন্তব্য করা আছে যে এটি নির্দিষ্ট সংখ্যক অলস মিলিসেকেন্ডের পর E2B কম্পিউটারগুলোকে পজ (pause) করে অথবা Docker কম্পিউটারগুলোকে বন্ধ করে দেয়। দশ মিনিট অলস থাকলে কম্পিউটারটি বন্ধ হয়ে যায়। সর্বনিম্ন গ্রহণযোগ্য মান হলো 30000। এটি ছাড়া, আপনার খোলা প্রতিটি বট চিরস্থায়ীভাবে মেমরি দখল করে রাখবে।

ডিস্কের জায়গাও গুরুত্বপূর্ণ। স্যান্ডবক্স ইমেজ, Node মডিউল এবং Postgres ভলিউম একই ডিস্ক শেয়ার করে, তাই 40 GB একটি যুক্তিসঙ্গত শুরুর পয়েন্ট।

ক্লোন করার আগে একটি ভার্সন পিন করুন

Rakazo দ্রুত পরিবর্তিত হয় এবং main কোনো রিলিজ নয়। 16 আগস্ট 2026 অনুযায়ী, রিপোজিটরিতে মাত্র একটি ট্যাগ রয়েছে, v0.1.0-beta, যা 13 আগস্ট 2026-এ প্রকাশিত হয়েছে এবং এটিকে একটি প্রি-রিলিজ হিসেবে চিহ্নিত করা হয়েছে।

git clone https://github.com/elie222/rakazo.git
cd rakazo
git checkout 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb
git log -1 --format='%H %ci'

সেই কমিটটিই হলো সেটি, যার দিকে v0.1.0-beta নির্দেশ করে। ব্রাঞ্চ বা ট্যাগের পরিবর্তে কমিটটিকে পিন করুন। পরবর্তী git pull-এর সময় ব্রাঞ্চ আপনার অজান্তেই পরিবর্তিত হতে পারে এবং ট্যাগ হলো একটি পরিবর্তনযোগ্য লেবেল যা মেইনটেইনার যেকোনো সময় সরিয়ে নিতে পারেন, তাই এগুলোর কোনোটিই এমন কোনো ট্রি (tree) শনাক্ত করে না যেখানে আপনি পুনরায় ফিরে আসতে পারবেন। একটি কমিট আইডেন্টিফায়ার কখনো পরিবর্তিত হয় না। আপনার সার্ভারের অন্যান্য তথ্যের পাশাপাশি এটি লিখে রাখুন, কারণ আপগ্রেডের ফলে কোনো সমস্যা হলে সবচেয়ে সহজ সমাধান হলো git checkout <old commit> এবং পুনরায় বিল্ড করা, আর এটি তখনই কাজ করবে যদি আপনি জানেন কোন কমিটটি সঠিকভাবে কাজ করছিল।

প্রয়োজনীয়তা: Node 22, pnpm 9 এবং Docker

node -v
pnpm -v
docker --version

package.json-এ "engines": { "node": ">=22" } এবং "packageManager": "pnpm@9.15.0" ঘোষণা করা হয়েছে, তাই node -v-কে অবশ্যই v22 বা তার চেয়ে উচ্চতর সংস্করণ দেখাতে হবে। Ubuntu আর্কাইভের Node প্যাকেজ সাধারণত এর চেয়ে পুরনো হয়, তাই NodeSource বা nvm থেকে ইনস্টল করুন। corepack-এর মাধ্যমে Node-এর সাথে pnpm চলে আসে:

corepack enable
corepack prepare pnpm@9.15.0 --activate

Docker Engine এবং compose plugin বাকি কাজগুলো সম্পন্ন করে, এবং আপনার ব্যবহারকারীর daemon-এর সাথে সংযোগ স্থাপনের সক্ষমতা থাকতে হবে। যদি docker ps কমান্ডটি permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock আউটপুট দেয়, তবে আপনার ব্যবহারকারীকে docker গ্রুপে যুক্ত করুন এবং একটি নতুন লগইন শেল খুলুন। এটি কী সুবিধা দেয় তা আগে জেনে নিন: docker গ্রুপের সদস্যপদ মেশিনে root-এর সমতুল্য, কারণ এই গ্রুপের যে কেউ এমন একটি কন্টেইনার চালু করতে পারে যা হোস্ট ফাইলসিস্টেমকে মাউন্ট করে।

.env কনফিগার করুন, তারপর Postgres চালু করুন

cp .env.example .env
chmod 600 .env

নেটওয়ার্কে কোনো কিছু উন্মুক্ত করার আগে দুটি মান অবশ্যই পরিবর্তন করতে হবে। .env.example-এর সাথে BETTER_AUTH_SECRET=replace-with-32-plus-character-secret এবং ENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase থাকে। ডেভেলপমেন্টের বাইরে এই প্লেসহোল্ডার মানগুলো Rakazo গ্রহণ করে না, তাই অর্ধেক কনফিগার করা ডিপ্লয়মেন্ট কোনো গোপন তথ্য যা রিপোজিটরিতে প্রকাশিত হয়েছে তা ব্যবহার করে চলার পরিবর্তে সরাসরি ব্যর্থ হয়।

openssl rand -base64 48
openssl rand -hex 32

এরপর ডাটাবেসটি আলাদাভাবে চালু করুন এবং মাইগ্রেশনগুলো চালান।

docker compose --env-file .env -f infra/compose/docker-compose.yml up postgres -d
pnpm install
pnpm db:generate
pnpm db:migrate
pnpm sandbox:build

pnpm sandbox:build বট কম্পিউটার ইমেজটি তৈরি করে, যা package.json-এ docker build -t rakazo/computer:local infra/sandboxes/computer হিসেবে সংজ্ঞায়িত করা হয়েছে। এটি একটি গ্রাফিক্যাল ইমেজ, তাই প্রথমবার বিল্ড করার সময় অনেক কিছু ডাউনলোড হয় এবং সময় লাগে। docker image ls rakazo/computer দিয়ে এটি নিশ্চিত করুন, যা একটি সারি প্রদর্শন করবে।

কম্পোজ ফাইলটি Postgres-কে 127.0.0.1:5433:5432 হিসেবে পাবলিশ করে, যা শুধুমাত্র লুপব্যাক ইন্টারফেসের জন্য। এটি এভাবেই রাখুন। ডেভেলপমেন্ট ক্রেডেনশিয়ালগুলো হলো rakazo:rakazo, যা রিপোজিটরিতেই থাকে। ইন্টারনেটে উন্মুক্ত কোনো Postgres পোর্ট এবং সেখানে থাকা পাসওয়ার্ড কয়েক ঘণ্টার মধ্যেই স্ক্যানারদের নজরে চলে আসে। প্রোডাকশন কম্পোজ ফাইলটি এর পরিবর্তে POSTGRES_PASSWORD ব্যবহার করে, তাই সেখানে পৌঁছানোর পর সেটিকে একটি র‍্যান্ডম স্ট্রিংয়ে সেট করুন।

প্রথমবার চালানো

pnpm dev

এটি চারটি বিষয় চালু করে: 3100 পোর্টে API, Graphile Worker, 5173 পোর্টে Vite ওয়েব অ্যাপ এবং 7091 পোর্টে স্যান্ডবক্স সুপারভাইজার। অ্যাপটি http://127.0.0.1:5173-এ রয়েছে এবং আপনি সেখানে একটি সাইন-ইন পেজ দেখতে পাবেন।

VPS-এর ক্ষেত্রে আপনি সরাসরি সেই মেশিনে বসে নেই, তাই এটি দেখার জন্য 5173 পোর্ট পাবলিকলি উন্মুক্ত করা উচিত নয়। এর পরিবর্তে আপনার নিজের মেশিন থেকে SSH (secure shell) ব্যবহার করে পোর্টগুলো ফরওয়ার্ড করুন।

ssh -L 5173:127.0.0.1:5173 -L 3100:127.0.0.1:3100 you@your-server

এটি চালানোর দুটি পদ্ধতির পার্থক্যের বিষয়ে সতর্ক থাকুন। pnpm dev কমান্ডটি Vite-কে হোস্ট মেশিনে লোকালি রান করে। compose ফাইলের web সার্ভিসটি 5173:5173 পোর্টকে প্রতিটি ইন্টারফেসে উন্মুক্ত করে দেয়। একটি পাবলিক VPS-এ সম্পূর্ণ ডেভেলপমেন্ট compose স্ট্যাক চালু করলে অ্যাপটি সবার জন্য উন্মুক্ত হয়ে যায়, তাই কোনো কিছু দীর্ঘস্থায়ীভাবে চালু রাখতে চাইলে production ফাইল এবং এর reverse proxy ব্যবহার করুন।

সার্ভারে কোন স্যান্ডবক্স প্রোভাইডার নিরাপদ?

এটি এমন একটি সেটিং যা সঠিকভাবে কনফিগার করা জরুরি। SANDBOX_PROVIDER-এ .env চারটি ভ্যালু গ্রহণ করে।

  • docker হলো ডিফল্ট। প্রতিটি বট আপনার মেশিনে নিজস্ব কন্টেইনারে চলে, যা pnpm sandbox:build ইমেজ থেকে তৈরি হয়। এটি সেলফ-হোস্টেড সেটআপের জন্য দ্রুততম উপায়।
  • e2b বট কম্পিউটারগুলোকে E2B-তে চালায় এবং এর জন্য E2B_API_KEY প্রয়োজন। পাবলিক বা মাল্টি-ইউজার ডিপ্লয়মেন্টের জন্য প্রজেক্টটি এটি ব্যবহারের পরামর্শ দেয়, কারণ এটি আপনার API এবং ডাটাবেস হোস্ট করা সার্ভার থেকে বট কম্পিউটারগুলোকে আলাদা রাখে।
  • desktop বটের কমান্ডগুলোকে সরাসরি API এবং ওয়ার্কার হোস্টে চালায়। রিপোজিটরির নির্দেশনায় স্পষ্টভাবে বলা হয়েছে: পাবলিক বা শেয়ারড সার্ভারে এটি ব্যবহার করবেন না।
  • fake হলো পরীক্ষার জন্য একটি ইন-প্রসেস এমুলেটর। এটি কোনো রানটাইম নয়।

ডেস্কটপ ওয়ার্নিংটিকে গুরুত্ব সহকারে নিন। ডেস্কটপ মোডে কোনো আইসোলেশন বাউন্ডারি থাকে না, তাই বটটি API প্রসেস চালানো ইউজারের পারমিশন নিয়ে শেল কমান্ড চালায়। এর ফলে বটটি ওই ইউজারের হোম ডিরেক্টরি, SSH কি, ক্লাউড ক্রেডেনশিয়াল এবং .env অ্যাক্সেস করতে পারে। ওয়েব পেজে থাকা টেক্সট যা বট পড়ে, তা আপনার সার্ভারে কমান্ড হিসেবে কার্যকর হতে পারে। সার্ভারে ডেস্কটপ মোড ব্যবহার করলে বটের কাছে আপনার ক্রেডেনশিয়াল চলে যাওয়ার ঝুঁকি থাকে। এটি শুধুমাত্র আপনার ব্যক্তিগত মেশিনে ব্যবহার করুন, অন্যথায় ব্যবহার করবেন না।

docker একটি বাস্তব বাউন্ডারি হলেও এটি নিখুঁত নয়। প্রতিটি বটের নিজস্ব কন্টেইনার থাকায় একটি বট অন্য বটের ফাইল পড়তে পারে না। তবে যে সুপারভাইজার এই কন্টেইনারগুলো তৈরি করে, সেটি /var/run/docker.sock মাউন্ট করে। হোস্ট Docker সকেটের নিয়ন্ত্রণ থাকা মানে পুরো হোস্টেরই নিয়ন্ত্রণ থাকা। তাই সুপারভাইজারকে প্রাইভেট রাখুন। .env.example-এ SANDBOX_SUPERVISOR_TOKEN-কে একটি ঐচ্ছিক আলাদা সার্ভিস ক্রেডেনশিয়াল হিসেবে উল্লেখ করা হয়েছে, যা খালি থাকলে ডিফল্টভাবে BETTER_AUTH_SECRET হিসেবে কাজ করে। এর মানে হলো, এই সিক্রেটটিকে প্লেসহোল্ডারে রেখে দিলে কন্টেইনার তৈরির সার্ভিসটি এমন একটি স্ট্রিং দ্বারা সুরক্ষিত থাকে যা GitHub-এ যে কেউ পড়তে পারে। উভয় ভ্যালুই সেট করুন। এখানে সবচেয়ে শক্তিশালী আইসোলেশনের জন্য e2b ব্যবহার করুন, অথবা Rakazo-কে এমন একটি মেশিন দিন যেখানে অন্য কিছু নেই। ডিসপোজেবল VM-এ কোডিং এজেন্ট চালানোর পেছনেও একই যুক্তি কাজ করে: কোনো এজেন্ট ভুল কিছু করলে তা থেকে বাঁচার সবচেয়ে সাশ্রয়ী উপায় হলো এমন একটি মেশিন ব্যবহার করা যার কোনো গুরুত্বপূর্ণ ডাটা নেই।

মডেল API key কোথায় রাখতে হয়?

Rakazo-তে কোনো ম্যানেজড মডেল বিলিং নেই। আপনাকে নিজের key ব্যবহার করতে হবে। .env.example-এ PI_DEFAULT_PROVIDER=openrouter সেট করা থাকে, তাই OPENROUTER_API_KEY হলো এর সাধারণ জায়গা এবং প্রোভাইডার key-গুলো একই সেটিংয়ের মাধ্যমে কাজ করে।

key-টিকে .env-এ রাখুন এবং এমন কোনো ফাইলে রাখবেন না যা আপনি commit করেন। রিপোজিটরিতে থাকা উভয় compose কমান্ডই --env-file .env পাস করে, তাই git দ্বারা ট্র্যাক করা YAML ফাইলে কোনো কিছু না লিখেই মানগুলো কন্টেইনারে পৌঁছে যায়। আপনি চাইলে OPENROUTER_API_KEY খালি রেখে onboarding-এর সময় অ্যাপে key পেস্ট করতে পারেন। এটি আরও একটি কারণ যে কেন ENCRYPTION_KEY-এ ডিফল্ট প্লেসহোল্ডারের পরিবর্তে একটি প্রকৃত র‍্যান্ডম মান থাকা প্রয়োজন।

বট ব্যবহার করার আগেই প্রোভাইডারের কাছে key-টির জন্য একটি খরচ করার সীমা (spending limit) নির্ধারণ করুন। একটি বট যদি লুপে পড়ে যায় তবে সেটি খরচ বাড়াতে থাকে, আর প্রতি-key সীমা হলো একমাত্র সুরক্ষা যা আপনার পর্যবেক্ষণের ওপর নির্ভর করে না। এই key-টিকে একটি আলাদা নাম দিন যাতে প্রয়োজনে আপনি শুধুমাত্র সেটিকে revoke করতে পারেন।

ডেভেলপমেন্ট মোড থেকে প্রোডাকশন পরিবেশে স্থানান্তর

এই রিপোজিটরি একটি প্রোডাকশন compose ফাইল সরবরাহ করে যা Postgres, API, worker, web app এবং TLS (transport layer security) সার্টিফিকেটের জন্য Caddy চালায়, যা স্বয়ংক্রিয়ভাবে সংগ্রহ করা হয়। বট কম্পিউটারগুলোর জন্য এটি E2B প্রত্যাশা করে।

sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

harden-host.sh SSH পাসওয়ার্ড লগইন নিষ্ক্রিয় করে, SSH, HTTP এবং HTTPS-এর জন্য UFW (uncomplicated firewall) রুল সেট করে, fail2ban চালু করে এবং AppArmor প্রোফাইল প্রয়োগ করে। এটি চালানোর আগে অবশ্যই পড়ে নিন, কারণ এটি আপনার লগইন পদ্ধতি পরিবর্তন করে। এটি চলার সময় একটি দ্বিতীয় SSH সেশন খোলা রাখুন।

প্রোডাকশন .env-এর জন্য ডেভেলপমেন্ট ভার্সনের চেয়ে বেশি রিসোর্স প্রয়োজন। সেলফ-হোস্ট ডকুমেন্টেশনে এই ন্যূনতম প্রয়োজনীয়তাগুলো তালিকাভুক্ত করা আছে।

NODE_ENV=production
RAKAZO_HOST=app.example.com
BETTER_AUTH_URL=https://app.example.com
WEB_ORIGIN=https://app.example.com
API_URL=https://app.example.com
POSTGRES_PASSWORD=<random>
BETTER_AUTH_SECRET=<random>
ENCRYPTION_KEY=<random>
E2B_API_KEY=<your key>
OPENROUTER_API_KEY=<your key>
SANDBOX_PROVIDER=e2b
AGENT_RUNTIME=pi
DATA_DIR=/data

প্রথম up চালানোর আগে সার্ভারের দিকে একটি A record পয়েন্ট করুন। Caddy RAKAZO_HOST-এ থাকা নামের জন্য একটি সার্টিফিকেটের অনুরোধ করে, এবং যদি সেই নামটি এই সার্ভারের আইপি-তে রিজলভ না হয় অথবা পোর্ট 80 বাইরের জন্য বন্ধ থাকে, তবে অনুরোধটি ব্যর্থ হয়।

এছাড়াও SIGNUP_ALLOWLIST=you@example.com সেট করুন। SIGNUPS_ENABLED=true ডিফল্ট হিসেবে থাকে, তাই পাবলিক নামে থাকা একটি ইনস্ট্যান্স যে কেউ খুঁজে পেলে রেজিস্ট্রেশন করতে পারে এবং প্রতিটি নতুন অ্যাকাউন্ট একটি কম্পিউটার পেয়ে যায়। প্রথমে Allowlist ব্যবহার করুন। পরে প্রয়োজন হলে এটি শিথিল করতে পারেন।

রিপোজিটরিতে থাকা docs/self-host.md-কে প্রোডাকশন সেটিংসের জন্য নির্ভরযোগ্য উৎস হিসেবে গণ্য করুন, কারণ কোডের পরিবর্তনের সাথে সাথে এটিও পরিবর্তিত হয়, কিন্তু এই গাইডটি সবসময় আপডেট নাও হতে পারে। যেহেতু Compose এই কাজটি করছে, তাই সাধারণ নিয়মগুলোই প্রযোজ্য, এবং VPS-এর জন্য Docker Compose-এর মৌলিক বিষয়গুলো আলোচনা করে কেন --env-file এবং named volumes গুরুত্বপূর্ণ, বিশেষ করে যখন কোনো স্ট্যাক দীর্ঘ সময়ের জন্য চালু রাখা হয়।

ব্যাকআপ

Postgres এবং data/ ডিরেক্টরি মিলেই পুরো ইনস্ট্যান্সটি গঠিত।

./scripts/backup.sh
./scripts/restore.sh backups/BACKUP_TIMESTAMP

backup.sh ব্যবহার করে Postgres-এর ডাম্প নিন এবং data/ আর্কাইভ করুন। যে মেশিনের ওপর আপনি নির্ভরশীল, সেখানে infra/compose/backup-prod.sh-কে /usr/local/sbin/rakazo-backup হিসেবে ইনস্টল করুন এবং রিপোজিটরিতে থাকা টাইমারটি ব্যবহার করুন, যাতে আপনার হস্তক্ষেপ ছাড়াই রোটেশন সম্পন্ন হয়। ডাটাবেস যে ডিস্কে আছে, সেই একই ডিস্কে রাখা ব্যাকআপ আসলে কোনো ব্যাকআপ নয়; তাই এটি অন্য কোনো মেশিনে কপি করে রাখুন। এরপর, প্রয়োজনে ব্যবহারের আগে অন্তত একবার একটি অতিরিক্ত সার্ভারে এটি রিস্টোর করে পরীক্ষা করে দেখুন।

কেন এটি ব্যর্থ হয় এবং আপনি কী দেখতে পাবেন

pnpm db:migrate ডাটাবেসের সাথে সংযোগ করতে পারছে না। মাইগ্রেশন রিপোর্ট করে যে এটি 127.0.0.1:5433-এ থাকা ডাটাবেস সার্ভারের সাথে সংযোগ করতে পারছে না। হয় Postgres কন্টেইনারটি চালু নেই, অথবা এটি চালু থাকলেও এখনো প্রস্তুত হয়নি। docker compose --env-file .env -f infra/compose/docker-compose.yml ps চালান এবং দেখুন postgres সার্ভিসটি healthy দেখাচ্ছে কি না, কারণ কম্পোজ ফাইলে একটি হেলথ চেক দেওয়া আছে যা প্রতি তিন সেকেন্ডে একবার চলে। একটি কন্টেইনার যদি বারবার রিস্টার্ট হতে থাকে, তবে সাধারণত এর মানে হলো pgdata ভলিউমটি ভিন্ন ক্রেডেনশিয়াল দিয়ে তৈরি করা হয়েছিল। docker compose ... down -v এটি পরিষ্কার করে দেয় এবং এর সাথে থাকা ডাটা মুছে ফেলে।

পোর্টটি ইতিমধ্যে ব্যবহৃত হচ্ছে। যখন অন্য কোনো কিছু 5433 পোর্টটি দখল করে রাখে, তখন Postgres চালু করতে গেলে bind: address already in use ত্রুটি দেখায়। সাধারণত এটি ঘটে যদি আপনি আগের কোনো Rakazo স্ট্যাক বন্ধ করতে ভুলে যান। sudo ss -lntp | grep 5433 কমান্ডটি সেই প্রসেসটির নাম বলে দেয়।

বট কোনো কম্পিউটার পাচ্ছে না। SANDBOX_PROVIDER=docker এবং কোনো rakazo/computer:local ইমেজ না থাকলে, শুরু করার মতো কিছুই থাকে না। docker image ls rakazo/computer এক লাইনে এর উত্তর দেয় এবং pnpm sandbox:build এটি ঠিক করে। যদি সুপারভাইজার Docker সকেটে পৌঁছাতে না পারে, তবে এটি কন্টেইনারও তৈরি করতে পারে না এবং মেসেজে এই পাথটি উল্লেখ থাকে: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

একটি দীর্ঘ কমান্ড মাঝপথে বন্ধ হয়ে যায়। .env.example কমান্ডটি SANDBOX_COMMAND_TIMEOUT_MS=300000 সেট করে, তাই বটের কম্পিউটারের ভেতরের একটি কমান্ড পাঁচ মিনিট পর বন্ধ হয়ে যায়। স্যান্ডবক্স ক্র্যাশ করেছে বলে ধরে নেওয়ার পরিবর্তে ধীরগতির বিল্ডের জন্য এই সময়সীমা বাড়িয়ে দিন।

pnpm install বিভ্রান্তিকরভাবে কাজ করা বন্ধ করে দেয়। অন্য কিছু করার আগে node -v চেক করুন। ওয়ার্কস্পেসে >=22 ঘোষণা করা থাকে, এবং পুরনো Node ভার্সন সংক্রান্ত মেসেজ দেওয়ার পরিবর্তে ডিপেন্ডেন্সি কোডের ভেতরেই ব্যর্থ হয়।

লোকালি সাইন-ইন কাজ করলেও ডোমেইনের মাধ্যমে কাজ করছে না। BETTER_AUTH_URL, WEB_ORIGIN এবং API_URL—এই সবগুলোতে অবশ্যই ব্রাউজারের অ্যাড্রেস বারের মতো একই পাবলিক অরিজিন (স্কিমসহ) থাকতে হবে। এগুলোর কোনো একটিতে পুরনো http://127.0.0.1:5173 থেকে যাওয়া সেশন স্থায়ী না হওয়ার সাধারণ কারণ।

পিন করা চেকআউট আপডেট করা

সেলফ-হোস্ট ডকুমেন্টেশনে আপগ্রেড করার ধাপগুলো সংক্ষিপ্ত: নতুন সোর্স কোড পুল করুন, ডাটাবেস মাইগ্রেশন চালান এবং API ও worker রিস্টার্ট করুন।

./scripts/backup.sh
git fetch --all
git checkout NEW_COMMIT_SHA
pnpm install
pnpm --filter @rakazo/db migrate
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

প্রথমে ব্যাকআপ নিন। মাইগ্রেশনগুলো কেবল সামনের দিকে অগ্রসর হয় এবং বেটা ভার্সনে কোনো নির্ভরযোগ্য রিভার্স পাথ থাকে না। আপডেট করার আগে আপনার পিন করা SHA এবং নতুন SHA-এর মধ্যবর্তী কমিটগুলো পড়ে নিন। কারণ এই ধরনের নতুন প্রজেক্টে অনেক সময় কোনো ঘোষণা ছাড়াই এনভায়রনমেন্ট ভেরিয়েবলের নাম পরিবর্তন করা হয়, আর কোনো ভেরিয়েবল মিস হলে সার্ভিসটি স্টার্ট হওয়ার পরপরই বন্ধ হয়ে যায়। আপনি যদি এখনো নিশ্চিত না হন যে Rakazo আপনার জন্য সঠিক সমাধান কি না, তবে সেলফ-হোস্টেড AI এজেন্টদের তালিকা থেকে এই ক্যাটাগরির অন্যান্য বিকল্প এবং সেগুলো রক্ষণাবেক্ষণের খরচ সম্পর্কে ধারণা নিতে পারেন।

FAQ

আমি কি 1 জিবি ভিপিএস-এ Rakazo চালাতে পারব?

না। Postgres, API, worker, sandbox supervisor এবং web app—সবগুলো একই সময়ে চলে। এছাড়া SANDBOX_PROVIDER=docker-এর কারণে প্রতিটি সক্রিয় বট একটি গ্রাফিক্যাল ডেস্কটপ ও ব্রাউজারসহ আলাদা কন্টেইনার তৈরি করে। প্রজেক্টের নিজস্ব ডকুমেন্টেশন অনুযায়ী, শুধুমাত্র API, worker এবং Postgres চালানোর জন্য 2 ভিপিইউ (vCPU) এবং 4 জিবি র‍্যাম প্রয়োজন, যদি E2B বট ডেস্কটপগুলো হোস্ট করে। কন্ট্রোল প্লেনের জন্য 4 জিবি র‍্যামকে সর্বনিম্ন সীমা হিসেবে ধরুন এবং আপনার মেশিনে ডেস্কটপ চালানোর ক্ষেত্রে এর চেয়ে বেশি র‍্যাম ব্যবহার করুন।

সার্ভারে ডেস্কটপ স্যান্ডবক্স প্রোভাইডার কি নিরাপদ?

না। desktop সরাসরি API এবং worker হোস্টের ওপর বটের কমান্ডগুলো চালায়। এটি সেই প্রসেসটি যে ইউজার চালাচ্ছে, তার ফাইল এবং ক্রেডেনশিয়ালগুলোর নাগাল পায়। রিপোজিটরিতে বলা হয়েছে, এটি পাবলিক বা শেয়ার্ড সার্ভারে ব্যবহার না করতে। প্রতিটি বটের জন্য আলাদা কন্টেইনার পেতে docker ব্যবহার করুন, অথবা একাধিক ব্যক্তি লগইন করলে e2b ব্যবহার করুন।

Rakazo-এর কোন সংস্করণটি আমার ইনস্টল করা উচিত?

16 আগস্ট 2026 পর্যন্ত একটিই ট্যাগ আছে, v0.1.0-beta, যা 13 আগস্ট 2026-এ প্রকাশিত হয়েছে এবং এটিকে প্রি-রিলিজ হিসেবে চিহ্নিত করা হয়েছে। main ট্র্যাক না করে এটি যে কমিটকে নির্দেশ করে, সেই 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb চেক আউট করুন। ব্রাঞ্চ যেকোনো সময় পরিবর্তিত হতে পারে এবং ট্যাগও পুনরায় সেট করা সম্ভব, তাই এগুলো দিয়ে নির্দিষ্ট কোনো ভার্সন নিশ্চিত করা যায় না। কমিট আইডি সংরক্ষণ করুন, কারণ কোনটি কাজ করছিল তা জানা থাকলে তবেই রোলব্যাক করা সম্ভব।

আমার OpenRouter API কি কোথায় রাখব?

এটি .env ফাইলে OPENROUTER_API_KEY হিসেবে রাখুন এবং কখনোই এমন কোনো কম্পোজ ফাইলে রাখবেন না যা আপনি কমিট করেন। রিপোজিটরির উভয় কম্পোজ কমান্ডই --env-file .env পাস করে, তাই ট্র্যাক করা YAML ফাইলে না লিখেও ভ্যালুটি কন্টেইনারে পৌঁছে যায়। আপনি চাইলে এটি খালি রেখে অনবোর্ডিংয়ের সময় অ্যাপের ভেতরে কি (key) পেস্ট করতে পারেন। প্রোভাইডারের কাছে কি-এর জন্য একটি স্পেন্ডিং লিমিট সেট করুন, কারণ লুপে থাকা কোনো বট থামানো না পর্যন্ত মডেলটিকে কল করতেই থাকবে।

আমার কি ডোমেইন নেম এবং TLS প্রয়োজন?

প্রাথমিক পরীক্ষার পরের যেকোনো কাজের জন্য হ্যাঁ। প্রোডাকশন কম্পোজ ফাইলটি Caddy চালায় এবং স্বয়ংক্রিয়ভাবে সার্টিফিকেট সংগ্রহ করে। এছাড়া RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGIN এবং API_URL—সবগুলোরই একই পাবলিক HTTPS অরিজিন থাকা আবশ্যক। প্রথমবার দেখার জন্য আপনি ডোমেইন বাদ দিতে পারেন: pnpm dev চালান এবং পোর্ট 5173 পাবলিশ না করে SSH-এর মাধ্যমে ফরওয়ার্ড করুন।