docs: update README and ADMIN_INTERFACE with ntfy notifications integration
This commit is contained in:
@@ -46,6 +46,17 @@ A web-based admin interface has been added to MySMSAPio for managing API keys an
|
|||||||
- **Activate/Deactivate**: Toggle gateway active status
|
- **Activate/Deactivate**: Toggle gateway active status
|
||||||
- **Recent Messages**: View messages processed by each gateway
|
- **Recent Messages**: View messages processed by each gateway
|
||||||
|
|
||||||
|
### 5. Push Notifications (ntfy)
|
||||||
|
- **Per-admin configuration**: Each admin user sets their own ntfy topic, access token, and server URL
|
||||||
|
- **Test button**: Send a test push notification to verify connectivity
|
||||||
|
- **Real-time alerts** for:
|
||||||
|
- Gateway went offline (high priority)
|
||||||
|
- Gateway came back online
|
||||||
|
- SMS delivery confirmed (low priority)
|
||||||
|
- SMS failed (urgent priority)
|
||||||
|
- API key revoked
|
||||||
|
- See [Push Notifications (ntfy)](#push-notifications-ntfy) section below for setup details
|
||||||
|
|
||||||
## Access
|
## Access
|
||||||
|
|
||||||
### Default Login Credentials
|
### Default Login Credentials
|
||||||
|
|||||||
73
README.md
73
README.md
@@ -10,6 +10,8 @@ A Ruby on Rails REST API and WebSocket server for managing SMS messaging through
|
|||||||
- **OTP Management**: Generate, send, and verify one-time passwords
|
- **OTP Management**: Generate, send, and verify one-time passwords
|
||||||
- **WebSocket Communication**: Real-time bidirectional communication with gateway devices
|
- **WebSocket Communication**: Real-time bidirectional communication with gateway devices
|
||||||
- **Webhook Support**: Trigger webhooks for SMS events
|
- **Webhook Support**: Trigger webhooks for SMS events
|
||||||
|
- **Push Notifications (ntfy)**: Self-hosted ntfy integration for real-time alerts on gateway status, SMS delivery, and API key changes
|
||||||
|
- **Admin Interface**: Web-based dashboard for managing API keys, SMS logs, gateways, and notification settings
|
||||||
- **Rate Limiting**: Protect API endpoints from abuse
|
- **Rate Limiting**: Protect API endpoints from abuse
|
||||||
- **Load Balancing**: Automatically distribute messages across multiple gateways
|
- **Load Balancing**: Automatically distribute messages across multiple gateways
|
||||||
- **Auto Failover**: Retry failed messages and handle gateway offline scenarios
|
- **Auto Failover**: Retry failed messages and handle gateway offline scenarios
|
||||||
@@ -23,6 +25,8 @@ A Ruby on Rails REST API and WebSocket server for managing SMS messaging through
|
|||||||
- **Background Jobs**: Sidekiq 7
|
- **Background Jobs**: Sidekiq 7
|
||||||
- **WebSocket**: Action Cable (Redis adapter)
|
- **WebSocket**: Action Cable (Redis adapter)
|
||||||
- **API Authentication**: JWT + API Keys
|
- **API Authentication**: JWT + API Keys
|
||||||
|
- **Push Notifications**: ntfy (self-hosted, via Kamal accessory)
|
||||||
|
- **Admin UI**: Tailwind CSS v4 + Font Awesome
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
@@ -66,6 +70,9 @@ DEFAULT_COUNTRY_CODE=US
|
|||||||
# Rails
|
# Rails
|
||||||
SECRET_KEY_BASE=your_secret_key_here
|
SECRET_KEY_BASE=your_secret_key_here
|
||||||
RAILS_ENV=development
|
RAILS_ENV=development
|
||||||
|
|
||||||
|
# ntfy Push Notifications (optional — defaults to https://ntfy.sh)
|
||||||
|
# NTFY_SERVER_URL=https://ntfy.yourdomain.com
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Create and set up the database
|
### 4. Create and set up the database
|
||||||
@@ -543,6 +550,7 @@ The system uses Sidekiq for background processing:
|
|||||||
- **ProcessInboundSmsJob**: Processes received SMS and triggers webhooks
|
- **ProcessInboundSmsJob**: Processes received SMS and triggers webhooks
|
||||||
- **RetryFailedSmsJob**: Retries failed messages with exponential backoff
|
- **RetryFailedSmsJob**: Retries failed messages with exponential backoff
|
||||||
- **TriggerWebhookJob**: Executes webhook HTTP calls
|
- **TriggerWebhookJob**: Executes webhook HTTP calls
|
||||||
|
- **SendNtfyNotificationJob**: Sends push notifications via ntfy (async, retries 3×)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -575,6 +583,58 @@ If a `secret_key` is configured, webhooks include an HMAC-SHA256 signature in th
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Push Notifications (ntfy)
|
||||||
|
|
||||||
|
The system integrates with [ntfy](https://ntfy.sh) for real-time push notifications to your phone or desktop. ntfy is a simple HTTP-based pub/sub notification service — no signup required.
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
|
||||||
|
1. A self-hosted ntfy server runs as a Docker container alongside the Rails app (configured as a Kamal accessory in `config/deploy.yml`).
|
||||||
|
2. Each admin user configures their own ntfy topic + access token in the admin UI at `/admin/notifications`.
|
||||||
|
3. When a monitored event occurs, `SendNtfyNotificationJob` fires asynchronously, POSTing a JSON payload to the ntfy server with title, message, priority, tags, and optional click URL.
|
||||||
|
4. The ntfy app on your phone (Android/iOS) or desktop receives the push notification.
|
||||||
|
|
||||||
|
### Notification Events
|
||||||
|
|
||||||
|
| Event | Priority | Tags | Trigger |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `gateway_online` | default (3) | white_check_mark | Gateway transitions from offline → online |
|
||||||
|
| `gateway_offline` | high (4) | rotating_light | Gateway goes offline (WebSocket disconnect or stale heartbeat) |
|
||||||
|
| `sms_delivered` | low (2) | white_check_mark | Delivery report confirms SMS reached handset |
|
||||||
|
| `sms_failed` | urgent (5) | x, rotating_light | SMS fails after retries exhausted |
|
||||||
|
| `api_key_revoked` | default (3) | key, no_entry | API key revoked by an admin |
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
1. **Install the ntfy app** on your phone ([Android](https://play.google.com/store/apps/details?id=io.heckel.ntfy) / [iOS](https://apps.apple.com/us/app/ntfy/id1625396347)) or use the [web app](https://ntfy.sh/app).
|
||||||
|
2. **Log in** to the admin interface at `/admin/login`.
|
||||||
|
3. **Navigate** to **Notifications** in the sidebar.
|
||||||
|
4. **Enter your ntfy topic** (treat it like a password — pick something hard to guess), access token (if your server has auth), and server URL (leave blank to use the default from `NTFY_SERVER_URL` env var).
|
||||||
|
5. **Click "Send Test Notification"** to verify connectivity.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- **Admin UI**: `/admin/notifications` — per-admin ntfy settings + test button
|
||||||
|
- **Environment variable**: `NTFY_SERVER_URL` — default ntfy server URL (used when an admin's `ntfy_server_url` field is blank). Defaults to `https://ntfy.sh`.
|
||||||
|
- **Kamal accessory**: ntfy runs as an accessory container in production (see `config/deploy.yml`). Requires `NTFY_AUTH_FILE` secret for access control.
|
||||||
|
- **Model**: `AdminUser` ntfy fields — `ntfy_topic`, `ntfy_token`, `ntfy_enabled`, `ntfy_server_url`
|
||||||
|
|
||||||
|
### Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Event (gateway offline, SMS failed, etc.)
|
||||||
|
↓
|
||||||
|
NtfyDispatchable concern → dispatch_ntfy(event, payload)
|
||||||
|
↓
|
||||||
|
SendNtfyNotificationJob (async, :notifications queue, retries 3×)
|
||||||
|
↓
|
||||||
|
Ntfy::Publisher → HTTParty.post(ntfy_server_url/topic, JSON + Bearer auth)
|
||||||
|
↓
|
||||||
|
ntfy server → push to phone/desktop app
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Error Responses
|
## Error Responses
|
||||||
|
|
||||||
All errors follow this format:
|
All errors follow this format:
|
||||||
@@ -658,8 +718,14 @@ SECRET_KEY_BASE=your_production_secret
|
|||||||
RAILS_ENV=production
|
RAILS_ENV=production
|
||||||
ALLOWED_ORIGINS=https://yourdomain.com
|
ALLOWED_ORIGINS=https://yourdomain.com
|
||||||
DEFAULT_COUNTRY_CODE=US
|
DEFAULT_COUNTRY_CODE=US
|
||||||
|
|
||||||
|
# ntfy Push Notifications
|
||||||
|
NTFY_SERVER_URL=https://ntfy.yourdomain.com
|
||||||
|
NTFY_AUTH_FILE=/var/lib/ntfy/user.db
|
||||||
```
|
```
|
||||||
|
|
||||||
|
ntfy runs as a Kamal accessory container. It listens on port 80 (mapped to `127.0.0.1:8090` on the host) with a persistent volume at `ntfy_data:/var/lib/ntfy`. The `NTFY_AUTH_FILE` secret points to the ntfy access control database. See `config/deploy.yml` for the full accessory configuration.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Monitoring
|
## Monitoring
|
||||||
@@ -714,6 +780,13 @@ mount Sidekiq::Web => '/sidekiq'
|
|||||||
│ (Background │
|
│ (Background │
|
||||||
│ Jobs) │
|
│ Jobs) │
|
||||||
│ │
|
│ │
|
||||||
|
└────────┬─────────┘
|
||||||
|
│
|
||||||
|
┌────────┴─────────┐
|
||||||
|
│ │
|
||||||
|
│ ntfy Server │
|
||||||
|
│ (Push Notifs) │
|
||||||
|
│ │
|
||||||
└──────────────────┘
|
└──────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user