update dashboard

This commit is contained in:
2026-08-20 20:16:02 +01:00
parent a9828e7883
commit 2d2b749c54
+101 -116
View File
@@ -2,99 +2,141 @@
{{define "page_title"}}Dashboard{{end}}
{{define "content"}}
{{if dget . "is_global_admin"}}
<div class="row">
<div class="col-lg-3 col-md-6 mb-4">
<div class="col-12 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-shield-x me-2"></i>Attack Activity</h5>
<a href="/smtp-server/blacklist" class="btn btn-outline-light btn-sm">View Blacklist</a>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 {{if gt (dget . "active_blacklist_count") 0}}text-danger{{else}}text-secondary{{end}}">{{dget . "active_blacklist_count"}}</div>
<small class="text-muted">Active Blocks</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-warning">{{dget . "failed_auth_24h"}}</div>
<small class="text-muted">Failed Auth (24h)</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-warning">{{dget . "failed_auth_7d"}}</div>
<small class="text-muted">Failed Auth (7d)</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-danger">{{dget . "blacklist_events_24h"}}</div>
<small class="text-muted">Blacklist Events (24h)</small>
</div>
<div class="col-6 col-md-2">
<div class="fs-3 text-danger">{{dget . "blacklist_events_7d"}}</div>
<small class="text-muted">Blacklist Events (7d)</small>
</div>
</div>
</div>
</div>
</div>
</div>
{{end}}
<div class="row g-2 mb-4">
<div class="col-6 col-md-4 col-lg">
<a href="/smtp-server/domains" class="text-decoration-none">
<div class="card border-primary">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h5 class="card-title text-primary mb-1"><i class="bi bi-globe me-2"></i>Domains</h5>
<h3 class="mb-0">{{.domain_count}}</h3>
<small class="text-muted">Active domains</small>
<div class="card border-primary h-100">
<div class="card-body py-2 px-3">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-primary small fw-semibold text-nowrap"><i class="bi bi-globe me-1"></i>Domains</div>
<div class="fs-4 fw-bold lh-1">{{.domain_count}}</div>
</div>
<div class="fs-2 text-primary opacity-50"><i class="bi bi-globe"></i></div>
<div class="fs-3 text-primary opacity-25"><i class="bi bi-globe"></i></div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-3 col-md-6 mb-4">
<div class="col-6 col-md-4 col-lg">
<a href="/smtp-server/senders" class="text-decoration-none">
<div class="card border-success">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h5 class="card-title text-success mb-1"><i class="bi bi-people me-2"></i>Senders</h5>
<h3 class="mb-0">{{.sender_count}}</h3>
<small class="text-muted">Authenticated senders</small>
<div class="card border-success h-100">
<div class="card-body py-2 px-3">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-success small fw-semibold text-nowrap"><i class="bi bi-people me-1"></i>Senders</div>
<div class="fs-4 fw-bold lh-1">{{.sender_count}}</div>
</div>
<div class="fs-2 text-success opacity-50"><i class="bi bi-people"></i></div>
<div class="fs-3 text-success opacity-25"><i class="bi bi-people"></i></div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-3 col-md-6 mb-4">
<div class="col-6 col-md-4 col-lg">
<a href="/smtp-server/dkim" class="text-decoration-none">
<div class="card border-warning">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h5 class="card-title text-warning mb-1"><i class="bi bi-shield-check me-2"></i>DKIM Keys</h5>
<h3 class="mb-0">{{.dkim_count}}</h3>
<small class="text-muted">Active DKIM keys</small>
<div class="card border-warning h-100">
<div class="card-body py-2 px-3">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-warning small fw-semibold text-nowrap"><i class="bi bi-shield-check me-1"></i>DKIM Keys</div>
<div class="fs-4 fw-bold lh-1">{{.dkim_count}}</div>
</div>
<div class="fs-2 text-warning opacity-50"><i class="bi bi-shield-check"></i></div>
<div class="fs-3 text-warning opacity-25"><i class="bi bi-shield-check"></i></div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-3 col-md-6 mb-4">
<div class="col-6 col-md-4 col-lg">
<a href="/smtp-server/mailboxes" class="text-decoration-none">
<div class="card {{if gt .mailboxes_near_quota 0}}border-danger{{else}}border-primary{{end}}">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h5 class="card-title {{if gt .mailboxes_near_quota 0}}text-danger{{else}}text-primary{{end}} mb-1"><i class="bi bi-inbox me-2"></i>Mailboxes</h5>
<h3 class="mb-0">{{.mailbox_count}}</h3>
{{if gt .mailboxes_near_quota 0}}
<small class="text-danger"><i class="bi bi-exclamation-triangle me-1"></i>{{.mailboxes_near_quota}} near quota</small>
{{else}}
<small class="text-muted">Active mailboxes</small>
{{end}}
<div class="card {{if gt .mailboxes_near_quota 0}}border-danger{{else}}border-primary{{end}} h-100">
<div class="card-body py-2 px-3">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="{{if gt .mailboxes_near_quota 0}}text-danger{{else}}text-primary{{end}} small fw-semibold text-nowrap"><i class="bi bi-inbox me-1"></i>Mailboxes</div>
<div class="fs-4 fw-bold lh-1">{{.mailbox_count}}</div>
{{if gt .mailboxes_near_quota 0}}<div class="text-danger text-nowrap" style="font-size: 0.7rem;"><i class="bi bi-exclamation-triangle me-1"></i>{{.mailboxes_near_quota}} near quota</div>{{end}}
</div>
<div class="fs-2 {{if gt .mailboxes_near_quota 0}}text-danger{{else}}text-primary{{end}} opacity-50"><i class="bi bi-inbox"></i></div>
<div class="fs-3 {{if gt .mailboxes_near_quota 0}}text-danger{{else}}text-primary{{end}} opacity-25"><i class="bi bi-inbox"></i></div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-3 col-md-6 mb-4">
<div class="card border-info">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h5 class="card-title text-info mb-1"><i class="bi bi-activity me-2"></i>Status</h5>
<h6 class="{{if eq .health.Status "healthy"}}text-success{{else}}text-warning{{end}} mb-0">
<i class="bi bi-circle-fill me-1" style="font-size: 0.5rem;"></i>
{{title .health.Status}}
</h6>
<small class="text-muted">
{{if and (eq .health.Services.smtp_server "running") (eq .health.Services.database "ok")}}
All services running
{{else}}
{{if eq .health.Services.smtp_server "stopped"}}SMTP Server stopped{{end}}
{{if eq .health.Services.database "error"}}Database error{{end}}
{{end}}
</small>
<div class="col-6 col-md-4 col-lg">
<div class="card border-info h-100">
<div class="card-body py-2 px-3">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-info small fw-semibold text-nowrap"><i class="bi bi-activity me-1"></i>Status</div>
<div class="fs-6 fw-bold lh-1 text-nowrap {{if eq .health.Status "healthy"}}text-success{{else}}text-warning{{end}}"
title="{{if and (eq .health.Services.smtp_server "running") (eq .health.Services.database "ok")}}All services running{{else}}{{if eq .health.Services.smtp_server "stopped"}}SMTP Server stopped{{end}} {{if eq .health.Services.database "error"}}Database error{{end}}{{end}}">
<i class="bi bi-circle-fill me-1" style="font-size: 0.5rem;"></i>{{title .health.Status}}
</div>
</div>
<div class="fs-2 text-info opacity-50"><i class="bi bi-activity"></i></div>
<div class="fs-3 text-info opacity-25"><i class="bi bi-activity"></i></div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header"><h5 class="mb-0"><i class="bi bi-lightning me-2"></i>Quick Actions</h5></div>
<div class="card-body">
<div class="row">
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/domains/add" class="btn btn-outline-primary"><i class="bi bi-plus-circle me-2"></i>Add Domain</a></div></div>
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/senders/add" class="btn btn-outline-success"><i class="bi bi-person-plus me-2"></i>Add Sender</a></div></div>
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/ips/add" class="btn btn-outline-warning"><i class="bi bi-shield-plus me-2"></i>Whitelist IP</a></div></div>
{{if dget . "is_global_admin"}}
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/settings" class="btn btn-outline-info"><i class="bi bi-gear me-2"></i>Settings</a></div></div>
{{else}}
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/mailboxes/add" class="btn btn-outline-info"><i class="bi bi-mailbox me-2"></i>Add Mailbox</a></div></div>
{{end}}
</div>
</div>
</div>
@@ -180,63 +222,6 @@
</div>
</div>
</div>
{{if dget . "is_global_admin"}}
<div class="row">
<div class="col-12 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-shield-x me-2"></i>Attack Activity</h5>
<a href="/smtp-server/blacklist" class="btn btn-outline-light btn-sm">View Blacklist</a>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 {{if gt (dget . "active_blacklist_count") 0}}text-danger{{else}}text-secondary{{end}}">{{dget . "active_blacklist_count"}}</div>
<small class="text-muted">Active Blocks</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-warning">{{dget . "failed_auth_24h"}}</div>
<small class="text-muted">Failed Auth (24h)</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-warning">{{dget . "failed_auth_7d"}}</div>
<small class="text-muted">Failed Auth (7d)</small>
</div>
<div class="col-6 col-md-2 mb-3 mb-md-0">
<div class="fs-3 text-danger">{{dget . "blacklist_events_24h"}}</div>
<small class="text-muted">Blacklist Events (24h)</small>
</div>
<div class="col-6 col-md-2">
<div class="fs-3 text-danger">{{dget . "blacklist_events_7d"}}</div>
<small class="text-muted">Blacklist Events (7d)</small>
</div>
</div>
</div>
</div>
</div>
</div>
{{end}}
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header"><h5 class="mb-0"><i class="bi bi-lightning me-2"></i>Quick Actions</h5></div>
<div class="card-body">
<div class="row">
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/domains/add" class="btn btn-outline-primary"><i class="bi bi-plus-circle me-2"></i>Add Domain</a></div></div>
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/senders/add" class="btn btn-outline-success"><i class="bi bi-person-plus me-2"></i>Add Sender</a></div></div>
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/ips/add" class="btn btn-outline-warning"><i class="bi bi-shield-plus me-2"></i>Whitelist IP</a></div></div>
{{if dget . "is_global_admin"}}
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/settings" class="btn btn-outline-info"><i class="bi bi-gear me-2"></i>Settings</a></div></div>
{{else}}
<div class="col-md-3 mb-3"><div class="d-grid"><a href="/smtp-server/mailboxes/add" class="btn btn-outline-info"><i class="bi bi-mailbox me-2"></i>Add Mailbox</a></div></div>
{{end}}
</div>
</div>
</div>
</div>
</div>
{{end}}
{{define "extra_js"}}