@silentjma/n8n-nodes-unraid 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/LICENSE +21 -0
- package/README.md +150 -2
- package/dist/credentials/UnraidApi.credentials.js +68 -0
- package/dist/lib/analysis.js +398 -0
- package/dist/lib/client.js +46 -0
- package/dist/lib/containers.js +54 -0
- package/dist/lib/logs.js +48 -0
- package/dist/lib/queries.js +86 -0
- package/dist/nodes/Unraid/Unraid.node.js +720 -0
- package/dist/nodes/Unraid/Unraid.node.json +9 -0
- package/dist/nodes/Unraid/unraid.svg +1 -0
- package/dist/nodes/UnraidTrigger/UnraidTrigger.node.js +287 -0
- package/dist/nodes/UnraidTrigger/UnraidTrigger.node.json +9 -0
- package/dist/nodes/UnraidTrigger/unraid.svg +1 -0
- package/package.json +77 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this package. Versions follow [semver](https://semver.org/).
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## 0.1.1 - 2026-10-26
|
|
8
|
+
|
|
9
|
+
Passes n8n's community package scanner (`npx @n8n/scan-community-package @silentjma/n8n-nodes-unraid`).
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- `package.json`: `author` now includes the npm owner's email. The scanner requires an author email (`valid-author`), and n8n's Creator Portal reads it from npm to match the package to its owner ("Error getting author email from npm").
|
|
13
|
+
- Nodes declare their inputs and outputs with `NodeConnectionTypes.Main`.
|
|
14
|
+
- Errors from an operation are always raised as `NodeApiError` or `NodeOperationError`, with the item index, so n8n shows them properly per item.
|
|
15
|
+
- An invalid log filter pattern now fails with a clear node error. It no longer throws a plain `Error` from the log helpers.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- Credential icon. Node icons use the light/dark form.
|
|
19
|
+
- `npm run lint` now includes n8n's community node rules (`@n8n/eslint-plugin-community-nodes`, the ruleset the scanner runs), so CI catches scan failures before a release. ESLint is pinned to 9.29.0 to match that plugin.
|
|
20
|
+
|
|
21
|
+
### Docs
|
|
22
|
+
- Telegram needs a public HTTPS webhook. Set `N8N_WEBHOOK_URL`; on n8n 2.x, `WEBHOOK_URL` alone leaves test webhooks on the editor URL.
|
|
23
|
+
|
|
24
|
+
### Project
|
|
25
|
+
- Community files: CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, SUPPORT, issue and pull request templates, Dependabot.
|
|
26
|
+
- CI on every push and pull request. A release workflow publishes to npm with provenance when a `v*` tag is pushed.
|
|
27
|
+
- Buy Me a Coffee funding link.
|
|
28
|
+
|
|
29
|
+
## 0.1.0 - 2026-10-25
|
|
30
|
+
|
|
31
|
+
First release.
|
|
32
|
+
|
|
33
|
+
### Nodes
|
|
34
|
+
- **Unraid** action node:
|
|
35
|
+
- System: health report with suggested next steps, info, metrics.
|
|
36
|
+
- Array: status, start, stop, parity check start, pause, resume and cancel, parity history.
|
|
37
|
+
- Disks and shares.
|
|
38
|
+
- Docker: list, get, logs (analysed), update status, check for updates, start, stop, restart, pause, unpause, update one or more containers, update all.
|
|
39
|
+
- VMs: list, start, stop, force stop, pause, resume, reboot, reset.
|
|
40
|
+
- Log files: list and read, with a regex filter and severity analysis.
|
|
41
|
+
- Notifications: create (optionally only if unique), list, overview, warnings and alerts, archive.
|
|
42
|
+
- Custom GraphQL.
|
|
43
|
+
- **Unraid Trigger** polling events: log file lines, container log lines, health problems (optionally resolved ones too), new notifications, container state changes, container updates available.
|
|
44
|
+
- **Unraid API** credential: server URL, `x-api-key`, and an option to accept self-signed certificates. The credential test fails on a revoked or invalid key, even though Unraid answers those with HTTP 200.
|
|
45
|
+
- Containers can be given by name, ID or command-safe name (`plex_media_server`).
|
|
46
|
+
- Built-in rules for log lines and health findings, each with next steps:
|
|
47
|
+
- Logs: disk I/O, filesystem corruption, OOM, hardware/MCE, kernel traces, disk space, parity, auth failures, segfaults, Docker, network, temperature, application fatal errors.
|
|
48
|
+
- Health: array state, disk status, errors, temperature (separate HDD and SSD thresholds) and usage, SMART, parity, stopped autostart containers, updates, memory, CPU, Unraid alerts.
|
|
49
|
+
|
|
50
|
+
### Workflows
|
|
51
|
+
- `unraid-alerts.json`, `unraid-docker.json` and `unraid-sysadmin-bot.json`: alerts, Docker updates and on-demand actions, and sysadmin commands, all managed from a Telegram bot.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mohamed Ayoub Jabane
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,151 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @silentjma/n8n-nodes-unraid
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@silentjma/n8n-nodes-unraid)
|
|
4
|
+
[](https://github.com/SilentJMA/n8n-nodes-unraid/actions/workflows/ci.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.buymeacoffee.com/kilwanitrod)
|
|
7
|
+
|
|
8
|
+
Unofficial n8n community nodes for the [Unraid API](https://docs.unraid.net/API/) (GraphQL, [unraid/api](https://github.com/unraid/api)).
|
|
9
|
+
|
|
10
|
+
- **Unraid**: an action node for System, Array, Disk, Share, Docker Container, Virtual Machine, Log File and Notification, plus a Custom GraphQL operation.
|
|
11
|
+
- **Unraid Trigger**: a polling trigger for new log lines (syslog or a container log), health problems, notifications, container state changes and container updates.
|
|
12
|
+
|
|
13
|
+
Both nodes use the same built-in rules ([src/lib/analysis.ts](src/lib/analysis.ts)). The rules tag log lines and health findings as `info`, `warning` or `critical` and attach **suggested next steps**.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
📦 **npm:** [@silentjma/n8n-nodes-unraid](https://www.npmjs.com/package/@silentjma/n8n-nodes-unraid)
|
|
18
|
+
|
|
19
|
+
**Community Nodes (recommended):** in n8n, open **Settings › Community Nodes › Install** and enter `@silentjma/n8n-nodes-unraid`.
|
|
20
|
+
|
|
21
|
+
**Manual / custom folder:** run `npm pack` and extract the tarball's `package/` folder into `~/.n8n/custom/n8n-nodes-unraid`. In Docker that is `/home/node/.n8n/custom`, which on Unraid is usually `/mnt/user/appdata/n8n/custom`. Then restart n8n.
|
|
22
|
+
|
|
23
|
+
Prefer workflows without a community node? [n8n-unraid-telegram-workflows](https://github.com/SilentJMA/n8n-unraid-telegram-workflows) has the same three workflows built only from n8n's built-in nodes.
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- Unraid 7.2+ has the API built in. Older versions need the Unraid Connect plugin.
|
|
28
|
+
- An API key, created in **Settings › Management Access › API Keys** or with `unraid-api apikey --create`. Read operations work with a read-only role. Updates, restarts and array/VM control need **admin**.
|
|
29
|
+
|
|
30
|
+
## Credential: Unraid API
|
|
31
|
+
|
|
32
|
+
| Field | Notes |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| Server URL | WebGUI base URL, e.g. `https://192.168.1.10`. Requests go to `<url>/graphql` with header `x-api-key`. Use https when SSL is enabled: Unraid redirects http, and the request body is lost. |
|
|
35
|
+
| API Key | The key from the WebGUI |
|
|
36
|
+
| Ignore SSL Issues | For self-signed certificates |
|
|
37
|
+
|
|
38
|
+
## Unraid node operations
|
|
39
|
+
|
|
40
|
+
| Resource | Operations |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| System | Get Health Report (findings + next steps), Get Info, Get Metrics |
|
|
43
|
+
| Array | Get Status, Start, Stop, Start / Pause / Resume / Cancel Parity Check, Get Parity History |
|
|
44
|
+
| Disk / Share | Get Many |
|
|
45
|
+
| Docker Container | Get, Get Many (filters: state, updates only, autostart, name), Get Logs (analysed), Get Update Status, Check for Updates, Start, Stop, Restart, Pause, Unpause, Update (one or many), Update All |
|
|
46
|
+
| Virtual Machine | Get Many, Start, Stop, Force Stop, Pause, Resume, Reboot, Reset |
|
|
47
|
+
| Log File | Get Many (`/var/log`), Read (last N lines or from a line; regex filter; analysis; one item or one per line) |
|
|
48
|
+
| Notification | Create (optionally only if unique), Get Many, Get Overview, Get Warnings and Alerts, Archive, Archive All |
|
|
49
|
+
| Custom GraphQL | Execute any query or mutation |
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
<img width="638" height="763" alt="{0E837C8A-E0E8-4CB5-903F-C4CD4459B37A}" src="https://github.com/user-attachments/assets/a3143eab-9a77-4ef6-99b7-35f639eb996e" />
|
|
53
|
+
|
|
54
|
+
Containers can be given by **name** (`plex`) or ID.
|
|
55
|
+
|
|
56
|
+
## Unraid Trigger events
|
|
57
|
+
|
|
58
|
+
| Event | Fires on |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| Log File Line | New lines in a `/var/log` file at or above the minimum severity. Tracks the line count and handles log rotation. |
|
|
61
|
+
| Container Log Line | New lines in a container's log (cursor based) |
|
|
62
|
+
| Health Problem | A finding not reported before. Can also emit "resolved" items. |
|
|
63
|
+
| New Notification | New unread Unraid notification at or above an importance |
|
|
64
|
+
| Container State Changed | Start / stop / pause / removal |
|
|
65
|
+
| Container Update Available | A container newly has an image update |
|
|
66
|
+
|
|
67
|
+
On the first poll, the trigger only records a baseline. Turn on *Emit Existing on First Poll* to also get what already exists. Manual "Fetch Test Event" always returns current data.
|
|
68
|
+
|
|
69
|
+
## Workflows (managed from Telegram)
|
|
70
|
+
|
|
71
|
+
`npm run workflow` ([scripts/build-workflows.mjs](scripts/build-workflows.mjs)) generates three workflows in [workflows/](workflows/):
|
|
72
|
+
|
|
73
|
+
| Workflow | Triggers | What it does |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| [Unraid · Alerts](workflows/unraid-alerts.json) | Syslog every minute, health report every 5 min | Sends each new problem to Telegram with suggested next steps and tappable follow-up commands (`/logs_sonarr`, `/disks`…). Repeats are throttled (60 min per alert key). Optional: AI triage (disabled by default), an Unraid notification as well, and automatic restart of stopped autostart containers. |
|
|
76
|
+
| [Unraid · Docker updates & actions](workflows/unraid-docker.json) | Weekly (Sun 04:00), and called by the bot | Weekly: updates every container that has a new image, except `cfg.excludeFromUpdates`. It reports only when something changed. Also answers the Docker commands. |
|
|
77
|
+
| [Unraid · Sysadmin & Telegram bot](workflows/unraid-sysadmin-bot.json) | Telegram Trigger | The bot. Answers the sysadmin commands and forwards Docker commands to the Docker workflow. |
|
|
78
|
+
|
|
79
|
+
<img width="1184" height="743" alt="image" src="https://github.com/user-attachments/assets/606adfce-023e-4d05-b873-b86bea7c8f0e" />
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
A Telegram bot delivers updates to a single webhook, so **only the bot workflow has a Telegram Trigger**. The other two just send messages.
|
|
83
|
+
|
|
84
|
+
### Commands
|
|
85
|
+
|
|
86
|
+
| Server | Docker |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `/status`: health report with next steps | `/containers`: list with quick actions |
|
|
89
|
+
| `/info`: uptime, CPU, RAM, array usage | `/updates`: check for image updates |
|
|
90
|
+
| `/disks`: status, temperature, usage, errors | `/update_all`: update all (asks first) |
|
|
91
|
+
| `/parity`, `/parity_start` (asks first), `/parity_pause`, `/parity_resume`, `/parity_cancel` | `/update_<name>`, `/restart_<name>`, `/start_<name>` |
|
|
92
|
+
| `/syslog`: recent warnings with next steps | `/stop_<name>` (asks first) |
|
|
93
|
+
| `/notifications`, `/archive_all` | `/logs_<name>`: last lines, analysed |
|
|
94
|
+
| `/vms`, `/help` | |
|
|
95
|
+
|
|
96
|
+
Telegram commands allow only `a-z0-9_`, so container names are written with underscores: `Plex-Media-Server` becomes `/logs_plex_media_server`. Actions that ask first reply with a `…_confirm` command to tap.
|
|
97
|
+
|
|
98
|
+
For autocomplete, send this to @BotFather with `/setcommands`:
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
status - Health report with next steps
|
|
102
|
+
info - Uptime, CPU, RAM, array usage
|
|
103
|
+
disks - Disk status and temperatures
|
|
104
|
+
containers - Docker containers with quick actions
|
|
105
|
+
updates - Check for container updates
|
|
106
|
+
syslog - Recent syslog warnings
|
|
107
|
+
parity - Parity check status
|
|
108
|
+
notifications - Unread Unraid notifications
|
|
109
|
+
help - All commands
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Setup
|
|
113
|
+
|
|
114
|
+
1. Create a bot with @BotFather and add a **Telegram** credential in n8n with its token.
|
|
115
|
+
n8n must be reachable at a **public HTTPS** address (for example a Cloudflare Tunnel or a reverse proxy), and the n8n container needs `N8N_WEBHOOK_URL=https://<that host>/`, otherwise Telegram rejects the trigger with *Bad request*. See [SUPPORT.md](SUPPORT.md).
|
|
116
|
+
2. Import the three workflows. In each one, select the **Unraid API** credential (your server as `https://<unraid-ip>`, Ignore SSL Issues on) and the Telegram credential.
|
|
117
|
+
3. Publish the **Sysadmin & Telegram bot** workflow and send the bot any message. While `cfg.allowedChatIds` is empty, the bot only replies with your chat ID and runs nothing else.
|
|
118
|
+
4. Put that ID in **Bot settings › cfg.allowedChatIds**, **Alert settings › cfg.telegramChatId** and **Settings › cfg.telegramChatId** (Docker workflow). After that, the bot ignores every other chat.
|
|
119
|
+
5. In the bot's **Run Docker workflow** node, pick *Unraid · Docker updates & actions*. Alternatively, regenerate with `DOCKER_WORKFLOW_ID=<id> npm run workflow` and re-import.
|
|
120
|
+
6. Publish the Docker and Alerts workflows.
|
|
121
|
+
|
|
122
|
+
Keep **n8n** in `cfg.excludeFromUpdates`. Updating it recreates the container that is running the workflow, so the run is cut off and no report arrives.
|
|
123
|
+
|
|
124
|
+
The workflows use node types `CUSTOM.unraid` / `CUSTOM.unraidTrigger`, which n8n uses for nodes in `~/.n8n/custom`. If you install the package through Community Nodes, generate with `UNRAID_NODE_PREFIX=@silentjma/n8n-nodes-unraid npm run workflow`.
|
|
125
|
+
|
|
126
|
+
## Development
|
|
127
|
+
|
|
128
|
+
See [AGENT.md](AGENT.md) for the full maintenance and release procedure.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npm install
|
|
132
|
+
npm run build && npm run lint && npm run typecheck && npm test
|
|
133
|
+
npm pack # -> silentjma-n8n-nodes-unraid-0.1.0.tgz
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The queries in [src/lib/queries.ts](src/lib/queries.ts) are written against `api/generated-schema.graphql` from the unraid/api repository. Check them again when Unraid changes the schema.
|
|
137
|
+
|
|
138
|
+
## Support and contributing
|
|
139
|
+
|
|
140
|
+
- **Questions:** [Discussions › Q&A](https://github.com/SilentJMA/n8n-nodes-unraid/discussions/categories/q-a). Common problems are listed in [SUPPORT.md](SUPPORT.md).
|
|
141
|
+
- **Bugs and feature requests:** [open an issue](https://github.com/SilentJMA/n8n-nodes-unraid/issues/new/choose) using the templates. Never paste API keys or tokens.
|
|
142
|
+
- **Security:** report privately, see [SECURITY.md](SECURITY.md).
|
|
143
|
+
- **Contributing:** pull requests are welcome. Read [CONTRIBUTING.md](CONTRIBUTING.md) and the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
144
|
+
|
|
145
|
+
If these nodes save you time, you can support the project:
|
|
146
|
+
|
|
147
|
+
<a href="https://www.buymeacoffee.com/kilwanitrod"><img src="https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee&emoji=%E2%98%95&slug=kilwanitrod&button_colour=FFDD00&font_colour=000000&font_family=Inter&outline_colour=000000&coffee_colour=ffffff" alt="Buy me a coffee" height="40"></a>
|
|
148
|
+
|
|
149
|
+
## License
|
|
150
|
+
|
|
151
|
+
[MIT](LICENSE). Not affiliated with or endorsed by Lime Technology / Unraid.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnraidApi = void 0;
|
|
4
|
+
class UnraidApi {
|
|
5
|
+
name = 'unraidApi';
|
|
6
|
+
displayName = 'Unraid API';
|
|
7
|
+
icon = { light: 'file:../nodes/Unraid/unraid.svg', dark: 'file:../nodes/Unraid/unraid.svg' };
|
|
8
|
+
documentationUrl = 'https://docs.unraid.net/API/how-to-use-the-api/';
|
|
9
|
+
properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'Server URL',
|
|
12
|
+
name: 'serverUrl',
|
|
13
|
+
type: 'string',
|
|
14
|
+
default: 'https://tower.local',
|
|
15
|
+
placeholder: 'https://192.168.1.10',
|
|
16
|
+
required: true,
|
|
17
|
+
description: 'Base URL of the Unraid WebGUI; requests go to /graphql. Use https:// when SSL is enabled (Unraid redirects http:// and the request would fail).',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: 'API Key',
|
|
21
|
+
name: 'apiKey',
|
|
22
|
+
type: 'string',
|
|
23
|
+
typeOptions: { password: true },
|
|
24
|
+
default: '',
|
|
25
|
+
required: true,
|
|
26
|
+
description: 'Created in Settings › Management Access › API Keys (or "unraid-api apikey --create"). Docker updates, array and VM control need the admin role.',
|
|
27
|
+
},
|
|
28
|
+
// A boolean switch, not a secret: the rule matches "cert" in the name. Renaming it would reset saved credentials.
|
|
29
|
+
// eslint-disable-next-line @n8n/community-nodes/credential-password-field
|
|
30
|
+
{
|
|
31
|
+
displayName: 'Ignore SSL Issues',
|
|
32
|
+
name: 'allowUnauthorizedCerts',
|
|
33
|
+
type: 'boolean',
|
|
34
|
+
default: false,
|
|
35
|
+
description: 'Whether to connect even if the server uses a self-signed or otherwise invalid certificate (the default for Unraid on a LAN IP)',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
authenticate = {
|
|
39
|
+
type: 'generic',
|
|
40
|
+
properties: {
|
|
41
|
+
headers: {
|
|
42
|
+
'x-api-key': '={{$credentials.apiKey}}',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
test = {
|
|
47
|
+
request: {
|
|
48
|
+
baseURL: '={{$credentials.serverUrl.replace(/\\/+$/, "")}}',
|
|
49
|
+
url: '/graphql',
|
|
50
|
+
method: 'POST',
|
|
51
|
+
skipSslCertificateValidation: '={{$credentials.allowUnauthorizedCerts}}',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: { query: '{ online info { os { hostname } } }' },
|
|
54
|
+
},
|
|
55
|
+
// Unraid answers HTTP 200 with a GraphQL error for a bad key, so check the body.
|
|
56
|
+
rules: [
|
|
57
|
+
{
|
|
58
|
+
type: 'responseSuccessBody',
|
|
59
|
+
properties: { key: 'errors[0].extensions.code', value: 'UNAUTHENTICATED', message: 'Invalid or revoked API key' },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'responseSuccessBody',
|
|
63
|
+
properties: { key: 'errors[0].extensions.code', value: 'FORBIDDEN', message: 'The API key may not read server info; give it at least a read role' },
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
exports.UnraidApi = UnraidApi;
|