2026-05-18 15:09:33 +00:00
|
|
|
|
# ns8-backup-monitor
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
> **NethServer 8 backup failure notification service.**
|
|
|
|
|
|
>
|
|
|
|
|
|
> Receives Alertmanager webhook alerts, correlates per-module backup status
|
|
|
|
|
|
> from the cluster Redis, optionally probes restic repositories, and sends a
|
|
|
|
|
|
> detailed HTML/text email through the NS8 mail relay.
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Table of contents
|
|
|
|
|
|
|
|
|
|
|
|
1. [Architecture](#architecture)
|
|
|
|
|
|
2. [File layout](#file-layout)
|
|
|
|
|
|
3. [Runtime paths](#runtime-paths)
|
|
|
|
|
|
4. [Requirements](#requirements)
|
|
|
|
|
|
5. [Installation](#installation)
|
|
|
|
|
|
6. [Configuration](#configuration)
|
|
|
|
|
|
7. [Alertmanager integration](#alertmanager-integration)
|
|
|
|
|
|
8. [Outcome classification](#outcome-classification)
|
|
|
|
|
|
9. [Redis key structure](#redis-key-structure)
|
|
|
|
|
|
10. [Service management](#service-management)
|
|
|
|
|
|
11. [Troubleshooting](#troubleshooting)
|
|
|
|
|
|
12. [Uninstallation](#uninstallation)
|
|
|
|
|
|
13. [License](#license)
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
## Architecture
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
|
|
|
|
|
```
|
2026-05-18 21:07:21 +00:00
|
|
|
|
Alertmanager ──POST /alert──► receiver.py
|
|
|
|
|
|
│
|
|
|
|
|
|
(wait N seconds for all modules
|
|
|
|
|
|
to finish writing their status)
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
correlator.py
|
|
|
|
|
|
(reads Redis KEYS/HGETALL,
|
|
|
|
|
|
classifies outcome:
|
|
|
|
|
|
SUCCESS / PARTIAL / REPO_FAILURE)
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
repo_check.py ← optional
|
|
|
|
|
|
(runagent → restic snapshots
|
|
|
|
|
|
on each module's repository)
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
notifier.py
|
|
|
|
|
|
(builds HTML + plain-text email,
|
|
|
|
|
|
dispatches via ns8-sendmail)
|
2026-05-18 15:10:33 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
**Key design decision:** the service is a long-running HTTP server managed by
|
|
|
|
|
|
systemd, not a one-shot script. This means it is always ready to receive an
|
|
|
|
|
|
alert regardless of whether the backup was triggered manually or by a scheduled
|
|
|
|
|
|
timer.
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
---
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
## File layout
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
ns8-backup-monitor/
|
2026-05-18 20:46:24 +00:00
|
|
|
|
│
|
2026-05-18 21:07:21 +00:00
|
|
|
|
├── README.md ← this file
|
2026-05-18 20:46:24 +00:00
|
|
|
|
│
|
|
|
|
|
|
├── config/
|
2026-05-18 21:07:21 +00:00
|
|
|
|
│ └── config.yml.example ← annotated configuration template
|
|
|
|
|
|
│ (copy to /etc/ns8-backup-monitor/config.yml)
|
2026-05-18 20:46:24 +00:00
|
|
|
|
│
|
2026-05-18 15:26:12 +00:00
|
|
|
|
├── deploy/
|
2026-05-18 21:07:21 +00:00
|
|
|
|
│ ├── install.sh ← interactive installer / uninstaller
|
2026-05-18 20:46:24 +00:00
|
|
|
|
│ └── ns8-backup-monitor.service ← systemd unit file
|
|
|
|
|
|
│
|
2026-05-18 21:07:21 +00:00
|
|
|
|
└── ns8_backup_monitor/ ← Python package
|
|
|
|
|
|
├── __init__.py ← package metadata, version string
|
|
|
|
|
|
├── __main__.py ← entry point: arg parsing, logging init,
|
|
|
|
|
|
│ hands off to receiver.run_server()
|
|
|
|
|
|
├── receiver.py ← HTTP webhook server (POST /alert)
|
|
|
|
|
|
├── correlator.py ← reads Redis, classifies backup outcome
|
|
|
|
|
|
├── repo_check.py ← probes restic repositories via runagent
|
|
|
|
|
|
├── notifier.py ← builds and sends email notifications
|
|
|
|
|
|
└── utils.py ← load_config(), setup_logging()
|
2026-05-18 20:46:24 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Runtime paths
|
|
|
|
|
|
|
|
|
|
|
|
The following paths are created by `deploy/install.sh` and assumed by the
|
|
|
|
|
|
default configuration.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
| Purpose | Path |
|
|
|
|
|
|
|---------|------|
|
|
|
|
|
|
| Python package | `/opt/ns8-backup-monitor/ns8_backup_monitor/` |
|
|
|
|
|
|
| Deploy scripts | `/opt/ns8-backup-monitor/deploy/` |
|
|
|
|
|
|
| Configuration | `/etc/ns8-backup-monitor/config.yml` |
|
|
|
|
|
|
| systemd unit | `/etc/systemd/system/ns8-backup-monitor.service` |
|
|
|
|
|
|
| Log file | `/var/log/ns8-backup-monitor.log` |
|
|
|
|
|
|
| NS8 Redis socket | `/var/lib/nethserver/cluster/state/redis.sock` |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Requirements
|
|
|
|
|
|
|
|
|
|
|
|
| Dependency | Provided by | Notes |
|
|
|
|
|
|
|------------|------------|-------|
|
|
|
|
|
|
| `python3` ≥ 3.8 | OS | Standard on AlmaLinux / Rocky 8+ |
|
|
|
|
|
|
| `pyyaml` | `pip3 install pyyaml` | Only non-stdlib dependency |
|
|
|
|
|
|
| `redis-cli` | NethServer 8 | Used via subprocess, no Python Redis client needed |
|
|
|
|
|
|
| `runagent` | NethServer 8 | Required for `repo_check` only |
|
|
|
|
|
|
| `ns8-sendmail` | NethServer 8 | Required for email delivery |
|
|
|
|
|
|
| `systemd` | OS | Service management |
|
|
|
|
|
|
|
|
|
|
|
|
> **This service must run on an NS8 leader node** (or any node that has
|
|
|
|
|
|
> read access to the cluster Redis socket and `runagent` in `PATH`).
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
### One-liner (recommended)
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
bash <(curl -fsSL https://repo.lelekaos.com/admin/ns8-backup-monitor/raw/branch/main/deploy/install.sh)
|
2026-05-18 15:10:33 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
The installer will:
|
|
|
|
|
|
1. Check prerequisites (`python3`, `curl`, `tar`, `ns8-sendmail`).
|
|
|
|
|
|
2. Download and extract the latest source archive from the Gitea repository.
|
|
|
|
|
|
3. Prompt interactively for sender address, recipient list, and subject prefix.
|
|
|
|
|
|
4. Write `/etc/ns8-backup-monitor/config.yml` with the supplied values.
|
|
|
|
|
|
5. Install and start the systemd service.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
### Manual installation
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-18 21:07:21 +00:00
|
|
|
|
git clone https://repo.lelekaos.com/admin/ns8-backup-monitor.git
|
|
|
|
|
|
cd ns8-backup-monitor
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Install Python dependency
|
|
|
|
|
|
pip3 install pyyaml
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Create directories
|
|
|
|
|
|
mkdir -p /opt/ns8-backup-monitor /etc/ns8-backup-monitor
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Copy source and config template
|
|
|
|
|
|
cp -r . /opt/ns8-backup-monitor/
|
|
|
|
|
|
cp config/config.yml.example /etc/ns8-backup-monitor/config.yml
|
|
|
|
|
|
# Edit the config before starting
|
|
|
|
|
|
nano /etc/ns8-backup-monitor/config.yml
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Install systemd unit
|
|
|
|
|
|
cp deploy/ns8-backup-monitor.service /etc/systemd/system/
|
|
|
|
|
|
systemctl daemon-reload
|
|
|
|
|
|
systemctl enable --now ns8-backup-monitor
|
2026-05-18 15:26:12 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Configuration
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
The configuration file is a YAML document. The installer writes it to
|
|
|
|
|
|
`/etc/ns8-backup-monitor/config.yml`; a fully annotated template is available
|
|
|
|
|
|
at `config/config.yml.example`.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
```yaml
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Email notification settings
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Delivery is handled by ns8-sendmail, which uses the SMTP relay already
|
|
|
|
|
|
# configured in NethServer 8. No SMTP credentials are needed here.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
mail:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Envelope / header sender address.
|
|
|
|
|
|
from: "ns8-backup-monitor@yourdomain.com"
|
|
|
|
|
|
|
|
|
|
|
|
# One or more recipient addresses. At least one is required.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
to:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
- "admin@yourdomain.com"
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# String prepended to every email subject line.
|
|
|
|
|
|
subject_prefix: "[NS8 Backup]"
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Webhook receiver (HTTP server)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
receiver:
|
|
|
|
|
|
# Interface to listen on. 127.0.0.1 is recommended when Alertmanager
|
|
|
|
|
|
# runs on the same host; use 0.0.0.0 only if it runs on a different node.
|
|
|
|
|
|
host: "127.0.0.1"
|
|
|
|
|
|
# TCP port. Must match the webhook URL configured in Alertmanager.
|
|
|
|
|
|
port: 9099
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Timing
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 20:46:24 +00:00
|
|
|
|
correlator:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Seconds to wait after receiving the alert before reading Redis.
|
|
|
|
|
|
# This grace period allows all module agents to finish writing their
|
|
|
|
|
|
# per-module status hashes. 30 s is sufficient for most deployments.
|
|
|
|
|
|
wait_seconds: 30
|
|
|
|
|
|
|
|
|
|
|
|
# Look-back window in seconds used when the alert does not include a
|
|
|
|
|
|
# backup_id label. Any plan whose Redis status was updated within this
|
|
|
|
|
|
# window is considered "recent" and included in the report.
|
|
|
|
|
|
recent_window: 3600
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Redis connection
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 20:46:24 +00:00
|
|
|
|
redis:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Path to the NS8 cluster Redis Unix socket.
|
|
|
|
|
|
# On a standard NS8 installation this path never changes.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
socket: "/var/lib/nethserver/cluster/state/redis.sock"
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Repository check (optional, uses runagent + restic)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 20:46:24 +00:00
|
|
|
|
repo_check:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Maximum seconds to wait for each repository check before giving up.
|
|
|
|
|
|
timeout: 60
|
|
|
|
|
|
# Extra flags passed verbatim to every restic invocation.
|
|
|
|
|
|
# Example: "--cacert /etc/pki/tls/certs/ca-bundle.crt"
|
|
|
|
|
|
restic_flags: ""
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# Logging
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 20:46:24 +00:00
|
|
|
|
logging:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Python log level: DEBUG, INFO, WARNING, ERROR.
|
|
|
|
|
|
level: INFO
|
|
|
|
|
|
# Absolute path for the rotating log file (5 MB × 3 backups).
|
|
|
|
|
|
# Leave empty to log to stdout / journald only.
|
|
|
|
|
|
file: "/var/log/ns8-backup-monitor.log"
|
2026-05-18 20:46:24 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Alertmanager integration
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
Add a receiver pointing to the service in your Alertmanager configuration:
|
2026-05-18 15:10:33 +00:00
|
|
|
|
|
|
|
|
|
|
```yaml
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# alertmanager.yml (relevant excerpt)
|
2026-05-18 15:10:33 +00:00
|
|
|
|
route:
|
|
|
|
|
|
receiver: ns8-backup-monitor
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Only route backup-related alerts to this receiver.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
routes:
|
2026-05-18 21:07:21 +00:00
|
|
|
|
- match:
|
|
|
|
|
|
alertname: NethServerBackupFailed
|
2026-05-18 20:46:24 +00:00
|
|
|
|
receiver: ns8-backup-monitor
|
2026-05-18 21:07:21 +00:00
|
|
|
|
|
|
|
|
|
|
receivers:
|
|
|
|
|
|
- name: ns8-backup-monitor
|
|
|
|
|
|
webhook_configs:
|
|
|
|
|
|
- url: "http://127.0.0.1:9099/alert"
|
|
|
|
|
|
# Send resolved alerts too so the service can log them.
|
|
|
|
|
|
send_resolved: true
|
2026-05-18 20:46:24 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
Reload Alertmanager after editing:
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
```bash
|
|
|
|
|
|
systemctl reload alertmanager
|
|
|
|
|
|
# or, for the NS8 metrics module:
|
|
|
|
|
|
runagent -m metrics1 systemctl reload alertmanager
|
|
|
|
|
|
```
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Outcome classification
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
For each backup plan the correlator reads all per-module status hashes and
|
|
|
|
|
|
produces one of three outcomes:
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
| Outcome | Condition | Email subject |
|
2026-05-18 21:07:21 +00:00
|
|
|
|
|---------|-----------|---------------|
|
|
|
|
|
|
| `SUCCESS` | All modules finished with `result=success` | `✅ Backup completed` |
|
|
|
|
|
|
| `PARTIAL` | At least one module succeeded, at least one failed | `⚠️ Backup partially failed` |
|
|
|
|
|
|
| `REPO_FAILURE` | All modules failed **or** no status found in Redis | `❌ Backup failed` |
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Redis key structure
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
The correlator reads two families of keys from the NS8 cluster Redis:
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
| Key pattern | Description |
|
|
|
|
|
|
|-------------|-------------|
|
|
|
|
|
|
| `cluster/backup/<backup_id>/status` | Plan-level status hash. Fields: `result`, `timestamp`, `errors` (integer count). |
|
|
|
|
|
|
| `module/<module_id>/backup/<backup_id>/status` | Per-module status hash. Fields: `result`, `timestamp`, `error` (message string). |
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
`result` is either `"success"` or `"error"`. `timestamp` is an ISO 8601
|
|
|
|
|
|
string in UTC (e.g. `2024-01-15T03:00:05Z`).
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Service management
|
|
|
|
|
|
|
2026-05-18 15:26:12 +00:00
|
|
|
|
```bash
|
2026-05-18 20:46:24 +00:00
|
|
|
|
# Check service status
|
|
|
|
|
|
systemctl status ns8-backup-monitor
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Follow live logs via journald
|
2026-05-18 20:46:24 +00:00
|
|
|
|
journalctl -u ns8-backup-monitor -f
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Follow the rotating log file directly
|
|
|
|
|
|
tail -f /var/log/ns8-backup-monitor.log
|
|
|
|
|
|
|
|
|
|
|
|
# Restart after a config change
|
2026-05-18 20:46:24 +00:00
|
|
|
|
systemctl restart ns8-backup-monitor
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
# Test the webhook endpoint manually
|
|
|
|
|
|
curl -s -X POST http://127.0.0.1:9099/alert \
|
|
|
|
|
|
-H 'Content-Type: application/json' \
|
|
|
|
|
|
-d '{"alerts":[{"status":"firing","labels":{"alertname":"NethServerBackupFailed"}}]}'
|
2026-05-18 15:26:12 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
---
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
## Troubleshooting
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
### Service starts but no email is received
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
1. Verify `ns8-sendmail` works independently:
|
2026-05-18 20:46:24 +00:00
|
|
|
|
```bash
|
2026-05-18 21:07:21 +00:00
|
|
|
|
echo 'Test' | ns8-sendmail -s 'Test' admin@yourdomain.com
|
2026-05-18 20:46:24 +00:00
|
|
|
|
```
|
2026-05-18 21:07:21 +00:00
|
|
|
|
2. Check `mail.to` in `/etc/ns8-backup-monitor/config.yml`.
|
|
|
|
|
|
3. Increase log level to `DEBUG` and restart the service.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
### `REPO_FAILURE` on every alert even though backups succeed
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
- The correlator may be reading Redis before all modules have finished.
|
|
|
|
|
|
Increase `correlator.wait_seconds` (e.g. to `60`).
|
|
|
|
|
|
- Check that the Redis socket path is correct:
|
|
|
|
|
|
`redis-cli -s /var/lib/nethserver/cluster/state/redis.sock PING`
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
### Alertmanager does not reach the webhook
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
- Confirm the service is listening:
|
|
|
|
|
|
`ss -tlnp | grep 9099`
|
|
|
|
|
|
- If Alertmanager runs on a different host, change `receiver.host` to
|
|
|
|
|
|
`0.0.0.0` and open the port in the firewall.
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
## Uninstallation
|
2026-05-18 15:26:12 +00:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-18 21:07:21 +00:00
|
|
|
|
bash /opt/ns8-backup-monitor/deploy/install.sh --uninstall
|
2026-05-18 15:26:12 +00:00
|
|
|
|
```
|
2026-05-18 20:46:24 +00:00
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
The script will stop and disable the service, remove the install directory,
|
|
|
|
|
|
and optionally remove the configuration directory.
|
|
|
|
|
|
|
2026-05-18 20:46:24 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
2026-05-18 21:07:21 +00:00
|
|
|
|
MIT — see [LICENSE](LICENSE) if present, otherwise contact the repository owner.
|