Loading...

CONTAINER APPS · مطالعه موردی

از docker-compose.yml تا یک اپلیکیشن زنده — در پنل و با cdnctl

یک راهنمای کامل و کپی-پیست برای توسعه‌دهندگانی که می‌خواهند پلتفرم را سریع امتحان کنند. یک پروژه چندسرویسی کوچک اما واقع‌گرایانه — یک API وب، یک worker پس‌زمینه، و Postgres + Redis مدیریت‌شده — را برمی‌داریم و مستقیماً از یک docker-compose.yml واحد روی CDN.com.tr Managed Containers اجرا می‌کنیم. همین سناریو به دو روش نشان داده شده: کلیک-و-اجرا از پنل مدیریت، و سرتاسر با ابزار خط فرمان cdnctl. هرکدام را که ترجیح می‌دهید انتخاب کنید.

در پایان چه چیزی به‌دست می‌آورید

دو اپ مدیریت‌شده (web، worker)، هرکدام متصل به یک افزونه Postgres و Redis مدیریت‌شده، و اپ وب زنده روی ساب‌دامین مخصوص به خودش https://<uid>.cdn.com.tr — همه از فایل compose ساخته شده، بدون Dockerfile یا YAML برای Kubernetes.

پروژه نمونه

سرویس web بازدیدها را در Postgres می‌شمارد و آخرین شمارش را در Redis کش می‌کند؛ worker یک حلقه پس‌زمینه بدون پورت است که همان افزونه‌های مدیریت‌شده را به‌اشتراک می‌گذارد. هر دو ایمیج از قبل ساخته شده و به رجیستری‌ای که پلتفرم می‌تواند pull کند push شده‌اند (برای linux/amd64 ساخته شده‌اند). پلتفرم جزئیات اتصال را به‌طور خودکار تزریق می‌کند — کد شما فقط DATABASE_URL و REDIS_URL را می‌خواند.

# docker-compose.yml
services:
  web:
    image: mediatriple/compose-demo-web:1.0.0
    ports:
      - "8080:8080"          # container port 8080 is exposed; the host side is ignored
    environment:
      APP_NAME: "Compose Demo"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
    depends_on: [db, cache]

  worker:
    image: mediatriple/compose-demo-worker:1.0.0   # no port -> stays private
    depends_on: [db, cache]

  db:
    image: postgres:16     # -> managed Postgres add-on (DATABASE_URL injected)

  cache:
    image: redis:7         # -> managed Redis add-on (REDIS_URL injected)

سرویس‌ها چگونه نگاشت می‌شوند. هر سرویس با یک ایمیج از قبل ساخته‌شده تبدیل به یک اپ مدیریت‌شده می‌شود. سرویس‌هایی که ایمیج آن‌ها postgres، mysql/mariadb، redis یا nats است تبدیل به افزونه مدیریت‌شده می‌شوند و به هر اپی که depends_on آن‌هاست متصل می‌شوند — هر اپ مصرف‌کننده نمونه افزونه مخصوص خودش را می‌گیرد، با اعتبارنامه‌های تزریق‌شده به‌صورت env (DATABASE_HOST/PORT/NAME/USER، REDIS_URL) و secret (DATABASE_PASSWORD، DATABASE_URL). سرویسی با build: (بدون ایمیج از قبل ساخته‌شده) رد می‌شود — ابتدا یک ایمیج منتشر کنید. حداکثر ۲۰ سرویس.

A · از پنل

۱ · Container Apps را باز کنید

وارد شوید، CDN Accounts را باز کنید، روی آیکن تنظیمات در حساب خود کلیک کنید و تب Platforms، سپس Container Apps را انتخاب کنید (بار اول روی Activate بزنید). نمای کلی محدودیت‌های بسته شما و یک فهرست اپ خالی را نشان می‌دهد.

نمای کلی Container Apps با محدودیت‌های بسته اعمال‌شده
نمای کلی: محدودیت‌های اعمال‌شده (اپ / object-storage / Redis / DB)، شمارنده‌های افزونه، و Create App.

۲ · (ایمیج‌های خصوصی) یک اعتبارنامه رجیستری اضافه کنید

