পড়ার অগ্রগতি: 0%
সার্ভার ডেপ্লয় গাইড

ডেপ্লয়মেন্ট পথ

0

সার্ভারে প্রবেশ — VPS ও AWS

উভয়

প্রোভাইডার প্যানেল থেকে IP ও লগইন পদ্ধতি বুঝে প্রথম SSH। AWS হলে `.pem` যে ফোল্ডারে আছে সেখানে `cd`, `chmod 400`, তারপর `ssh -i`। ডোমেন কিনে DNS এ ভিপিএস IP পয়েন্ট করা (Namecheap, GoDaddy)।

প্রয়োজনীয়এই সেকশনের গুরুত্ব

না করলে সাধারণত সার্ভারে অ্যাপ চালু, প্রবেশ বা কানেকশন পুরোপুরি হয় না — বা গুরুতর ত্রুটি থেকে যায়। করলে স্ট্যাক কাজ করে।

0.1জেনেরিক VPS (DigitalOcean, Hetzner, Linode, Vultr…)

কেন এই ধাপ

একই আইডিয়া: কন্ট্রোল প্যানেলে ইন্সট্যান্স → পাবলিক IPv4 → SSH পোর্ট ২২ খোলা।

  1. প্রোভাইডার অ্যাকাউন্টে লগইন করে “Droplet / Server / Instance” তৈরি করুন (Ubuntu LTS বেছে নিন)।
  2. তালিকায় পাবলিক IPv4 নোট করুন। কিছু প্রোভাইডার প্রথম লগইনের রুট পাসওয়ার্ড ইমেইল করে; কেউ কেউ শুধু SSH কী।
  3. নিজের মেশিনে টার্মিনাল খুলে `ssh root@আপনার_IP` বা প্রোভাইডারের দেওয়া কমান্ড চালান। ভুল IP বা ফায়ারওয়ালে ২২ বন্ধ থাকলে “Connection timed out” দেখতে পারেন।
1# typical first login (password auth, if provider emailed root password)
2ssh root@YOUR_SERVER_IP
3
4# if you already added a deploy user + key on the server
5ssh deploy@YOUR_SERVER_IP

0.2AWS EC2

কেন এই ধাপ

AWS তে সিকিউরিটি গ্রুপ, কী পেয়ার ও ইউজারনেম (ubuntu, ec2-user ইত্যাদি) আলাদা নিয়ম।

কনসোলে EC2 → Instances → Launch। AMI তে Ubuntu নিলে ডিফল্ট ইউজার সাধারণত ubuntu; Amazon Linux এ ec2-user।

লঞ্চের সময় বা পরে কী পেয়ার (.pem) ডাউনলোড করুন — AWS আবার দেখাবে না। ফাইল যে ফোল্ডারে আছে সেখানে টার্মিনাল খুলুন (বা `cd` দিয়ে সেই ডিরেক্টরিতে যান), তারপর `chmod 400` ও `ssh -i` চালান।

ইন্সট্যান্সের Security Group ইনবাউন্ডে TCP ২২ আপনার IP (বা অস্থায়ীভাবে 0.0.0.0/0 — কম সুপারিশ) খুলুন, নাহলে SSH যাবে না।

হোস্ট হিসেবে কনসোলে দেখানো পাবলিক IPv4 অথবা AWS এর public DNS (`ec2-….compute.amazonaws.com` ধরনের) ব্যবহার করুন — নিজের ইন্সট্যান্সের মান বসাবেন। “Connect” ট্যাবে প্রায়ই উদাহরণ কমান্ড থাকে।

1cd ~/Downloads
2# cd "C:\Users\You\Downloads"
3
4chmod 400 "./YOUR_KEY.pem"
5
6# Ubuntu AMI — ubuntu@ (Amazon Linux — ec2-user@)
7ssh -i "./YOUR_KEY.pem" ubuntu@YOUR_PUBLIC_DNS_OR_IP
8
9# ssh -i "./YOUR_KEY.pem" ubuntu@ec2-00-00-00-00.us-east-1.compute.amazonaws.com
10# ssh -i "./YOUR_KEY.pem" ubuntu@203.0.113.10
1

প্রাথমিক সার্ভার সেটআপ ও সিকিউরিটি

উভয়

সোয়াপ, আপডেট, ডিপ্লয় ইউজার, SSH কী, ফায়ারওয়াল ও Fail2ban — সব আকারের অ্যাপের জন্য। ২FA ও CrowdSec ছোট/মাঝারি সেটআপে ঐচ্ছিক।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

1.1সোয়াপ মেমোরি

কেন এই ধাপ

RAM কম থাকলে লিনাক্স OOM কিলার অ্যাপ বন্ধ করে দেয়; সোয়াপ অস্থায়ী মেমোরি বাড়িয়ে ছোট স্পাইক সহনীয় করে।

সোয়াপ = ডিস্কের একটু জায়গা র‍্যামের মতো ব্যবহার করা (ধীর, কিন্তু OOM এড়ায়)। উদাহরণ: ১ GB RAM ড্রপলেটে `npm run build` + API একসাথে চললে RAM ফুল হয়ে লিনাক্স প্রসেস কিল করতে পারে; ২ GB সোয়াপ থাকলে অনেক সময় বেঁচে যায়।

ঐচ্ছিক কিন্তু: ৪ GB+ RAM আর হালকা ট্রাফিকে অনেকে সোয়াপ ছাড়াই চালায় — তবে স্পাইকে OOM ঝুঁকি থাকতে পারে।

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

1.2সিস্টেম আপডেট

কেন এই ধাপ

পুরনো কার্নেল/লাইব্রেরিতে নোন্নতম সিকিউরিটি প্যাচ থাকে না; আপডেট দিয়ে SSH ও সিস্টেম লাইব্রেরি নিরাপদ রাখা হয়।

1sudo apt update && sudo apt -y upgrade
2sudo apt -y install curl git ufw fail2ban unattended-upgrades

1.3ডিপ্লয় ইউজার ও SSH কী

কেন এই ধাপ

রুট দিয়ে ডেপ্লয় মানে একটা বাগেই পুরো সার্ভার ঝুঁকি; আলাদা ইউজার ও SSH কী পাসওয়ার্ড ব্রুটফোর্স কমায়।

ডিপ্লয় ইউজার = অ্যাপ ও ডেপ্লয় স্ক্রিপ্ট চালানোর আলাদা লিনাক্স অ্যাকাউন্ট (রুট নয়)। SSH কী জোড়া = ল্যাপটপে গোপন কী + সার্ভারে পাবলিক কী `authorized_keys` এ। উদাহরণ: একই `ssh-keygen` এর `.pub` GitHub এ ও সার্ভারের `deploy` ইউজারে লাগানো যায়।

1sudo adduser deploy
2sudo usermod -aG sudo deploy
3sudo rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
1# on your laptop
2ssh-keygen -t ed25519 -C "deploy@yourdomain"
1# append public key on server
2sudo mkdir -p /home/deploy/.ssh
3echo "YOUR_PUBLIC_KEY" | sudo tee -a /home/deploy/.ssh/authorized_keys
4sudo chown -R deploy:deploy /home/deploy/.ssh
5sudo chmod 700 /home/deploy/.ssh
6sudo chmod 600 /home/deploy/.ssh/authorized_keys
/etc/ssh/sshd_config
1# recommended flags (merge carefully)
2PermitRootLogin no
3PasswordAuthentication no
4KbdInteractiveAuthentication no
5ChallengeResponseAuthentication no
6AllowUsers deploy

