رفتن به محتوا
پروژهvivid-visual-platformنوعSpecificationنسخه0.1وضعیتپیش‌نویس

استراتژی استقرار

استقرار Vivid Visual بر پایه Kubernetes در زیرساخت میزبانی‌شده داخل ایران طراحی شده است. همه سرویس‌ها Dockerize شده‌اند، با Helm به کلاستر منتقل می‌شوند و در مسیر توسعه از Skaffold برای تکرار سریع استفاده می‌شود.

flowchart LR
  DEV[توسعه + Skaffold] --> BUILD[Build CI]
  BUILD --> IMG[Docker Image]
  IMG --> REG[رجیستری خصوصی]
  REG --> HELM[Helm Release]
  HELM --> K8S[کلاستر Kubernetes]
  K8S --> STG[Staging]
  STG --> PRD[Production]

زیرساخت استقرار در ایران

Section titled “زیرساخت استقرار در ایران”

پلتفرم روی کلاستر Kubernetes اختصاصی مستقر می‌شود که روی سرورهای فیزیکی/اختصاصی داخل ایران ساماندهی شده است. این رویکرد اهداف زیر را پوشش می‌دهد:

  • اقامت داده: داده‌های کاربران، تراکنش و محتوا در مرز ایران نگه داشته می‌شود.
  • کنترل عملیاتی: تیم پیمانکار مالک topology کلاستر، سیاست backup و برنامه ظرفیت است.
  • جداسازی محیط: namespace یا سگمنت شبکه جدا برای dev، staging و production.

توپولوژی پیشنهادی در سطح قرارداد:

لایهنقش
Control Planeمدیریت API، scheduler و etcd کلاستر
Worker Nodesاجرای podهای سرویس‌های Angular، .NET و Python
Data PlanePostgreSQL، Redis، Kafka، Elasticsearch (managed یا cluster داخلی)
EdgeIngress/TLS و توزیع ترافیک عمومی

تعداد دقیق node، مشخصات سخت‌افزار، آدرس‌دهی شبکه و نحوه راه‌اندازی اولیه control plane جزئیات داخلی پیمانکار است و در مستندات مشتری منتشر نمی‌شود.

هر سرویس یک image مستقل دارد. imageها immutable هستند: پس از build تغییر نمی‌کنند؛ فقط tag جدید جایگزین می‌شود. قبل از deploy:

  • اسکن آسیب‌پذیری image
  • تست smoke در container staging
  • ثبت نسخه در release notes داخلی

استقرار production از طریق Helm انجام می‌شود، نه deploy دستی pod. هر release شامل chart version، image tag و checksum config است. در صورت خطا، helm rollback به revision پایدار قبلی اجرا می‌شود.

کاربرد: سرویس‌های کم‌ریسک که توقف کوتاه یا تعویض تدریجی pod برایشان قابل قبول است.

نحوه کار: Kubernetes به‌تدریج podهای قدیمی را با نسخه جدید جایگزین می‌کند. maxUnavailable و maxSurge طوری تنظیم می‌شود که حداقل یک replica سالم همیشه در دسترس باشد. readiness probe قبل از دریافت ترافیک، سلامت pod را تایید می‌کند.

سرویس‌های مناسب:

  • CMS و صفحات محتوایی
  • Analytics و Reporting
  • CRM (غیر از windowهای کمپین حساس)
  • HR و Job Portal در ساعات کم‌ترافیک
  • سرویس‌های پشتیبان و workerهای غیرحیاتی

مزایا: ساده، سریع، مصرف منابع کمتر از Blue/Green.

ریسک‌ها: در انتشار بد، بخشی از کاربران ممکن است نسخه معیوب را ببینند تا rollback انجام شود. برای همین سرویس‌های درآمدی در این مدل قرار نمی‌گیرند.

مدل انتشار: Blue/Green Deployment

Section titled “مدل انتشار: Blue/Green Deployment”

کاربرد: ماژول‌های درآمدی و حیاتی که هر ثانیه downtime یا ناسازگاری نسخه می‌تواند مستقیماً روی درآمد اثر بگذارد.

نحوه کار: دو محیط موازی (Blue = فعال، Green = کاندید) نگه داشته می‌شود. نسخه جدید روی Green مستقر و با تست smoke، تست پرداخت آزمایشی و بررسی migration دیتابیس اعتبارسنجی می‌شود. سپس ترافیک production یک‌جا (یا به‌صورت کنترل‌شده) به Green منتقل می‌شود. Blue برای rollback فوری آماده می‌ماند.

سرویس‌های اجباری Blue/Green:

  • Commerce Service (سبد، سفارش، پرداخت، اشتراک)
  • Player Service در بازه‌های کمپین و فروش دوره
  • API Gateway در انتشارهایی که قرارداد API را تغییر می‌دهند
  • Learning Service هنگام تغییر سیاست دسترسی یا قیمت‌گذاری

