NestJS کنٹینر کی تعیناتی
Node.js/Nest.js کی تعیناتی آسان بنائیں: Docker اور Google Cloud کی مرحلہ وار رہنمائی
کئی مراحل والے Node.js اور NestJS کنٹینرز، ناقابلِ تبدیلی آرٹیفیکٹس، اور Cloud Run تک فراہمی کے لیے Docker Hub اور Cloud Build میں درست انتخاب کی نظرثانی شدہ رہنمائی۔
پڑھنے کا وقت: 8 منٹتحریر Abdullah Raheel
Node.js یا NestJS خدمت کی تعیناتی
یہ تعیناتی کا وہ راستہ ہے جو میں نے 2023 میں NestJS مائیکرو سروس کے لیے استعمال کیا: Docker امیج بنانا، اسے GitHub Actions سے شائع کرنا، اور Cloud Run پر تعینات کرنا۔ اصل رہنمائی کے وہ حصے درست کر دیے ہیں جنہیں آج میں پروڈکشن میں نہیں بھیجوں گا۔
Docker، رن ٹائم، انحصارات اور ایپ کو ایک امیج میں بند کرتا ہے۔ اس سے مقامی، CI اور Cloud Run ماحول کا فرق کم ہوتا ہے، لیکن ترتیب اور بنیادی ڈھانچا پھر بھی مختلف ہوسکتے ہیں۔
یہ رہنمائی تین مراحل بیان کرتی ہے: امیج بنانا اور جانچنا، GitHub Actions اور Docker Hub کے ذریعے شائع کرنا، اور دستی نظرثانیاں یا مسلسل تعیناتی کے ذریعے Google Cloud پر تعینات کرنا۔
پیشگی ضروریات
- بلڈ شروع کرنے سے پہلے Docker نصب کریں۔
- Windows پر WSL (Windows Subsystem for Linux) نصب کریں تاکہ Docker مطلوبہ Linux ماحول استعمال کرسکے۔
- اگر WSL کی تنصیب نقص 0x80370114 سے ناکام ہو تو آگے بڑھنے سے پہلے مطلوبہ ورچوئلائزیشن خصوصیات فعال کریں۔
مرحلہ 1: Docker امیج بنائیں
2023 کی اصل رہنمائی میں ایک Node 18 Alpine مرحلہ تھا، پروڈکشن انحصارات نصب ہوئے، پھر اسی امیج میں Nest بلڈ چلائی گئی۔ یہ ترتیب قابلِ اعتماد NestJS بلڈ نہیں: TypeScript اور دوسرے بلڈ اوزار عموماً devDependencies میں ہوتے ہیں۔ درست امیج میں تالیف کو چلنے کے مرحلے سے الگ رکھا گیا ہے تاکہ بلڈ کو مکمل اوزار ملیں مگر وہ اوزار پروڈکشن تک نہ جائیں۔
FROM node:18-alpine AS build
WORKDIR /usr/src/app
# Copy manifests first so dependency layers can be reused.
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine AS runtime
ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /usr/src/app/dist ./dist
EXPOSE 8080
USER node
CMD ["node", "dist/main.js"]بلڈ مرحلہ npm ci استعمال کرتا ہے، جس کے لیے کَمٹ شدہ لاک فائل درکار ہے، اور منصوبے میں مقرر Nest اور TypeScript ورژنز سے تالیف کرتا ہے۔ چلنے کے مرحلے کو پروڈکشن انحصارات اور تیار شدہ نتیجہ ملتے ہیں، پھر امیج کے node صارف کے ذریعے روٹ اختیارات چھوڑ دیے جاتے ہیں۔
Dockerfile
.dockerignore
node_modules
npm-debug.log
distنظر انداز کی گئی فائلیں، Docker بلڈ کا سیاق چھوٹا رکھتی ہیں اور میزبان کے انحصارات یا موجودہ dist ڈائریکٹری کو امیج میں نقل ہونے سے روکتی ہیں۔
کنٹینر کو مقامی طور پر چلائیں اور جانچیں
امیج بنائیں اور تصدیق کریں کہ Docker نے اسے تیار کیا ہے۔
docker build --tag nest-microservice .
docker imagesپس منظر میں کنٹینر شروع کریں اور اس کا اندرونی پورٹ 8080 مقامی پورٹ 5000 سے جوڑیں۔ امیج شائع کرنے سے پہلے docker ps دیکھیں، HTTP ہیلتھ اینڈ پوائنٹ کو کال کریں، اور docker لاگز جانچیں۔
docker run -d --publish 5000:8080 --name nest-container nest-microservice
docker ps
docker ps --all
docker stop nest-containerمقامی امیج اور کنٹینر درست چلنے کے بعد Dockerfile اور .dockerignore کو GitHub ریپوزٹری میں پُش کریں۔
مرحلہ 2: GitHub Actions سے امیج شائع کریں
مسلسل انضمام کے لیے Node.js یا NestJS سورس والی GitHub ریپوزٹری اور Docker Hub اکاؤنٹ درکار ہے۔ Docker Hub کا ذاتی رسائی ٹوکن بنائیں، پھر اکاؤنٹ نام اور ٹوکن کو ریپوزٹری کی خفیہ قدروں میں DOCKERHUB_USERNAME اور DOCKERHUB_TOKEN کے نام سے محفوظ کریں۔
نیچے دیا گیا 2023 ورک فلو، main پر ہر پُش کے ساتھ چلتا، سورس حاصل کرتا، Docker Hub میں داخل ہوتا، Buildx فعال کرتا، جڑ کا Dockerfile بناتا، اور abdullahraheel/nest-microservice:latest پُش کرتا تھا۔ تاریخی ایکشن ورژنز سمیت اسے اصل اطلاق کے طور پر برقرار رکھا گیا ہے۔
name: ci
on:
push:
branches:
- "main"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/nest-microservice:latest- ورک فلو محفوظ کرکے کَمٹ کریں۔
- تبدیلی main پر پُش کریں تاکہ ورک فلو شروع ہو۔
- Actions کا اجرا دیکھیں اور جاب ناکام ہو تو عین اسی مرحلے کی تشخیص کریں۔
- تصدیق کریں کہ شائع شدہ ریپوزٹری اور ٹیگ، Docker Hub میں نظر آتے ہیں۔
مرحلہ 3: امیج کو Google Cloud Run پر تعینات کریں
Google Cloud پروجیکٹ بنائیں، Cloud Run کھولیں اور سروس بنائیں۔ دستی تعیناتی کے لیے Docker Hub امیج کو username/repository:tag کی صورت دیں، ریجن اور سروس سیٹنگز منتخب کریں، اور ریویژن بنائیں۔ مثالی امیج abdullahraheel/nest-microservice:latest ہے؛ اپنے ورک فلو سے بننے والی عین ریپوزٹری اور ٹیگ استعمال کریں۔
مسلسل تعیناتی کے لیے Cloud Build جوڑیں
- Create Service منتخب کریں اور Cloud Build کے ساتھ مسلسل تعیناتی قائم کرنے کا اختیار چنیں۔
- ریپوزٹری فراہم کنندہ اور ریپوزٹری منتخب کریں۔
- تعیناتی برانچ منتخب کریں؛ اس مثال میں main استعمال کریں۔
- بلڈ کی قسم Dockerfile منتخب کرکے اس کا راستہ دیں۔
- ترتیب محفوظ کریں اور خدمت بنائیں۔
رابطہ فعال ہونے کے بعد main میں مرج ہونے والی تبدیلیاں Cloud Build کو ریپوزٹری بنانے اور خدمت خود دوبارہ تعینات کرنے کا اشارہ دیتی ہیں۔ یہ مرحلہ 2 میں بننے والی Docker Hub امیج کی تعیناتی کا متبادل ہے، اسی آرٹیفیکٹ کا دوسرا صارف نہیں۔
خلاصہ اور حوالہ جات
- NestJS یا Node.js منصوبے کو Docker امیج بنائیں اور اس کا کنٹینر مقامی طور پر جانچیں۔
- فراہمی کا ایک راستہ چنیں: GitHub Actions سے ورژن شدہ امیج شائع کریں، یا Cloud Build کو منسلک ریپوزٹری بنانے دیں۔
- کسی عین امیج ریویژن کو دستی طور پر تعینات کریں، یا خودکار سروس ریویژنز کے لیے منسلک Cloud Build راستہ استعمال کریں۔
- مقررہ کام کے لیے بیرونی شیڈیولر یا سنگلٹن کنٹرول استعمال کریں؛ Cloud Run ویب انسٹینس فطری طور پر واحد مستقل cron ورکر نہیں۔

