مدیریت دیتاسنتر (DCIM)
> version: 3.10 | last_updated: 2026-08-15 | audience: admin
> backup: `backups/bss-full-20260811-165403`
هدف
ماژول **مدیریت زیرساخت فیزیکی دیتاسنتر** برای هر Tenant:
هر **tenant** دیتاسنتر(های) مستقل خود را دارد.
---
شروع سریع (ادمین)
دکمه **آموزش** در هر صفحه لیست توضیح همان بخش را نشان میدهد.
---
ساختار سلسلهمراتبی
```
سایت دیتاسنتر (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 |
دکمههای لیست
---
سایت و شاهکار
فیلدهای شاهکار روی سایت (type 26 Dedicated):
**اولویت در 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`:
تغییر سایت و نصب colo دیگر روی کارتابل نیستند؛ از جزئیات سرویس انجام میشوند.
پس از تخصیص:
اکشنهای اختیاری 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)
---
پورتهای سوییچ
نمای سوییچ
LED:
| رنگ | معنی |
|-----|------|
| سبز درخشان | Link Up |
| قرمز | Link Down |
| آبی | متصل، لینک نامشخص |
| خاکستری روشن | آزاد |
| خاکستری تیره | Disabled |
---
SNMP تجهیز (سوییچ / روتر)
بخش فرم **SNMP**: نسخه، Community یا v3، پورت ۱۶۱، timeout.
پیشنیاز شبکه: سرور BSS → UDP/161 تجهیز
---
SNMP Discovery (سطح سایت)
روی ویرایش سایت → بخش **SNMP Discovery**:
رفتار:
---
نمای گرافیکی رک
از لیست رکها → **نمای رک**:
استایلها **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 ← ثبت دستی ریسورسها
```
---