نکات استقرار برنامه های مبتنی بر NestJS بر روی سرویس ابری لیارا


از اون جایی که همه سرویس هایی که خودم و مشتریانم داریم رو روی سرویس های لیارا میزبانی می کنیم خواستم چند نکته کاربری رو برای برنامه هایی که با nest توسعه داده شدند عرض کنم.


نکته مهم اینکه توی داکیومنت های لیارا توضیحی در مورد این موارد داده نشده و فقط باید به همون داکیومنت های بخش nodejs اکتفا کرد.

اما اگر زمانی بخواید اپ nest رو deploy کنید مشکلاتی وجود داره که راه حل هاش رو میگم.



1. پورت برنامه
در حالت پیشفرض ساخت یک برنامه nest پورت به صورت hard-code داخل فایل main.ts قرار داده شده. اما برای استقرار روی پلتفرم ها باید پورت رو از environment بگیرید. برای اینکار :

  • در فایل main.ts یک متغیر به صورت زیر تعریف کنید :
const port = process.env.PORT || 3000;
  • سپس قسمت listen رو به اینصورت تغییر بدید
await app.listen(port);
  • در تنظیمات برنامک قسمت متغیر ها یک متغیر به اسم PORT تعریف کنید و مقدار اون رو مثلا برابر با 3000 یا 8000 یا هر پورتی که مدنظرتون هست قرار بدید.
  • فایل liara.json در روت برنامه رو تعریف کنید و متغیر port رو برابر با پورت مورد نظر قرار بدید.


2. فایل package-lock.json

علت دقیق این موضوع رو نمی دونم اما وجود این فایل در روت برنامه باعث میشه deploy شما با خطاهای عجیب و غریب مواجه بشه. خطاها انقدر عجیب و غریب هست که دلیل خاصی برای اونها پیدا نکردم. پس قبل از deploy کردن یا این فایل رو حذف کنید یا از .liaraignore یا .gitignore کمک بگیرید و اون رو کلا ignore کنید.


3. شروع برنامه

سرویس لیارا مثل همه سرویس های دیگه برای شروع برنامه در داخل فایل package.json اول اسکریپت build رو صدا می زنه و بعد هم استارت. اما در حالت پیش فرض هیچ ارتباطی به هم ندارن. چون اسکریپتی که در start صدا زده میشه صرفا nest start هست که از پوشه build استفاده نمی کنه و بسیار کند هست و برای یک برنامه معمولی حداقل باید 1 گیگ رم داشته باشید. اسکریپت صحیح start:prod هست. راه ساده اینه که اسکریپت استارت رو به

&quotstart&quot: &quotnode dist/main&quot,

یا

&quotstart&quot: &quotnpm run start:prod&quot,

تغییر بدید.


اینجوری برای یک برنامه ساده چیزی در حدود 100 مگابایت رم نیاز خواهید داشت که با پلن اول لیارا هم قابل انجام هست که ماهیانه حدودا 45 هزار تومن هزینه داره.