برنامه نویسی

ساخت سرویس‌های متن باز PDF با Angular و GCP — خدمات را در Cloud Run اجرا کنید

به سفر ساخت سرویس PDF منبع باز با استفاده از Angular (Analogjs)، Firestore، Cloud Storage و CloudRun خوش آمدید. این پروژه به عنوان یک پلت فرم برای به اشتراک گذاشتن دانش من، یادگیری مداوم بهترین شیوه ها، و به طور همزمان کمک به جامعه عمل می کند.

بخش 1: بررسی اجمالی معماری
بخش 2: استقرار خدمات در Cloud Run

نسخه ی نمایشی: https://pdfun.xyz
GitHub: https://github.com/dalenguyen/pdfun

راه حل حول اکوسیستم GCP ساخته شده است، بهتر است پروژه را روی GCP مستقر کنید تا بتواند به خدمات آنها دسترسی داشته باشد. راه حل دو بخش دارد:

  • رابط کاربری وب (Analogjs – Angular): مدیریت تعامل با کاربر
  • Backend (Node – Express): پردازش فایل های PDF

چرا در Cloud Run مستقر شویم؟

Cloud Run یک پلت فرم محاسباتی کاملاً مدیریت شده توسط Google Cloud Platform (GCP) است که به طور خودکار کانتینرهای بدون حالت شما را مقیاس می کند. اما چرا باید Cloud Run را برای استقرار خدمات خود انتخاب کنیم؟ در اینجا چند دلیل وجود دارد:

  • Cloud Run به دلیل پشتیبانی از وظایف طولانی مدت، یک انتخاب عالی برای استقرار خدمات است. خدمات می توانند تا 60 دقیقه اجرا شوند و وظایفی را که نیاز به زمان محاسباتی قابل توجهی دارند، انجام دهند.
  • علاوه بر این، Cloud Run مزایایی مانند مقیاس‌بندی خودکار، محیطی مناسب برای توسعه‌دهنده، ثبت و نظارت یکپارچه، مدل قیمت‌گذاری پرداخت به ازای استفاده و قابلیت حمل در پلتفرم‌های مختلف را ارائه می‌دهد. این آن را به یک راه حل همه کاره و مقرون به صرفه برای استقرار سرویس PDF ما تبدیل می کند.

استقرار در Google Cloud Run با استفاده از Docker

Cloud Run با استفاده از یک تصویر docker برای استقرار سرویس خود، بنابراین کاری که ما باید انجام دهیم این است که برنامه های خود را در یک تصویر قرار دهیم.

پیش نیازها

قبل از شروع، مطمئن شوید که موارد زیر را دارید:

  • یک پروژه Google Cloud با فعال کردن صورت‌حساب.
  • Docker روی دستگاه محلی شما نصب شده است.
  • Google Cloud SDK نصب و راه اندازی شد.

لطفاً اسناد Deploying to Cloud Run را برای آموزش بیشتر دنبال کنید.

تصویر داکر خود را بسازید

در مرحله بعد، باید پروژه خود و تصویر داکر را بسازید. این را می توان با استفاده از دستور ساخت docker انجام داد. حتما تصویر خود را با نام رجیستری تگ کنید. مثلا:

// build-new-image.sh

imageTag=${REGION}-docker.pkg.dev/$GCLOUD_PROJECT/$REPO/$image

docker build -t $imageTag -f Dockerfile --platform linux/x86_64 .
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

REGIONS، GCLOUD_PROJECT، REPO و تصویر را به ترتیب با شناسه پروژه Google Cloud، نام تصویر و برچسب تصویر خود جایگزین کنید.

تصویر خود را به رجیستری مصنوع فشار دهید

هنگامی که تصویر شما ساخته شد، می توانید آن را با استفاده از دستور docker push به رجیستری Artifact فشار دهید:

docker push $imageTag
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک سرویس جدید در Cloud Run ایجاد کنید

با تصویر خود در حال حاضر در رجیستری Artifact، می توانید یک سرویس جدید در Cloud Run ایجاد کنید. برای استقرار سرویس PDF می توانید دستور زیر را اجرا کنید:

