ساخت سرویسهای متن باز 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 ما تردید نکنید. در غیر این صورت، می توانید با من چت کنید. من اینجا هستم تا کمک کنم و دوست دارم نظرات شما را بشنوم.
منتظر قسمت بعدی باشید. تا آن زمان، کد نویسی مبارک!