# معماری

یک نصب خودمیزبان Status200 از چند کانتینر تشکیل می‌شود: یک ingress که هر درخواستی از آن وارد می‌شود، یک ایمیج برنامه که کار را انجام می‌دهد، پراب‌هایی که بررسی‌های مانیتورهای شما را اجرا می‌کنند، و سه مخزن داده. این صفحه نشان می‌دهد این‌ها چطور کنار هم قرار می‌گیرند، هر کدام چه می‌کند و کدام اتصال‌ها از مرز شبکهٔ شما عبور می‌کنند.

```mermaid title="یک نصب خودمیزبان Status200"
flowchart TB
    People["افراد و<br/>مرورگرها"]
    Senders["فرستندگان<br/>تله‌متری:<br/>OpenTelemetry،<br/>Fluent Bit،<br/>syslog،<br/>عامل‌ها"]
    Targets["آنچه پایش<br/>می‌کنید:<br/>داخلی و عمومی"]
    subgraph Install["شبکهٔ شما"]
        direction TB
        Ingress["Ingress<br/>(Nginx، TLS)"]
        App["برنامه<br/>داشبوردها،<br/>صفحه‌های<br/>وضعیت،<br/>API، دریافت<br/>داده، کارهای<br/>پس‌زمینه"]
        Runner["Runner"]
        Probe["پراب‌ها"]
        subgraph Data["مخزن‌های داده"]
            direction LR
            Postgres[("PostgreSQL<br/>پیکربندی<br/>و وضعیت")]
            ClickHouse[("ClickHouse<br/>لاگ‌ها،<br/>متریک‌ها،<br/>ردها")]
            Valkey[("Valkey<br/>کش و<br/>صف‌ها")]
        end
    end
    People -->|"HTTPS"| Ingress
    Senders -->|"OTLP, HTTPS"| Ingress
    Ingress --> App
    Runner -->|"برداشتن کارها،<br/>فرستادن نتایج"| App
    Probe -->|"گرفتن کار،<br/>فرستادن نتایج"| App
    Probe -->|"HTTP، TCP، ping،<br/>DNS، SNMP"| Targets
    App --> Postgres
    App --> ClickHouse
    App --> Valkey
    Targets ~~~ Probe
```

## این نمودار چه نشان می‌دهد

- افراد از راه **ingress** به Status200 می‌رسند، که TLS را پایان می‌دهد و هر درخواست را به برنامه می‌فرستد: Dashboard، صفحه‌های وضعیت، API، و هر نقطهٔ دریافتی که تله‌متری به آن فرستاده می‌شود.
- **برنامه** وضعیت خود را در PostgreSQL می‌خواند و می‌نویسد، تله‌متری را در ClickHouse نگه می‌دارد، و از Valkey (انشعاب دارای مجوز BSD از Redis 7.2) برای کش و برای صف‌هایی که کارهای پس‌زمینه‌اش پردازش می‌کنند استفاده می‌کند.
- **پراب‌ها** می‌توانند درون کلاستر شما (توصیه می‌شود) و/یا جای دیگری در شبکهٔ شما اجرا شوند. آن‌ها می‌توانند این‌ها را پایش کنند:
  - سرویس‌های داخلی/خصوصی پشت دیوار آتش شما.
  - منابع خارجی/عمومی در اینترنت.
- نتایج پراب‌ها به برنامه فرستاده می‌شوند، در Valkey به صف می‌روند و کارهای پس‌زمینه آن‌ها را پردازش می‌کنند و در مخزن‌های داده‌تان می‌نویسند. پرابی که جای دیگری در شبکهٔ شماست، از راه ingress و با نشانی Status200 شما به برنامه می‌رسد.
- تله‌متری (متریک‌ها، ردها، لاگ‌ها و بیشتر) را همان برنامه دریافت می‌کند و در ClickHouse ذخیره می‌شود.

