Next.js ওয়েবসাইট Hostinger VPS-এ ডিপ্লয় ডকুমেন্টেশন

সংক্ষিপ্ত বিবরণ

এই ডকুমেন্টেশনটি Hostinger VPS-এ Next.js ওয়েবসাইট ডিপ্লয় করার ধাপে ধাপে নির্দেশনা প্রদান করে। এটি example.com, x.example.com, এবং example2.com ডোমেইনগুলোর জন্য Nginx রিভার্স প্রক্সি, PM2 প্রসেস ম্যানেজার, এবং MongoDB ডাটাবেস ব্যবহার করে। এছাড়াও Let’s Encrypt দিয়ে HTTPS সেটআপ এবং MongoDB-এর স্বয়ংক্রিয় ব্যাকআপ কনফিগারেশন অন্তর্ভুক্ত রয়েছে।

প্রয়োজনীয়তা

  • Hostinger VPS: Ubuntu 22.04 বা তার উপরের ভার্সন, SSH অ্যাক্সেস সহ।
  • ডোমেইন: example.com, x.example.com, এবং example2.com, VPS IP-এর সাথে DNS লিঙ্ক করা।
  • Next.js প্রজেক্ট: GitHub বা অন্য রিপোজিটরিতে হোস্ট করা।
  • Environment Variables: MongoDB URL, username, password; Clerk publishable এবং secret key।
  • টুলস: SSH ক্লায়েন্ট (PuTTY/Terminal), Git, টেক্সট এডিটর (nano/vim)।
  • প্রি-ইনস্টলড সফটওয়্যার (পরবর্তী ধাপে ইনস্টল করা হবে):

    • Node.js (v18.17+)
    • Nginx
    • PM2
    • MongoDB
    • Certbot (Let’s Encrypt)

ধাপসমূহ

ধাপ ১: VPS সেটআপ

  1. VPS-এ লগইন:
ssh root@your-vps-ip
  1. সিস্টেম আপডেট:
sudo apt update && sudo apt upgrade -y
  1. প্রয়োজনীয় সফটওয়্যার ইনস্টল:
  • Node.js:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
  • Nginx:
sudo apt install nginx -y
sudo systemctl enable nginx
  • PM2:
sudo npm install -g pm2
  • Git:
sudo apt install git -y
  • ফায়ারওয়াল সেটআপ:
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

ধাপ ২: MongoDB ডাটাবেস ডিপ্লয়

  1. MongoDB ইনস্টল:
sudo apt install gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 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
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
  1. ডাটাবেস এবং ইউজার তৈরি:
  • MongoDB শেলে প্রবেশ:
mongosh
  • example.com এবং x.example.com-এর জন্য:
use example
db.createUser({
  user: "example_user",
  pwd: "your_secure_password",
  roles: [{ role: "readWrite", db: "example" }]
})
  • example2.com-এর জন্য:
use example2
db.createUser({
  user: "example2_user",
  pwd: "your_secure_password",
  roles: [{ role: "readWrite", db: "example2" }]
})
  • MongoDB শেল থেকে বের হোন:
exit
  • MongoDB সিকিউরিটি:

    • /etc/mongod.conf-এ bindIp: 127.0.0.1 নিশ্চিত করুন।
  • MongoDB রিস্টার্ট:

sudo systemctl restart mongod

ধাপ ৩: Next.js প্রজেক্ট ডিপ্লয়

3.1: example.com এবং x.example.com

  • প্রজেক্ট ক্লোন:
mkdir -p ~/apps/example
cd ~/apps/example
git clone https://github.com/yourusername/example-repo.git .
  • Environment Variables সেট করুন:
nano ~/apps/example/.env
MONGODB_URL=mongodb://example_user:your_secure_password@localhost:27017/example?authSource=example
CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
CLERK_SECRET_KEY=your_clerk_secret_key
NEXT_PUBLIC_SERVER_URL=https://example.com
  • বিল্ড এবং রান:
npm install
npm run build
pm2 start npm --name "example" -- start
pm2 save
pm2 startup

3.2: example2.com

  • প্রজেক্ট ক্লোন:
mkdir -p ~/apps/example2
cd ~/apps/example2
git clone https://github.com/yourusername/example2-repo.git .
  • Environment Variables সেট করুন:
nano ~/apps/example2/.env
MONGODB_URL=mongodb://example2_user:your_secure_password@localhost:27017/example2?authSource=example2
CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
CLERK_SECRET_KEY=your_clerk_secret_key
NEXT_PUBLIC_SERVER_URL=https://example2.com
  • বিল্ড এবং রান:
npm install
npm run build
pm2 start npm --name "example2" -- start --port 3001
pm2 save

ধাপ ৪: Nginx কনফিগারেশন

example.com এবং x.example.com:

