Security (Desktop Wallet): - Implement BIP39 mnemonic generation with cryptographic RNG - Add Argon2id password-based key derivation (64MB, 3 iterations) - Add ChaCha20-Poly1305 authenticated encryption for seed storage - Add mnemonic auto-clear (60s timeout) and clipboard auto-clear (30s) - Add sanitized error logging to prevent credential leaks - Strengthen CSP with object-src, base-uri, form-action, frame-ancestors - Clear sensitive state on component unmount Explorer (Gas Estimator): - Add Gas Estimation page with from/to/amount/data inputs - Add bech32 address validation (synor1/tsynor1 prefix) - Add BigInt-based amount parsing to avoid floating point errors - Add production guard for mock mode (cannot enable in prod builds) Monitoring (30-day Testnet): - Add Prometheus config with 30-day retention - Add comprehensive alert rules for node health, consensus, network, mempool - Add Alertmanager with severity-based routing and inhibition rules - Add Grafana with auto-provisioned datasource and dashboard - Add Synor testnet dashboard with uptime SLA tracking Docker: - Update docker-compose.testnet.yml with monitoring profile - Fix node-exporter for macOS Docker Desktop compatibility - Change Grafana port to 3001 to avoid conflict
91 lines
2.5 KiB
YAML
91 lines
2.5 KiB
YAML
# Alertmanager Configuration for Synor Testnet
|
|
# Routes alerts to appropriate channels based on severity
|
|
|
|
global:
|
|
# Default timeout for resolving alerts
|
|
resolve_timeout: 5m
|
|
|
|
# Alert routing configuration
|
|
route:
|
|
# Group alerts by alertname and instance
|
|
group_by: ['alertname', 'instance']
|
|
|
|
# Wait before sending initial notification
|
|
group_wait: 30s
|
|
|
|
# Wait between sending notifications for new alerts in same group
|
|
group_interval: 5m
|
|
|
|
# Wait before resending notification for same alert
|
|
repeat_interval: 4h
|
|
|
|
# Default receiver
|
|
receiver: 'default-receiver'
|
|
|
|
# Child routes for specific severities
|
|
routes:
|
|
# Critical alerts - immediate notification
|
|
- match:
|
|
severity: critical
|
|
receiver: 'critical-receiver'
|
|
group_wait: 10s
|
|
repeat_interval: 1h
|
|
continue: true
|
|
|
|
# Warning alerts - batched notification
|
|
- match:
|
|
severity: warning
|
|
receiver: 'warning-receiver'
|
|
group_wait: 1m
|
|
repeat_interval: 6h
|
|
|
|
# Receivers define where alerts go
|
|
receivers:
|
|
- name: 'default-receiver'
|
|
# Default: log to stdout (visible in docker logs)
|
|
webhook_configs: []
|
|
|
|
- name: 'critical-receiver'
|
|
# Critical alerts - configure your preferred channel
|
|
# Example: Discord webhook (uncomment and add your URL)
|
|
# webhook_configs:
|
|
# - url: 'https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN'
|
|
# send_resolved: true
|
|
# http_config:
|
|
# follow_redirects: true
|
|
|
|
# Example: Slack webhook (uncomment and add your URL)
|
|
# slack_configs:
|
|
# - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
|
|
# channel: '#synor-alerts'
|
|
# title: '{{ .Status | toUpper }}: {{ .CommonAnnotations.summary }}'
|
|
# text: '{{ .CommonAnnotations.description }}'
|
|
# send_resolved: true
|
|
webhook_configs: []
|
|
|
|
- name: 'warning-receiver'
|
|
# Warning alerts - lower priority channel
|
|
webhook_configs: []
|
|
|
|
# Inhibition rules - suppress lower severity when higher fires
|
|
inhibit_rules:
|
|
# If SynorNodeDown fires, suppress other alerts for same instance
|
|
- source_match:
|
|
alertname: 'SynorNodeDown'
|
|
target_match_re:
|
|
alertname: 'Synor.*'
|
|
equal: ['instance']
|
|
|
|
# If NetworkPartition fires, suppress LowPeerCount
|
|
- source_match:
|
|
alertname: 'SynorNetworkPartition'
|
|
target_match:
|
|
alertname: 'SynorLowPeerCount'
|
|
equal: ['instance']
|
|
|
|
# Critical suppresses warning for same alert type
|
|
- source_match:
|
|
severity: 'critical'
|
|
target_match:
|
|
severity: 'warning'
|
|
equal: ['alertname', 'instance']
|