ویژگی تصویر

دیپلوی پروژه Node.js روی سرور — راهنمای جامع

  /  Node.js   /  دیپلوی پروژه Node.js روی سرور
بنر تبلیغاتی الف
NodeJS - Node.js

در این مقاله قدم‌به‌قدم روش‌های عملی و حرفه‌ای برای دیپلوی یک اپلیکیشن Node.js روی سرور را توضیح می‌دهم. هدف این است که از نصب اولیه تا مدیریت فرآیند، پیکربندی Reverse Proxy، فعال‌سازی SSL و روش‌های خودکارسازی استقرار را پوشش دهیم. مثال‌ها واقعی و قابل اجرا هستند و برای محیط‌های تولید (production) بهترین شیوه‌ها لحاظ شده‌اند.

پیش‌نیازها

  • سرور لینوکسی (معمولاً Ubuntu 20.04 یا بالاتر)
  • دسترسی SSH با کاربر غیر ریشه و امکان اجرای sudo
  • نسخه Node.js متناسب با پروژه (مثلاً 16 یا 18)
  • نام دامنه ثبت‌شده در DNS که به IP سرور اشاره می‌کند

1. آماده‌سازی سرور

اولین قدم به‌روز کردن بسته‌ها و نصب ابزارهای اصلی است.

sudo apt update && sudo apt upgrade -y
sudo apt install git build-essential curl -y

این دستورات مخازن را بروزرسانی، ابزارهای پایه را نصب و Git را آماده می‌کنند تا مخزن پروژه را کلون کنیم.

2. نصب Node.js (با nvm)

استفاده از nvm اجازه می‌دهد چند نسخه Node را مدیریت کنید.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm install 18
nvm use 18
node -v
npm -v

این کد nvm را نصب می‌کند، نسخه 18 Node را دانلود و فعال می‌سازد و در پایان نسخه Node و npm را نمایش می‌دهد تا مطمئن شویم نصب موفق بوده است.

3. کلون کردن پروژه و نصب وابستگی‌ها

git clone https://github.com/your-username/your-node-app.git
cd your-node-app
npm install
npm run build    # اگر پروژه دارای مرحله build است

پروژه از گیت کلون شده و وابستگی‌ها نصب می‌شوند. اگر پروژه از ابزارهایی مثل webpack یا TypeScript استفاده می‌کند، دستور build را اجرا کنید.

4. مدیریت فرآیند با PM2

PM2 یک Process Manager محبوب برای Node.js است که ویژگی‌هایی مثل مانیتورینگ، ری‌استارت خودکار و سرویس‌دهی پس از ریبوت را دارد.

npm install -g pm2
pm2 start dist/index.js --name my-app
pm2 save
pm2 startup systemd

ابتدا PM2 نصب می‌شود، سپس اپلیکیشن با نام my-app اجرا می‌شود. دستور pm2 save وضعیت فعلی را ذخیره می‌کند و pm2 startup systemd فرمانی برای ایجاد سرویس Systemd اجرا می‌کند تا پس از ریبوت سرور، برنامه اتوماتیک اجرا شود.

نمونه فایل ecosystem.config.js برای PM2

module.exports = {
  apps: [
    {
      name: "my-app",
      script: "./dist/index.js",
      instances: "max",
      exec_mode: "cluster",
      env: {
        NODE_ENV: "production",
        PORT: 3000
      }
    }
  ]
};

این فایل تنظیمات PM2 را تعریف می‌کند: اجرای در حالت cluster با ماکزیمم تعداد هسته‌ها، تنظیم متغیرهای محیطی و مسیر فایل اجرایی. استفاده از cluster باعث استفاده بهتر از چند هسته CPU می‌شود.

5. کانفیگ Nginx به‌عنوان Reverse Proxy

برای مسیردهی درخواست‌های HTTP/HTTPS به اپ Node.js و مدیریت دامنه از Nginx استفاده می‌کنیم.

sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/my-app

فایل کانفیگ Nginx را باز کنید و یک کانفیگ مشابه زیر ایجاد کنید:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1: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;
    }
}

این کانفیگ درخواست‌های ورودی روی پورت 80 را به پورت 3000 (جایی که اپ Node اجرا شده) فوروارد می‌کند و هدرهای لازم برای WebSocket/Upgrade را تنظیم می‌نماید. پس از ذخیره فایل، آن را فعال و Nginx را ری‌استارت کنید:

sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

nginx -t برای بررسی صحت کانفیگ است و اگر مشکلی نباشد Nginx ری‌استارت می‌شود.

6. فعال‌سازی SSL رایگان با Certbot

برای امنیت و SEO بهتر حتما HTTPS را فعال کنید.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

این دستورات Certbot را نصب و سپس با استفاده از پلاگین Nginx، گواهی Let’s Encrypt را گرفته و کانفیگ Nginx را برای HTTPS بروزرسانی می‌کند. Certbot تنظیمات تمدید خودکار را هم اضافه می‌کند.

7. لاگ‌ها، مانیتورینگ و نگهداری

  • مشاهده لاگ PM2: pm2 logs my-app — برای بررسی runtime errors
  • استفاده از سرویس‌هایی مثل New Relic، Datadog یا Prometheus برای مانیتورینگ عملکرد
  • پیکربندی rotation لاگ‌ها با logrotate برای جلوگیری از پر شدن دیسک

8. روش‌های استقرار خودکار (CI/CD)

برای آپدیت‌های منظم، از GitHub Actions یا GitLab CI می‌توانید استفاده کنید. نمونه ساده GitHub Actions که پس از push، روی سرور ssh و deploy می‌کند:

name: Deploy to Server
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Copy to server
        uses: appleboy/ssh-action@v0.1.8
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd /var/www/my-app
            git pull
            npm install --production
            pm2 reload ecosystem.config.js --env production

این Workflow پس از هر push به main، با SSH به سرور متصل می‌شود، کد را کشیده، وابستگی‌ها را نصب و PM2 را ری‌لود می‌کند. اطلاعات حساس مانند کلید SSH و آدرس سرور باید در Secrets ذخیره شوند.

توصیه‌های امنیتی و بهینه‌سازی

  • از متغیرهای محیطی برای نگهداری کلیدها و تنظیمات حساس استفاده کنید، فایل .env را در گیت نگه ندارید.
  • سخت‌سازی SSH: غیرفعال کردن ورود با رمز و استفاده از کلید‌ها، تغییر پورت SSH و فعال‌سازی fail2ban.
  • تنظیم منابع (CPU/Memory) در PM2 و محدود کردن اندازه لاگ‌ها.
  • پیکربندی Cache و gzip در Nginx برای بهبود سرعت پاسخ‌دهی.

نمونه جدول خلاصه مراحل

مرحلهدستور/ابزار
آماده‌سازیapt, git
نصب Nodenvm
مدیریت فرآیندPM2
Reverse ProxyNginx
SSLCertbot / Let’s Encrypt

نتیجه‌گیری و نکات نهایی

دیپلوی موفق Node.js ترکیبی از نصب درست env، مدیریت فرآیند، پیکربندی پروکسی و امنیت است. از PM2 برای اطمینان از در دسترس بودن سرویس، از Nginx برای مدیریت درخواست‌ها و از Certbot برای HTTPS استفاده کنید. برای محیط‌های پیچیده‌تر، کانتینرسازی با Docker و ارکستراسیون با Kubernetes گزینه‌های مناسبی هستند.

اگر بخواهید می‌توانم برای پروژه‌تان یک اسکریپت دیپلوی اتوماتیک یا فایل Docker/Docker Compose و کانفیگ Nginx مخصوص دامنه شما تهیه کنم.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: