تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

استقرار یک برنامه NestJS با Postgres در سرور مجازی اوبونتو


۱۲ اردیبهشت ۱۴۰۴

راه‌اندازی یک اپلیکیشن NestJS در سرور مجازی اوبونتو، با دیتابیس PostgreSQL یکی از رایج‌ترین سناریوها در پروژه‌های بک‌اند می‌باشد. NestJS با ساختار ماژولار و پشتیبانی از TypeScript یک انتخاب مناسب و قدرتمند برای توسعه‌ی API‌ها محسوب می‌شود. از طرف دیگر، Postgres نیز یکی از پراستفاده‌ترین پایگاه‌داده‌ها است. در این مقاله، به شما آموزش می‌دهیم که چگونه یک REST API ساخته شده با NestJS را همراه با دیتابیس Postgres، در یک سرور VPS دیپلوی کنید. اگر قصد دارید پروژه خود را از حالت لوکال خارج کرده و روی سرور مجازی اوبونتو مستقر کنید، تا پایان این آموزش با ما همراه باشید.

پیش‌نیازها

قبل از اینکه وارد مراحل اصلی شوید، لازم است چند پیش‌نیاز را روی سرور خود داشته باشید تا بتوانید این آموزش را بطور کامل انجام دهید.

در ادامه بخوانید:

  • گام اول:نصب و پیکربندی PostgreSQL روی سرور
  • گام دوم: نصب Node.js و npm روی سرور
  • گام سوم: اتصال دامنه یا ساب‌دامنه به پروژه NestJS
  • جمع‌بندی
  • سوالات متداول
استقرار یک برنامه NestJS با Postgres در سرور مجازی اوبونتو

گام اول:نصب و پیکربندی PostgreSQL روی سرور

در گام اول دیتابیس Postgres را با دستور زیر نصب کنید:

sudo apt update
sudo apt install postgresql postgresql-contrib

حالا که دیتابیس Postgres روی سرور شما نصب شده، برای دسترسی به محیط PostgresSQL می‌توانید به کاربر postgres سوئیچ کنید. برای این‌کار دستور زیر را وارد کنید:

sudo -i -u postgres

اکنون که با کاربر Postgres وارد شدید، خیلی راحت می‌توانید با اجرای دستور زیر وارد شل (پوسته) Postgres شوید:

psql

در این محیط می‌توانید دیتابیس بسازید، یوزر تعریف کنید و کارهای مدیریتی زیادی روی PostgreSQL انجام دهید:

root@testapi:~# su - postgres
postgres@testapi:~$ psql
psql (14.12 (Ubuntu 14.12-0ubuntu0.24.04.1))
Type "help" for help.

postgres=#
آموزش کامل نحوه بکاپ‌گیری از دیتابیس PostgreSQL در سرور مجازی اوبونتو را می‌توانید در مقاله زیر بخوانید.
آموزش بکاپ گیری از PostgreSQL در اوبونتو 24.04

ساخت یوزر جدید در Postgres

برای ساخت کاربر جدید، دستور زیر را وارد کنید. به‌جای newuser نام دلخواه خودتان را قرار دهید:

CREATE USER newuser WITH PASSWORD 'password';

همینطور باید پسورد دلخواه خود را وارد کنید.

البته بعد از وارد کردن دستور بالا، از شما سوال می‌شود که آیا می‌خواهید به کاربر، دسترسی‌های Superuser دهید یا خیر:

postgres@testapi:~$ createuser --interactive --pwprompt
Enter name of role to add: admin
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) y

با فشردن کلید y، یک کاربر با دسترسی‌های Superuser ساخته می‌شود.

بعد از ایجاد یوزر، نوبت به ساخت یک دیتابیس و اختصاص دادن آن به یوزر می‌رسد. ابتدا وارد محیط psql شوید و دستورات زیر را وارد کنید:

sudo -u postgres psql

حالا دیتابیس جدیدی بسازید:

CREATE DATABASE mydatabase;

جای mydatabase اسم دیتابیس جدیدی است که می‌خواهید ایجاد کنید.

سپس یوزر خودتان را با دستور زیر به دیتابیس اختصاص دهید:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO admin;

در اینجا admin نام یوزر شماست که به دیتابیس mydatabase دسترسی داده می‌شود. برای اینکه مطمئن شوید همه چیز به‌درستی تنظیم شده است، دستور زیر را اجرا کنید:

\l

برای خروج از محیط psql از دستور زیر استفاده کنید:

\q
در لیارا فقط با یک کلیک و در چند ثانیه، دیتابیس PostgreSQL تهیه کنید.
✅ شبکه خصوصی ✅ منابع اختصاصی ✅ مدیریت آسان
خرید هاست ابری PostgreSQL

دسترسی به PostgreSQL از خارج از سرور (اختیاری)

حالا اگر بخواهید از خارج سرور VPS به دیتابیس‌تان دسترسی داشته باشید و از ابزارهایی مثل PG Admin یا هر ابزار دیگری استفاده کنید، می‌توانید مراحل زیر را انجام کنید:

فایل پیکربندی postgresql.conf را برای ویرایش باز کنید:

nano /etc/postgresql/12/main/postgresql.conf

در فایل بالا به دنبال listen_addresses = 'localhost' بگردید، این خط را از حالت کامنت خارج کنید و به listen_addresses = '*' تغییر دهید، سپس فایل را ذخیره کرده و خارج شوید. تغییرات به شکل زیر خواهد بود:

...
listen_addresses = '*'          # what IP address(es) to listen on;

اکنون دوباره، فایل پیکربندی زیر را باز کنید:

nano /etc/postgresql/12/main/pg_hba.conf

در فایل pg_hba.conf به بخش مربوط به IPv4 local connections بروید و در آن قسمت آی‌پی 127.0.0.1/32 را به 0.0.0.0/0 تغییر دهید. با این‌کار از آی‌‌پی‌های خارجی نیز به دیتابیس دسترسی خواهید داشت.

تغییرات به‌شکل زیر خواهد بود:

...
# IPv4 local connections:
host    all             all             0.0.0.0/0            md5
...

بعد از اتمام مراحل بالا برای خروج از کاربر Postgres، دستور زیر را وارد کنید:

exit

در آخر برای اجازه دادن به اتصالات ورودی به پورت 5432 (پورت پیش‌فرض Postgres) دستور زیر را وارد کنید تا تنظیماتی که تا الان انجام داده‌ایم، اعمال شده و سرویس Postgres ری‌استارت شود.

sudo ufw allow 5432/tcp
sudo systemctl restart postgresql

بعد از انجام تمام مراحل بالا، شما به پایگاه داده خود از خارج سرور دسترسی خواهید داشت.

هر آنچه باید درباره سرور مجازی، مزایا و کاربردهایش بدانید را می‌توانید در مقاله زیر مطالعه کنید.
سرور مجازی یا VPS چیست؟

گام دوم: نصب Node.js و npm روی سرور

حالا که تنظیمات دیتابیس را انجام دادید، قدم بعدی، نصب و راه‌اندازی Node.js می‌باشد.

دستورات زیر Node.js، npm، pm2 و NestJS را نصب می‌کنند:

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install pm2@latest -g
sudo npm i -g @nestjs/cli

توجه: یادتان باشد اگر هنوز از کاربر Postgres خارج نشدید، با تایپ دستور exit از کاربر Postgres خارج شوید.

در این مرحله فرض کنید، یک اپلیکیشن NestJS دارید که از PostgreSQL استفاده می‌کند و فولدر پروژه‌ی خود را Clone یا کپی کرده‌ و در home دایرکتوری قرار داده‌اید. حالا برای ادامه، وارد فولدر پروژه شوید و یک فایل .env در root فولدر ایجاد کنید تا تمام اطلاعات مربوط به دیتابیس در آن ذخیره شود.

فایل .env شامل اطلاعات مورد نیاز برای اتصال Nest JS به پایگاه‌داده خواهد بود. محتوای فایل .env به این شکل خواهد بود که در آن host به localhost اشاره دارد.

توضیح بقیه موارد فایل .env به صورت زیر است:

DB_HOST=127.0.0.1
DB_PORT=5432
DB_USERNAME=admin
DB_PASSWORD=admin
DB_NAME=jugaad

برای نصب وابستگی‌های پروژه و ساخت اپلیکیشن NestJS، دستورات زیر را وارد کنید:

npm i
nest build

نصب و راه‌اندازی PM2

برای اجرای اپلیکیشن NestJS با استفاده از PM2 در سرور VPS، دستور زیر را اجرا کنید:

pm2 start dist/main.js --name jugaadapi

دستور بالا، اپلیکیشن شما را اجرا می‌کند و پردازشی با نام jugaadapi در PM2 ثبت می‌شود.

همچنین برای مشاهده لاگ‌ها و مطمئن شدن از اجرای درست اپلیکیشن، دستور زیر وارد کنید:

pm2 log jugaadapi

اگر موقع اجرای اپلیکیشن با PM2 هیچ خطایی دریافت نکردید، یعنی همه تنظیمات درست انجام شده و اپلیکیشن شما در حال حاضر روی سرور مجازی فعال اوبونتو فعال است.

اما برای اطمینان بیشتر، دستور زیر را وارد کنید:

pm2 startup

خروجی این دستور، شامل دستور دیگری است:

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u your-username --hp /home/your-username

خط آخر این خروجی را در خط فرمان اجرا کنید تا تنظیمات ذخیره شوند.