پیش‌نیازهای اضافی Blue/Green:

  • migration دیتابیس backward-compatible
  • تست end-to-end پرداخت در staging با درگاه آزمایشی
  • هماهنگی با تیم محصول برای freeze کوتاه تغییرات قیمت
سرویسمدلدلیل
CommerceBlue/Greenحساسیت مستقیم درآمد
LearningBlue/Green در release بزرگدسترسی دوره و قیمت
PlayerBlue/Green در کمپینتجربه پخش و Upsell
CRMRollingریسک متوسط، rollback سریع کافی است
CMSRollingمحتوا، بدون تراکنش مالی
AnalyticsRollingتأخیر چند دقیقه‌ای قابل تحمل
AI WorkerRollingصف async، بدون مسیر همزمان کاربر

Skaffold ابزار توسعه است، نه ابزار production. تیم فنی با آن روی کلاستر dev/staging داخلی iterate می‌کند: build image محلی یا remote، deploy خودکار، log و port-forward. این کار از ناهماهنگی بین Dockerfile و محیط واقعی جلوگیری می‌کند.

مشتری یا تیم محصول Vivid Visual نیازی به دانستن پروفایل Skaffold ندارد؛ خروجی نهایی همان image تاییدشده CI و Helm release است.

  • عبور pipeline از تست خودکار (unit، integration حیاتی)
  • تایید smoke test در staging با داده نزدیک به production
  • تایید سلامت migration و backup اخیر دیتابیس
  • بررسی changelog و تایید Product Owner برای ماژول‌های درآمدی
  • وجود runbook rollback و مسئول on-call
  • ۳۰ دقیقه اول: پایش error rate، latency p95 و saturation pod
  • ۲۴ ساعت اول: KPI فروش، نرخ تکمیل دوره، نرخ خطای پرداخت
  • ۷۲ ساعت: مقایسه با baseline قبل از release
  • در صورت افت شاخص حیاتی: rollback فوری به revision یا محیط Blue

مهاجرت از WordPress / WooCommerce به پلتفرم جدید

Section titled “مهاجرت از WordPress / WooCommerce به پلتفرم جدید”

سایت عملیاتی فعلی Vivid Visual بر پایه WordPress با WooCommerce و افزونه‌های جانبی (LMS، لایسنس، SEO، فرم‌ها و …) است. راه‌اندازی پلتفرم جدید بدون از دست رفتن کاربر، سفارش، محتوا و لایسنس‌های پلیر/دوره‌ای که قبلاً توزیع شده، نیازمند برنامه مهاجرت جدا از deploy معمولی است.

  • انتقال کاربران به Keycloak با حفظ هویت مبتنی بر ایمیل
  • انتقال entitlementهای خرید (دوره، اشتراک، لایسنس پلیر)
  • انتقال محتوای وب (صفحات، مقالات، رسانه) به CMS جدید
  • حفظ SEO با redirect 301 از URLهای قدیمی
  • cutover کنترل‌شده با امکان rollback به WP در بازه محدود

فاز ۰ — کشف و موجودی (۲ تا ۳ هفته)

Section titled “فاز ۰ — کشف و موجودی (۲ تا ۳ هفته)”

قبل از هر ETL، موجودی دقیق سیستم فعلی ثبت می‌شود:

حوزهمنابع معمول در WPخروجی کشف
کاربرانwp_users، wp_usermetaتعداد، نقش‌ها، duplicate email
فروشWooCommerce orders، subscriptionsSKUها، وضعیت پرداخت، اشتراک فعال
آموزشLearnDash / Tutor / MemberPress / سفارشیدوره‌ها، پیشرفت، enrollment
لایسنسEDD License، WC Software Add-on، customکلیدها، فعال‌سازی، انقضا
محتواposts، pages، media libraryحجم، ساختار، shortcodeها
پلیرCDN/S3 فعلی، meta ویدیومسیر فایل، DRM فعلی

خروجی: سند Mapping تأییدشده + لیست افزونه‌های واقعاً استفاده‌شده (نه فقط نصب‌شده).

flowchart TD
  WP[WordPress + WooCommerce] --> DISC[کشف و استخراج]
  DISC --> STG[Staging PostgreSQL]
  DISC --> KC[Keycloak Staging]
  STG --> VAL[اعتبارسنجی و Reconciliation]
  KC --> VAL
  VAL --> UAT[UAT با کاربران نمونه]
  UAT --> CUT[Cutover Blue/Green]
  CUT --> NEW[پلتفرم Vivid Visual]
  WP -.->|آرشیو read-only 30 روز| ARCH[WP Archive]

استخراج داده — مسئولیت‌ها

Section titled “استخراج داده — مسئولیت‌ها”

کارفرما (Vivid Visual) داده خام یا export استاندارد را فراهم می‌کند:

  • دسترسی read-only به دیتابیس WP (یا dump امن)
  • دسترسی پنل WooCommerce برای گزارش سفارش/اشتراک
  • استخراج فایل CSV لایسنس طبق قالب سند ۱۴ (پلیر) و ۳۱ (کاربران)
  • فهرست URLهای مهم برای redirect
  • تایید نگاشت محصول قدیمی → محصول جدید (SKU mapping)

