BSS HostKhaneh

مدیریت دیتاسنتر (DCIM)

← بازگشت به راهنما

مدیریت دیتاسنتر (DCIM)



> version: 3.10 | last_updated: 2026-08-15 | audience: admin
> backup: `backups/bss-full-20260811-165403`

هدف



ماژول **مدیریت زیرساخت فیزیکی دیتاسنتر** برای هر Tenant:

  • ثبت سایت / اتاق / رک / یونیت / تجهیز

  • تخصیص سرور به سرویس Dedicated (شاهکار type 26) — دستی یا **رزرو/تخصیص خودکار از انبار**

  • اجاره فضا با **رزرو خودکار یونیت متوالی** (`inventory_kind=datacenter_space`)

  • نمای گرافیکی رک و نمای جلوی سوییچ

  • پورت سوییچ و اتصال به سرور

  • SNMP پولینگ Up/Down + **SNMP Discovery** در سطح سایت

  • مانیتورینگ (Zabbix/Cacti/…) و iLO/IPMI


  • هر **tenant** دیتاسنتر(های) مستقل خود را دارد.

    ---

    شروع سریع (ادمین)



  • منوی **انبار → دیتاسنتر**

  • **سایت** بسازید (آدرس + فیلدهای شاهکار)

  • در ویرایش سایت → تب **اتاق‌ها** → اتاق بسازید

  • **رک‌ها** → رک بسازید → **ساخت یونیت‌ها**

  • **تجهیزات** → سرور/سوییچ بسازید یا **ایمپورت Excel**

  • (اختیاری) روی سایت: **SNMP Discovery** → Seed → اجرا → وارد انبار

  • روی محصول Dedicated: شاهکار type 26 + **اتصال به انبار = سرور دیتاسنتر** + سایت/معیار تطبیق

  • سفارش → رزرو خودکار؛ کارتابل یا `subscription.activate` → تخصیص نهایی


  • دکمه **آموزش** در هر صفحه لیست توضیح همان بخش را نشان می‌دهد.

    ---

    ساختار سلسله‌مراتبی



    ```
    سایت دیتاسنتر (DatacenterSite)
    ├── SNMP Discovery (Seed / CIDR / LLDP) → dc_discovery_hosts
    └── اتاق / سالن (DcRoom)
    └── رک (DcRack)
    ├── یونیت رک 1..N (DcRackUnit)
    └── تجهیز (DcDevice)
    ├── سرور → iLO + مانیتورینگ + لینک پورت سوییچ
    └── سوییچ/روتر → dc_switch_ports + SNMP poll
    ```

    ---

    جداول و مدل‌ها



    | جدول | مدل | کاربرد |
    |------|-----|--------|
    | `inv_datacenter_sites` | `DatacenterSite` | سایت + شاهکار + SNMP Discovery |
    | `dc_rooms` | `DcRoom` | اتاق/سالن |
    | `dc_racks` | `DcRack` | رک + ظرفیت U + `allocation_unit_gap` (فاصله خالی بین تخصیص‌ها) |
    | `dc_rack_units` | `DcRackUnit` | هر یونیت (آزاد/اشغال/رزرو/مسدود) |
    | `dc_devices` | `DcDevice` | تجهیز + SNMP/مانیتورینگ/iLO + `datacenter_site_id` |
    | `dc_device_allocations` | `DcDeviceAllocation` | تاریخچه تخصیص |
    | `dc_switch_ports` | `DcSwitchPort` | پورت سوییچ + link Up/Down + ifIndex SNMP |
    | `dc_discovery_hosts` | `DcDiscoveryHost` | نتیجه Discovery قبل از وارد انبار |

    Migrations کلیدی



    | فایل | محتوا |
    |------|--------|
    | `2026_08_11_100000_create_inv_datacenter_sites_table` | سایت |
    | `2026_08_11_110000_create_dcim_tables` | rooms/racks/units/devices/allocations |
    | `2026_08_11_130000_add_monitoring_fields_to_dc_devices` | مانیتورینگ |
    | `2026_08_11_140000_create_dc_switch_ports_table` | پورت سوییچ + `port_count` |
    | `2026_08_11_150000_add_link_status_to_dc_switch_ports` | link up/down |
    | `2026_08_11_160000_add_snmp_fields_to_dc_devices` | SNMP تجهیز |
    | `2026_08_11_170000_add_site_snmp_discovery` | SNMP سایت + discovery hosts |
    | `2026_08_15_120000_add_allocation_unit_gap_to_dc_racks` | فاصله U بین تخصیص‌ها روی رک |

    ---

    Enumها



    `DcDeviceType`


    `server` · `switch` · `router` · `firewall` · `pdu` · `ups` · `storage` · `other`

    `DcDeviceStatus`


    `available` · `reserved` · `allocated` · `maintenance` · `decommissioned`

    `DcRackUnitStatus`


    `free` · `occupied` · `reserved` · `blocked`

    `DcSwitchPortStatus`


    `free` · `connected` · `disabled`

    `DcSwitchPortLinkStatus`


    `up` · `down` · `unknown`

    `DcDiscoveryHostStatus`


    `new` · `imported` · `ignored` · `unreachable`

    ---

    UI ادمین (Filament)



    **کلاستر:** `InventoryDatacenterCluster` — منوی **انبار → دیتاسنتر**
    **ثبت ریسورس:** دستی در `TenantPanelProvider` (auto-discover نیست)

    | ریسورس | مسیر تقریبی | امکانات |
    |--------|-------------|---------|
    | سایت‌ها | `/panel/datacenter-sites` | CRUD، اتاق‌ها، SNMP Discovery، آموزش، ایمپورت |
    | رک‌ها | `/panel/dc-racks` | CRUD، فاصله تخصیص U، ساخت یونیت، نمای رک، تجهیزات، آموزش، ایمپورت |
    | تجهیزات | `/panel/dc-devices` | CRUD، پورت‌ها، نمای سوییچ، iLO، SNMP، مانیتورینگ |

    صفحات سفارشی



    | صفحه | مسیر | توضیح |
    |------|------|--------|
    | `ViewDcRack` | `/panel/dc-racks/{id}` | نمای گرافیکی یونیت‌ها |
    | `ViewDcSwitch` | `/panel/dc-devices/{id}/switch-view` | نمای جلوی سوییچ + LED + SNMP |

    دکمه‌های لیست



  • **آموزش** → `App\Filament\Support\DcimGuide`

  • **ایمپورت Excel** → فایل یا paste (`DcImportService`)

  • رک: **نمای رک** · تجهیز سوییچ: **نمای سوییچ**


  • ---

    سایت و شاهکار



    فیلدهای شاهکار روی سایت (type 26 Dedicated):

  • `shahkar_data_center_id`, `address`, `province`, `latitude`, `longitude`

  • فلگ‌ها: Dedicated / Rack / Shared / Cloud / CDN / WebHosting

  • `default_units`, `default_bandwidth`


  • **اولویت در put:**
    `subscription.metadata.datacenter_site_id` → `product.provisioning_config.datacenter_site_id`

    کلاس: `ShahkarPayloadBuilder::mergeDatacenterSiteDefaults()`
    متد مدل: `DatacenterSite::toShahkarServiceBlock()`

    روی محصول Dedicated فیلد انتخاب سایت در `ProductOfferingFormSchema` دیده می‌شود.

    ---

    اتصال محصول به انبار سرور



    روی **محصول اصلی** Dedicated (`shahkar_service_type = 26`):

    | تنظیم | معنی |
    |--------|------|
    | `inventory_kind = datacenter_server` | رزرو خودکار هنگام سفارش |
    | `datacenter_site_id` | فیلتر سایت + پیش‌فرض شاهکار |
    | `dc_match_min_cpu_cores` / `dc_match_min_ram_gb` / `dc_match_manufacturer` | تطبیق سخت‌افزار |

    سرویس: `DatacenterServerOrderService` — `assertStock` → `reserveForOrder` → `linkSubscriptions` → `allocateForSubscription`؛ آزادسازی با `releaseForOrder` / `releaseForSubscription`.

    بدون اتصال انبار: فقط تخصیص دستی در کارتابل (رفتار قبلی).

    ---

    اتصال محصول به انبار فضای رک (اجاره فضا)



    روی **محصول اصلی**:

    | تنظیم | معنی |
    |--------|------|
    | `inventory_kind = datacenter_space` | چک/رزرو یونیت هنگام سفارش |
    | `dc_elements.rack_units` و … | کدام المان‌های فروش (U / IP ثابت) فعال‌اند |
    | `datacenter_site_ids` | یک یا چند سایت؛ اگر >1 مشتری/ریسلر انتخاب می‌کند |
    | `dc_space_units` | تعداد ثابت وقتی المان U خاموش باشد |
    | `dc_rack_id` | فیلتر رک اختیاری |

    روی **گروه گزینه**: فیلد `datacenter_element` (نقش) — مثلاً `rack_units`؛ بدون `inventory_kind` دیتاسنتر.

    سرویس: `DatacenterSpaceOrderService`

    جزئیات کارتابل: [datacenter-space-sales-cartable.md](./datacenter-space-sales-cartable.md)

    نصب تجهیز مشتری داخل فضای اجاره



    بعد از رزرو/تخصیص یونیت به سرویس اجاره فضا، تجهیز فیزیکی مشتری جداگانه روی همان Uها نصب می‌شود:

    | عمل | کجا | نتیجه |
    |-----|-----|--------|
    | **نصب روی اجاره فضا** | لیست تجهیزات (ردیف) · ویرایش تجهیز (بخش تخصیص + هدر) | جستجو با نام مشتری/شماره سرویس → تجهیز روی Uهای سرویس می‌نشیند |
    | **جدا کردن از سرویس** / حذف تجهیز | همان‌جا | فقط تجهیز آزاد می‌شود؛ یونیت‌ها `occupied` + متعلق به سرویس اجاره می‌مانند |
    | **نصب تجهیز روی فضای اجاره** | **جزئیات سرویس** (ادمین/تننت) و **جزئیات سرویس ریسلر** | انتخاب سرور آزاد و نصب روی Uهای همان سرویس |
    | **تغییر سایت دیتاسنتر** | همان صفحات جزئیات سرویس | ذخیره `metadata.datacenter_site_id` برای شاهکار |

    جستجوی سرویس در فرم تجهیز: نام مشتری، کد ملی، موبایل، شماره سرویس، برچسب فضا.

    متدها: `allocateDeviceIntoSpaceSubscription` · `releaseUnitFromDevice` · `coloSpaceSubscriptionOptions` · هلپر `DatacenterSubscriptionActions`

    ---

    تخصیص به سرویس (کارتابل)



    Pipeline: `dedicated-sales`.

    در `ViewWorkflowCase`:

  • بخش **سرویس‌ها** در پایین صفحه (لینک به جزئیات سرویس)

  • **تخصیص تجهیز دیتاسنتر** — تأیید رزرو خودکار یا انتخاب سرور دیگر → `DatacenterServerOrderService` / `DcInventoryService::allocateDevice`


  • تغییر سایت و نصب colo دیگر روی کارتابل نیستند؛ از جزئیات سرویس انجام می‌شوند.

    پس از تخصیص:

  • وضعیت تجهیز = `allocated`

  • یونیت‌ها = `occupied`

  • `subscription.metadata.dc_device_id` / نام / محل رک / `dc_server_allocated`


  • اکشن‌های اختیاری workflow: `inventory.dc_server_reserve` · `inventory.dc_server_allocate` · `inventory.dc_server_release`

    جزئیات کارتابل: [dedicated-sales-cartable.md](dedicated-sales-cartable.md)

    ---

    سرویس‌های بک‌اند



    | سرویس | مسئولیت |
    |-------|----------|
    | `DcInventoryService` | یونیت رک، allocate/deallocate (Dedicated + نصب داخل colo)، پورت سوییچ، ensureSwitchPorts |
    | `DatacenterServerOrderService` | رزرو/لینک/تخصیص/آزادسازی سرور برای سفارش Dedicated |
    | `DcImportService` | ایمپورت سایت/رک/تجهیز از Excel/CSV/Paste |
    | `SnmpPollService` | پولینگ SNMP یک تجهیز (sysInfo + IF-MIB → link_status) |
    | `SnmpDiscoveryService` | Discovery سطح سایت (Seed/CIDR/LLDP → import) |
    | `IloProxyService` | Redfish: power / thermal / console URL |
    | `MonitoringProxyService` | URL گراف + آمار Zabbix/LibreNMS |

    پکیج: `freedsx/snmp` (pure PHP — بدون ext-snmp)

    ---

    پورت‌های سوییچ



  • روی سوییچ/روتر `port_count` را بگذارید → بعد از ذخیره پورت‌ها ساخته می‌شوند

  • تب **پورت‌ها**: اتصال به سرور، قطع، Up/Down دستی، ساخت پورت‌های گمشده

  • اتصال، فیلدهای `switch_port_device_id` / `switch_port_label` سرور را همگام می‌کند


  • نمای سوییچ



    LED:

    | رنگ | معنی |
    |-----|------|
    | سبز درخشان | Link Up |
    | قرمز | Link Down |
    | آبی | متصل، لینک نامشخص |
    | خاکستری روشن | آزاد |
    | خاکستری تیره | Disabled |

    ---

    SNMP تجهیز (سوییچ / روتر)



    بخش فرم **SNMP**: نسخه، Community یا v3، پورت ۱۶۱، timeout.

  • هدف: `mgmt_ip` وگرنه `primary_ip`

  • **تست SNMP** / **بروزرسانی از SNMP** در نمای سوییچ و ویرایش

  • خروجی: sysName، uptime، ifName، link Up/Down واقعی


  • پیش‌نیاز شبکه: سرور BSS → UDP/161 تجهیز

    ---

    SNMP Discovery (سطح سایت)



    روی ویرایش سایت → بخش **SNMP Discovery**:

  • فعال‌سازی + Community

  • Seed: هر خط یک IP یا CIDR (سقف `/24` به ازای هر رنج)

  • سقف host (پیش‌فرض تا ۲۵۶) + LLDP اختیاری

  • **اجرای SNMP Discovery**

  • تب **Discovery SNMP**: لیست hostها

  • **وارد انبار** (تکی / همه جدید / bulk)


  • رفتار:

  • GET: `sysDescr` / `sysName` / `sysObjectID` / `ifNumber`

  • تشخیص نوع از متن sysDescr

  • LLDP → صف همسایه‌ها

  • import → `DcDevice` با SNMP کپی‌شده از سایت + poll پورت برای سوییچ/روتر

  • وضعیت‌ها: جدید / وارد شده / نادیده / بدون پاسخ


  • ---

    نمای گرافیکی رک



    از لیست رک‌ها → **نمای رک**:

  • ستون عمودی U از بالا به پایین

  • رنگ بر اساس نوع تجهیز

  • **رزرو/اشغال اجاره فضا** با شماره سرویس و نام محصول (و مشتری در tooltip)

  • آمار اشغال + جدول تجهیزات

  • کلیک روی سوییچ → نمای سوییچ

  • **کلیک روی هر یونیت** → ویرایش وضعیت (آزاد/اشغال/رزرو/مسدود) و **شناسه اختصاص سرویس**

  • دکمه **ویرایش یونیت‌ها** → تب جدول در صفحه ویرایش رک (ویرایش تکی + گروهی)


  • استایل‌ها **inline** هستند (Tailwind purge کلاس داینامیک را حذف می‌کرد).

    ویرایش یونیت در صفحه رک



    در **ویرایش رک** تب **یونیت‌های رک**:

    | فیلد | معنی |
    |------|------|
    | وضعیت | `free` / `occupied` / `reserved` / `blocked` |
    | شناسه سرویس | `subscription_id` عددی؛ یا جستجو با نام مشتری / شماره سرویس |
    | برچسب | اختیاری |

    عملیات گروهی: تغییر وضعیت چند U · اختصاص چند U به یک سرویس.

    فاصله خالی بین تخصیص‌ها (`allocation_unit_gap`)



    در **ایجاد / ویرایش رک**:

    | مقدار | معنی |
    |-------|------|
    | `0` | تخصیص‌ها می‌توانند پشت‌سرهم باشند |
    | `1` | بین هر تجهیز یا اجاره فضا یک U آزاد می‌ماند؛ رزرو بعدی از بعد از آن شروع می‌شود |
    | `N` | N یونیت حائل |

    این فاصله در دیتابیس **آزاد** می‌ماند (رزرو نمی‌شود)؛ فقط الگوریتم `findContiguousFreeBlock` هنگام اجاره فضا آن را برای تخصیص جدید انتخاب نمی‌کند.

    ---

    مانیتورینگ و پورتال



    فیلدهای تجهیز: `monitoring_system`, `monitoring_host_id`, `monitoring_graph_url`, `monitoring_api_url`

    در snapshot پورتال (`SubscriptionPresenter`): `bandwidth_graph_url` برای Dedicated/VPS وقتی تجهیز تخصیص‌یافته گراف داشته باشد.

    ---

    iLO / IPMI



    منوی ویرایش سرور (اگر `ilo_ip` پر باشد):

    | اکشن | عملکرد |
    |------|--------|
    | وضعیت سرور | PowerState / Health |
    | ریستارت | GracefulRestart |
    | خاموش / روشن | ForceOff / On |
    | کنسول | URL وب iLO/iDRAC |
    | دما و فن‌ها | Thermal |

    پروتکل: Redfish `/redfish/v1/Systems/1`

    ---

    ایمپورت دسته‌ای



    | بخش | کلید یکتایی | ستون‌های اصلی |
    |-----|------------|--------------|
    | سایت | `slug` | name, address, lat/lon, province, shahkar_… |
    | رک | `slug` | name, room, total_units, row_label, … |
    | تجهیز | `asset_tag` | name, device_type, hostname, rack, cpu, ram, ip, ilo |

    حداکثر ۵۰۰۰ ردیف · هدر فارسی/انگلیسی · skip یا update تکراری

    ---

    داده نمونه (tenant صفرویک پرداز)



    | مورد | مقدار تقریبی |
    |------|----------------|
    | سایت | تهران-نارمک + اصفهان |
    | اتاق | ۴ |
    | رک | ۸ (۳۱۸ یونیت) |
    | تجهیز | ۱۵ (سرور/سوییچ/روتر/PDU/فایروال) |
    | پورت سوییچ | ۱۲۴ (+ چند اتصال TOR) |
    | SNMP سایت ۱ | Seed نمونه ۱۰.x (فقط تنظیمات — شبکه واقعی لازم است) |

    ---

    مسیر فایل‌های مهم



    ```
    modules/Inventory/Models/DatacenterSite.php, DcRoom, DcRack, DcRackUnit, DcDevice, DcSwitchPort, DcDiscoveryHost
    modules/Inventory/Services/DcInventoryService, DcImportService, SnmpPollService, SnmpDiscoveryService, IloProxyService, MonitoringProxyService
    app/Filament/Clusters/InventoryDatacenterCluster.php
    app/Filament/Resources/DatacenterSiteResource*, DcRackResource*, DcDeviceResource*
    app/Filament/Support/DcimGuide.php
    resources/views/filament/pages/dc-rack-view.blade.php
    resources/views/filament/pages/dc-switch-view.blade.php
    app/Providers/Filament/TenantPanelProvider.php ← ثبت دستی ریسورس‌ها
    ```

    ---

    فازهای آینده



  • ویجت گراف پهنای باند در UI پورتال

  • PRTG API اختصاصی

  • iLO محدود از پورتال مشتری

  • Discovery زمان‌بندی‌شده (cron) و اسکن بزرگ‌تر از /24 با صف job