sudo nano /etc/nginx/sites-available/example.com
server {
    listen 80;
    server_name example.com www.example.com x.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name x.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

example2.com:

sudo nano /etc/nginx/sites-available/example2.com
server {
    listen 80;
    server_name example2.com www.example2.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example2.com;
    ssl_certificate /etc/letsencrypt/live/example2.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example2.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

server {
    listen 443 ssl;
    server_name www.example2.com;
    ssl_certificate /etc/letsencrypt/live/example2.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example2.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    return 301 https://example2.com$request_uri;
}
  • সাইট এনাবল এবং রিস্টার্ট:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

ধাপ ৫: SSL সার্টিফিকেট সেটআপ

  • Certbot ইনস্টল:
sudo apt install certbot python3-certbot-nginx -y
  • SSL সার্টিফিকেট তৈরি:

    • example.com:
    sudo certbot --nginx -d example.com -d www.example.com -d x.example.com
    
    • example2.com:
    sudo certbot --nginx -d example2.com -d www.example2.com
    
  • অটো-রিনিউয়াল চেক:

sudo certbot renew --dry-run

ধাপ ৬: MongoDB ব্যাকআপ সেটআপ

  • ব্যাকআপ ডিরেক্টরি:
mkdir -p ~/backups/mongodb
  • ব্যাকআপ স্ক্রিপ্ট:

    • example ডাটাবেস:
    nano ~/backups/mongodb_backup_example.sh
    
```bash
#!/bin/bash
BACKUP_DIR=~/backups/mongodb
DB_NAME=example
TIMESTAMP=$(date +%F-%H-%M-%S)
BACKUP_NAME="backup-$DB_NAME-$TIMESTAMP.gz"

mongodump --db $DB_NAME --authenticationDatabase example -u example_user -p your_secure_password --archive=$BACKUP_DIR/$BACKUP_NAME --gzip

ls -t $BACKUP_DIR/backup-$DB_NAME-*.gz | tail -n +6 | xargs -I {} rm {}
```
  • example2 ডাটাবেস:

    nano ~/backups/mongodb_backup_example2.sh
    
```bash
#!/bin/bash
BACKUP_DIR=~/backups/mongodb
DB_NAME=example2
TIMESTAMP=$(date +%F-%H-%M-%S)
BACKUP_NAME="backup-$DB_NAME-$TIMESTAMP.gz"

mongodump --db $DB_NAME --authenticationDatabase example2 -u example2_user -p your_secure_password --archive=$BACKUP_DIR/$BACKUP_NAME --gzip

ls -t $BACKUP_DIR/backup-$DB_NAME-*.gz | tail -n +6 | xargs -I {} rm {}
```
  • এক্সিকিউটেবল করুন:
chmod +x ~/backups/mongodb_backup_example.sh
chmod +x ~/backups/mongodb_backup_example2.sh
  • Cron Job:
crontab -e
  • প্রতি ঘণ্টায়:
0 * * * * ~/backups/mongodb_backup_example.sh
0 * * * * ~/backups/mongodb_backup_example2.sh
  • প্রতিদিন (রাত ১২টা):
0 0 * * * ~/backups/mongodb_backup_example.sh
0 0 * * * ~/backups/mongodb_backup_example2.sh

ধাপ ৭: DNS সেটআপ

example.com:

Hostinger DNS প্যানেলে:

Type: A
Name: @
Value: your-vps-ip
TTL: 14400

Type: A
Name: www
Value: your-vps-ip
TTL: 14400

Type: A
Name: x
Value: your-vps-ip
TTL: 14400

example2.com:

Hostinger DNS প্যানেলে:

Type: A
Name: @
Value: your-vps-ip
TTL: 14400

Type: A
Name: www
Value: your-vps-ip
TTL: 14400

ধাপ ৮: টেস্টিং

  • ওয়েবসাইট:

  • ডাটাবেস কানেকশন:

    • Clerk অথেনটিকেশন এবং ডাটাবেস কার্যকারিতা টেস্ট করুন।
  • ব্যাকআপ:

ls ~/backups/mongodb

সমস্যা সমাধান

  • Nginx ত্রুটি:
sudo tail -f /var/log/nginx/error.log
  • PM2 ত্রুটি:
pm2 logs example
pm2 logs example2
  • MongoDB ত্রুটি:
sudo systemctl status mongod
  • DNS ত্রুটি:
dig example.com
dig x.example.com
dig example2.com

সিকিউরিটি সুপারিশ

  • SSH: Password-এর পরিবর্তে SSH key ব্যবহার করুন।
  • Root লগইন: /etc/ssh/sshd_config-এ PermitRootLogin no সেট করুন।
  • ব্যাকআপ স্টোরেজ: ব্যাকআপ ফাইলগুলো AWS S3 বা অন্য ক্লাউডে স্থানান্তর করুন।
  • মনিটরিং: UptimeRobot দিয়ে সাইট মনিটর করুন।

রেফারেন্স

  • MongoDB ডকুমেন্টেশন
  • Next.js ডিপ্লয় গাইড
  • Nginx ডকুমেন্টেশন
  • Let’s Encrypt

পরিশিষ্ট

  • তারিখ: ৮ জুলাই, ২০২৫
  • লেখক: Tariqul Islam
  • যোগাযোগ: প্রশ্ন থাকলে Hostinger সাপোর্ট বা ডেভেলপারের সাথে যোগাযোগ করুন।

Note: Grok

Similar Posts