Rebati ETL، پاک‌سازی، import به staging، تست و cutover را اجرا می‌کند. اسکریپت‌ها و runbook داخلی جزء تحویل عمومی نیستند.

مهاجرت دیتابیس (MySQL WP → PostgreSQL)

Section titled “مهاجرت دیتابیس (MySQL WP → PostgreSQL)”
دامنه WP/WCجدول/منبعمقصد PostgreSQL
مشتریwc_customer_lookup / userscommerce.customers + legacy_user_id
سفارشwc_orderscommerce.orders (وضعیت تاریخی)
محصولwc_productscommerce.products
اشتراکwcs_subscriptionscommerce.subscriptions
دورهLMS tableslearning.courses + enrollments
پیشرفتLMS progress metalearning.lesson_progress
لایسنسlicense plugin tablescommerce.licenses + legacy_licenses
CRM (در صورت افزونه)leads metacrm.leads

اصول:

  • import اولیه در staging؛ production فقط پس از reconciliation
  • هر رکورد legacy دارای external_id از WP (order_id، user_id، license_key)
  • سفارش‌های قدیمی read-only هستند؛ سفارش جدید فقط در سیستم جدید ثبت می‌شود

جزئیات در سند ۳۱ (احراز هویت). خلاصه cutover:

  1. import کاربران به realm production Keycloak
  2. ارسال ایمیل «حساب شما منتقل شد — رمز جدید تنظیم کنید»
  3. غیرفعال کردن فرم login در WP (یا maintenance mode)
  4. فعال‌سازی OIDC در دامنه اصلی

مهاجرت لایسنس پلیر و دسترسی توزیع‌شده

Section titled “مهاجرت لایسنس پلیر و دسترسی توزیع‌شده”

جزئیات در سند ۱۴ (پلیر). خلاصه:

  • کارفرما کلیدهای فعال را extract می‌کند
  • Rebati validate می‌کند: تعداد active قبل = بعد
  • API پلیر در grace period هر دو منبع را می‌پذیرد
  • پس از ۹۰ روز، فقط منبع جدید (مگر استثناء قراردادی)
  • صفحات و مقالات: HTML → Markdown/بلاک CMS (دستی + نیمه‌خودکار)
  • تصاویر و فایل‌ها: media library → S3 با حفظ نام یا mapping
  • ویدیوهای دوره: انتقال به bucket پلیر جدید؛ به‌روزرسانی URL در lesson
  • shortcodeهای WP: جایگزین با کامپوننت Angular یا حذف تدریجی
  • جدول redirect 301 از /old-path به /new-path در Ingress
  • حفظ slugهای مهم در صورت امکان
  • ثبت در Search Console پس از cutover
  • sitemap جدید در Angular SSR
روزفعالیت
T-14freeze تغییرات محصول/قیمت در WP
T-7import نهایی staging + UAT کامل
T-3اعلام به کاربران (ایمیل + بنر سایت)
T-0 شبWP به read-only، import نهایی delta، switch DNS به Green
T+1پایش 24/7: login، پرداخت، پخش، لایسنس
T+7گزارش reconciliation رسمی
T+30خاموش کردن grace legacy (در صورت پایداری)

Cutover ماژول Commerce و Player با Blue/Green انجام می‌شود؛ WP تا ۳۰ روز به‌صورت آرشیو زنده می‌ماند.

اگر در ۴۸ ساعت اول شاخص حیاتی شکست بخورد:

  1. برگرداندن DNS به WP (Blue)
  2. توقف OIDC در وب جدید
  3. اعلام به کاربران
  4. تحلیل root cause قبل از تلاش مجدد

آنچه در این سند نیست (اجرای داخلی Rebati)

Section titled “آنچه در این سند نیست (اجرای داخلی Rebati)”
  • کوئری‌های SQL دقیق هر افزونه
  • اسکریپت ETL و ترتیب transaction
  • نمونه credential و اتصال دیتابیس
  • ابزار one-off برای parse shortcode

محرمانه — خارج از مستندات تحویلی

Section titled “محرمانه — خارج از مستندات تحویلی”

موارد زیر عمداً در این سند نیامده‌اند و در اختیار تیم پیمانکار (Rebati) نگهداری می‌شوند:

  • مشخصات دقیق سرورها و IPهای داخلی
  • دستورات bootstrap کلاستر و hardening سطح OS
  • محتوای کامل values/secret و runbook داخلی
  • تنظیمات دقیق Skaffold profile و hookهای اختصاصی خط لوله
  • «دستور پخت» اتوماسیون‌های خاص تیم (secret recipe)

این محدودیت عمدی است: مشتری شفافیت در چه چیزی مستقر می‌شود و چه تضمینی دارد را می‌بیند؛ جزئیات اجرایی که امنیت یا مزیت رقابتی عملیاتی را تحت تأثیر قرار می‌دهد، منتشر نمی‌شود.