SSD Nodes Learn
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-07-25

VPS-এ tmux ভেতরে Claude Code চালানোর নিয়ম

SSH সংযোগ কেটে গেলে Claude Code এজেন্ট মারা যায় কারণ shell-এ SIGHUP পৌঁছায়। একটি Linux VPS-এ tmux ভেতরে চালালে সেশন বেঁচে থাকে। ইনস্টল, হার্ডেনিং ও বিফলতার ধরন বিস্তারিত।

সমস্যাটি ল্যাপটপের লিড, CLI নয়

Claude Code আপনার ল্যাপটপে ঠিকঠাক চলছিল, কিন্তু আপনি লিড বন্ধ করতেই সব বিপদ: SSH সেশন বন্ধ হয়ে যায়, shell-এ SIGHUP পৌঁছায়, এবং এর সাথেই টেস্ট চলার তিন মিনিটের মাথায় এজেন্টও মারা যায়। CLI চালান এমন একটি মেশিনে যা কখনো ঘুমায় না, এবং সেটি চালান একটি টার্মিনাল মাল্টিপ্লেক্সারের ভেতরে যার প্রসেসগুলো আপনার SSH সেশনের চাইল্ড নয়। পুরো কৌশল এটাই — এবং এখানে মূল ভার বহনকারী অংশটি হলো tmux, ইনস্টল নয়।

এই পেজটি এমন একটি সার্ভার পরিচালনা নিয়ে, যেখানে আপনি এজেন্ট চালু রেখে যান। আপনার কাছে যদি এমন কোনো Linux সার্ভার না থাকে যা আপনি সব সময় চালু রাখতে পারেন, তবে এখানকার কোনো কথাই প্রযোজ্য নয়। এটিই একমাত্র সৎ পূর্বশর্ত।

tmux আসলে কী করে

আপনি SSH দিয়ে যুক্ত হলে, sshd একটি shell ফর্ক করে এবং তাকে একটি pseudo-terminal দেয়; আপনি সেই shell থেকে যা শুরু করেন, তা তার চাইল্ড। সংযোগ বিচ্ছিন্ন করলে kernel সেই pty ভেঙে দেয়, shell-টি SIGHUP পায়, এবং সে তার চাইল্ডদেরও একে একে বন্ধ করে দেয়। দীর্ঘকাল চলমান foreground প্রসেসগুলি মারা যায়।

tmux মালিকানা উল্টে দেয়। আপনি যে tmux কমান্ড টাইপ করেন, তা একটি থিন ক্লায়েন্ট যা একটি unix socket-এর মাধ্যমে একটি tmux server-এর সাথে কথা বলে যা আপনার টার্মিনাল থেকে detached হয়ে চলে। একটি সেশনের ভেতরের shell-গুলি সেই server-এর চাইল্ড, sshd-এর নয়। SSH সংযোগ বন্ধ করলে ক্লায়েন্ট চলে যায়, কিন্তু server, সেশন এবং কাজ চলমান এজেন্ট চলতেই থাকে। পুনরায় সংযুক্ত হন, tmux attach, এবং আপনি একই scrollback সহ একই shell-এ ফিরে আছেন। nohup ও hangup-এ টিকে থাকে, কিন্তু ফিরে যাওয়ার কোনো উপায় দেয় না — আপনি একটি backgrounded TUI-তে পুনরায় যুক্ত হতে পারবেন না। Claude Code ইন্টারঅ্যাকটিভ; tmux (বা screen) হল সঠিক টুল।

বক্সের সাইজ নির্ধারণ

CLI একটি Node প্রসেস; এটি মেশিনকে পূর্ণ করে না। মেশিনকে পূর্ণ করে এমন কিছু যা এজেন্ট আপনার হয়ে চালায়: একটি বিল্ড, একটি সম্পূর্ণ টেস্ট স্যুট, tsc, একটি ল্যাঙ্গুয়েজ সার্ভার, Docker-এ একটি ডেটাবেস। CLI-এর জন্য নয়, টুলচেইনের জন্য সাইজ নির্ধারণ করুন। আপনি কখনো ব্যবহার না করার পরিকল্পনা করলেও swap যোগ করুন — এটি একটি হার্ড OOM kill-কে একটি ধীর বিল্ডে পরিণত করে:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

