{{ n.name }}
{{ t('node_this') }}
{{ t('node_down') }} · {{ n.error }}
{{ n.qps.toFixed(2) }} QPS
{{ n.total_queries.toLocaleString() }} {{ t('node_queries') }}
{{ t('node_hit') }} {{ (n.cache_hit_rate * 100).toFixed(0) }}%
{{ t('node_miss') }} {{ fmtUs(n.avg_miss_us) }}
{{ Math.round(n.total_queries / stats.total_queries * 100) }}%
{{ t('node_share') }}
{{ t('stats_total_queries') }}
{{ formatNumber(stats.total_queries) }}
CN
{{ formatNumber(stats.total_cn) }}
Overseas
{{ formatNumber(stats.total_overseas) }}
{{ t('stats_memory') }}
{{ stats.memory_usage_mb?.toFixed(1) }} MB
QPS
{{ formatQPS(stats.qps) }} req/s
{{ t('stats_uptime') }}
{{ formatUptime(stats.uptime_seconds) }}
Started At
{{ getStartTime(stats.uptime_seconds) }}
{{ t('stats_ports') }}
TCP
{{ formatListenPort(stats.listen_dns_tcp) }}
{{ t('not_listening') }}
UDP
{{ formatListenPort(stats.listen_dns_udp) }}
{{ t('not_listening') }}
DoH
{{ formatListenPort(stats.listen_doh) }}
{{ t('not_listening') }}
DoT
{{ formatListenPort(stats.listen_dot) }}
{{ t('not_listening') }}
DoQ
{{ formatListenPort(stats.listen_doq) }}
{{ t('not_listening') }}
{{ t('accel_title') }}
{{ t('cache_disabled') }}{{ Math.round((cacheStats.hit_rate || 0) * 100) }}%
{{ t('cache_hit_rate') }}
{{ t('cache_entries') }} {{ formatNumber(cacheStats.entries) }}
{{ t('accel_faster') }}
{{ speedupText }}
{{ t('accel_cache_lane') }}
{{ fmtUs(cacheStats.avg_hit_us) }}
{{ t('accel_upstream_lane') }}
{{ fmtUs(cacheStats.avg_miss_us) }}
{{ t('accel_race_hint') }}
{{ t('accel_saved') }}
{{ fmtSaved(savedDisplay) }}
{{ t('accel_saved_hint', { n: formatNumber(cacheStats.hits) }) }}
{{ t('accel_stale') }}
{{ formatNumber(cacheStats.stale_hits) }}
{{ t('accel_prefetch') }}
{{ formatNumber(cacheStats.prefetches) }}
{{ t('accel_ecs') }}
{{ formatNumber(cacheStats.ecs_routed) }}
{{ t('accel_trend') }}
{{ t('accel_cache_lane') }}
{{ t('accel_upstream_lane') }}
{{ t('accel_15m_ago') }}{{ t('accel_now') }}
{{ t('flow_title') }}
{{ t('flow_empty') }}
{{ log.node }}
{{ log.domain.replace(/\.$/, '') || '.' }}
{{ log.type }}
{{ t('stats_traffic_distribution') }}
CN (Domestic)
{{ stats.total_cn }}
{{ getPercentage(stats.total_cn, stats.total_queries) }}%
Overseas
{{ stats.total_overseas }}
{{ getPercentage(stats.total_overseas, stats.total_queries) }}%
{{ t('stats_blocked') }}
{{ stats.total_blocked || 0 }}
{{ getPercentage(stats.total_blocked || 0, stats.total_queries) }}%
{{ t('stats_upstream_perf') }}
{{ t('top_clients') }}
-
{{ idx + 1 }} {{ client[0] }}{{ client[1] }}
{{ t('top_domains') }}
-
{{ idx + 1 }} {{ domain[0] }}{{ domain[1] }}
{{ t('logs_title') }}
| {{ t('log_time') }} | {{ t('log_client') }} | {{ t('log_domain') }} | {{ t('log_type') }} | {{ t('log_answer') }} | {{ t('log_upstream') }} | {{ t('log_status') }} | {{ t('log_duration') }} |
|---|---|---|---|---|---|---|---|
| {{ log.node }}{{ formatTime(log.time) }} |
{{ log.client_ip }}
ECS {{ log.downstream_ecs }}
|
{{ log.domain }} | {{ log.type }} | {{ log.answer }} |
{{ log.cache === 'stale' ? t('accel_stale') : t('flow_cache') }}
{{ formatUpstreamLabel(log.upstream) }}
{{ log.ecs }}
|
{{ getLogStatusText(log) }} | {{ fmtUs(logUs(log)) }} |
|
{{ t('no_logs') }} |
|||||||
Showing {{ (logsPage - 1) * 15 + 1 }} to {{ Math.min(logsPage * 15, logsTotal) }} of {{ logsTotal }} results
WebUI Settings
Allow viewing dashboard without login. Login required for changes.
{{ t('setting_querylog') }}
Defaults to 'query.log' if empty.
{{ t('setting_cache') }}
{{ t('ecs_client_subnet_help') }}
{{ t('setting_block') }}
{{ t('block_help') }}
{{ t('block_lists') }}
{{ t('no_records') }}
{{ t('setting_listen') }}
{{ t('listen_address_help') }}
{{ t('setting_bootstrap') }}
{{ t('setting_tls_certs') }}
{{ t('setting_upstreams') }}
{{ t('setting_hosts') }}
Total: {{ hostsTotal }}
{{ hostsPage }}