SCRIPTS · BOOTSTRAP

bring_up.sh — راه‌اندازی مرحله‌ای استک

← بازگشت به فهرست اسکریپت‌ها


مسیر فایل: scripts/bring_up.sh


۱. کاراییش به زبان ساده

این اسکریپت همان دکمهٔ «پروژه را برایم بالا بیاور» است؛ ولی دیگر همه‌چیز را با یک docker compose up -d واحد روشن نمی‌کند. روی ماشین تازه یا سرور نصب‌شده اجرا می‌شود، فایل‌های محیطی گم‌شده را از نمونه‌ها می‌سازد (بدون بازنویسی فایل‌های موجود)، اعتبارنامه‌های خالی Postgres را پر می‌کند، سپس استک را مرحله‌به‌مرحله بالا می‌آورد: اول زیرساخت، بعد فقط app-api، بعد ثبت اپ‌های اولیه با seed_apps.sh، و در نهایت بقیهٔ سرویس‌های پیش‌فرض (از جمله crawler و storage-consumer). هدف این ترتیب این است که اولین چرخهٔ crawl با لیست اپ‌های ازپیش‌ثبت‌شده شروع شود، نه با دیتابیس خالی. در پایان، مگر با --skip-check، Smoke Test زیرساخت (check_infra.sh) را اجرا می‌کند. نصب Docker روی سیستم‌عامل را انجام نمی‌دهد؛ آن کار عمداً به اپراتور یا Ansible سپرده شده است.


۲. کجا در پروژه کلی استفاده می‌شود؟

  • نقطهٔ ورود توصیه‌شده برای راه‌اندازی اولیه و بالا آوردن روزمرهٔ استک (طبق docs/setup.md و فهرست اسکریپت‌ها).
  • همان اسکریپتی که نقش deploy در Ansible صدا می‌زند (./scripts/bring_up.sh --skip-check)؛ بنابراین ترتیب seed قبل از crawler روی سرور هم اعمال می‌شود.
  • جایگزین فراخوانی دستی و پراکندهٔ docker compose up برای اپراتورهایی که می‌خواهند env، wait، seed و smoke check یک‌جا انجام شود.
  • با فلگ --with-cycle-reports سرویس Compose به نام cycle-reporter را هم فعال می‌کند که داخلش finalize_cycle_reports.py در حلقه اجرا می‌شود.
  • با فلگ --infra-only فقط لایهٔ داده و ابزارهای کمکی را بالا می‌آورد (بدون app-api / seed / crawler) تا توسعهٔ host/venv روی App API و Crawler ممکن باشد.
  • نیمهٔ Shell از «نصب و راه‌اندازی» است؛ نیمهٔ Ansible در پوشهٔ ansible/ عمداً جدا مانده و اینجا صدا زده نمی‌شود.

۳. چیکارا می‌کند؟ (جریان مرحله‌ای)

در حالت کامل (بدون --infra-only) ترتیب ثابت است. سرویس‌های پروفایل tools و test در گام آخر با up عادی بالا نمی‌آیند.

مرحلهچه چیزی بالا می‌آید / اجرا می‌شودمنتظر چه چیزی می‌ماند
۰ — پیش‌نیاز و env docker / Compose روی PATH؛ ساخت .envهای گم‌شده از *.env.example؛ پر کردن Postgres خالی و آینه به envهای host-side مربوط به app_api و storage_consumer. —
۱ — زیرساخت postgres، zookeeper، kafka، kafka-init، kafka-ui، metabase Postgres آماده؛ وجود/ساخت idempotent دیتابیس metabase_app_db؛ سلامت Metabase (با بودجهٔ retry بلند)؛ Kafka؛ اتمام موفق kafka-init
۲ — فقط app-api docker compose up -d app-api (و در صورت نیاز --build) healthcheck کانتینر project_app_api سبز شود
۳ — Seed اپ‌ها اجرای ./scripts/seed_apps.sh از روی host با APP_API_PORT خوانده‌شده از root .env اگر حداقل یک [FAIL] واقعی باشد، bring_up با exit غیرصفر قطع می‌شود (قبل از بالا آوردن crawler)
۴ — بقیهٔ استک پیش‌فرض storage-consumer، crawler؛ و در صورت --with-cycle-reports سرویس cycle-reporter. فهرست سرویس‌ها صریح است تا پروفایل‌های tools / test ناخواسته فعال نشوند. سلامت storage-consumer
۵ — Sentiment (اختیاری) اگر image از قبل موجود playpulse-sentiment:latest باشد: compose --profile tools up -d --no-build sentiment؛ وگرنه skip بدون cold-build. —
۶ — Smoke scripts/infra/check_infra.sh (مگر --skip-check) exit معنادار از smoke

