{{ summary.total }}kurulum
{{ summary.online }}çevrimiçi
{{ summary.down }}erişilemiyor
{{ summary.license_expiring_30d }}30 günde lisans bitiyor
{{ summary.open_alerts }}açık uyarı
Müşteriler — birine tıklayın: tüm sayfa o müşteriye süzülür
-
{{ c.name }} {{ installations.filter(i => i.customer === c.name).length }} kurulum {{ c.contact }}
… ve {{ filteredCustomers.length - 30 }} müşteri daha — aramayla daraltın
Yeni appliance token (bir kez gösterilir):
{{ newToken }}
Appliance .env → HUB_TOKEN değerine yapıştırın.
Filo {{ selectedCustomer }} · {{ filteredInstallations.length }}
| Müşteri | Kurulum | Makine | Durum | Ver. | Lisans | Bitiş | Kam. | Son Alarm | Son Sinyal |
|---|---|---|---|---|---|---|---|---|---|
| {{ selectedCustomer || search ? 'Bu filtreyle eşleşen kurulum yok' : 'Henüz kurulum yok — müşteri satırındaki "+ Kurulum" ile başlayın' }} | |||||||||
| {{ i.customer }} | {{ i.name || '—' }} | {{ i.machine_id || 'bağlanmadı' }} | {{ tr(i.status) }} | {{ i.version || '—' }} | {{ tr(i.license_status) || '—' }} | {{ i.expire_date || '—' }} | {{ i.camera_count }} | {{ fmt(i.last_alarm_at) }} | {{ fmt(i.last_heartbeat_at) }} |
{{ detail.customer }} — {{ detail.machine_id || detail.name }}
Hizmet durumu:
TÜM HİZMET ASKIDA
MODÜL ASKIDA: {{ detailService.modules.map(m => moduleLabelWithId(m)).join(', ') }}
aktif
son işlem: {{ detailService.set_by }}
ödeme/fesih içindir — lisans bitişinden ayrıdır
İdari müdahale:
| modül bazında durdur:
Modül-bazlı durdurmada appliance bütünü çalışır; yalnız seçilen modüller olay/alarm üretmez. Değiştirmek için seçimi güncelleyip tekrar uygulayın; tümünü açmak için "Devam ettir".
| modül-bazlı durdurma için bu kuruluma lisanslı modül tanımlı değil
Modüller
- {{ m }}: {{ trModule(s) }}
Kaynaklar
- Disk: {{ detail.payload.disk_free_gb }} GB boş
- RAM: {{ detail.payload.ram_free_gb }} GB kullanılabilir
- GPU: {{ detail.payload.gpu_ok === null ? 'beklenmiyor' : (detail.payload.gpu_ok ? 'çalışıyor' : '⚠ SORUN VAR') }}
- Sunucu açık kalma süresi: {{ Math.round((detail.payload.uptime_seconds || 0) / 3600) }} saat
Kameralar
- Kamera {{ c.camera_id }} — son frame: {{ fmt(c.last_frame_at) }}
Sinyal (heartbeat) geçmişi
- {{ fmt(h.received_at) }} (v{{ h.version }})
Yapay zekâ modeli (uzaktan dağıtım)
- Çalışan model: {{ currentModelOf(detail) }}
- İstenen model: {{ detailDesired ? detailDesired.version : '—' }} ({{ detailDesired.set_by }} atadı)
⏳ Modeller yükleniyor…
Bu modül için yüklü model yok — aşağıdaki "Model Dağıtımı"ndan ekleyin.
Appliance imzayı ve sha256'yı kendisi doğrular, modeli kesintisiz (restart'sız) devreye alır; sonuç bir sonraki sinyalde "Çalışan model" olarak görünür.
Model Dağıtımı (artefakt deposu — kuruluma göndermek için kurulum detayını açın)
{{ modelMsg }}
| Modül | Sürüm | Dosya | Boyut | sha256 | Yükleyen | Tarih | |
|---|---|---|---|---|---|---|---|
| ⏳ Modeller yükleniyor… | |||||||
| Henüz model artefaktı yok — "+ Model yükle" ile .onnx ekleyin | |||||||
| {{ a.module }} | {{ a.version }} | {{ a.filename }} | {{ (a.size_bytes / 1048576).toFixed(2) }} MB | {{ a.sha256.slice(0, 16) }}… | {{ a.uploaded_by }} | {{ fmt(a.created_at) }} | |
Uyarılar {{ selectedCustomer }} · {{ filteredAlerts.length }}
| Zaman | Müşteri / Kurulum | Makine | Tip | Detay | |
|---|---|---|---|---|---|
| ✅ Uyarı yok — filo sağlıklı | |||||
| {{ fmt(a.created_at) }} | {{ a.customer || '—' }} · {{ a.installation_name }} | {{ a.machine_id }} | {{ a.kind === 'system_down' ? '🔴 ' : '🟢 ' }}{{ tr(a.kind) }} | {{ a.detail }} | {{ a.acked_by }} |
Lisanslar {{ selectedCustomer }} · {{ filteredLicenses.length }}
| Müşteri | Makine | Limit | Modüller | Bitiş | Durum | |
|---|---|---|---|---|---|---|
| {{ selectedCustomer ? 'Bu müşteri için lisans yok' : 'Henüz lisans kesilmedi' }} | ||||||
| {{ machineCustomer[l.machine_id] || '—' }} | {{ l.machine_id }} | {{ l.camera_limit }} | {{ l.modules.join(', ') }} | {{ l.expire_date }} | {{ l.revoked ? 'iptal edildi' : 'aktif' }} | |
Kullanıcılar
✏️ Düzenleniyor: {{ newUser.username }}
-
{{ u.username }} {{ tr(u.role) }} siz
Denetim Kaydı
- {{ fmt(a.created_at) }} · {{ a.actor }} {{ trAudit(a.action, a.target) }}