1.4SSH টু-ফ্যাক্টর (PAM) (ঐচ্ছিক)

কেন এই ধাপ

কী লিক হলেও দ্বিতীয় ফ্যাক্টর ছাড়া লগইন কঠিন; উচ্চ-রিস্ক বা কমপ্লায়েন্সে সুপারিশ।

1# 1) install tools
2sudo apt -y install libpam-google-authenticator qrencode
3
4# 2) as deploy user
5google-authenticator -t -d -f -r 3 -R 30 -W
6
7# 3) edit PAM for sshd
8echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd
9
10# 4) sshd_config — enable challenge-response + require MFA after pubkey
11sudo nano /etc/ssh/sshd_config
12# set: ChallengeResponseAuthentication yes
13# append: AuthenticationMethods publickey,keyboard-interactive
14
15# 5) keep sudo session safe (optional)
16echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sudo
17
18# 6) reload
19sudo systemctl reload ssh
20
21# 7) TEST in a second session before closing the first
22
23# 8) emergency: recovery console / IPMI if locked out
24
25# 9) backup secret codes offline
26
27# 10) rotate codes periodically

1.5ফায়ারওয়াল (UFW)

কেন এই ধাপ

শুধু ২২/৮০/৪৪৩ খোলা রাখলে অপ্রয়োজনীয় পোর্ট বন্ধ থাকে; বট স্ক্যান করে যা পায় তা আক্রমণ করতে পারে না।

1sudo ufw default deny incoming
2sudo ufw default allow outgoing
3sudo ufw allow OpenSSH
4sudo ufw allow 80/tcp
5sudo ufw allow 443/tcp
6sudo ufw enable
7sudo ufw status verbose

1.6Fail2Ban

কেন এই ধাপ

বারবার ভুল পাসওয়ার্ড/SSH চেষ্টা আইপি ব্যান করে ব্রুটফোর্স ধীর করে; ফায়ারওয়াল একা প্যাটার্ন বুঝতে পারে না।

Fail2ban = লগ দেখে বারবার ব্যর্থ লগইন করা IP অস্থায়ী ব্যান। উদাহরণ: কেউ সেকেন্ডে ২০ বার ভুল পাসওয়ার্ড দিলে ১ ঘণ্টার জন্য ব্লক। SSH শুধু কী দিয়ে হলে ব্রুটফোর্স কম তবু লগ নজরদারি সুবিধা থাকে।

/etc/fail2ban/jail.local
1[DEFAULT]
2bantime = 1h
3findtime = 10m
4maxretry = 5
5
6[sshd]
7enabled = true
8port = ssh
9logpath = %(sshd_log)s
10backend = systemd
1sudo systemctl enable --now fail2ban
2sudo fail2ban-client status sshd

1.7CrowdSec (ঐচ্ছিক)

কেন এই ধাপ

কমিউনিটি সিগন্যাল শেয়ার করে নতুন আক্রমণ প্যাটার্ন দ্রুত ব্লক করা যায়; Fail2Ban-এর বাইরে আরেক স্তর।

1curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
2sudo apt install crowdsec
3sudo cscli hub update
4sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd
5sudo systemctl enable --now crowdsec
2

ডাটাবেজ সেটআপ

উভয়

MongoDB, PostgreSQL+PgBouncer, Redis — ম্যানুয়াল বা ডকার পথে।

প্রয়োজনীয়এই সেকশনের গুরুত্ব

না করলে সাধারণত সার্ভারে অ্যাপ চালু, প্রবেশ বা কানেকশন পুরোপুরি হয় না — বা গুরুতর ত্রুটি থেকে যায়। করলে স্ট্যাক কাজ করে।

2AMongoDB (ম্যানুয়াল)

কেন এই ধাপ

ডকুমেন্ট-স্টোর ডাটার জন্য Mongo সাধারণ; হোস্টে ইনস্টল করলে পারফরম্যান্স টিউন ও লগ সরাসরি হাতের নাগালে।

1wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
2echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
3sudo apt update && sudo apt -y install mongodb-org
/etc/mongod.conf
1storage:
2 dbPath: /var/lib/mongodb
3systemLog:
4 destination: file
5 path: /var/log/mongodb/mongod.log
6net:
7 port: 27017
8 bindIp: 127.0.0.1
9security:
10 authorization: enabled
1sudo systemctl enable --now mongod
1mongosh <<'EOF'
2use admin
3db.createUser({ user: "admin", pwd: "STRONG_PASSWORD", roles: ["root"] })
4use appdb
5db.createUser({ user: "app", pwd: "STRONG_PASSWORD", roles: ["readWrite"] })
6EOF

2CPostgreSQL + PgBouncer (ম্যানুয়াল) (ঐচ্ছিক)

কেন এই ধাপ

অনেক ছোট কানেকশন খুলে রাখা Postgresের জন্য ব্যয়বহুল; PgBouncer পুল করে ট্রানজ্যাকশন মোডে চাপ কমায়।

1sudo apt -y install postgresql postgresql-contrib pgbouncer
/etc/pgbouncer/pgbouncer.ini
1[databases]
2app = host=127.0.0.1 port=5432 dbname=app
3
4[pgbouncer]
5listen_addr = 127.0.0.1
6listen_port = 6432
7auth_type = scram-sha-256
8auth_file = /etc/pgbouncer/userlist.txt
9pool_mode = transaction
10max_client_conn = 200
11default_pool_size = 20
/etc/pgbouncer/userlist.txt
1"appuser" "SCRAM_HASH_FROM_postgres"

2ERedis (ম্যানুয়াল)

কেন এই ধাপ

সেশন, রেট লিমিট, ক্যাশ, কিউ — দ্রুত ইন-মেমোরি স্টোর দরকার হলে Redis; লোকালহোস্ট বাইন্ড ও পাসওয়ার্ড বাধ্যতামূলক।

1sudo apt -y install redis-server
/etc/redis/redis.conf
1bind 127.0.0.1
2protected-mode yes
3requirepass STRONG_REDIS_PASSWORD
4maxmemory 256mb
5maxmemory-policy allkeys-lru
3

অ্যাপ্লিকেশন ডেপ্লয়মেন্ট

উভয়

Node.js + PM2 বা tmux (ম্যানুয়াল পথে বিকল্প) অথবা ডকার ইমেজ ও কম্পোজ — যেটা পছন্দ সেটা বেছে নিন।

প্রয়োজনীয়এই সেকশনের গুরুত্ব

না করলে সাধারণত সার্ভারে অ্যাপ চালু, প্রবেশ বা কানেকশন পুরোপুরি হয় না — বা গুরুতর ত্রুটি থেকে যায়। করলে স্ট্যাক কাজ করে।

3ANode.js + PM2 (ম্যানুয়াল)

কেন এই ধাপ

NVM দিয়ে নোড ভার্সন পিন, PM2 দিয়ে প্রসেস রিস্টার্ট/ক্লাস্টার — সরাসরি সার্ভারে দ্রুত ইটারেশনের জন্য।

1curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
2source ~/.nvm/nvm.sh
3nvm install --lts
4node -v
1ssh-keygen -t ed25519 -C "deploy-key" -f ~/.ssh/deploy_ed25519 -N ""
2cat ~/.ssh/deploy_ed25519.pub
3# add read-only deploy key in Git provider
1sudo mkdir -p /var/www && sudo chown deploy:deploy /var/www
2cd /var/www
3git clone git@github.com:org/backend.git
4git clone git@github.com:org/frontend.git
5git clone git@github.com:org/dashboard.git
/var/www/backend/ecosystem.config.js
1module.exports = {
2 apps: [{
3 name: "api",
4 cwd: "/var/www/backend",
5 script: "dist/main.js",
6 instances: "max",
7 exec_mode: "cluster",
8 env: { NODE_ENV: "production" }
9 }]
10};
/var/www/frontend/ecosystem.config.js
1module.exports = {
2 apps: [{
3 name: "web",
4 cwd: "/var/www/frontend",
5 script: "node_modules/next/dist/bin/next",
6 args: "start -p 3000",
7 env: { NODE_ENV: "production" }
8 }]
9};
/var/www/dashboard/ecosystem.config.js
1module.exports = {
2 apps: [{
3 name: "dash",
4 cwd: "/var/www/dashboard",
5 script: "dist/server.js",
6 env: { NODE_ENV: "production" }
7 }]
8};
1npm i -g pm2
2cd /var/www/backend && npm ci && npm run build
3cd /var/www/frontend && npm ci && npm run build
4cd /var/www/dashboard && npm ci && npm run build
5pm2 start /var/www/backend/ecosystem.config.js
6pm2 start /var/www/frontend/ecosystem.config.js
7pm2 start /var/www/dashboard/ecosystem.config.js
8pm2 save
9pm2 startup systemd -u deploy --hp /home/deploy

3Ctmux — PM2 ছাড়াই প্রসেস চালু রাখা

কেন এই ধাপ

PM2 ছাড়াই SSH সেশন ডিট্যাচ করে নোড/স্ক্রিপ্ট চালু রাখা যায়; ছোট সার্ভার বা পছন্দে বৈধ বিকল্প।

ইনস্টল: `sudo apt install -y tmux`। নতুন সেশন: `tmux new -s app`। ভেতরে অ্যাপ চালান (`node dist/main.js` বা `npm run start`)। কীবোর্ড থেকে ডিট্যাচ: Ctrl+b তারপর d। আবার ঢুকুন: `tmux attach -t app`। সেশন তালিকা: `tmux ls`।

1sudo apt update && sudo apt install -y tmux
2tmux new -s api
3# inside tmux: cd /var/www/backend && node dist/main.js
4# detach: Ctrl+b then d
5tmux attach -t api
6tmux ls

সার্ভার রিবুট হলে tmux সেশন মুছে যায় — তখন systemd ইউনিট বা @reboot ক্রন দিয়ে আবার চালু করার পরিকল্পনা রাখুন, অথবা PM2 ব্যবহার করুন।

4

এনভায়রনমেন্ট ভেরিয়েবল

উভয়

ম্যানুয়ালে .env ফাইল; ডকারে কম্পোজ env_file বা সিক্রেট। ফাইল প্যাটার্ন দেখানো হয়েছে; সঠিক ভেরিয়েবল মান ছাড়া অ্যাপ ডাটাবেজ বা রেডিসে যোগ দিতে পারবে না।

প্রয়োজনীয়এই সেকশনের গুরুত্ব

না করলে সাধারণত সার্ভারে অ্যাপ চালু, প্রবেশ বা কানেকশন পুরোপুরি হয় না — বা গুরুতর ত্রুটি থেকে যায়। করলে স্ট্যাক কাজ করে।

4Aম্যানুয়াল .env

কেন এই ধাপ

অ্যাপ ডিরেক্টরিতে .env রেখে পোর্ট ও DB URI হোস্ট লোকালহোস্টে সেট করুন — PM2/Node সরাসরি পড়ে।

/var/www/backend/.env
1NODE_ENV=production
2PORT=4000
3DATABASE_URL=mongodb://app:password@127.0.0.1:27017/appdb
4REDIS_URL=redis://:password@127.0.0.1:6379

4Cপার্থক্য ও সতর্কতা

কেন এই ধাপ

দুই পথের কনফিগ এক রকম দেখালেও নেটওয়ার্ক নাম আলাদা — এখানে ভুল বুঝলে প্রোডে কানেকশন ফেল।

6

Nginx — রিভার্স প্রক্সি

উভয়

ইনস্টল, শেয়ার্ড proxy_params, API/ফ্রন্ট/ড্যাশবোর্ড সাইট, সাইট সক্রিয়করণ।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

6.1Nginx ইনস্টল

কেন এই ধাপ

রিভার্স প্রক্সি ও স্ট্যাটিক ফাইল সার্ভ করার জন্য Nginx স্ট্যান্ডার্ড; সিস্টেম সার্ভিস হিসেবে সহজে রিলোড।

1sudo apt -y install nginx
2sudo systemctl enable --now nginx

6.2proxy_params শেয়ার্ড ফাইল

কেন এই ধাপ

হেডার ও আপগ্রেড ম্যাপ এক জায়গায় রাখলে তিনটি সাইট ব্লকে কপি-পেস্ট কমে, ভুলও কমে।

/etc/nginx/proxy_params
1proxy_http_version 1.1;
2proxy_set_header Host $host;
3proxy_set_header X-Real-IP $remote_addr;
4proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5proxy_set_header X-Forwarded-Proto $scheme;
6proxy_set_header Upgrade $http_upgrade;
7proxy_set_header Connection $connection_upgrade;
/etc/nginx/conf.d/upgrade-map.conf
1map $http_upgrade $connection_upgrade {
2 default upgrade;
3 '' close;
4}
1sudo nginx -t && sudo systemctl reload nginx

6.3Backend API সাইট

কেন এই ধাপ

API আলাদা হোস্টনেমে রাখলে কুকি, রেট লিমিট ও সার্ট আলাদা নিয়ন্ত্রণ করা সহজ।

/etc/nginx/sites-available/api.yourdomain.com
1server {
2 listen 80;
3 server_name api.yourdomain.com;
4
5 location / {
6 include proxy_params;
7 proxy_pass http://127.0.0.1:4000;
8 }
9}

6.4ফ্রন্টএন্ড সাইট

কেন এই ধাপ

ইউজার-ফেসিং অ্যাপ সাধারণত মেইন ডোমেইনে; এখানে Next/SPA আপস্ট্রিম পাস করা হয়।

/etc/nginx/sites-available/yourdomain.com
1server {
2 listen 80;
3 server_name yourdomain.com www.yourdomain.com;
4
5 location / {
6 include proxy_params;
7 proxy_pass http://127.0.0.1:3000;
8 }
9}

6.5ড্যাশবোর্ড সাইট

কেন এই ধাপ

অ্যাডমিন/অ্যানালিটিক্স আলাদা সাবডোমেইনে রাখলে অ্যাক্সেস নিয়ন্ত্রণ ও ক্যাশ রুল আলাদা করা যায়।

/etc/nginx/sites-available/dashboard.yourdomain.com
1server {
2 listen 80;
3 server_name dashboard.yourdomain.com;
4
5 location / {
6 include proxy_params;
7 proxy_pass http://127.0.0.1:4100;
8 }
9}

