Docs / Reference
Dashboard API
The web dashboard exposes a REST API consumed by the Vue 3 frontend.
Example: Create a Domain
Request
curl -X POST http://localhost:6443/api/domains \
-H "Content-Type: application/json" \
-d '{
"name": "example.com",
"port": 3000,
"backendHost": "127.0.0.1",
"upstreamType": "http",
"ssl": { "enabled": true },
"performance": { "gzip": true },
"security": { "rateLimit": false }
}'Response (201)
{
"name": "example.com",
"port": 3000,
"backendHost": "127.0.0.1",
"upstreamType": "http",
"ssl": { "enabled": true },
"enabled": true,
"notifications": {
"domain_health": { "enabled": true, "channelIds": [] },
"cert_expiry": { "enabled": true, "channelIds": [] }
}
}Example: Create a Notification Channel
Request
curl -X POST http://localhost:6443/api/settings/channels \
-H "Content-Type: application/json" \
-d '{
"name": "Production Discord",
"type": "discord",
"webhookUrl": "https://discord.com/api/webhooks/...",
"message": "<@&1280907071813976196>"
}'Response (201)
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Production Discord",
"type": "discord",
"webhookUrl": "https://discord.com/api/webhooks/...",
"message": "<@&1280907071813976196>"
}Example: Configure Domain Notifications
Request
curl -X PUT http://localhost:6443/api/domains/example.com/notifications \
-H "Content-Type: application/json" \
-d '{
"domain_health": { "enabled": true, "channelIds": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"] },
"cert_expiry": { "enabled": false, "channelIds": [] }
}'All Endpoints
Nginx
| Endpoint | Method | Description |
|---|---|---|
| /api/nginx/status | GET | Get nginx running status |
| /api/nginx/start | POST | Start nginx |
| /api/nginx/stop | POST | Stop nginx |
| /api/nginx/reload | POST | Graceful reload |
| /api/nginx/configs | GET | List config files |
| /api/nginx/config/:file | GETPOST | Read / write config file |
Domains
| Endpoint | Method | Description |
|---|---|---|
| /api/domains | GETPOST | List / create domains. Responses include a notifications field with per-domain channel config. |
| /api/domains/:name | PUTDELETE | Update / delete domain |
| /api/domains/:name/toggle | PUT | Enable or disable domain |
| /api/domains/:name/reload | POST | Reload nginx for domain |
| /api/domains/:name/notifications | GETPUT | Get or update per-domain notification config (enabled flag + channelIds per event type) |
SSL
| Endpoint | Method | Description |
|---|---|---|
| /api/ssl | GET | List certificates |
| /api/ssl/create | POST | Issue new certificate (HTTP-01 or DNS-01) |
| /api/ssl/create-confirm | POST | Confirm DNS-01 challenge |
| /api/ssl/renew/:domain | POST | Renew certificate |
Settings
| Endpoint | Method | Description |
|---|---|---|
| /api/settings | GETPOST | Get / save dashboard settings |
| /api/settings/permissions | GET | Check whether Linux NOPASSWD sudoers are configured |
| /api/settings/permissions/setup | POST | Write /etc/sudoers.d/easy-devops via sudo -S (Linux only). Body: { password: string } |
| /api/settings/backup | GET | Download config and domains as a JSON file (password excluded) |
| /api/settings/restore | POST | Restore config and domains from a backup JSON body |
Notification Channels
| Endpoint | Method | Description |
|---|---|---|
| /api/settings/channels | GET | List all named notification channels |
| /api/settings/channels | POST | Create a channel. Body: { name, type: 'discord'|'telegram', webhookUrl?, botToken?, chatId?, message? } |
| /api/settings/channels/:id | PUT | Update channel name or credentials. Type is immutable after creation. |
| /api/settings/channels/:id | DELETE | Delete a channel |
| /api/settings/channels/:id/test | POST | Send a live test notification to a single channel |