ডিস্কের দিকেও নজর রাখুন: রিপো, node_modules এবং Docker ইমেজ দ্রুত জমা হয়। আর যদি টুলচেইন কন্টেইনারের বাইরে সম্পূর্ণ ভার্চুয়াল মেশিন পর্যন্ত পৌঁছায় — একটি KVM গেস্ট, একটি লোকাল Kubernetes নোড — কমিট করার আগে প্ল্যানটি CPU ভার্চুয়ালাইজেশন এক্সটেনশনগুলো প্রকাশ করে কিনা যাচাই করুন, কারণ VPS-এ নেস্টেড ভার্চুয়ালাইজেশন চালানো এমন কিছু যা প্রোভাইডার আপনার জন্য সক্ষম করে, গেস্টের ভেতর থেকে চালু করার মতো নয়।

প্রথমে একজন non-root ব্যবহারকারী

নিজস্ব home সহ একজন বিশেষ ব্যবহারকারী তৈরি করুন, এবং আপনার public key সঠিক স্থানে বসান:

sudo adduser --disabled-password --gecos "" agent
sudo install -d -m 700 -o agent -g agent /home/agent/.ssh
sudo cp ~/.ssh/authorized_keys /home/agent/.ssh/authorized_keys
sudo chown agent:agent /home/agent/.ssh/authorized_keys
sudo chmod 600 /home/agent/.ssh/authorized_keys

জেনেশুনেই agent-কে sudo গ্রুপে রাখা হয়নি। কোনো সিস্টেম প্যাকেজ প্রয়োজন হলে, আপনি নিজে ইনস্টল করুন। এই একটি সিদ্ধান্তই বেশিরভাগ ক্ষেত্রে একটি ভুল shell কমান্ড দ্বারা হোস্ট ক্ষতিগ্রস্ত হওয়ার ঝুঁকি দূর করে দেয়।

একটি চালু রাখা সার্ভারের জন্য SSH পরিচ্ছন্নতা