اگر ایمیج‌های شما خصوصی‌اند، Create App را باز کنید و در ردیف Private registry credential، یک نام، URL رجیستری (https://index.docker.io/v1/ برای Docker Hub)، نام کاربری‌تان و یک توکن دسترسی فقط-خواندنی اضافه کنید، سپس ذخیره کنید. توکن به‌صورت رمزنگاری‌شده ذخیره می‌شود و دیگر نمایش داده نمی‌شود. ایمیج‌های عمومی به هیچ اعتبارنامه‌ای نیاز ندارند.

فرم ساخت container app با ردیف اعتبارنامه رجیستری
پنل Create-App. تب Import From Docker Compose کنار Create است؛ اعتبارنامه رجیستری درست بالای آن قرار دارد.

۳ · Import From Docker Compose

به Import From Docker Compose بروید، سپس docker-compose.yml خود را آپلود یا جای‌گذاری کنید (حداکثر ۲۵۶ کیلوبایت).

پنجره وارد کردن Docker Compose
فایل compose را جای‌گذاری کنید. اعتبارنامه رجیستری ذخیره‌شده برای ایمیج‌های خصوصی متصل می‌شود.
فایل compose جای‌گذاری‌شده در جعبه وارد کردن
فایل compose در جای خود — آماده پیش‌نمایش.

۴ · برنامه را پیش‌نمایش کنید

روی Preview کلیک کنید. پلتفرم فایل را تجزیه می‌کند و یک برنامه غیرمخرب نشان می‌دهد: هر اپی که خواهد ساخت، ایمیج/پورت/رپلیکاها، افزونه‌های متصل، و هر هشداری — بدون دست‌زدن به هیچ‌چیز هنوز.

برنامه پیش‌نمایش وارد کردن compose
برنامه: web (پورت ۸۰۸۰) و worker، هرکدام با یک افزونه Redis + Postgres. هشدار اشاره می‌کند که نگاشت‌های پورت میزبان نادیده گرفته می‌شوند — اپ‌ها را از طریق جریان expose/domain پلتفرم منتشر می‌کنید.

۵ · اعمال کنید، استقرار را تماشا کنید

I have reviewed this plan را علامت بزنید و روی Apply Import کلیک کنید. Apply یا همه یا هیچ است؛ اپ‌ها و افزونه‌ها ساخته می‌شوند و استقرارها در صف قرار می‌گیرند. ظرف یک دقیقه اپ‌ها در فهرست Your apps به running تغییر می‌کنند.

دو container app در حال اجرا پس از وارد کردن
هر دو اپ (web و worker) در فهرست Your apps در حال اجرا هستند. یک اپ را باز کنید (Manage →) تا به افزونه‌های آن و عمل Expose on cdn.com.tr برسید.

۶ · اپ وب را منتشر کنید

اپ web را باز کنید (Manage →) و روی Expose on cdn.com.tr کلیک کنید تا یک ساب‌دامین آنی <uid>.cdn.com.tr تولید شود (HTTPS برای شما مدیریت می‌شود). worker را خصوصی بگذارید. همین — پروژه compose شما زنده است. نتیجه را ببینید ↓

B · از ترمینال (cdnctl)

هر مرحله بالا معادل CLI دارد. cdnctl را نصب کنید، سپس:

۱ · وارد شوید و حساب خود را پیدا کنید

cdnctl login --email you@example.com --password '••••••'
cdnctl accounts list                 # copy your account <uuid>

۲ · برنامه را پیش‌نمایش کنید

همان برنامه غیرمخرب پنل — اپ‌ها، افزونه‌ها و هشدارها را به‌صورت JSON برمی‌گرداند. پیش‌نمایش همیشه فقط کلیدهای env/secret را برمی‌گرداند، هرگز مقادیر را نه.

cdnctl container compose preview --account <uuid> --file docker-compose.yml

۳ · اعمال کنید

دوباره سمت سرور برنامه‌ریزی می‌کند (به برنامه سمت کلاینت هرگز اعتماد نمی‌شود)، حقوق بسته شما را اعمال می‌کند، سپس اپ‌ها را به ترتیب وابستگی می‌سازد.

cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes

ایمیج‌های خصوصی. یک اعتبارنامه رجیستری را یک‌بار بسازید (پنل → Private registry credential، یا API)، و آن را به اپ‌ها متصل کنید تا پلتفرم بتواند pull کند — ایمیج‌های عمومی به چیزی نیاز ندارند.

۴ · تماشا کنید، منتشر کنید، بررسی کنید

cdnctl container apps list   --account <uuid>
cdnctl container apps wait   --account <uuid> --app <app_uuid> --status running --timeout 300
cdnctl container apps expose --account <uuid> --app <app_uuid>   # -> <uid>.cdn.com.tr
cdnctl container apps logs   --account <uuid> --app <app_uuid> --tail 100
cdnctl container apps status --account <uuid> --app <app_uuid>

نتیجه

اپ وب روی ساب‌دامین cdn.com.tr خود زنده است — شمارنده بازدید در افزونه Postgres مدیریت‌شده ماندگار است، در افزونه Redis مدیریت‌شده کش شده؛ هر دو connected گزارش می‌دهند، توسط یک رپلیکای مدیریت‌شده سرویس‌دهی می‌شود.

اپلیکیشن دمو مستقرشده در حال اجرا روی یک ساب‌دامین cdn.com.tr
اپلیکیشن در حال اجرا، وارد‌شده از docker-compose.yml و سرویس‌دهی‌شده روی <uid>.cdn.com.tr.

یک نکته درباره وضعیت مشترک. چون هر اپ Postgres/Redis مدیریت‌شده مخصوص خودش را می‌گیرد، worker در پایگاه‌داده‌ای متفاوت از آنچه web می‌خواند می‌نویسد. برای اشتراک‌گذاری واقعی یک پایگاه‌داده SQL، بگذارید یک اپ مالک آن باشد و بقیه از طریق شبکه خصوصی با نام اپ به آن برسند (http://<app-name>:<port>)، دقیقاً مانند یک سرویس compose. بک‌اندهای بدون رمز عبور (Redis، NATS) را می‌توان با تنظیم URL آن‌ها به‌عنوان env روی هر مصرف‌کننده به‌اشتراک گذاشت.