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 সেটআপ
- VPS-এ লগইন:
ssh root@your-vps-ip
- সিস্টেম আপডেট:
sudo apt update && sudo apt upgrade -y
- প্রয়োজনীয় সফটওয়্যার ইনস্টল:
- 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 ডাটাবেস ডিপ্লয়
- 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
- ডাটাবেস এবং ইউজার তৈরি:
- 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
ধাপ ৮: টেস্টিং
-
ওয়েবসাইট:
- ব্রাউজারে খুলুন:
- https://example.com
- https://x.example.com
- https://example2.com
- www ভার্সন রিডাইরেক্ট চেক করুন।
-
ডাটাবেস কানেকশন:
- 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 সাপোর্ট বা ডেভেলপারের সাথে যোগাযোগ করুন।