6.6সাইট সক্রিয়করণ

কেন এই ধাপ

sites-available থেকে sites-enabled সিমলিংক দিয়ে সাইট চালু; nginx -t দিয়ে সিনট্যাক্স চেক করুন।

1sudo ln -s /etc/nginx/sites-available/api.yourdomain.com /etc/nginx/sites-enabled/
2sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
3sudo ln -s /etc/nginx/sites-available/dashboard.yourdomain.com /etc/nginx/sites-enabled/
4sudo nginx -t && sudo systemctl reload nginx

6.7SSL সার্টিফিকেট — Certbot (Required)

কেন এই ধাপ

প্রোডাকশন অ্যাপে HTTPS বাধ্যতামূলক; Certbot বিনামূল্যে Let's Encrypt সার্ট দেয় এবং Nginx কনফিগ স্বয়ংক্রিয় আপডেট করে।

1sudo apt -y install certbot python3-certbot-nginx
2
3# প্রতিটি ডোমেইনের জন্য আলাদা চালান
4sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
5sudo certbot --nginx -d api.yourdomain.com
6sudo certbot --nginx -d dashboard.yourdomain.com

6.8HTTPS রিডাইরেক্ট ও SSL ব্লক (Certbot পরে)

কেন এই ধাপ

Certbot চালানোর পরে Nginx site config কেমন দেখায় তা বুঝলে TLS সমস্যা নিজেই ডিবাগ করতে পারবেন।

Certbot সফলভাবে চললে site config প্রায় এরকম আপডেট হয় (Certbot নিজেই লেখে — শুধু যাচাই করুন):

/etc/nginx/sites-available/yourdomain.com (after certbot)
1server {
2 listen 80;
3 server_name yourdomain.com www.yourdomain.com;
4 return 301 https://$host$request_uri;
5}
6
7server {
8 listen 443 ssl;
9 server_name yourdomain.com www.yourdomain.com;
10
11 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
12 ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
13 include /etc/letsencrypt/options-ssl-nginx.conf;
14 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
15
16 location / {
17 include proxy_params;
18 proxy_pass http://127.0.0.1:3000;
19 }
20}
1# কনফিগ টেস্ট করুন ও Nginx রিলোড
2sudo nginx -t && sudo systemctl reload nginx

6.9সার্ট অটো-রিনিউয়াল যাচাই

কেন এই ধাপ

Let's Encrypt সার্ট ৯০ দিনে expire করে; systemd timer স্বয়ংক্রিয় রিনিউ করে — install-এর পরেই টাইমার active আছে কিনা যাচাই করুন।

1# dry-run: সার্ট expire না হলেও রিনিউ প্রক্রিয়া সিমুলেট করে
2sudo certbot renew --dry-run
3
4# systemd timer চালু আছে কিনা দেখুন
5sudo systemctl list-timers | grep certbot
6sudo systemctl status certbot.timer
7

অ্যাডভান্স সিকিউরিটি — WAF ও SSL

উভয়

মাঝারি/বড় ট্রাফিক বা কমপ্লায়েন্সের জন্য। ছোট অ্যাপে নিচের সাবসেকশনগুলো সাধারণত ঐচ্ছিক।

ঐচ্ছিকএই সেকশনের গুরুত্ব

নির্দিষ্ট দরকারে লাগে বা অ্যাডভান্স সেটআপ। না করলে মূল স্ট্যাক অনেক সময় চলতে পারে; করলে সেই বিষয়ে লাভ বা সুবিধা।

7.1ModSecurity WAF (ঐচ্ছিক)

কেন এই ধাপ

অ্যাপ কোডের বাইরে কমন ওয়েব আক্রমণ ফিল্টার করতে WAF; ট্রাফিক বেশি হলে বেশি দরকার।

1sudo apt -y install libnginx-mod-http-modsecurity
2sudo mkdir -p /etc/nginx/modsec
3sudo wget -qO /etc/nginx/modsec/modsecurity.conf https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
OWASP CRS ইনস্টল
1sudo apt -y install git
2sudo git clone https://github.com/coreruleset/coreruleset /etc/nginx/modsec/owasp-crs
3sudo cp /etc/nginx/modsec/owasp-crs/crs-setup.conf.example /etc/nginx/modsec/owasp-crs/crs-setup.conf
/etc/nginx/modsec/main.conf
1Include /etc/nginx/modsec/modsecurity.conf
2Include /etc/nginx/modsec/owasp-crs/crs-setup.conf
3Include /etc/nginx/modsec/owasp-crs/rules/*.conf
4SecRuleEngine On
/etc/nginx/nginx.conf — http { } block এর ভেতরে যোগ করুন
1modsecurity on;
2modsecurity_rules_file /etc/nginx/modsec/main.conf;
1sudo nginx -t && sudo systemctl reload nginx

7.2DDoS সুরক্ষা (Nginx) (ঐচ্ছিক)

কেন এই ধাপ

সস্তা বট ট্রাফিক বা রিপিটেড রিকোয়েস্ট এজে কেটে অ্যাপ সার্ভার সুরক্ষিত রাখে।

/etc/nginx/conf.d/ddos-protection.conf
1limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
2limit_conn_zone $binary_remote_addr zone=addr:10m;
3
4server {
5 limit_req zone=perip burst=20 nodelay;
6 limit_conn addr 20;
7}

7.3SSL হার্ডেনিং (ঐচ্ছিক)

কেন এই ধাপ

Let's Encrypt সার্ট পেলেও দুর্বল সাইফার বা HSTS ছাড়া ব্রাউজার স্কোর ও সিকিউরিটি কমে।

1sudo apt -y install certbot python3-certbot-nginx
2sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
/etc/nginx/snippets/ssl-hardening.conf
1ssl_protocols TLSv1.2 TLSv1.3;
2ssl_prefer_server_ciphers off;
3add_header Strict-Transport-Security "max-age=63072000" always;

সার্ট ইস্যুর পরে SSL ল্যাবস বা মজিলা অবজারভেটরি দিয়ে গ্রেড পরীক্ষা করুন।

8

Cloudflare Tunnel

উভয়

Dashboard থেকে connector ইনস্টল করে hostname → localhost:PORT ম্যাপ করুন। Nginx ও SSL সার্ট ছাড়াই সাইট চলে।

ঐচ্ছিকএই সেকশনের গুরুত্ব

নির্দিষ্ট দরকারে লাগে বা অ্যাডভান্স সেটআপ। না করলে মূল স্ট্যাক অনেক সময় চলতে পারে; করলে সেই বিষয়ে লাভ বা সুবিধা।

8.0Nginx বনাম Cloudflare Tunnel — কোনটা বেছে নেবেন?

কেন এই ধাপ

দুটি পথ একেবারে আলাদা আর্কিটেকচার — একটি বেছে নিন, দুটো একসাথে সাধারণত দরকার নেই।

বিষয়Nginx + CertbotCloudflare Tunnel
SSL সার্টিফিকেটনিজে manage (Certbot)Cloudflare handle করে — লাগে না
Port 80/443সার্ভারে খুলতে হবেবন্ধ রাখা যায় — outbound only
Nginxলাগেলাগে না
সেটআপ জটিলতাবেশি (Nginx config, certbot)কম (dashboard click করুন)
Cloudflare dependencyনেই (সরাসরি VPS IP)Cloudflare ছাড়া site চলবে না
কখন বেছে নেবেনCloudflare ছাড়া চালাতে চাইলে বা custom Nginx config দরকার হলেসহজ সেটআপ, SSL ঝামেলা এড়াতে, বা inbound port বন্ধ রাখতে চাইলে

8.1ধাপ ১ — Cloudflare-এ Domain যোগ করুন ও Nameserver পরিবর্তন

কেন এই ধাপ

Tunnel ব্যবহারের আগে domain টি Cloudflare-এর নিয়ন্ত্রণে আনতে হবে — nameserver পরিবর্তন করেই এটা হয়।

  1. cloudflare.com-এ লগইন করুন। Home page-এ বা বাম sidebar-এ **Websites** (বা Domains/Overview) থেকে **Add a site** বা **Add a domain** বাটনে ক্লিক করুন।
  2. **Connect your domain** অপশন বেছে নিন। Domain name টাইপ করুন (যেমন `yourdomain.com`) → **Continue**।
  3. Plan বেছে নিন — **Free** plan-এ সব দরকারি feature আছে → **Continue**।
  4. Cloudflare আপনার domain-এর বিদ্যমান DNS record scan করবে। **Quick scan** রেজাল্ট review করুন — সব ঠিক থাকলে **Continue**।
  5. Cloudflare দুটো nameserver দেবে (যেমন `alice.ns.cloudflare.com` ও `bob.ns.cloudflare.com`)। এগুলো copy করুন।
  6. Domain কেনার জায়গায় (Namecheap, GoDaddy, Dynadot যেটাই হোক) লগইন করুন → Domain management → **Custom nameservers** বা **Nameservers** সেকশনে যান → Cloudflare-এর দেওয়া দুটো nameserver বসান → Save।
  7. Cloudflare-এ ফিরে আসুন এবং **Done, check nameservers** বাটনে ক্লিক করুন। Propagation সাধারণত ৫ মিনিট থেকে ২৪ ঘণ্টা লাগে। Active হলে ইমেইল পাবেন।

8.2ধাপ ২ — Zero Trust Tunnel তৈরি ও Connector ইনস্টল

কেন এই ধাপ

Tunnel তৈরি করলে Cloudflare একটি unique token সহ install command দেয় — সেটি সার্ভারে চালালেই connector চালু হয়।

  1. Cloudflare Dashboard-এর বাম sidebar থেকে **Zero Trust** → **Networks** → **Tunnels** → **Create a tunnel** ক্লিক করুন।
  2. Connector type: **Cloudflared** বেছে নিন → **Next**। Tunnel-এর একটি নাম দিন (যেমন `production`) → **Save tunnel**।
  3. **Install and run a connector** ধাপে OS হিসেবে **Debian** বা **Linux** বেছে নিন। Cloudflare একটি command দেবে যার মধ্যে unique token আছে।
  4. সার্ভারে SSH করুন এবং Cloudflare-এর দেওয়া সেই command টি হুবহু চালান। Command দেখতে নিচের মতো হবে (token আপনার নিজের হবে)।
  5. Command চালানোর পরে Cloudflare dashboard-এ connector **Connected** দেখাবে → **Next** চাপুন।
Cloudflare-এর দেওয়া command (উদাহরণ — token আপনার নিজের হবে)
1curl -L --output cloudflared.deb \
2 https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
3 && sudo dpkg -i cloudflared.deb \
4 && sudo cloudflared service install eyJhIjoiYWJjZGVm...YOUR_TOKEN_HERE

8.3ধাপ ৩ — Public Hostname যোগ করুন

কেন এই ধাপ

Hostname mapping-এ domain → localhost:PORT বলে দিলে Cloudflare সেই domain-এ আসা ট্রাফিক সার্ভারের সঠিক port-এ পাঠায়।

Connector connected হওয়ার পর **Public Hostname** ট্যাবে প্রতিটি সার্ভিসের জন্য একটি করে entry যোগ করুন:

SubdomainDomainTypeURLকোন সার্ভিস
(খালি)yourdomain.comHTTPlocalhost:3000Frontend (Next.js/React)
wwwyourdomain.comHTTPlocalhost:3000Frontend (www redirect)
apiyourdomain.comHTTPlocalhost:4000Backend API
dashboardyourdomain.comHTTPlocalhost:4100Admin dashboard

8.4UFW আপডেট — 80/443 বন্ধ করুন (ঐচ্ছিক)

কেন এই ধাপ

Tunnel ব্যবহারে ইনবাউন্ড HTTP/HTTPS-এর দরকার নেই — বন্ধ করলে attack surface আরও কমে।

1sudo ufw delete allow 80/tcp
2sudo ufw delete allow 443/tcp
3sudo ufw status verbose
4# এখন শুধু 22 (SSH) খোলা থাকবে

8.5Cloudflare Dashboard সেটিংস (ঐচ্ছিক)

কেন এই ধাপ

ভুল SSL মোড বা aggressive caching SPA/Next.js ভেঙে দেয়; নিচের টেবিল নিরাপদ default দেখায়।

সেটিংসুপারিশকৃত মানকেন
SSL মোডFlexibleOrigin localhost HTTP — Full দিলে 526 error
Always HTTPSচালুHTTP → HTTPS redirect Cloudflare করবে
Rocket Loaderবন্ধSPA/Next.js-এ JS execution ভেঙে দিতে পারে
Bot Fight Modeচালু (প্রয়োজনে)Basic bot protection বিনামূল্যে
Cache RulesHTML no-cache, static long-cacheDynamic page cache করলে stale data দেখাবে
WAFManaged rulesetsCloudflare-এর built-in WAF চালু রাখুন
9

Prometheus + Grafana মনিটরিং

উভয়

প্রোডাকশন পর্যবেক্ষণ — ছোট প্রোজেক্টে ঐচ্ছিক; মাঝারি/বড় দলের জন্য সুপারিশ।

ঐচ্ছিকএই সেকশনের গুরুত্ব

নির্দিষ্ট দরকারে লাগে বা অ্যাডভান্স সেটআপ। না করলে মূল স্ট্যাক অনেক সময় চলতে পারে; করলে সেই বিষয়ে লাভ বা সুবিধা।

9.1Prometheus ইনস্টল (ঐচ্ছিক)

কেন এই ধাপ

মেট্রিক্স টাইম সিরিজে জমা করে অ্যানোমালি ধরতে; node exporter সহ সার্ভার হেলথ দেখা যায়।

1cd /tmp
2VER=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep tag_name | cut -d '"' -f4)
3VERFILE=$(echo "$VER" | sed 's/^v//')
4wget "https://github.com/prometheus/prometheus/releases/download/${VER}/prometheus-${VERFILE}.linux-amd64.tar.gz"
5tar xvf prometheus-*.linux-amd64.tar.gz
6sudo mv prometheus-*.linux-amd64 /opt/prometheus
/opt/prometheus/prometheus.yml
1global:
2 scrape_interval: 15s
3
4scrape_configs:
5 - job_name: node
6 static_configs:
7 - targets: ["127.0.0.1:9100"]

9.2Grafana ইনস্টল (ঐচ্ছিক)

কেন এই ধাপ

শুধু সংখ্যা নয় চার্ট দরকার হলে Grafana; টিমকে একই ড্যাশবোর্ড শেয়ার করা সহজ।

1# GPG কী — apt-key deprecated (Ubuntu 22.04+), keyring পদ্ধতি ব্যবহার করুন
2sudo mkdir -p /etc/apt/keyrings
3wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
4echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
5sudo apt update && sudo apt -y install grafana
6sudo systemctl enable --now grafana-server

9.3ড্যাশবোর্ড আইডি (ঐচ্ছিক)

কেন এই ধাপ

প্রস্তুত ড্যাশবোর্ড আইডি দিয়ে দ্রুত Node/DB/Docker ভিউ আমদানি — নিজে সব প্যানেল বানানোর সময় বাঁচে।

আইডিবিবরণ
1860Node Exporter Full
3662Prometheus 2.0
7362MongoDB
9628PostgreSQL
11835Redis
12708Docker

9.4Uptime Kuma (ঐচ্ছিক)

কেন এই ধাপ

বাইরে থেকে HTTP পিং করে ডাউনটাইম নোটিফিকেশন; মেট্রিক্সের পাশাপাশি ইউজার-ফেসিং চেক।

1docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
10

স্টেজিং ও Git ওয়ার্কফ্লো

উভয়

ব্রাঞ্চিং ও ডেপ্লয় ফ্লো সবার জন্য; পৃথক স্টেজিং সার্ভার ঐচ্ছিক (ছোট টিমে প্রায়ই মেইন+ট্যাগই যথেষ্ট)।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

10.1Git ব্রাঞ্চিং

কেন এই ধাপ

কোন ব্রাঞ্চে কী ধরনের কোড থাকবে স্পষ্ট করলে রিলিজ ও হটফিক্স ট্র্যাক করা সহজ।

ব্রাঞ্চউদ্দেশ্য
mainপ্রোডাকশন
stagingপ্রি-প্রোড ইন্টিগ্রেশন
developডেভ ইন্টিগ্রেশন
feature/*ফিচার কাজ
hotfix/*জরুরি প্যাচ

10.2স্টেজিং (ম্যানুয়াল) (ঐচ্ছিক)

কেন এই ধাপ

প্রোডের আগে আলাদা .env ও পোর্টে চালিয়ে রিগ্রেশন ধরা; PM2 এ আলাদা env দিয়ে চালানো যায়।

1sudo mkdir -p /var/www/staging && sudo chown deploy:deploy /var/www/staging
2cd /var/www/staging
3git clone -b staging git@github.com:org/backend.git
4cp /var/www/staging/backend/.env.example /var/www/staging/backend/.env.staging
5# edit DATABASE_URL, secrets for staging
6cd /var/www/staging/backend && npm ci && npm run build
7pm2 start ecosystem.config.js --env staging

10.4ডেপ্লয় ফ্লো

কেন এই ধাপ

ফিচার থেকে প্রোড পর্যন্ত ধাপ লিখে রাখলে টিম একই রিদমে রিলিজ করে; UAT বাদ দিলে ঝুঁকি বাড়ে।

  1. ফিচার ব্রাঞ্চে কাজ ও PR
  2. স্টেজিংয়ে মার্জ ও স্বয়ংক্রিয়/ম্যানুয়াল টেস্ট
  3. স্টেকহোল্ডার UAT
  4. মেইনে মার্জ (প্রোড)
  5. বিল্ড আর্টিফ্যাক্ট/ইমেজ তৈরি
  6. ব্যাকআপ নিশ্চিত
  7. রোলিং ডেপ্লয়
  8. পোস্ট-ডেপ্লয় স্বাস্থ্য পরীক্ষা
11

CI/CD পাইপলাইন

উভয়

ম্যানুয়াল/ডকার ডেপ্লয় স্ক্রিপ্ট — সবার জন্য। GitHub Actions ও ব্লু-গ্রিন ঐচ্ছিক (ছোট রিলিজে ম্যানুয়াল স্ক্রিপ্টই চলে)।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

11.1ডেপ্লয় স্ক্রিপ্ট (ম্যানুয়াল)

কেন এই ধাপ

একই সিকোয়েন্স (পুল, বিল্ড, রিলোড) স্ক্রিপ্টে বন্ধ করলে ম্যানুয়াল টাইপো কমে, অন্য কেউ রিলিজ করতে পারে।

/opt/scripts/deploy.sh
1#!/usr/bin/env bash
2set -euo pipefail
3
4# non-interactive SSH-এ ~/.bashrc source হয় না — nvm manually load করতে হবে
5export NVM_DIR="$HOME/.nvm"
6[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
7
8APP_DIR="/var/www/backend"
9git -C "$APP_DIR" fetch --all --prune
10git -C "$APP_DIR" checkout main
11git -C "$APP_DIR" pull --ff-only
12cd "$APP_DIR" && npm ci && npm run build
13pm2 reload ecosystem.config.js --only api
1sudo chmod +x /opt/scripts/deploy.sh

11.3GitHub Actions (ঐচ্ছিক)

কেন এই ধাপ

মেইনে মার্জ হলেই একই স্ক্রিপ্ট চালানো — ম্যানুয়াল ভুলে ভুল সার্ভারে SSH কম।

.github/workflows/deploy.yml
1name: Deploy
2on:
3 push:
4 branches: [main]
5
6jobs:
7 deploy:
8 runs-on: ubuntu-latest
9 steps:
10 - uses: actions/checkout@v4
11 - name: SSH deploy
12 uses: appleboy/ssh-action@v1.0.3
13 with:
14 host: ${{ secrets.PROD_HOST }}
15 username: deploy
16 key: ${{ secrets.SSH_PRIVATE_KEY }}
17 script: |
18 /opt/scripts/deploy.sh

11.4ব্লু-গ্রিন ডেপ্লয় (ঐচ্ছিক)

কেন এই ধাপ

নতুন বিল্ড আলাদা ডিরে হেলথ চেক করে ট্রাফিক ফ্লিপ — বিগ ব্যাং রিলিজের ঝুঁকি কমে।

/opt/scripts/blue-green.sh
1#!/usr/bin/env bash
2set -euo pipefail
3ACTIVE=$(readlink -f /var/www/active)
4if [[ "$ACTIVE" == "/var/www/blue" ]]; then
5 TARGET="/var/www/green"
6else
7 TARGET="/var/www/blue"
8fi
9git clone --depth 1 git@github.com:org/backend.git "$TARGET"
10# build, healthcheck, flip nginx upstream symlink
11ln -sfn "$TARGET" /var/www/active
12sudo nginx -s reload
12

রোলব্যাক স্ট্র্যাটেজি

উভয়

ম্যানুয়াল গিট রিভার্ট ও ডকার ট্যাগ সোয়াপ।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

12.1রোলব্যাক (ম্যানুয়াল)

কেন এই ধাপ

খারাপ কমিট দ্রুত ছেড়ে আগের SHA-তে ফিরে বিল্ড+রিলোড — MTTR কমায়।

/opt/scripts/rollback.sh
1#!/usr/bin/env bash
2set -euo pipefail
3APP_DIR="/var/www/backend"
4LAST_GOOD="${1:-}"
5if [[ -z "$LAST_GOOD" ]]; then
6 echo "usage: rollback.sh <commit_sha>"
7 exit 1
8fi
9git -C "$APP_DIR" checkout "$LAST_GOOD"
10cd "$APP_DIR" && npm ci && npm run build
11pm2 reload ecosystem.config.js --only api
13

ব্যাকআপ স্ট্র্যাটেজি

উভয়

MongoDB, PostgreSQL, ক্রন শিডিউল।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

13.1MongoDB ব্যাকআপ

কেন এই ধাপ

আর্কাইভড ডাম্প অফসাইটে না গেলে এক ডিস্ক ফেলে সব হারায়; ম্যানুয়াল ও ডকার উভয় রুট।

/opt/scripts/backup-mongo.sh (manual)
1#!/usr/bin/env bash
2mongodump --uri="$MONGO_URI" --archive=/backups/mongo-$(date +%F).gz --gzip
docker exec one-liner
1docker exec stack-mongo-1 mongodump --archive=/tmp/dump.gz --gzip
2docker cp stack-mongo-1:/tmp/dump.gz ./mongo-$(date +%F).gz

13.2PostgreSQL ব্যাকআপ

কেন এই ধাপ

pg_dump লজিক্যাল ব্যাকআপ — ভার্শন মিশম্যাচে ভলিউম কপির চেয়ে নিরাপদ অনেক সময়।

1pg_dump -h 127.0.0.1 -U appuser app | gzip > /backups/pg-$(date +%F).sql.gz
1docker exec stack-postgres-1 pg_dump -U appuser app | gzip > pg-$(date +%F).sql.gz

13.3ক্রন শিডিউল

কেন এই ধাপ

ম্যানুয়াল রিমাইন্ডারে ব্যাকআপ ভুলে যায়; ক্রনে স্থির সময়ে চালালে অফসাইট সিঙ্কও একসাথে বাঁধা যায়।

crontab -e
10 2 * * * /opt/scripts/backup-mongo.sh
215 2 * * * /opt/scripts/backup-pg.sh
330 3 * * * /opt/scripts/offsite-sync.sh

13.4অফসাইট সিঙ্ক — S3 / Object Storage

কেন এই ধাপ

লোকাল ডাম্প ডিস্ক ফেলে গেলে কাজে আসে না — S3 বা compatible storage-এ sync করলে সত্যিকারের disaster recovery সম্ভব।

দুটি জনপ্রিয় পদ্ধতি: AWS CLI (S3 সরাসরি) বা rclone (S3, Backblaze B2, Cloudflare R2, Google Cloud Storage — যেকোনো provider)।

পদ্ধতি ১ — AWS CLI
1# AWS CLI ইনস্টল
2sudo apt -y install awscli
3
4# credentials একবার সেটআপ করুন
5aws configure
6# AWS Access Key ID: YOUR_ACCESS_KEY
7# AWS Secret Access Key: YOUR_SECRET_KEY
8# Default region name: ap-southeast-1
9# Default output format: json
/opt/scripts/offsite-sync.sh (AWS CLI)
1#!/usr/bin/env bash
2set -euo pipefail
3BUCKET="your-bucket-name"
4HOST=$(hostname)
5aws s3 sync /backups "s3://$BUCKET/backups/$HOST/" --storage-class STANDARD_IA
6# S3 Lifecycle Rule দিয়ে ৩০ দিনের পুরনো ব্যাকআপ স্বয়ংক্রিয় মুছুন
পদ্ধতি ২ — rclone (যেকোনো provider)
1# rclone ইনস্টল
2curl https://rclone.org/install.sh | sudo bash
3
4# interactive config (provider বেছে credentials দিন)
5rclone config
/opt/scripts/offsite-sync.sh (rclone)
1#!/usr/bin/env bash
2set -euo pipefail
3# "remote" = rclone config-এ দেওয়া নাম
4rclone sync /backups remote:your-bucket/backups/$(hostname)/
14

ডিজাস্টার রিকভারি

উভয়

রিস্টোর কমান্ড — প্রয়োজনে। সম্পূর্ণ DR চেকলিস্ট বড়/মিশন-ক্রিটিকাল সিস্টেমের জন্য; ছোট অ্যাপে ঐচ্ছিক।

ঐচ্ছিকএই সেকশনের গুরুত্ব

নির্দিষ্ট দরকারে লাগে বা অ্যাডভান্স সেটআপ। না করলে মূল স্ট্যাক অনেক সময় চলতে পারে; করলে সেই বিষয়ে লাভ বা সুবিধা।

14.1MongoDB রিস্টোর

কেন এই ধাপ

ডাম্প থেকে পুনরুদ্ধার জানা থাকলে ইন্সিডেন্টে সময় বাঁচে; ডকার কপি পাথও একই।

1mongorestore --uri="$MONGO_URI" --archive=/backups/mongo-YYYY-MM-DD.gz --gzip
1docker cp ./mongo-YYYY-MM-DD.gz stack-mongo-1:/tmp/dump.gz
2docker exec stack-mongo-1 mongorestore --archive=/tmp/dump.gz --gzip

14.2ফুল রিকভারি চেকলিস্ট (ঐচ্ছিক)

কেন এই ধাপ

পুরো অঞ্চল/প্রোভাইডার ফেলে গেলে ধাপ মিস করলে সেবা আধা-উঠা থেকে যায়; টেবিল হল রানবুক স্কেলেটন।

ধাপম্যানুয়ালডকার
1নতুন ভিপিএস প্রভিজননতুন ভিপিএস প্রভিজন
2SSH কী ও ইউজারSSH কী ও ইউজার
3UFW/Fail2banUFW/Fail2ban
4Nginx ইনস্টলডকার ইনস্টল
5ডাটাবেজ ইনস্টলকম্পোজ স্ট্যাক
6রিস্টোর ডাম্পরিস্টোর ভলিউম/ডাম্প
7গিট ক্লোন ও বিল্ডইমেজ পুল
8.env পুনরুদ্ধার.env ও সিক্রেট
9PM2 স্টার্টআপ স্ট্যাক
10Nginx সাইটরিভার্স প্রক্সি
11SSL সার্টSSL সার্ট/টানেল
12DNS আপডেটDNS আপডেট
13স্মোক টেস্টস্মোক টেস্ট
14মনিটরিং পুনরায় সংযোগমনিটরিং পুনরায় সংযোগ
15ইন্সিডেন্ট নোটইন্সিডেন্ট নোট
16পোস্টমর্টেম
15

সিকিউরিটি চেকলিস্ট

উভয়

সার্ভার, ডাটাবেজ, অ্যাপ, অপারেশন ও ট্রাবলশুটিং।

সুপারিশিতএই সেকশনের গুরুত্ব

না করলেও অনেক সময় মৌলিক কাজ চলতে পারে (যেমন রুট দিয়ে SSH, IP:পোর্টে অ্যাপ); করলে নিরাপত্তা, স্থায়িত্ব ও দলের কাজের ধরন ভালো হয়।

15.1সার্ভার সিকিউরিটি

কেন এই ধাপ

সার্ফেস অ্যাটাক কমাতে SSH, ফায়ারওয়াল, প্যাচিং — অ্যাপ সিকিউর হলেও বক্স খোলা থাকলে লিক হয়।

আইটেমস্ট্যাটাস
রুট লগইন বন্ধ
কী-অনলি SSH
UFW সক্রিয়
অটো আপডেট

15.2ডাটাবেজ সিকিউরিটি

কেন এই ধাপ

পাবলিক বাইন্ড বা দুর্বল রোল মানে এক লিকে পুরো ডাটা; লোকাল বাইন্ড+রোল মিনিমাইজেশন।

আইটেমস্ট্যাটাস
শুধু লোকালহোস্ট বাইন্ড
শক্তিশালী পাসওয়ার্ড/রোল
নিয়মিত ব্যাকআপ

15.3অ্যাপ্লিকেশন সিকিউরিটি

কেন এই ধাপ

হেডার ও রেট লিমিট ব্রাউজার/বট আক্রমণ কমায়; ডিপেন্ডেন্সি প্যাচ সাপ্লাই চেইন সুরক্ষা।

আইটেমস্ট্যাটাস
হেডার (HSTS, CSP)
রেট লিমিট
ডিপেন্ডেন্সি আপডেট

15.4দৈনন্দিন কমান্ড

কেন এই ধাপ

দ্রুত স্বাস্থ্য চেক (প্রসেস, লগ, nginx) ইউজার রিপোর্টের আগে সমস্যা ধরে।

Manual
1pm2 status
2pm2 logs api --lines 200
3sudo nginx -t && sudo systemctl reload nginx
Docker
1docker compose ps
2docker compose logs -f --tail=200 api

15.5ট্রাবলশুটিং

কেন এই ধাপ

লক্ষণ→পরীক্ষা ম্যাপ দিয়ে ডিবাগ অর্ডার ঠিক রাখা; ৫০২ এ আগে আপস্ট্রিম, পরে সার্ট/ডিস্ক।

লক্ষণপরীক্ষা
502আপস্ট্রিম/PM2/কন্টেইনার স্বাস্থ্য
SSL ত্রুটিসার্ট মেয়াদ ও চেইন
ডিস্ক পূর্ণলগ ও ডাম্প পরিষ্কার
16

কমান্ড রেফারেন্স (PM2, tmux, ডকার, সিস্টেম)

উভয়

নিচের ব্লকগুলো ক্লিক করে খুলুন — PM2, tmux, ডকার কম্পোজ, systemd, লগ ও Nginx দ্রুত কমান্ড।

ঐচ্ছিকএই সেকশনের গুরুত্ব

নির্দিষ্ট দরকারে লাগে বা অ্যাডভান্স সেটআপ। না করলে মূল স্ট্যাক অনেক সময় চলতে পারে; করলে সেই বিষয়ে লাভ বা সুবিধা।

16.1PM2 ও প্রসেস ম্যানেজমেন্ট

কেন এই ধাপ

ম্যানুয়াল পথে Node অ্যাপ চালাতে PM2 স্ট্যান্ডার্ড — স্টার্ট, রিলোড, লগ, মেট্রিক্স।

গ্লোবাল ইনস্টল: sudo npm i -g pm2। প্রথমবার: cd অ্যাপ ডিরেক্টরি থেকে pm2 start …

▶ স্টার্ট / স্টপ / রিস্টার্ট / রিলোড
1pm2 start ecosystem.config.js
2pm2 start npm --name api -- start
3pm2 stop api
4pm2 restart api
5pm2 reload api # zero-downtime cluster reload (if app supports)
6pm2 delete api
▶ তালিকা, মনিটর, স্ট্যাটাস
1pm2 list
2pm2 status
3pm2 monit
4pm2 show api
5pm2 describe api
▶ লগ (লাইভ, লাইন লিমিট, ফ্লাশ)
1pm2 logs
2pm2 logs api
3pm2 logs api --lines 200
4pm2 flush # clear all log files
▶ স্টার্টআপে আবার চালু (boot)
1pm2 save
2pm2 startup # prints a sudo command — run it once
3pm2 unstartup systemd # remove autostart (distro-specific)
▶ আপডেট / ইনস্টল / ক্লাস্টার
1pm2 update # update in-memory PM2
2npm i -g pm2@latest && pm2 update
3
4# ecosystem example: instances : "max" or number for cluster mode
5pm2 scale api 4
▶ লগ রোটেশন (pm2-logrotate) — প্রোডাকশনে জরুরি

প্রোডাকশনে PM2 লগ ফাইল বাড়তে বাড়তে ডিস্ক ভরে যায় — pm2-logrotate মডিউল স্বয়ংক্রিয় কেটে রাখে।

1pm2 install pm2-logrotate
2
3# ১০ MB-এর বেশি হলে নতুন ফাইলে রোটেট
4pm2 set pm2-logrotate:max_size 10M
5
6# ৭টি পুরনো ফাইল রাখবে, বাকি মুছবে
7pm2 set pm2-logrotate:retain 7
8
9# gzip কম্প্রেস করে রাখা
10pm2 set pm2-logrotate:compress true
11
12# প্রতিদিন মাঝরাতে রোটেট
13pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
14
15# বর্তমান সেটিংস দেখুন
16pm2 get pm2-logrotate
▶ এনভ ও ডিবাগ
1pm2 env 0
2pm2 restart api --update-env
3NODE_ENV=production pm2 restart api --update-env

16.2Docker ও Compose

কেন এই ধাপ

ডকার পথে ইমেজ, কন্টেইনার, ভলিউম ও কম্পোজ এক লাইনে চালানোর রেফারেন্স।

▶ কম্পোজ (সাধারণ)
1docker compose ps
2docker compose up -d
3docker compose pull api
4docker compose up -d --no-deps api
5docker compose logs -f --tail=200 api
6docker compose down
▶ ইমেজ ও কন্টেইনার
1docker images
2docker ps -a
3docker exec -it CONTAINER_NAME sh
4docker stats --no-stream

16.3systemd ও লগ (journalctl)

কেন এই ধাপ

Nginx বা সিস্টেম সার্ভিস ডিবাগ ও রিবুট পর স্ট্যাটাস দেখতে।

▶ systemctl
1sudo systemctl status nginx
2sudo systemctl reload nginx
3sudo systemctl restart nginx
4sudo systemctl is-active nginx
▶ journalctl
1journalctl -u nginx -f
2journalctl -u nginx --since "1 hour ago"
3journalctl -xe

16.4Nginx, সার্ট, ডিস্ক

কেন এই ধাপ

সাইট কনফিগ টেস্ট, সার্ট রিনিউ, ডিস্ক ফুল হলে দ্রুত চেক।

▶ Nginx + Certbot
1sudo nginx -t
2sudo systemctl reload nginx
3sudo certbot renew --dry-run
4sudo certbot renew
▶ ডিস্ক ও মেমোরি
1df -h
2du -sh /var/log/* | sort -h | tail
3free -h

16.5tmux দ্রুত রেফারেন্স

কেন এই ধাপ

ম্যানুয়াল পথে PM2 ছাড়া চালালে সেশন, ডিট্যাচ ও রিকভারি এক নজরে।

সেশন নাম দিয়ে চালান (`tmux new -s api`) যাতে রিবুটের পর `attach` সহজ হয়।

▶ সেশন ও উইন্ডো
1tmux new -s work
2tmux ls
3tmux attach -t work
4tmux kill-session -t work
5
6# prefix key default: Ctrl+b
7# new window: Ctrl+b c
8# next/prev window: Ctrl+b n / Ctrl+b p
▶ স্ক্রল ও কপি (কপি মোড)
1# enter copy mode: Ctrl+b [
2# navigate with vi keys or arrows; q to quit copy mode