چرا این ترتیب؟ Crawler در شروع چرخه لیست اپ‌های فعال را از App API می‌گیرد. اگر crawler همزمان با app-api (روی DB خالی) بالا بیاید، اولین چرخه با total=0 تمام می‌شود. Seed بین «app-api سالم» و «شروع crawler» این شکاف را می‌بندد.

حالت --infra-only: فقط مرحلهٔ ۰ و ۱؛ بدون app-api، seed، crawler، consumer و sentiment.

آنچه bring_up عمداً انجام نمی‌دهد:

  • فعال کردن پروفایل test (سرویس‌های *-tests).
  • فعال کردن پروفایل tools برای network-analyzer — آن job دسته‌ای است و باید جداگانه با docker compose --profile tools run --rm network-analyzer صدا زده شود.
  • cold-build کردن image سنتیم‌نت؛ فقط در صورت وجود قبلی ممکن است کانتینر را با --no-build بسازد.

۴. تصمیمات معماری

  • Staged startup به‌جای یک up واحد: تضمین ترتیب وابستگی داده (registry پر → crawler) فراتر از depends_on که فقط «کانتینر سالم» را تضمین می‌کند، نه «داده seed شده».
  • جدا بودن از Ansible: نصب OS/Docker کار provisioning است؛ این اسکریپت فقط bootstrap داخل مخزن کلون‌شده است تا مرز مسئولیت شفاف بماند.
  • هرگز overwrite نکردن .env: جلوگیری از از دست رفتن تنظیمات اپراتور روی سرور زنده.
  • آینه‌کردن credentials: یک منبع حقیقت برای Postgres در root .env، و همگام‌سازی envهای host تا تست/اجرای محلی گیر نکند.
  • Metabase در INFRA نه APP: مثل Kafka UI یک ابزار ops است، فقط به Postgres سالم نیاز دارد، و در حالت --infra-only هم مفید است.
  • فهرست صریح سرویس‌ها در گام آخر: تا cycle-reporter فقط با فلگ بیاید و پروفایل‌های tools/test دست‌نخورده بمانند.
  • Sentiment بدون cold-build: همان قرارداد run_tests_in_docker.sh؛ build سنگین مدل فقط وقتی اپراتور عمداً compose --profile tools build sentiment زده باشد.
  • Wait قبل از smoke و قبل از seed: «کانتینر بالا آمده» با «سرویس آماده است» یکی نیست.
  • شکست seed = توقف bring_up: بهتر است crawler اصلاً بالا نیاید تا اینکه با registry ناقص شروع کند.

۵. دستورات

# از ریشهٔ مخزن — استک کامل (infra → app-api → seed → consumer + crawler)
./scripts/bring_up.sh

# فقط زیرساخت (Postgres / ZooKeeper / Kafka / UI / Metabase)
./scripts/bring_up.sh --infra-only

# استک کامل + گزارش‌های چرخه (crawler pending + cycle-reporter)
./scripts/bring_up.sh --with-cycle-reports

# رد کردن smoke check (مثلاً وقتی Ansible جداگانه check_infra را می‌زند)
./scripts/bring_up.sh --skip-check

# استفاده از imageهای از قبل build‌شده
./scripts/bring_up.sh --no-build

./scripts/bring_up.sh --help

پیش‌نیاز: Docker Engine + پلاگین Compose، اجرا از ریشهٔ کلون مخزن؛ برای seed روی host به curl و python3 نیاز است (همان پیش‌نیازهای seed_apps.sh).

بررسی سریع پس از موفقیت:

# ترتیب زمانی شروع: app-api باید قبل از crawler باشد
docker inspect -f '{{.Name}} started={{.State.StartedAt}}' project_app_api project_crawler

# ۱۵ اپ seed‌شده
curl -sS "http://localhost:${APP_API_PORT:-8000}/api/applications/" | python3 -m json.tool

# اولین چرخه نباید total=0 باشد
docker compose logs crawler | grep "Crawl cycle summary"

# گام عملیاتی بعدی
./scripts/verify/verify_storage_consumer.sh

← بازگشت به فهرست اسکریپت‌ها · مستند seed_apps.sh → · مستند check_infra.sh →