در نهایت با دستور زیر، وضعیت فعلی اپلیکیشن‌ها را ذخیره کنید:

pm2 save

اگر تا اینجای آموزش را به‌طور کامل انجام داده باشید، اپلیکیشن NestJS‌ روی سرور مجازی اوبونتو اجرا شده و آماده‌ی استفاده می‌باشد.

تنها کاری که باقی‌مانده، اتصال دامنه یا ساب‌دامین به سرور VPS است. در ادامه به شما خواهیم گفت که چگونه این اتصال را برقرار کنید.

گام سوم: اتصال دامنه یا ساب‌دامین به پروژه NestJS

همانطور که در پیش‌نیازها گفتیم، باید تنظیمات فایروال را انجام داده باشید، اگر اینکار را انجام ندادید، دستورات زیر را وارد کنید:

sudo apt update
sudo apt install nginx -y
sudo ufw allow 'Nginx Full'
برای آموزش نصب کامل وب‌سرور Nginx در سرور مجازی اوبونتو Ubuntu به مقاله زیر مراجعه کنید.
نصب Nginx در سرور مجازی اوبونتو

توجه: کافی‌است در تنظیمات DNS دامنه‌تان، یک رکورد A بسازید و آی‌پی سرور را بدهید.

 اتصال دامنه یا ساب‌دامین به پروژه NestJS

در ادامه ما فرض می‌کنیم، Nginx را نصب کرده‌اید. وقت آن است که یک Server Block بسازیم تا بتوانیم از طریق دامنه یا ساب‌دامین به API دسترسی داشته باشیم. برای این‌کار بک فایل کانفیگ جدید در دایرکتوری /etc/nginx/sites-available می‌سازیم و به‌طور مثال نام آن را api-project می‌گذاریم.

sudo nano /etc/nginx/sites-available/api-project

محتوای فایل شبیه زیر می‌باشد:

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

    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;
    }
}

سپس، با دستور زیر فایل را به دایرکتوری sites-enabled لینک می‌دهیم:

sudo ln -s /etc/nginx/sites-available/api-project /etc/nginx/sites-enabled/

در آخر، با اجرای دستور زیر مطمئن می‌شویم، تنظیمات مشکلی ندارد و Nginx را ری‌استارت می‌کنیم:

sudo nginx -t
sudo systemctl restart nginx

به این‌صورت، درخواست‌هایی که به api.example.com می‌رسند، به اپلیکیشن NestJS شما روی پورت 3000 فوروارد می‌شوند.

همین الان، بدون کمترین پیچیدگی، سرور مجازی خودتون رو در کمتر از ۳۰ ثانیه، راه‌اندازی کنید.
✅ عملکرد پایدار ✅ ترافیک نامحدود ✅ هزینه به‌صرفه
خرید سرور مجازی اوبونتو

جمع‌بندی

در این آموزش از لیارا نحوه استقرار یک اپلیکیشن NestJS را بادیتابیس PostgreSQL روی سرور مجازی اوبونتو آموزش دادیم. از نصب پکیج‌ها و ساخت یوزر دیتابیس گرفته تا راه‌اندازی PM2 برای مدیریت پروسه‌ها و در آخر با پابلیش کردن API روی دامنه با Nginx.

✅ نصب و پیکربندی PostgreSQL
✅ ساخت یوزر و دیتابیس امن با دستورات تعاملی
✅ نصب NodeJS، Nest CLI و PM2
✅ ساخت فایل .env و بیلد کردن اپ
✅ راه‌اندازی اپ با PM2 و تنظیم اتوماتیک اجرا بعد از ریبوت
✅ نصب و پیکربندی Nginx برای دامنه
✅ تست کانفیگ و بالا آوردن نهایی API روی وب

سوالات متداول

چطور می‌توانم مطمئن شوم که PostgreSQL از بیرون سرور قابل دسترس است؟

کافیه از یه ابزار مثل telnet یا nc روی پورت 5432 تست اتصال بزنی. مثلاً:

telnet your-server-ip 5432

اگه اتصال برقرار شد یعنی تنظیمات listen_addresses و pg_hba.conf درسته و فایروال هم راه رو باز گذاشته.

ساخت یوزر با createuser بهتر است یا با SQL؟

اگر تازه‌کار هستید، createuser مناسب‌تر است، چون تعاملی و راحت‌تر است. ولی در غیر اینصورت، با دستور SQL مثل CREATE USER هم می‌توانید یوزر بسازید.

اگه بخواهم پورت پیش‌فرض PostgreSQL را عوض کنم چکار کنم؟

می‌توانید فایل تنظیمات PostgreSQL را ویرایش کنید و عدد پورت را تغییر دهید. بعد از آن حتماً سرویس را ری‌استارت کنید تا تغییرات اعمال شود.

به اشتراک بگذارید