সারাদিন পাবলিক ইন্টারনেটে সংযুক্ত একটি মেশিনে পাসওয়ার্ড প্রমাণীকরণ ব্যবহার করা ঝুঁকিপূর্ণ। এই মেশিনে আপনার এজেন্ট এবং সোর্স কোড থাকে। পাসওয়ার্ড প্রমাণীকরণ বন্ধ করুন। Ubuntu 24.04 এবং Debian 13-এ, /etc/ssh/sshd_config-এ /etc/ssh/sshd_config.d/*.conf অন্তর্ভুক্ত থাকে। তাই মূল কনফিগ সম্পাদনা না করে একটি নতুন ফাইল যোগ করুন:

# /etc/ssh/sshd_config.d/10-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no

যাচাই করে পুনরায় লোড করুন। পরীক্ষার সময় বর্তমান সেশনটি খোলা রাখুন। দ্বিতীয় একটি টার্মিনাল থেকে একটি নতুন সেশন যাচাই করুন:

sudo sshd -t && sudo systemctl restart ssh

Ubuntu 24.04-এ একটি বিশেষ বিষয় লক্ষ্য করুন: sshd সকেট-অ্যাক্টিভেটেড। প্রমাণীকরণ সেটিংস systemctl restart ssh-এ প্রযোজ্য হয়। তবে শোনার জন্য Port পরিবর্তন করলে systemctl daemon-reload এবং ssh.socket পুনরায় চালু করা প্রয়োজন।

এরপর ফায়ারওয়াল। ফায়ারওয়াল চালু করার আগে SSH অনুমোদন করুন। অন্যথায় আপনি নিজেই লকআউট হবেন:

sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable

fail2ban ইনস্টল করুন। এটি যা দেয়, সে সম্পর্কে স্পষ্ট ধারণা রাখুন: পাসওয়ার্ড প্রমাণীকরণ বন্ধ থাকলে ব্রুট-ফোর্স আক্রমণ সফল হতে পারে না। এটি কেবল ব্যর্থ প্রচেষ্টাগুলোকে আপনার জার্নাল থেকে বাইরে রাখে।

# /etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
bantime = 1h

অবশেষে, sudo apt install unattended-upgrades এবং sudo dpkg-reconfigure -plow unattended-upgrades দিয়ে স্বয়ংক্রিয়ভাবে প্যাচ করুন। tmux-এর সাথে এর মিথস্ক্রিয়া লক্ষ্য করুন: Unattended-Upgrade::Automatic-Reboot চালু করলে কার্নেল আপডেটের পর সার্ভারটি পুনরায় চালু হয়। এতে সব সেশন বন্ধ হয়ে যায়। এটি বন্ধ রাখুন এবং কোনো কাজ চলমান না থাকলে নিজের সুবিধামতো সময়ে পুনরায় চালু করুন।

Ubuntu-তে Node.js এবং Claude Code ইনস্টল করুন

Claude Code একটি Node CLI, তাই আপনার একটি বর্তমান Node দরকার। ডিস্ট্রো প্যাকেজ প্রায়ই পিছিয়ে থাকে; Ubuntu এবং Debian-এ NodeSource সাধারণ পথ, এবং এটি একটি সাইন করা রিপো দেয় (কোনো apt-key নেই — সেই টুলটি বর্জিত):

curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
node --version

এখন যে অংশটি মানুষ ভুল করে: CLI আপনার agent ইউজার হিসেবে ইনস্টল করুন, sudo npm -g দিয়ে কখনোই নয়। root-এর মালিকানাধীন গ্লোবাল প্রিফিক্স পরে পারমিশন এরর তৈরি করে এবং npm ক্যাশে root-এর মালিকানাধীন ফাইল রেখে দেয়। প্রথমে npm-এর প্রিফিক্স ইউজারের হোমে নির্দেশ করুন:

mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
npm install -g @anthropic-ai/claude-code
claude --version

export কমান্ডটি ~/.bashrc-এ যায়, ~/.profile-এ নয়, এবং এটি ফাইলের শীর্ষের কাছে "If not running interactively, don't do anything" গার্ডের উপরে থাকা উচিত: tmux নন-লগিন শেল শুরু করতে পারে, যা ~/.bashrc পড়ে এবং ~/.profile এড়িয়ে যায় — ~/.profile শুধুমাত্র লগিন শেলের জন্য চলে। nvm-এর মতো একটি ভার্সন ম্যানেজারের মাধ্যমে প্রতি-ইউজার Node একই ফল দেয়; উভয় ক্ষেত্রেই লক্ষ্য হলো npm install -g-এর কখনো sudo প্রয়োজন হবে না। npm এখনও ঠিকঠাক কাজ করে, অথবা Anthropic-এর নেটিভ ইনস্টল স্ক্রিপ্ট ব্যবহার করুন, যা বর্তমানে ডকুমেন্টেড ডিফল্ট। পেস্ট করার আগে Anthropic-এর ইনস্টল ডকস যাচাই করুন — ইনস্টল পদ্ধতি পরিবর্তিত হয়।

একটি রিপোর ভেতরে claude চালান এটি শুরু করতে। প্রথম রান আপনাকে অথেনটিকেশনের মধ্য দিয়ে নিয়ে যায়; একটি হেডলেস বক্সে কোনো ব্রাউজার নেই, তাই ফ্লো আপনাকে আপনার নিজের মেশিনে খোলার জন্য একটি URL এবং টার্মিনালে ফিরিয়ে আনার জন্য একটি কোড দেয়। (পরিবেশে একটি API কী হলো অন্য পথ।) উভয় ক্ষেত্রেই, সেই ক্রেডেনশিয়াল এখন সার্ভারে থাকে — যা আমাদের সেই অংশে নিয়ে যায় যা মানুষ এড়িয়ে যায়।

ব্লাস্ট রেডিয়াস আলোচনা

শেল অ্যাক্সেস সহ একটি এজেন্ট হলো একটি শেল। এটি যে ইউজার হিসেবে চলে, সেই ইউজার যা যা পড়তে পারে এটিও তা পড়তে পারে, এবং সেই ইউজার যেখানে যেখানে পুশ করতে পারে এটিও সেখানে পুশ করতে পারে। এটি টুলের সমালোচনা নয়, এটি হলো এর সংজ্ঞা — এবং এই কারণেই এটি যে অ্যাকাউন্টে চলে তা যেকোনো একক সেটিংয়ের চেয়ে বেশি গুরুত্বপূর্ণ।

  • ডেডিকেটেড, আনপ্রিভিলেজড ইউজার। কোনো sudo গ্রুপ নয়, আপনার নিজের অ্যাকাউন্টের সাথে শেয়ার করা কোনো হোম ডিরেক্টরি নয়।
  • বক্সে কোনো প্রোডাকশন ক্রেডেনশিয়াল নয়। প্রড কী ধরে রাখা কোনো ~/.aws/credentials নয়, প্রোডাকশন থেকে কপি করা কোনো .env নয়, এমন কোনো ডেটাবেস পাসওয়ার্ড নয় যার গুরুত্বপূর্ণ কিছুতে রাইট অ্যাক্সেস আছে। এজেন্টকে একটি স্টেজিং বা রিড-অনলি ক্রেডেনশিয়াল দিন।
  • স্কোপড টোকেন। একটি ফাইন-গ্রেইন্ড GitHub টোকেন যা শুধুমাত্র একটি রিপোজিটরিতে সীমাবদ্ধ; রিড অ্যাক্সেস যথেষ্ট হলে একটি ডিপ্লয় কী।

Claude Code একটি ফ্ল্যাগ দেয় যা এর পারমিশন প্রম্পট সম্পূর্ণভাবে এড়িয়ে যায়। একটি ল্যাপটপে, একটি থ্রো-অ্যাওয়ে প্রজেক্টে, সেটা আপনার সিদ্ধান্ত। টোকেন ধরে রাখা একটি সার্ভারে, এটি ভুল বোঝা একটি নির্দেশ এবং একটি git push --force এর মধ্যে দাঁড়িয়ে থাকা শেষ জিনিসটি সরিয়ে দেয়। ফ্ল্যাগটি আসলে কী পরিবর্তন করে, এবং এটি চালিয়ে একটি এজেন্টকে কীভাবে কন্টেইন করা যায়, বিল্ট-ইন স্যান্ডবক্স থেকে শুরু করে একটি ডিসপোজেবল VPS পর্যন্ত, তা সার্ভারে Claude Code নিরাপদে চালানো-তে আলোচনা করা হয়েছে।

ডিপ্লয় কী বনাম SSH এজেন্ট ফরওয়ার্ডিং

git যাতে আপনার ল্যাপটপের কী ব্যবহার করতে পারে সেজন্য ssh -A করতে প্রলুব্ধ হওয়া যায়। এটি কী অনুমতি দেয় তা বুঝুন: এজেন্ট ফরওয়ার্ডিং আপনার লোকাল SSH এজেন্টের সকেট বক্সে সেই ইউজার হিসেবে চলা প্রসেসগুলোর কাছে উন্মুক্ত করে। agent হিসেবে চলা যেকোনো কিছু — এজেন্ট সহ — আপনার কীকে এটি যতক্ষণ সংযুক্ত থাকে ততক্ষণ এটি যেকোনো হোস্টের জন্য সাইন করতে বলতে পারে। এটি "git কে এই একটি রিপো পুল করতে দিন" এর চেয়ে অনেক বেশি।

এর পরিবর্তে সার্ভারে একটি কী জেনারেট করুন, এটিকে একটি পার-রিপোজিটরি ডিপ্লয় কী হিসেবে রেজিস্টার করুন (এজেন্টকে পুশ করতে হলে শুধুমাত্র রাইট অ্যাক্সেস), এবং একটি git আইডেন্টিটি সেট করুন যাতে বক্স থেকে কমিটগুলো চেনা যায়:

ssh-keygen -t ed25519 -C "agent deploy key" -f ~/.ssh/id_ed25519_repo
cat ~/.ssh/id_ed25519_repo.pub   # paste into the repo's Deploy Keys
git config --global user.name "Agent (build box)"
git config --global user.email "agent@example.com"

tmux ওয়ার্কফ্লো

ইনস্টল করুন (sudo apt install tmux), তারপর একটি ন্যূনতম ~/.tmux.conf:

set -g mouse on
set -g history-limit 50000
set -g default-terminal "tmux-256color"

চারটি কমান্ড দৈনন্দিন ব্যবহারের জন্য যথেষ্ট:

tmux new -A -s claude     # attach to session "claude", creating it if absent
# ...run `claude` inside it, work normally...
# Ctrl-b then d           -> detach; everything keeps running
tmux ls                   # list sessions
tmux attach -t claude     # reattach, from this machine or any other
tmux kill-session -t claude

tmux new -A -s claude কমান্ডটি মুখস্থ রাখুন — সেশন বিদ্যমান থাকলে এটি সংযুক্ত করে, আর না থাকলে তৈরি করে, ফলে দিন শুরু করা এবং সংযোগ বিচ্ছিন্ন হওয়ার পর পুনরায় শুরু করা — দুটোই একই কমান্ডে সম্ভব। এর জন্য একটি alias তৈরি করুন। একটি সেশনের ভেতরে, Ctrl-b c একটি নতুন উইন্ডো খোলে, Ctrl-b n এবং Ctrl-b p সেগুলোর মধ্যে পরিবর্তন করে, এবং Ctrl-b [ পেছনের অংশ স্ক্রল করার জন্য copy mode-এ প্রবেশ করায় (q দিয়ে বের হন)।

যেসব সেশন আপনি কখনো বন্ধ করেন না, সেগুলো সম্পর্কে একটি বিষয় জানুন: এজেন্ট প্রতিটি ধাপে পুরো কথোপকথনটি পুনরায় পাঠায়, তাই একটি সেশন এক সপ্তাহ চালু রাখার আগে একটি দীর্ঘস্থায়ী Claude Code সেশন কোথায় তার টোকেন ব্যয় করে পড়ুন।

ব্যর্থতার ধরন

"আমার সেশন চলে গেছে।" tmux ls প্রিন্ট করে no server running on /tmp/tmux-1000/default। এর মানে প্রায় সবসময়ই প্রসেসটি কখনো tmux-এর ভেতরে ছিল না — আপনি SSH দিয়ে ঢুকেছেন, সরাসরি claude চালিয়েছেন, এবং সংযোগ বিচ্ছিন্ন হওয়ায় সেটি বন্ধ হয়ে গেছে। পুনরুদ্ধার করার কিছু নেই। এটি প্রতিরোধকারী অভ্যাস: প্রতিটি লগইনের পর tmux new -A -s <project> হল প্রথম কমান্ড।

পেনটি একটি ছোট বাক্সে সংকুচিত হয়ে যায়। tmux একটি সেশনকে সবচেয়ে ছোট সংযুক্ত ক্লায়েন্টের আকারে নির্ধারণ করে, তাই অন্য মেশিন থেকে সংযুক্ত একটি পুরোনো ক্লায়েন্ট ডিসপ্লে সংকুচিত করে। সংযুক্ত হওয়ার সময় অন্যদের বিচ্ছিন্ন করুন: tmux attach -d -t claude

একটি বিল্ড Killed প্রিন্ট করে। একটি শব্দ, কোনো স্ট্যাক ট্রেস নেই। sudo dmesg -T | grep -i -E 'out of memory|killed process' দিয়ে নিশ্চিত করুন — কার্নেল OOM কিলার সবচেয়ে বড় প্রসেসটি বেছে নিয়েছে। Node থেকে আপনি হয়তো FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory দেখতে পাবেন। সমাধান, ক্রমানুসারে: সোয়াপ যোগ করুন (উপরে), টেস্ট এবং কম্পাইলার প্যারালেলিজম সীমিত করুন, NODE_OPTIONS=--max-old-space-size=... দিয়ে Node-এর হিপ বাড়ান, অথবা VPS-এর আকার বৃদ্ধি করুন। OOM কিলার বিল্ডের পরিবর্তে tmux সার্ভারকেও বেছে নিতে পারে, যার ফলে আপনার সেশনও বন্ধ হয়ে যায়; যদি systemd-oomd চলমান থাকে, তবে এটি একই প্রভাবে একটি সম্পূর্ণ ইউজার স্লাইস বন্ধ করতে পারে।

npm error code EACCES / permission denied, mkdir '/usr/lib/node_modules/...' root-এর মালিকানাধীন প্রিফিক্সে একটি গ্লোবাল ইনস্টল। উপরের ~/.npm-global প্রিফিক্স ব্যবহার করুন। যদি আপনি কোনো এক সময়ে sudo npm চালিয়ে থাকেন, তবে আপনি Your cache folder contains root-owned files-ও দেখতে পারেন — sudo chown -R $(id -u):$(id -g) ~/.npm দিয়ে মেরামত করুন।

claude: command not found — কিন্তু শুধু কখনো কখনো। আপনার PATH এক্সপোর্ট "ইন্টারঅ্যাকটিভভাবে চলমান না হলে, কিছু করবেন না" গার্ডের নিচে ~/.bashrc-এ অবস্থিত, তাই নন-ইন্টারঅ্যাকটিভ শেলগুলি এটি এড়িয়ে যায়। এই এক্সপোর্টটি সেই গার্ডের উপরে সরিয়ে নিন এবং এটি ~/.profile-এ নয়, ~/.bashrc-এ রাখুন: tmux নন-লগইন শেল শুরু করতে পারে, যা ~/.bashrc পড়ে এবং ~/.profile-কে কখনো স্পর্শ করে না।

সংযুক্ত হওয়ার পর রঙ বিকৃত হয়। একটি TERM অমিল — উপরের default-terminal লাইনটি হল সমাধান।

রিবুটের পর সেশনগুলি অদৃশ্য হয়ে যায়। এটি বাগ নয়: tmux সার্ভার একটি প্রসেস, এবং রিবুট এটি শেষ করে দেয়। uptime দেখুন।

কী ভেঙে যায় এটি বড় হওয়ার সাথে সাথে

আরও প্রোজেক্ট। প্রতিটি রিপোর জন্য একটি tmux সেশন, রিপোর নামে নামকরণ করা; তখন tmux ls হল আপনার ড্যাশবোর্ড। নামকরণের নিয়ম মানলেন না, ফলে সেশনগুলোর নাম হয়ে যাবে 0, 1, 2। পোর্টগুলোও একইভাবে ছড়িয়ে পড়ে — ছয়টি রিপো সবাই :3000 চাইলে বুঝবেন হাতে দিয়ে পোর্ট বরাদ্দ করা বন্ধ করার সময় এসেছে এবং Docker Compose-এর অধীনে একটি Traefik রিভার্স প্রক্সি হোস্টনাম অনুসারে একাধিক অ্যাপ রাউট করুক ডিসপ্যাচিংয়ের কাজ সামলাক।

আরও মানুষ। tmux সকেট প্রতি-ইউজার ভিত্তিক, তাই একই বক্সে দুজন ডেভেলপার আলাদা tmux সার্ভার পান এবং একে অপরের সেশন দেখতে পান না। শেয়ার করা সকেটে একটি সেশন ভাগ করলে সবাই একই Unix ইউজার হিসেবে একই শেলে টাইপ করে, যার অডিট ও অনুমতি সম্পর্কিত পরিণতি রয়েছে। আলাদা ইউজার ব্যবহার করাই সঠিক ও পরিচিত সমাধান।

নজরদারি ছাড়া কাজ। tmux মানে হল এমন ইন্টারঅ্যাকটিভ সেশন যাতে আপনি যুক্ত হন। নির্ধারিত সময়ে চলা কাজ যেখানে কেউ নজর রাখে না, সেগুলো একটি systemd ইউনিট ও টাইমারের ভেতরে রাখা উচিত, যেখানে সেগুলো বিনা খরচে লগিং, একটি রিস্টার্ট নীতি এবং বুট সারভাইভাল পায়। cron-এর মতো কাজ চালাতে tmux ব্যবহার করতে চাইলে বুঝবেন সেই কাজটি একটি সার্ভিস হতে চায়।

শেষ কথা: এজেন্ট যে ডেভ সার্ভারগুলো চালু করে সেগুলো 0.0.0.0-এর বদলে 127.0.0.1-এ বাইন্ড করুন, এবং ufw-এ পোর্ট না খুলে একটি SSH টানেলের (ssh -L 3000:127.0.0.1:3000 agent@your-server) মাধ্যমে সেগুলোতে প্রবেশ করুন। অর্ধডজন পোর্ট ফরওয়ার্ড করার পর, বা একই প্রিভিউ একসাথে একটি ফোন ও একটি ল্যাপটপ চাইলে, সেগুলোর সামনে একটি VPS-এ সেলফ-হোস্টেড WireGuard VPN বসান: ডেভ সার্ভারগুলো একটি প্রাইভেট ইন্টারফেসে বাইন্ড হয়, এবং ufw পাবলিক ইন্টারফেস থেকে সবকিছু ডিনাই করতেই থাকে। ফায়ারওয়াল তখনই কাজ দেয় যখন আপনি তাতে গর্ত করা বন্ধ করেন।

Claude Code-ই একমাত্র পছন্দ নয়: VPS-এ একটি কোডিং AI এজেন্ট চালানো Aider ও Goose-এর তুলনাও করে।

FAQ

SSH সংযোগ বিচ্ছিন্ন হওয়ার পরেও Claude Code চলতে থাকে?

শুধুমাত্র তখনই, যখন আপনি এটি tmux-এর ভেতর শুরু করেছেন। SSH shell থেকে সরাসরি চালানো প্রসেসটি ওই shell-এর একটি চাইল্ড, এবং সংযোগ বিচ্ছিন্ন হলে pty-সহ এটি বন্ধ হয়ে যায়। tmux-এর ভেতরে shell-টি ডিটাচ করা tmux server-এর অধীন, তাই এজেন্ট কাজ চালিয়ে যায় এবং tmux attach আপনাকে একই scrollback-এ ফিরিয়ে আনে। প্রতিবার লগইনের পর tmux new -A -s <project> প্রথম কমান্ড হিসেবে চালান, সমস্যা আর থাকবে না।

CLI কি sudo npm install -g দিয়ে ইনস্টল করা উচিত?

না। root-এর মালিকানাধীন গ্লোবাল প্রিফিক্স পরবর্তী ইনস্টলে EACCES ত্রুটি দেয় এবং npm ক্যাশে root-এর মালিকানাধীন ফাইল রেখে দেয়। npm-এর প্রিফিক্স ~/.npm-global-এ সেট করুন (অথবা nvm-এর মতো একটি ভার্সন ম্যানেজার ব্যবহার করুন), agent সাধারণ ইউজার হিসেবে ইনস্টল করুন, এবং ~/.bashrc থেকে PATH-এ ~/.npm-global/bin এক্সপোর্ট করুন, ইন্টারঅ্যাকটিভ গার্ডের উপরে। আপনি যদি আগে একবার sudo npm চালিয়ে থাকেন, তবে sudo chown -R $(id -u):$(id -g) ~/.npm দিয়ে ক্যাশে মেরামত করুন।

এজেন্ট চলমান একটি বক্সে ssh -A এজেন্ট ফরওয়ার্ডিং কি নিরাপদ?

এটি কাজের প্রয়োজনের চেয়ে অনেক বেশি অনুমতি দেয়। ফরওয়ার্ডিং আপনার লোকাল SSH এজেন্টের সকেট ওই ইউজার হিসেবে চলা প্রতিটি প্রসেসের কাছে উন্মুক্ত করে, ফলে বক্সের যেকোনো প্রসেস আপনার কী দিয়ে যতক্ষণ আপনি সংযুক্ত আছেন, ততক্ষণ সে যতগুলো হোস্টে পৌঁছাতে পারে সবখানে স্বাক্ষর করাতে পারে। সার্ভারে একটি ed25519 কী তৈরি করুন এবং সেটি প্রতি-রিপোজিটরি deploy কী হিসেবে যোগ করুন, শুধুমাত্র তখনই রাইট অ্যাক্সেস দিন যখন এজেন্টের সত্যিই পুশ করা দরকার।

আমার বিল্ড কেন শুধু Killed প্রিন্ট করে?

কোনো স্ট্যাক ট্রেস ছাড়া একটি শব্দ মানে কার্নেল OOM কিলার। sudo dmesg -T | grep -i -E 'out of memory|killed process' দিয়ে এটি নিশ্চিত করুন; Node থেকে আপনি হয়তো JavaScript heap out of memory দেখতে পাবেন। ক্রমানুসারে সমাধানগুলো প্রয়োগ করুন: একটি সোয়াপফাইল যোগ করুন, টেস্ট ও কম্পাইলার প্যারালেলিজম সীমিত করুন, NODE_OPTIONS=--max-old-space-size=... বাড়ান, তারপর VPS আপগ্রেড করুন। মনে রাখবেন, OOM কিলার বিল্ডের বদলে tmux server-কে বেছে নিতে পারে, যাতে আপনার পুরো সেশন বন্ধ হয়ে যায়।

tmux নাকি systemd সার্ভিস?

tmux ইন্টারঅ্যাকটিভ সেশনের জন্য উপযুক্ত, যেখানে আপনি সংযুক্ত হন, দেখেন এবং টাইপ করেন, ঠিক যেমন একটি এজেন্ট সেশন হয়। শিডিউল করা কাজ, যেখানে কেউ নজর রাখে না, সেটি systemd ইউনিট ও টাইমারের ভেতর রাখা উচিত, যেখানে লগিং, রিস্টার্ট নীতি এবং বুটে টিকে থাকা স্বয়ংক্রিয়ভাবে পাওয়া যায়। আপনি যদি cron-এর মতো একটি কাজ চালাতে tmux ব্যবহার করতে চান, তবে সেই কাজটি একটি সার্ভিস হিসেবে চালানো উচিত।