> [!NOTE]
> اگر به‌جای نمونه‌های داخلی از PostgreSQL، Valkey (یا Redis) یا ClickHouse خارجی استفاده کنید، برنامه به‌جای آن‌ها به نقطه‌های پایانی خارجی شما وصل می‌شود. جریان منطقی همان می‌ماند.

## اجزا

| جزء | سرویس Docker Compose | چارت Helm | چه می‌کند |
| --- | --- | --- | --- |
| Ingress | `ingress` | `nginx` | TLS را پایان می‌دهد، نام میزبان و دامنه‌های صفحه‌های وضعیت شما را سرو می‌کند و هر درخواست را به برنامه می‌فرستد. |
| برنامه | `app` | `app` | Dashboard، صفحه‌های وضعیت، نقطه‌های پایانی API و دریافت داده، و اگر جدایشان نکنید، کارهای پس‌زمینه. |
| Worker | بخشی از `app` | `worker` (به‌طور پیش‌فرض خاموش) | کارهای پس‌زمینه در پادهای جداگانهٔ خودشان، تا پردازش سنگین صف هرگز با درخواست‌های API رقابت نکند. |
| Telemetry writer | بخشی از `app` | `telemetryWriter` (به‌طور پیش‌فرض خاموش) | لایه‌ای با اندازهٔ ثابت که هر درج در ClickHouse را انجام می‌دهد، تا درج‌ها هر قدر هم workerها مقیاس بگیرند محدود بمانند. |
| پراب | `probe-1` | `probes` | بررسی‌های مانیتور را اجرا می‌کند و نتایج را برمی‌گرداند. هر پراب همراه، یک پراب سراسری است که همهٔ پروژه‌ها می‌توانند از آن استفاده کنند. |
| Runner | `runner` | `runner` | Runner خودِ نمونه، که می‌تواند اصلاح کد با هوش مصنوعی را برای هر پروژه اجرا کند. گام‌های رانبوک روی [Runnerهایی](/docs/runbooks/agents) اجرا می‌شوند که خودتان همان جایی نصب می‌کنید که باید اجرا شوند. |
| Runner سراسری | `global-runner` | `globalRunner` | یک [Runner سراسری](/docs/runbooks/agents#runnerهای-سراسری): گام‌های JavaScript هر پروژه‌ای را که Runner خودش را انتخاب نکند اجرا می‌کند، هر کدام در سندباکسی که فقط به اینترنت می‌رسد. کلید خودش را دارد و هیچ چیز دیگری از سرور ندارد. |
| PostgreSQL | `postgres` | `postgresql`، یا `postgresOperator.cnpg` | پروژه‌ها، مانیتورها، حادثه‌ها، کاربران و هر تنظیم و وضعیت دیگر. |
| ClickHouse | `clickhouse` | `clickhouse`، یا `clickhouseOperator.altinity` | لاگ‌ها، متریک‌ها، ردها، استثناها، پروفایل‌ها و لاگ‌های مانیتور. |
| Valkey | `valkey` | `valkey` | کش، صف‌های کار و وضعیت کوتاه‌مدت، مانند رسیدهای پوش در انتظار. |

همهٔ نقش‌های برنامه یک ایمیج‌اند: Docker Compose آن‌ها را در یک کانتینر `app` اجرا می‌کند، و چارت Helm می‌تواند worker و telemetry writer را به‌صورت استقرارهای جداگانه اجرا کند. برای تعیین اندازهٔ هر لایه، [اندازه‌گذاری و برنامه‌ریزی ظرفیت](/docs/installation/sizing) را ببینید.

## اتصال‌های رو به بیرون از شبکهٔ شما

سه اتصال برقرار می‌شوند، مگر اینکه تنظیمی را تغییر دهید:

- برنامه روزی یک بار از API سرویس GitHub (`api.github.com`) می‌پرسد که آیا نسخهٔ تازه‌تری منتشر شده است. برای خاموش کردن آن، در چارت Helm مقدار `updateCheck.disabled: true` را، یا در Docker Compose مقدار `DISABLE_UPDATE_CHECK=true` را در `config.env` تنظیم کنید.
- ثبت‌نام با گزینهٔ «مرا از وصله‌های امنیتی و نسخه‌های جدید مطلع کن» در حالت تیک‌خورده، که در ابتدا همین‌طور است، نام و ایمیل آن شخص، هر شرکت و شماره تلفنی که داده باشد، و نشانی و نسخهٔ نصب شما را به `status200.ru` می‌فرستد. در شبکه‌ای بدون دسترسی به اینترنت، تیک آن را بردارید.
- در Kubernetes، پراب‌ها پس از DNS خود کلاستر شما به سرورهای نام عمومی `8.8.8.8` و `1.1.1.1` روی می‌آورند. مقدار `dnsConfig.nameservers` را `[]` بگذارید تا همهٔ جست‌وجوها روی DNS خود شما بمانند.

هر چیز دیگری فقط وقتی به بیرون وصل می‌شود که آن را روشن کنید، و هر کدام صفحه‌ای دارد که نشانی‌های دقیقی را که باید مجاز کنید نام می‌برد:

| اتصال خروجی | برای چه | بیشتر بخوانید |
| --- | --- | --- |
| ایمیل (SMTP، یا API سرویس SendGrid) | اعلان‌ها و دعوت‌نامه‌ها | [SMTP](/docs/emails/smtp) |
| Twilio | پیامک و تماس تلفنی | [یکپارچه‌سازی Twilio](/docs/self-hosted/twilio-integration) |
| رلهٔ پوش Status200، یا Expo | اعلان‌های پوش موبایل | [اعلان‌های پوش](/docs/self-hosted/push-notifications) |
| Slack و Microsoft Teams | اعلان‌ها و کنش‌های فضای کاری | [یکپارچه‌سازی Slack](/docs/self-hosted/slack-integration) |
| یک ارائه‌دهندهٔ LLM، مانند OpenAI، Anthropic، Microsoft Foundry یا مدلی که خودتان اجرا می‌کنید | Status200 AI | [ارائه‌دهندگان LLM](/docs/ai/llm-provider) |
| `status200.ru` | فعال‌سازی آنلاین مجوز Enterprise | [نسخه سازمانی](/docs/self-hosted/enterprise) |

اتصال‌های جهت مخالف - SendGrid که ایمیل ورودی را تحویل می‌دهد، و Slack و Microsoft Teams که فراخوانی برگشتی انجام می‌دهند - نیاز دارند که ingress از اینترنت در دسترس باشد. اینکه برنامه و پراب‌ها به کدام نشانی‌های خصوصی برسند با شماست: [دسترسی به شبکه خصوصی](/docs/self-hosted/private-network-access) را ببینید.

لوگوی Status200 درون هر ایمیلی که Status200 می‌فرستد جای دارد، پس حتی در شبکه‌ای بدون دسترسی به اینترنت هم نشان داده می‌شود، و باز کردن یک ایمیل چیزی از میزبان دیگری نمی‌خواهد. تصویرهایی که خودتان بارگذاری می‌کنید، مانند لوگوی خودتان یا لوگوی یک صفحه وضعیت، از نشانی Status200 شما نشان داده می‌شوند، پس کسانی که این ایمیل‌ها را می‌خوانند باید بتوانند به آن برسند.

## گام‌های بعدی

:::cards
- [Docker Compose](/docs/installation/docker-compose): همهٔ اجزا را روی یک ماشین نصب کنید.
- [اندازه‌گذاری و برنامه‌ریزی ظرفیت](/docs/installation/sizing): هر لایه چقدر CPU، حافظه و دیسک نیاز دارد.
- [پراب‌های سفارشی](/docs/probe/custom-probe): یک پراب را درون شبکه‌ای دیگر اجرا کنید.
- [نسخه سازمانی](/docs/self-hosted/enterprise): ایمیج‌های Enterprise چه چیزی اضافه می‌کنند و مجوزدهی چطور کار می‌کند.
:::