gcloud run deploy pdfun \
  --image=us-central1-docker.pkg.dev/pdfun-prod/pdf/pdfun \
  --platform=managed --project=pdfun-prod --region=us-central1 \
  --allow-unauthenticated
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور رابط کاربری وب با نام سرویس pdfun را در Cloud Run مستقر می کند و به همه اجازه می دهد به وب سایت دسترسی داشته باشند (--allow-unauthenticated).

امتیاز: استفاده از Nx برای استقرار خدمات

Nx یک چارچوب توسعه است که برای ساخت برنامه های کاربردی در داخل monorepos طراحی شده است. Monorepos حاوی چندین برنامه در یک مخزن Git است که به سازمان‌ها اجازه می‌دهد تا کدهایی مانند مؤلفه‌ها و کتابخانه‌های ابزار را در بین برنامه‌ها و تیم‌ها به اشتراک بگذارند. Nx بسیاری از موارد استفاده monorepo مانند سیستم‌های ساخت، ابزارهای داخلی و حافظه پنهان را مدیریت می‌کند.

وقتی نوبت به استقرار سرویس‌ها می‌رسد، Nx یک فرآیند ساده ارائه می‌دهد. پس از پیکربندی، تنها کاری که باید انجام دهم این است که yarn deploy را اجرا کنم تا فقط برنامه‌های تحت تأثیر مستقر شوند. به عنوان مثال، اگر من فقط frontend را به روز کنم، آنگاه frontend تنها برنامه ای است که ساخته و اجرا می شود.

پس از اجرای فرمان deploying در زیر هود چه اتفاقی می افتد:

npx nx affected -t deploy --base=main~1 --head=main
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور با مقایسه commit و آخرین commit در شاخه اصلی، deploy target را در پروژه.json برای پروژه‌های آسیب‌دیده اجرا می‌کند.

بیایید نگاهی به project.json برای برنامه pdfun:

// project.json

...

"deploy": {
  "executor": "nx:run-commands",
  "options": {
    "commands": ["nx deploy-docker pdf", "nx deploy-cloudrun pdf"],
    "color": true,
    "parallel": false
  },
  "dependsOn": [
    {
      "target": "build"
    }
  ]
},
"deploy-cloudrun": {
  "command": "gcloud run deploy pdfun --image=us-central1-docker.pkg.dev/pdfun-prod/pdf/pdfun --platform=managed --project=pdfun-prod --region=us-central1 --allow-unauthenticated"
},
"deploy-docker": {
  "command": "./build-new-image.sh --dir dist/pdf/analog --image pdfun",
  "parallel": false,
  "dependsOn": [
    {
      "target": "copy"
    }
  ]
},
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بنابراین، زمانی که deploy هدف اجرا می شود، دو دستور دیگر را راه اندازی می کند:

npx nx deploy-docker pdf
npx nx deploy-cloudrun pdf
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستورات به نوبه خود تصویر docker را می سازند، تصویر را فشار می دهند و سرویس Cloud Run را بر اساس تصویر آپلود شده در Artifact Registry مستقر می کنند.

در اینجا نتیجه است:

dalenguyen$ yarn deploy

yarn run v1.22.19
$ npx nx affected -t deploy --base=main~1 --head=main

 NX   Running target deploy for 2 projects and 3
 NX   Running target deploy for 2 projects and 3 tasks they depend on

   ✔  nx run domain:build (6s)
———————————————————————————————————————————————
   ✔  nx run pdf:build:production (17s)
———————————————————————————————————————————————
   ✔  nx run pdf:deploy (17s)
   ✔  nx run pdf-on-create:deploy (29s)
———————————————————————————————————————————————

 NX   Successfully ran target deploy for 2 projects and 3 tasks they depend on (37s)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

می بینید که با استفاده از کش ساخت، دو سرویس در حدود 1 دقیقه به صورت محلی ساخته و مستقر شدند!

سوالات؟

اگر سؤالی دارید یا به مشکلی برخوردید، لطفاً در ایجاد مشکل در مخزن GitHub ما تردید نکنید. در غیر این صورت، می توانید با من چت کنید. من اینجا هستم تا کمک کنم و دوست دارم نظرات شما را بشنوم.

منتظر قسمت بعدی باشید. تا آن زمان، کد نویسی مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا