SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-26

SSH বিচ্ছিন্ন হলেও tmux-এ Claude Code চালান VPS-এ

ল্যাপটপের ঢাকনা বন্ধ বা SSH বিচ্ছিন্ন হলেও Claude Code চালু রাখুন। Linux VPS-এ tmux ইনস্টল, নিরাপত্তা শক্ত করা এবং SIGHUP-জনিত ব্যর্থতা সামলানোর বাস্তব নির্দেশনা।

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

ল্যাপটপে Claude Code ঠিকমতো চলে, যতক্ষণ না আপনি ঢাকনা বন্ধ করেন। তখন SSH session বিচ্ছিন্ন হয়, shell একটি SIGHUP পায়, এবং test run শুরুর তিন মিনিট পর agent-ও বন্ধ হয়ে যায়। এমন একটি মেশিনে CLI চালান, যেটি কখনও sleep mode-এ যায় না। এটি এমন একটি terminal multiplexer-এর ভিতরে চালান, যার process-গুলো আপনার SSH session-এর child process নয়। পুরো কৌশল এটুকুই। এখানে install-এর চেয়ে tmux বেশি গুরুত্বপূর্ণ।

এই পৃষ্ঠায় এমন একটি box পরিচালনার পদ্ধতি দেখানো হয়েছে, যেখানে agent চালু রেখে দেওয়া হবে। চালু অবস্থায় রেখে দেওয়া যায়—এমন কোনো Linux server না থাকলে এর কোনো অংশই প্রযোজ্য নয়। এটিই একমাত্র বাস্তব prerequisite।

tmux আসলে কী করে

আপনি SSH-এ সংযোগ করলে, sshd একটি shell fork করে এবং সেটিকে একটি pseudo-terminal দেয়; ওই shell থেকে চালু করা সবকিছু তার child process হয়। সংযোগ বিচ্ছিন্ন হলে kernel সেই pty সরিয়ে দেয়, shell SIGHUP পায়, এবং পরপর তার child process-গুলোকেও hangup signal পাঠায়। Foreground-এ চলমান দীর্ঘস্থায়ী process বন্ধ হয়ে যায়।

tmux এই ownership কাঠামো উল্টে দেয়। আপনি যে tmux command টাইপ করেন, সেটি একটি thin client; এটি unix socket-এর মাধ্যমে আপনার terminal থেকে detached অবস্থায় চলা একটি tmux server-এর সঙ্গে যোগাযোগ করে। একটি session-এর ভেতরের shell-গুলো sshd-এর নয়, ওই server-এর child process। SSH connection বন্ধ করলে client চলে যায়, কিন্তু server, session এবং কাজরত agent চলতে থাকে। আবার সংযোগ করে tmux attach চালালে আপনি একই shell-এ ফিরে যান এবং আগের scrollback-ও থাকে। nohup hangup-এর পরেও চলতে পারে, কিন্তু এতে ফিরে আসার কোনো উপায় নেই; background-এ পাঠানো TUI-তে আপনি আবার attach করতে পারবেন না। Claude Code interactive; তাই tmux (অথবা screen) সঠিক tool।

সার্ভারের আকার নির্ধারণ

CLI একটি Node process; এটি নিজে মেশিনের resource শেষ করে না। আপনার হয়ে agent যা চালায়, সেটিই resource ব্যবহার করে: একটি build, সম্পূর্ণ test suite, tsc, একটি language server বা Docker-এ চলা একটি database। CLI-এর জন্য নয়, toolchain-এর জন্য server-এর আকার নির্ধারণ করুন। আপনি swap ব্যবহার করার পরিকল্পনা না করলেও এটি যোগ করুন। এতে কঠিন OOM kill-এর পরিবর্তে ধীর build হয়:

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

Disk-এর দিকেও নজর রাখুন। Repository, node_modules এবং Docker image দ্রুত জমা হয়। Toolchain যদি container-এর বাইরে গিয়ে সম্পূর্ণ virtual machine বা local Kubernetes node চালায়, তাহলে server নেওয়ার আগে plan-এ CPU virtualisation extension উন্মুক্ত আছে কি না যাচাই করুন। কারণ VPS-এ nested virtualization চালানো provider-এর পক্ষ থেকে enable করতে হয়; guest-এর ভেতর থেকে এটি চালু করা যায় না।

প্রথমে root-বহির্ভূত একজন ব্যবহারকারী

নিজস্ব home-সহ একটি dedicated user তৈরি করুন এবং তার 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

আর কোনো কাজ করার আগে দ্বিতীয় terminal থেকে login পরীক্ষা করুন। তখনও fallback হিসেবে password authentication চালু থাকবে। যদি publickey দিয়ে Permission denied বার্তা আসে, তাহলে সাধারণত key-এর সমস্যা নয়; ওই .ssh directory-র ownership বা mode-এ সমস্যা থাকে।

ইচ্ছাকৃতভাবে, agent sudo group-এর সদস্য নয়। কোনো system package প্রয়োজন হলে আপনি সেটি install করবেন। এই এক সিদ্ধান্তের ফলে ভুল করে চালানো shell command-এর মাধ্যমে host নষ্ট হওয়ার সম্ভাবনার অধিকাংশই দূর হয়।

চালু রাখা সার্ভারের জন্য SSH hygiene

সারাদিন public Internet-এ থাকা কোনো মেশিনে password authentication চালু রাখা নিরাপদ নয়, বিশেষ করে সেখানে agent ও আপনার source code থাকলে। এটি বন্ধ করুন। Ubuntu 24.04 এবং Debian 13-এ /etc/ssh/sshd_config-এর মধ্যে /etc/ssh/sshd_config.d/*.conf অন্তর্ভুক্ত থাকে। তাই মূল configuration সম্পাদনা না করে একটি ফাইল যোগ করুন:

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

Validation করে reload করুন। পরীক্ষা করার সময় বর্তমান session খোলা রাখুন এবং দ্বিতীয় terminal থেকে একটি নতুন session দিয়ে পরীক্ষা করুন:

sudo sshd -t && sudo systemctl restart ssh

Ubuntu 24.04-এ একটি বিষয় মনে রাখুন: sshd socket-activated। Authentication settings systemctl restart ssh-এ প্রয়োগ হয়। তবে listening Port পরিবর্তন করলে systemctl daemon-reload এবং ssh.socket restart করাও প্রয়োজন।

এরপর firewall configuration করুন। এটি enable করার আগে SSH অনুমোদন করুন। তা না হলে আপনি নিজেকেই system থেকে বিচ্ছিন্ন করে ফেলবেন:

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

fail2ban install করার আগে এটি কী সুবিধা দেয় তা পরিষ্কারভাবে বুঝে নিন: password authentication বন্ধ থাকলে brute-force আক্রমণ এমনিতেই সফল হতে পারে না। এটি শুধু ব্যর্থ প্রচেষ্টাগুলো journal-এ জমা হওয়া থেকে বিরত রাখে।

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

সবশেষে sudo apt install unattended-upgrades এবং sudo dpkg-reconfigure -plow unattended-upgrades ব্যবহার করে স্বয়ংক্রিয়ভাবে patch করুন। tmux-এর সঙ্গে এর পারস্পরিক প্রভাব মনে রাখুন: Unattended-Upgrade::Automatic-Reboot চালু করলে kernel update-এর পরে system reboot হয় এবং এর সঙ্গে সব session বন্ধ হয়ে যায়। এটি বন্ধ রাখলে নিজের সময়সূচি অনুযায়ী reboot করতে পারবেন, যখন কোনো কাজ মাঝপথে চলবে না। একই সতর্কতা release upgrade-এর ক্ষেত্রেও প্রযোজ্য: Ubuntu 24.04 থেকে 26.04-এ system সরানো হলে sshd এবং kernel restart হয়। তাই এমন maintenance window বেছে নিন, যখন কোনো tmux session-এ গুরুত্বপূর্ণ কাজ চলমান নেই।

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

Claude Code একটি Node CLI, তাই আপনার একটি বর্তমান Node সংস্করণ প্রয়োজন। Distro package প্রায়ই পুরোনো থাকে; Ubuntu এবং Debian-এ NodeSource ব্যবহার করাই প্রচলিত পদ্ধতি, এবং এটি একটি signed repo সরবরাহ করে (কোনো apt-key নেই, ওই tool আর নেই):

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

এখন যে বিষয়টি অনেকে ভুল করেন: CLI আপনার agent user হিসেবে ইনস্টল করুন, কখনো sudo npm -g দিয়ে নয়। root-owned global prefix পরে permission error তৈরি করে এবং npm cache-এ root-owned file রেখে যায়। প্রথমে npm-এর prefix user-এর home directory-তে নির্ধারণ করুন:

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-এ নয়। এটি file-এর উপরের দিকে থাকা "If not running interactively, don't do anything" guard-এর উপরে রাখতে হবে: tmux non-login shell শুরু করতে পারে, যা ~/.bashrc পড়ে এবং ~/.profile এড়িয়ে যায়; ~/.profile শুধু login shell-এর জন্য চলে। nvm-এর মতো version manager ব্যবহার করে per-user Node ইনস্টল করলেও একই ফল পাওয়া যায়; উভয় ক্ষেত্রেই লক্ষ্য হলো যেন npm install -g-এর কখনো sudo প্রয়োজন না হয়। npm এখনও ঠিকভাবে কাজ করে। অথবা Anthropic-এর native install script ব্যবহার করতে পারেন, যা বর্তমানে নথিভুক্ত default পদ্ধতি। Paste করার আগে Anthropic-এর install docs পরীক্ষা করুন, কারণ install method পরিবর্তিত হতে পারে।

একটি repo-এর ভিতরে claude চালিয়ে এটি শুরু করুন। প্রথমবার চালানোর সময় authentication প্রক্রিয়া সম্পন্ন করতে আপনাকে নির্দেশনা দেওয়া হবে। Headless box-এ browser থাকে না, তাই প্রক্রিয়াটি আপনার নিজের machine-এ খোলার জন্য একটি URL এবং terminal-এ ফিরিয়ে আনার জন্য একটি code দেবে। (Environment-এ API key সেট করাও অন্য একটি পদ্ধতি।) যেকোনো পদ্ধতিতে সেই credential এখন server-এ সংরক্ষিত হবে। এখান থেকেই মানুষ যে অংশটি এড়িয়ে যায়, সেটি শুরু হয়।

আক্রমণের বিস্তারের পরিধি নিয়ে আলোচনা

Shell access থাকা কোনো agent আসলে একটি shell-ই। যে user হিসেবে এটি চলে, সেই user যা পড়তে পারে এটি তা-ই পড়তে পারে এবং সেই user যেখানে push করতে পারে, সেখানেই push করতে পারে। এটি tool-এর সমালোচনা নয়; এটিই tool-এর সংজ্ঞা। তাই কোনো একটি setting-এর চেয়ে agent যে account-এর অধীনে চলে, সেটি বেশি গুরুত্বপূর্ণ।

  • আলাদা, unprivileged user। কোনো sudo group নয় এবং আপনার নিজের account-এর সঙ্গে shared কোনো home directory নয়।
  • সার্ভারে কোনো production credential রাখবেন না। ~/.aws/credentials-এ prod key রাখবেন না, production থেকে কোনো .env copy করে আনবেন না এবং গুরুত্বপূর্ণ কোনো কিছুর write access-সহ database password রাখবেন না। Agent-কে staging অথবা read-only credential দিন।
  • সীমাবদ্ধ token। একটি repository-তে সীমিত fine-grained GitHub token ব্যবহার করুন; read access যথেষ্ট হলে deploy key ব্যবহার করুন।

Claude Code এমন একটি flag সরবরাহ করে, যা তার permission prompt সম্পূর্ণভাবে এড়িয়ে যায়। Laptop বা সাময়িক ব্যবহারের project-এ এটি আপনার সিদ্ধান্ত। কিন্তু token থাকা কোনো server-এ এটি ভুলভাবে পড়া instruction এবং একটি git push --force-এর মধ্যে থাকা শেষ প্রতিরোধটিও সরিয়ে দেয়। আপনি যে prompt-গুলো এড়িয়ে যাবেন, সেগুলোও সব ক্ষেত্রে একইভাবে অনুমতি দেওয়া বা অস্বীকার করার বিষয় নয়। তাছাড়া নতুন default হিসেবে auto mode চালু হওয়ায় আপনি যে server পর্যবেক্ষণ করছেন না, সেটিতে কোন permission mode নির্দিষ্ট করে রাখা উচিত তা জানা গুরুত্বপূর্ণ। এই flag আসলে কী পরিবর্তন করে এবং এটি ব্যবহার করে চলা agent-কে কীভাবে নিয়ন্ত্রণে রাখা যায়—built-in sandbox থেকে শুরু করে disposable VPS পর্যন্ত—তা server-এ Claude Code নিরাপদে চালানো অংশে আলোচনা করা হয়েছে।

Deploy key বনাম SSH agent forwarding

Git যাতে আপনার laptop-এর key ব্যবহার করতে পারে, সে জন্য ssh -A করা আকর্ষণীয় মনে হতে পারে। কিন্তু এতে কী অনুমতি দেওয়া হয় তা বুঝে নিন: agent forwarding আপনার local SSH agent-এর socket-টি server-এ ওই user হিসেবে চলা process-গুলোর কাছে উন্মুক্ত করে। agent হিসেবে চলা যেকোনো কিছু, agent-সহ, আপনি connected থাকা অবস্থায় তার কাছে পৌঁছানো যেকোনো host-এর জন্য আপনার key দিয়ে sign করার অনুরোধ করতে পারে। এটি “এই একটি repo-তে git pull করতে দিন”-এর চেয়ে অনেক বেশি ক্ষমতা দেয়।

এর পরিবর্তে server-এ একটি key তৈরি করুন। সেটিকে প্রতি-repository deploy key হিসেবে register করুন। Agent-এর push করার প্রয়োজন হলে তবেই write access দিন। এরপর একটি git identity নির্ধারণ করুন, যাতে server থেকে করা commit শনাক্ত করা যায়:

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 workflow

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

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

প্রতিদিনের ব্যবহারের জন্য চারটি command যথেষ্ট:

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 মনে রাখার মতো প্রধান command। session থাকলে এটি সেটিতে সংযুক্ত হয়, আর না থাকলে session তৈরি করে। তাই দিনের কাজ শুরু করা এবং সংযোগ বিচ্ছিন্ন হওয়ার পরে কাজ চালিয়ে যাওয়া—দুই ক্ষেত্রেই একই command ব্যবহার করা যায়। এটিকে alias হিসেবে সেট করুন। session-এর মধ্যে Ctrl-b c নতুন window খোলে, Ctrl-b n এবং Ctrl-b p window পরিবর্তন করে, আর Ctrl-b [ copy mode চালু করে পিছনের output দেখার জন্য (q চাপলে বের হওয়া যায়)।

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

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

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

Pane খুব ছোট box হয়ে যায়। tmux একটি session-এর আকার সবচেয়ে ছোট সংযুক্ত client অনুযায়ী নির্ধারণ করে। তাই অন্য কোনো machine থেকে সংযুক্ত থাকা পুরোনো client display-টি সংকুচিত করে। সংযুক্ত হওয়ার সময় অন্য client-গুলো জোর করে বিচ্ছিন্ন করুন: tmux attach -d -t claude

একটি build Killed দেখায়। শুধু একটি শব্দ, কোনো stack trace নেই। sudo dmesg -T | grep -i -E 'out of memory|killed process' দিয়ে নিশ্চিত করুন; kernel-এর OOM killer সবচেয়ে বেশি memory ব্যবহার করা processটি বেছে নিয়েছে। Node থেকে এর পরিবর্তে FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory দেখা যেতে পারে। সমাধানের ক্রম: উপরের নির্দেশনা অনুযায়ী swap যোগ করুন, test ও compiler-এর parallelism সীমিত করুন, NODE_OPTIONS=--max-old-space-size=... দিয়ে Node-এর heap বাড়ান, অথবা VPS-এর আকার বাড়ান। OOM killer build-এর বদলে tmux server-কেও বেছে নিতে পারে। এতে আপনার session-ও বন্ধ হয়ে যায়। systemd-oomd চলমান থাকলে এটি একই ফলাফলে পুরো user slice বন্ধ করে দিতে পারে।

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

claude: command not found, কিন্তু শুধু কখনও কখনও। আপনার PATH exportটি ~/.bashrc-এ "If not running interactively, don't do anything" guard-এর নিচে রয়েছে। তাই non-interactive shell এটি এড়িয়ে যায়। Exportটি ওই guard-এর উপরে সরিয়ে রাখুন এবং এটি ~/.bashrc-এ রাখুন, ~/.profile-এ নয়। tmux non-login shell চালু করতে পারে। এসব shell ~/.bashrc পড়ে এবং ~/.profile কখনও পড়ে না।

সংযুক্ত হওয়ার পরে রং বিকৃত দেখা যায়। এটি একটি TERM mismatch। উপরের default-terminal line-টি এর সমাধান।

Reboot-এর পরে session অদৃশ্য হয়ে যায়। এটি bug নয়। tmux server একটি process, এবং reboot হলে তা বন্ধ হয়ে যায়। uptime পরীক্ষা করুন।

বাড়ার সঙ্গে কী সমস্যা হয়

আরও বেশি project। প্রতিটি repo-এর জন্য একটি করে tmux session নিন এবং session-এর নাম repo-এর নামে রাখুন; tmux ls তখন আপনার dashboard হিসেবে কাজ করবে। নাম দেওয়ার এই নিয়ম না মানলে 0, 1, 2-এর মতো session তৈরি হবে। একসঙ্গে কয়েকটি session চললে সেগুলোকে আলাদা করে কাজ করাতে হবে না, কারণ একই box-এ একটি session অন্য session-এ message পাঠাতে পারে। দীর্ঘ refactor চালানো agent-কে দ্বিতীয় agent দিয়ে test চালাতে হলে এটি কার্যকর। Port-ও একইভাবে ছড়িয়ে পড়ে। ছয়টি repo যদি :3000 চায়, তখন হাতে port বরাদ্দ বন্ধ করে Docker Compose-এর অধীনে একাধিক app-এ hostname অনুযায়ী route করতে Traefik reverse proxy ব্যবহার করুন।

আরও বেশি মানুষ। tmux socket প্রতি user-এর জন্য আলাদা। তাই একই box-এ থাকা দুই developer নিজ নিজ tmux server পান এবং একে অপরের session দেখতে পারেন না। Shared socket ব্যবহার করে একটি session ভাগ করলে সবাই একই Unix user হিসেবে একই shell-এ input দেন। এর ফলে audit ও permission-সংক্রান্ত যে প্রভাব তৈরি হয়, তা মেনে নিতে হয়। আলাদা user ব্যবহার করাই সহজ এবং সঠিক সমাধান।

তদারকিবিহীন কাজ। tmux এমন interactive session-এর জন্য, যেখানে আপনি attach করেন। কোনো তদারকি ছাড়াই schedule অনুযায়ী চলা job-এর জন্য systemd unit ও timer ব্যবহার করুন। এতে logging, restart policy এবং boot-এর পর কাজ চালু থাকার সুবিধা স্বাভাবিকভাবেই পাওয়া যায়। cron-এর মতো job চালাতে tmux ব্যবহার করতে চাওয়া সাধারণত বোঝায় যে job-টিকে service হিসেবে চালানো উচিত।

আরও একটি বিষয়: agent যে dev server চালু করে, সেগুলো 127.0.0.1-এ bind করুন, 0.0.0.0-এ নয়। Port ufw-তে খুলে দেওয়ার পরিবর্তে SSH tunnel (ssh -L 3000:127.0.0.1:3000 agent@your-server) দিয়ে সেগুলোতে সংযোগ করুন। যখন প্রায় আধা ডজন port forward করছেন, অথবা একটি phone ও একটি laptop একই preview-তে একসঙ্গে access করতে চায়, তখন এর সামনে VPS-এ self-hosted WireGuard VPN বসান। Dev server-গুলো একটি private interface-এ bind থাকবে, আর ufw public interface থেকে আসা সবকিছু deny করতে থাকবে। Firewall তখনই সাহায্য করে, যখন আপনি এতে বারবার নতুন hole তৈরি করা বন্ধ করেন।

Claude Code একমাত্র বিকল্প নয়: VPS-এ coding AI agent চালানোর ক্ষেত্রে Aider এবং Goose-ও বিবেচনা করা যায়।

FAQ

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

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

sudo npm install -g দিয়ে CLI install করা উচিত কি?

না। root-owned global prefix পরবর্তী install-এ EACCES error এবং npm cache-এ root-owned file তৈরি করে। npm-এর prefix ~/.npm-global-এ সেট করুন অথবা nvm-এর মতো একটি version manager ব্যবহার করুন। unprivileged agent user হিসেবে install করুন। এরপর ~/.bashrc থেকে PATH-এ ~/.npm-global/bin export করুন, interactive guard-এর উপরে। আগে একবার sudo npm চালিয়ে থাকলে sudo chown -R $(id -u):$(id -g) ~/.npm দিয়ে cache মেরামত করুন।

agent চলমান একটি box-এ ssh -A agent forwarding কি নিরাপদ?

এটি কাজটির প্রয়োজনের তুলনায় অনেক বেশি access দেয়। Forwarding আপনার local SSH agent-এর socket-টি ওই user হিসেবে চলা প্রতিটি process-এর কাছে উন্মুক্ত করে। ফলে box-এর যেকোনো process আপনার key ব্যবহার করে, আপনি সংযুক্ত থাকা পর্যন্ত, process-টি যেসব host-এ পৌঁছাতে পারে সেগুলোর জন্য signature চাইতে পারে। Server-এ একটি ed25519 key তৈরি করুন এবং সেটিকে প্রতি-repository deploy key হিসেবে register করুন। Agent-কে সত্যিই push করতে হলে তবেই write access দিন।

আমার build শুধু Killed print করে কেন?

Stack trace ছাড়া একটি মাত্র শব্দ দেখালে কারণটি kernel OOM killer হওয়ার সম্ভাবনা বেশি। sudo dmesg -T | grep -i -E 'out of memory|killed process' দিয়ে এটি নিশ্চিত করুন। Node থেকে এর পরিবর্তে JavaScript heap out of memory দেখতে পারেন। সমাধানগুলো ক্রমানুসারে প্রয়োগ করুন: একটি swapfile যোগ করুন, test ও compiler-এর parallelism সীমিত করুন, NODE_OPTIONS=--max-old-space-size=... বাড়ান, তারপর VPS-এর আকার বাড়ান। মনে রাখবেন, OOM killer build-এর পরিবর্তে tmux server-কে বেছে নিতে পারে। এতে আপনার পুরো session বন্ধ হয়ে যেতে পারে।

tmux নাকি systemd service?

যেসব interactive session-এ আপনি সংযুক্ত হন, দেখেন এবং command টাইপ করেন, সেগুলোর জন্য tmux উপযুক্ত। Agent session ঠিক এই ধরনের। নির্ধারিত সময়ে চলে এবং যাকে কেউ monitor করে না, এমন কাজ systemd unit ও timer-এর অধীনে থাকা উচিত। সেখানে logging, restart policy এবং boot-এর পর চালু থাকার সুবিধা স্বয়ংক্রিয়ভাবে পাওয়া যায়। cron-এর মতো কাজ চালাতে যদি tmux ব্যবহার করতে হয়, তাহলে সেটি আসলে একটি service হিসেবে চালানো উচিত।