docs: update nix guide for TimescaleDB, add org settings and device monitoring docs
- nix.md: TimescaleDB now enabled for both dev and test databases - nix.md: added troubleshooting section for TimescaleDB reinitialization - New: docs/features/organization-settings.md (tabbed interface, all tabs documented) - New: docs/features/device-monitoring.md (schema field reference, activity feed fields, SNMP socket management)
This commit is contained in:
parent
6d8c3f932b
commit
397271ce03
3 changed files with 148 additions and 2 deletions
47
docs/features/device-monitoring.md
Normal file
47
docs/features/device-monitoring.md
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Device Monitoring
|
||||||
|
|
||||||
|
## Device Schema
|
||||||
|
|
||||||
|
Key fields on the `Device` schema (`Towerops.Devices.Device`):
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| `device_role` | string | Device role classification (router, switch, ap, etc.) |
|
||||||
|
| `last_checked_at` | utc_datetime | Last time any check ran against this device |
|
||||||
|
| `last_discovery_at` | utc_datetime | Last SNMP discovery scan |
|
||||||
|
| `last_snmp_poll_at` | utc_datetime | Last SNMP metrics poll |
|
||||||
|
|
||||||
|
> **Note**: The schema does NOT have `device_type` or `last_seen_at` — these were removed/renamed. Use `device_role` and `last_checked_at` respectively.
|
||||||
|
|
||||||
|
## Device Health Indicators
|
||||||
|
|
||||||
|
The device index shows health status based on check results:
|
||||||
|
|
||||||
|
- **Status badge**: up/down/warning based on latest check
|
||||||
|
- **Role icon**: visual indicator based on `device_role`
|
||||||
|
- **Last checked**: relative timestamp from `last_checked_at`
|
||||||
|
|
||||||
|
## Activity Feed
|
||||||
|
|
||||||
|
Dashboard activity feed items (from `ActivityFeed.list_org_activity/2`) use:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| `summary` | string | Short description of the activity |
|
||||||
|
| `detail` | string | Extended detail (optional) |
|
||||||
|
| `timestamp` | utc_datetime | When the activity occurred |
|
||||||
|
| `severity` | string | info, warning, error, critical |
|
||||||
|
| `icon` | string | Hero icon name |
|
||||||
|
| `link` | string | URL to related resource |
|
||||||
|
| `device_name` | string | Associated device name |
|
||||||
|
| `site_name` | string | Associated site name |
|
||||||
|
|
||||||
|
> **Note**: Activity items do NOT have `description` or `inserted_at` — use `summary` and `timestamp`.
|
||||||
|
|
||||||
|
## SNMP Socket Management
|
||||||
|
|
||||||
|
The SNMP manager (`SnmpKit.SnmpLib.Manager`) uses UDP sockets for device communication. Key implementation details:
|
||||||
|
|
||||||
|
- Sockets are opened per-request and cleaned up via `try/after` blocks
|
||||||
|
- `get_bulk`, `set`, and `get_multi` all guarantee socket cleanup in all code paths
|
||||||
|
- Previously, socket leaks could cause EMFILE (too many open files) errors that would crash the BEAM VM
|
||||||
81
docs/features/organization-settings.md
Normal file
81
docs/features/organization-settings.md
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
# Organization Settings
|
||||||
|
|
||||||
|
Organization settings are managed through a tabbed interface at `/orgs/:slug/settings`.
|
||||||
|
|
||||||
|
## Tabs
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
- **Organization name** — 2-100 characters
|
||||||
|
- **Default organization** — set which org loads on login (visible when user has multiple orgs)
|
||||||
|
- **Site organization** — toggle `use_sites` to group devices into physical locations
|
||||||
|
|
||||||
|
### SNMP
|
||||||
|
|
||||||
|
Default SNMP configuration applied to all devices (overridable at site or device level).
|
||||||
|
|
||||||
|
- **Version**: v1, v2c, or v3
|
||||||
|
- **Community string** (v1/v2c)
|
||||||
|
- **SNMPv3 credentials** (v3): username, auth protocol/password, privacy protocol/password
|
||||||
|
- **Port**: default 161
|
||||||
|
- **Force apply**: push org-level SNMP config to all existing devices
|
||||||
|
|
||||||
|
Configuration hierarchy: **Device > Site > Organization**
|
||||||
|
|
||||||
|
### MikroTik (superuser only)
|
||||||
|
|
||||||
|
RouterOS API credentials for MikroTik device management.
|
||||||
|
|
||||||
|
- Enable/disable MikroTik API
|
||||||
|
- Username, password, port (default 8729)
|
||||||
|
- SSL toggle with security warnings for plain API
|
||||||
|
|
||||||
|
### Agents
|
||||||
|
|
||||||
|
Default polling agent assignment.
|
||||||
|
|
||||||
|
- Select default remote agent or use cloud polling
|
||||||
|
- View device assignment breakdown (device-level, site-level, org-level, cloud)
|
||||||
|
- Force apply default agent to all devices
|
||||||
|
|
||||||
|
### Integrations
|
||||||
|
|
||||||
|
Third-party service connections. Each integration has:
|
||||||
|
|
||||||
|
- **API key** (encrypted at rest via Cloak)
|
||||||
|
- **Sync interval** (minutes)
|
||||||
|
- **Enable/disable toggle**
|
||||||
|
- **Test connection** button
|
||||||
|
- **Sync status** and schedule display
|
||||||
|
|
||||||
|
#### Preseem
|
||||||
|
|
||||||
|
QoE monitoring for wireless ISPs. Links to:
|
||||||
|
- Device management (`/settings/integrations/preseem/devices`)
|
||||||
|
- Network Insights (`/insights?source=preseem`)
|
||||||
|
|
||||||
|
#### Gaiia
|
||||||
|
|
||||||
|
Billing and subscriber management. Includes:
|
||||||
|
- Entity mapping (`/settings/integrations/gaiia/mapping`)
|
||||||
|
- Reconciliation (`/settings/integrations/gaiia/reconciliation`)
|
||||||
|
- **Webhook configuration**: URL and secret for real-time updates from Gaiia
|
||||||
|
|
||||||
|
## URL Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/orgs/:slug/settings → General tab (default)
|
||||||
|
/orgs/:slug/settings?tab=snmp → SNMP tab
|
||||||
|
/orgs/:slug/settings?tab=mikrotik → MikroTik tab
|
||||||
|
/orgs/:slug/settings?tab=agents → Agents tab
|
||||||
|
/orgs/:slug/settings?tab=integrations → Integrations tab
|
||||||
|
```
|
||||||
|
|
||||||
|
Invalid `?tab=` values default gracefully to the General tab.
|
||||||
|
|
||||||
|
## Technical Notes
|
||||||
|
|
||||||
|
- The General/SNMP/MikroTik/Agents tabs share a single organization changeset form
|
||||||
|
- The Integrations tab uses separate per-provider forms
|
||||||
|
- Integration credentials are stored encrypted using `Encrypted.Map` (Cloak + AES-GCM)
|
||||||
|
- All settings changes are audit-logged
|
||||||
22
docs/nix.md
22
docs/nix.md
|
|
@ -159,10 +159,12 @@ nix develop
|
||||||
|
|
||||||
The development shell automatically starts:
|
The development shell automatically starts:
|
||||||
|
|
||||||
- **PostgreSQL 16**: Runs on `localhost:5432`
|
- **PostgreSQL 16 + TimescaleDB**: Runs on `localhost:5432`
|
||||||
- Databases: `towerops_dev`, `towerops_test`
|
- Databases: `towerops_dev`, `towerops_test`
|
||||||
- Data directory: `.nix-postgres/`
|
- Data directory: `.nix-postgres/`
|
||||||
- TimescaleDB extension enabled (dev database only)
|
- TimescaleDB extension enabled for both dev and test databases
|
||||||
|
- PostgreSQL built with `withPackages` to include TimescaleDB
|
||||||
|
- `shared_preload_libraries = 'timescaledb'` set in config
|
||||||
|
|
||||||
- **Redis**: Runs on `localhost:6379`
|
- **Redis**: Runs on `localhost:6379`
|
||||||
- Data directory: `.nix-redis/`
|
- Data directory: `.nix-redis/`
|
||||||
|
|
@ -440,6 +442,22 @@ nix-shell -p net-snmp --run "pkg-config --libs netsnmp"
|
||||||
nix build .#towerops-nif --rebuild
|
nix build .#towerops-nif --rebuild
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### TimescaleDB Not Loading
|
||||||
|
|
||||||
|
If TimescaleDB was added after initial setup, you need to reinitialize PostgreSQL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Stop services and remove old data directory
|
||||||
|
stop-services
|
||||||
|
rm -rf .nix-postgres .nix-services-started
|
||||||
|
|
||||||
|
# Re-enter shell to reinitialize with TimescaleDB
|
||||||
|
exit
|
||||||
|
nix develop
|
||||||
|
```
|
||||||
|
|
||||||
|
This is required because `shared_preload_libraries` is set during `initdb` and the TimescaleDB shared library must be available in the PostgreSQL package.
|
||||||
|
|
||||||
### Mix Dependencies
|
### Mix Dependencies
|
||||||
|
|
||||||
**Error: Mix dependencies not found**:
|
**Error: Mix dependencies not found**:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue