A Telegram bot for monitoring Docker containers and Unraid servers. Get real-time alerts, check container status, view logs, and control containers - all from Telegram.
scratch-it.co.uk/unraidmonitorbot has the illustrated tour. This README is the reference.
- Interactive Setup Wizard - Guided first-run setup via Telegram with auto-classification of containers
- Container Monitoring - Status, health checks, crash detection, and recovery notifications
- Resource Alerts - CPU/memory usage with per-container thresholds, adjustable directly from alert buttons
- Log Watching - Automatic alerts when errors appear in container logs
- AI Diagnostics - LLM-powered log analysis and troubleshooting (Anthropic, OpenAI, or Ollama)
- Smart Ignore Patterns - AI-generated patterns to filter known errors, with interactive toggle selection
- Multi-Provider LLM - Switch between Anthropic Claude, OpenAI GPT, or local Ollama models at runtime
- Container Control - Start, stop, restart, and pull containers with inline confirmation buttons
- Image-Update Detection - Opt-in daily digest of containers with newer images available, with Pull buttons
- Auto-Heal - Opt-in automatic restart of unhealthy containers (HEALTHCHECK failures) with storm guard
- Unraid Server Monitoring - CPU/memory, temperatures, array health, and parity-operation progress
- Unraid Notification Relay - Opt-in forwarding of Unraid's own notification feed (SMART, disk errors, share full) with an adjustable importance floor
- UPS Monitoring (NUT) - Reads your UPS over the network from a NUT server: mains loss, low battery, overload and bypass alerts, plus
/upsfor battery and runtime - Memory Pressure Management - Automatic container priority handling during high memory
- Mute System - Temporarily silence alerts per container, server, or array
- Natural Language Chat - Ask questions naturally instead of using commands
- Interactive Dashboard -
/managehub for status, resources, server, disks, ignores, mutes, and a Features panel to toggle optional monitors - Sectioned Help -
/helpwith navigable category buttons instead of a text wall
- Replying to an alert now picks the right container -
/mute,/ignoreand/diagnoseread the container name off the alert you replied to. Replying to a restart-loop alert used to mute a container called "4" (the crash count) and tell you it had worked. Reply-to-alert/diagnosehad never worked on anything but resource alerts - The π Restart button on an alert asks first - It restarted immediately on one tap, while
/restarthas always wanted a β . Alerts stay in your chat for days, so a stale one was a mis-tap away from bouncing a container - A full array no longer texts you every five minutes - The capacity warning now fires once per crossing and re-arms when usage drops back under the threshold
- Fewer slow leaks - The Unraid client stopped leaking a connection on every network drop, and your runtime
/modelchoice survives a crash mid-save
- Memory was reported as ~98% when the real figure was ~55% - The percentage came from one Unraid API field and the gigabytes from another, and those two mean different things.
/server, the Memory Critical alert body and the figures handed to the AI were all wrong together. Alert thresholds read the percentage, so no false alerts were firing /server detailednow shows the total and the reclaimable disk cache - "55% used" next to "0.5 GB free" was baffling without them
- UPS monitoring, over the network - The bot reads your UPS from a NUT server, so the UPS does not have to be plugged into the machine running the bot. Alerts on mains loss, low battery, overload and bypass
- New
/upscommand - Model, status, battery percentage, runtime left, load and input voltage./ups detaileddumps every variable - On by default, quiet by default - With no NUT server to talk to it logs one line and stays silent, rather than nagging the majority of installs that have no UPS. Turn it off in
/manage-> βοΈ Features - A UPS it cannot read says "unavailable", never "healthy" - A monitor that lost contact with
upsdknows nothing, and reporting that as an OK would be worse than useless
Setup gotcha:
upsdbinds to127.0.0.1only by default. If the bot runs in a container you needLISTEN 0.0.0.0 3493inupsd.confbefore it can connect. See Configure NUT.
- No more false parity alarms - A parity sync or disk rebuild is reported as progress ("45% complete"), not as a disk problem, and you're told when it finishes. A genuinely failed disk still alerts during a sync
- Unraid notifications in Telegram - Opt-in relay of Unraid's own notification feed (SMART, disk errors, share full, parity results) so everything lands in one place. Enable in
/manageβ βοΈ Features - Control how chatty it is - The notification button cycles WARNING+ (default), ALERT only, or everything including INFO, and applies instantly
- Four broken buttons fixed - Array threshold options no longer fail silently after saving the value; Stop buttons on memory alerts now work even with memory management disabled; "Re-mute 1h" means one hour rather than sixty
- Command autocomplete - Type
/in Telegram to see every command, built from the features your install actually has enabled /managepanels have Back and Refresh - Status, Resources, Server and Disks are no longer dead ends/pullkeeps your GPU - nvidia device access, custom runtimes and supplementary groups now survive a container update- Failures are visible - A handler that crashes replies instead of going quiet, and no button can spin forever
- Top memory users on pressure alerts - Memory warnings list the top 5 memory-consuming containers, largest first, with a one-tap π Restart for containers that just need a bounce (v0.18.0)
Note on UPS support: UPS monitoring reads from a NUT server, not from Unraid's API. Unraid exposes
upsDevices, but that data comes fromapcupsdover a local USB link, which is no use to a bot in a container and no use at all without the cable. NUT works over TCP, so it covers both cases. See the changelog.
See the changelog for full details.
- Screenshots
- Installation
- Prerequisites
- Configuration
- Commands
- Alert Examples
- User Guide
- Troubleshooting
The easiest way to install on Unraid.
-
Install from Community Apps
- Open the Unraid web UI
- Go to Apps tab
- Search for "Unraid Monitor Bot"
- Click Install
-
Configure the template
TELEGRAM_BOT_TOKEN- Your bot token (how to get one)TELEGRAM_ALLOWED_USERS- Your Telegram user ID (how to find it)ANTHROPIC_API_KEY(optional) - Enables AI features via ClaudeOPENAI_API_KEY(optional) - Enables AI features via OpenAIOLLAMA_HOST(optional) - Enables AI features via local Ollama (e.g.,http://192.168.1.100:11434)DEFAULT_MODEL(optional) - Override the default AI model (e.g.,qwen2.5:7b,gpt-4o)UNRAID_API_KEY(optional) - Enables server monitoring
-
Start the container
-
Message your bot on Telegram - send
/startto begin the setup wizard- The wizard will guide you through connecting to your Unraid server
- It auto-classifies your containers into categories (priority, protected, watched, killable, ignored)
- When an Anthropic API key is configured, AI assists with classifying unknown containers
- Review and adjust the categories, then confirm to save
- The bot restarts automatically and begins monitoring
-
Re-configure anytime (optional)
- Send
/setupto re-run the wizard (merges non-destructively with existing config) - Or edit
/mnt/user/appdata/unraid-monitor/config/config.yamldirectly and restart
- Send
If not using Community Apps, you can set it up manually.
mkdir -p /mnt/user/appdata/unraid-monitor/{config,data}Create /mnt/user/appdata/unraid-monitor/config/.env:
# Required
TELEGRAM_BOT_TOKEN=your_bot_token_here
TELEGRAM_ALLOWED_USERS=123456789
# Optional - AI features (configure at least one for /diagnose, NL chat, smart ignore)
ANTHROPIC_API_KEY=your_anthropic_api_key_here
OPENAI_API_KEY=your_openai_api_key_here
OLLAMA_HOST=http://localhost:11434
# Optional - override the default AI model (e.g. qwen2.5:7b, gpt-4o)
DEFAULT_MODEL=
# Optional - enables Unraid server monitoring
UNRAID_API_KEY=your_unraid_api_key_here
# Optional - only if your NUT server requires a login for reads
NUT_USERNAME=
NUT_PASSWORD=Go to Docker β Add Container and configure:
| Field | Value |
|---|---|
| Name | unraid-monitor-bot |
| Repository | dervish/unraidmonitorbot:latest |
| Network Type | bridge or your preferred network |
Add these paths:
| Container Path | Host Path | Access |
|---|---|---|
/app/config |
/mnt/user/appdata/unraid-monitor/config |
Read/Write |
/app/data |
/mnt/user/appdata/unraid-monitor/data |
Read/Write |
/var/run/docker.sock |
/var/run/docker.sock |
Read Only |
Add these variables:
| Name | Value |
|---|---|
TELEGRAM_BOT_TOKEN |
Your bot token |
TELEGRAM_ALLOWED_USERS |
Your user ID |
ANTHROPIC_API_KEY |
(optional) Claude AI features |
OPENAI_API_KEY |
(optional) OpenAI AI features |
OLLAMA_HOST |
(optional) Ollama URL, e.g., http://192.168.1.100:11434 |
DEFAULT_MODEL |
(optional) Override default model, e.g., qwen2.5:7b |
UNRAID_API_KEY |
(optional) Unraid server monitoring |
NUT_USERNAME |
(optional) Only if your NUT server gates reads |
NUT_PASSWORD |
(optional) Only if your NUT server gates reads |
PUID |
(optional) Runtime user ID for file ownership (default: 99 β Unraid's nobody) |
PGID |
(optional) Runtime group ID for file ownership (default: 100 β Unraid's users) |
TZ |
Your timezone (e.g., Europe/London) |
Start the container and check the logs for any errors. Message your bot on Telegram with /start to begin the interactive setup wizard.
For non-Unraid Docker hosts (Ubuntu, Debian, Synology, etc.), use docker-compose:
-
Clone the repository and create your environment file:
git clone https://github.com/dervish666/UnraidMonitor.git cd UnraidMonitor cp config/.env.example config/.env # Edit config/.env with your TELEGRAM_BOT_TOKEN, TELEGRAM_ALLOWED_USERS, etc.
-
Adjust docker-compose.yml volume paths to suit your system (the defaults point to Unraid appdata paths). For example:
volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./config:/app/config - ./data:/app/data
-
Check your Docker socket GID and set it if it differs from the default (281):
ls -ln /var/run/docker.sock # look at the 4th column echo "DOCKER_GID=999" >> .env # adjust to match
-
Build and start:
docker-compose up -d
-
Message your bot on Telegram with
/startto begin the setup wizard.
- Open Telegram and message @BotFather
- Send
/newbot - Follow the prompts to name your bot
- Copy the bot token (looks like
123456789:ABCdefGHIjklMNOpqrsTUVwxyz)
- Message @userinfobot on Telegram
- It will reply with your numeric user ID (e.g.,
123456789)
This ID is used to restrict who can control your bot. You can add multiple IDs separated by commas: 123456789,987654321
At least one provider is needed for AI-powered features (/diagnose, smart ignore patterns, natural language chat). You can configure multiple providers and switch between them at runtime with /model.
Option A: Anthropic Claude (recommended)
- Sign up at console.anthropic.com
- Go to API Keys and create a new key
- Add it as
ANTHROPIC_API_KEY
Option B: OpenAI
- Sign up at platform.openai.com
- Go to API Keys and create a new key
- Add it as
OPENAI_API_KEY
Option C: Ollama (free, runs locally)
- Install Ollama from ollama.com
- Pull a model:
ollama pull llama3.1:8b - Set
OLLAMA_HOSTto your Ollama URL (e.g.,http://192.168.1.100:11434)
Models are auto-discovered from Ollama at startup. Note: some local models don't support tool calling, so NL chat actions (restart, etc.) may be limited.
Required for Unraid server monitoring (CPU, memory, temps, array status).
- In Unraid web UI, go to Settings β Management Access
- Generate an API key
- Add it as
UNRAID_API_KEY
Needed only if you have a UPS. NUT talks over the network, so the UPS can hang off any machine on the LAN, not necessarily the one running the bot.
-
Install a NUT server. On Unraid, install the NUT plugin from Community Apps and point it at your UPS. On another Linux box, install
nutand configureups.conffor your model. Check it works locally first:upsc myups
-
Let the bot reach it. This is the step people miss.
upsdbinds to127.0.0.1only by default, which a container cannot reach. Add this toupsd.confand restartupsd:LISTEN 0.0.0.0 3493Then confirm from another machine:
upsc myups@<your-nut-host>. -
Point the bot at it (optional). If your NUT server runs on the same box as Unraid, the bot uses your
unraid.hostautomatically. Otherwise setnut.hostinconfig.yaml. -
Credentials (optional). Most
upsdsetups allow anonymous reads, sinceupsd.usersnormally gates onlySETand instant commands. If yours does not, setNUT_USERNAMEandNUT_PASSWORDinconfig/.env.
Configuration is stored in config/config.yaml. On first run, the interactive setup wizard creates this file. You can also run /setup anytime to reconfigure.
Location:
- Unraid:
/mnt/user/appdata/unraid-monitor/config/config.yaml - Docker:
./config/config.yaml(relative to project root)
# Containers to watch for log errors
log_watching:
containers:
- plex
- radarr
- sonarr
- lidarr
error_patterns:
- "error"
- "exception"
- "fatal"
- "failed"
- "critical"
ignore_patterns:
- "DeprecationWarning"
- "DEBUG"
cooldown_seconds: 900 # 15 min between alerts for same container
# Containers to hide from status reports
ignored_containers:
- some-temp-container
# Containers that cannot be controlled via Telegram (safety)
protected_containers:
- unraid-monitor-bot
- mariadb
- postgresql14CPU is reported per-core on Linux, so multi-threaded apps can exceed 100% (e.g., 200% = 2 cores fully used). Set thresholds accordingly.
resource_monitoring:
enabled: true
poll_interval_seconds: 60
sustained_threshold_seconds: 120 # Alert after 2 min exceeded
defaults:
cpu_percent: 80
memory_percent: 85
# Per-container overrides (also adjustable via Telegram)
containers:
plex:
cpu_percent: 200 # Plex transcoding uses multiple cores
memory_percent: 90
handbrake:
cpu_percent: 400 # Expected to max out all coresPer-container thresholds can also be adjusted directly from Telegram: when a resource alert fires, tap βοΈ Raise Limit to pick a new threshold. The change applies immediately and persists across restarts.
Automatically kills low-priority containers when system memory is critical.
memory_management:
enabled: false # Disabled by default - enable with caution
warning_threshold: 90 # Notify at this %
critical_threshold: 95 # Start killing at this %
safe_threshold: 80 # Offer restart when below this
kill_delay_seconds: 60 # Warning before killing
stabilization_wait: 180 # Wait between kills
# Never kill these (highest priority)
priority_containers:
- plex
- mariadb
# Kill these in order during memory pressure (lowest priority first)
killable_containers:
- handbrake
- tdarr
# Offer a one-tap Restart button for these on pressure alerts β for
# services that hog memory but recover after a bounce (classic Plex).
# Pick them from Telegram via /manage β Features β Configure memory restarts.
restart_containers:
- plexMemory warnings list the top 5 memory users and offer Restart/Stop buttons sorted largest-first, so the biggest win is always the top button.
unraid:
enabled: true
host: "192.168.1.100" # Your Unraid IP
port: 443
use_ssl: true
verify_ssl: false # Set true if using valid SSL cert
polling:
system: 30 # CPU/memory poll interval
array: 300 # Array status poll interval
notifications: 300 # Unraid notification feed poll interval
# ups: 60 # IGNORED - UPS polling lives under the `nut:` section below
thresholds:
cpu_temp: 80 # Alert above this temp (C)
cpu_usage: 95 # Alert above this %
memory_usage: 90 # Alert above this %
disk_temp: 50 # Alert above this temp (C)
array_usage: 85 # Alert above this %
# ups_battery: 30 # IGNORED - see `nut.thresholds.battery_charge` below
notifications:
enabled: false # Relay Unraid's own notifications into Telegram
min_importance: WARNING # WARNING (default), ALERT, or INFO for everythingUnraid's notification feed is what sits behind the bell icon in the web UI: SMART
warnings, disk errors, share-full warnings, parity results, plugin updates.
Relaying it means one place to look instead of two. It is off by default and
floored at WARNING, because the feed also carries routine INFO chatter
(backup finished, parity-check tuning pausing and resuming).
Toggle it from Telegram with /manage β βοΈ Features. Enabling or disabling
restarts the bot; changing the importance floor applies immediately.
Reads your UPS from a NUT server over TCP 3493. Enabled by default, but it does nothing until a host resolves, and it never alerts about a NUT server it has never reached.
nut:
enabled: true # Master switch (also toggled from /manage -> Features)
host: "" # Blank falls back to unraid.host
port: 3493
ups_name: "" # Blank auto-picks when upsd serves exactly one UPS
poll_seconds: 60
thresholds:
battery_charge: 50 # Warn below this %, but only while on battery
load: 80 # Warn above this % of rated capacityYou get an alert when the mains drops (OB), when the battery gets low (LB),
when the battery needs replacing (RB, nagged once a day rather than every
poll), and on OVER, BYPASS, OFF, FSD and ALARM. Coming back to mains
sends a recovery message with how long you ran on battery.
A runtime calibration (CAL) is not alerted on. It puts the UPS on battery
deliberately, the same reason a parity sync is not reported as a failed disk.
If the bot cannot reach upsd, /ups and /health say unavailable and
name the error. They never render a UPS it cannot read as healthy. Losing a
server that was previously working sends an alert after three consecutive
failed polls, so one dropped poll does not wake you up.
Checks once per day (configurable) whether a newer image is available for watched containers. Sends a single batched digest message with Pull buttons. Disabled by default β opt in per-deployment.
image_updates:
enabled: false # Set true to enable daily image-update checks
poll_interval_hours: 24 # How often to check (minimum 1)Automatically restarts containers that report a Docker HEALTHCHECK unhealthy status. A per-container storm guard gives up after max_restarts within window_minutes and sends an escalation alert. Protected containers are never touched regardless of this setting.
auto_heal:
enabled: true # Master switch
containers: # List of container names to auto-heal (opt-in)
- radarr
- sonarr
max_restarts: 3 # Give up after this many restarts in the window
window_minutes: 60 # Rolling window for the restart count| Command | Description |
|---|---|
/status |
Overview of all containers |
/status <name> |
Details for a specific container |
/resources |
CPU/memory usage for all containers |
/resources <name> |
Detailed stats with thresholds |
/logs <name> [n] |
Last n log lines (default 20) |
/diagnose <name> |
AI log analysis with π More Details button |
/restart <name> |
Restart with β Confirm / β Cancel buttons |
/stop <name> |
Stop with confirmation buttons |
/start <name> |
Start with confirmation buttons |
/pull <name> |
Pull latest image and recreate (with confirmation) |
Tip: Partial names work β /status rad matches radarr
| Command | Description |
|---|---|
/server |
Server overview (CPU, memory, temps) |
/server detailed |
Full metrics including per-core temps |
/array |
Array status and disk health |
/disks |
Detailed disk information |
/ups |
UPS status, battery, runtime and load |
/ups detailed |
Every variable the UPS reports |
| Command | Description |
|---|---|
/mute <name> <duration> |
Mute container (e.g., /mute plex 2h) |
/unmute <name> |
Unmute a container |
/mute-server <duration> |
Mute server alerts |
/unmute-server |
Unmute server alerts |
/mute-array <duration> |
Mute array alerts |
/unmute-array |
Unmute array alerts |
/mutes |
Show all active mutes |
/ignore |
Select errors to ignore with β/β toggle buttons |
/ignores |
List all ignore patterns |
/cancel-kill |
Cancel pending memory pressure kill |
Duration formats: 30m, 2h, 1d, 1w
| Command | Description |
|---|---|
/setup |
Re-run the setup wizard (merges with existing config) |
/cancel |
Exit the setup wizard mid-flow |
/manage |
Interactive dashboard β status, resources, server, disks, ignores, mutes, features |
/health |
Bot version, uptime, and monitor status |
/model |
Switch the global LLM provider and model at runtime |
/model <feature> <model> |
Per-feature model override (chat, diagnose, analyze); default resets to global |
/help |
Browse commands by category with navigation buttons |
Instead of commands, you can ask questions naturally:
- "What's wrong with plex?"
- "Why is my server slow?"
- "Is anything crashing?"
- "Show me radarr logs"
- "Restart sonarr" (shows confirmation buttons)
Follow-up questions work too β say "restart it" after discussing a container.
Note: Requires at least one LLM provider to be configured (ANTHROPIC_API_KEY, OPENAI_API_KEY, or OLLAMA_HOST). Use /model to switch providers.
All alerts include tappable inline buttons for quick actions β no need to type commands.
π΄ CONTAINER CRASHED: radarr
Exit code: 137 (OOM killed)
Image: linuxserver/radarr:latest
Uptime: 2h 34m
[π Restart] [π Logs] [π Diagnose]
[π Mute 1h] [π Mute 24h]
Sent automatically when a previously crashed container starts successfully:
β
radarr recovered and is running again.
Recovery alerts include a 5-minute cooldown to prevent spam if a container is flapping.
ππ΄ RESTART LOOP: radarr
Crashed 5 times in the last 10 minutes!
Exit code: 137 (OOM killed)
Image: linuxserver/radarr:latest
[π Restart] [π Logs] [π Diagnose]
[π Mute 1h] [π Mute 24h]
β οΈ HIGH MEMORY USAGE: plex
Memory: 92% (threshold: 85%)
7.4GB / 8.0GB limit
Exceeded for: 3 minutes
CPU: 45% (normal)
[π Logs] [π Diagnose]
[π Mute 1h] [π Mute 24h]
[βοΈ Raise MEMORY Limit]
Tapping βοΈ Raise Limit shows threshold options (e.g., 90%, 95%, 99% for memory, or 120%, 200%, 400% for CPU). The new threshold applies immediately.
β οΈ ERRORS IN: sonarr
Found 3 errors in the last 15 minutes
Latest: Database connection failed: timeout
[π Ignore Similar] [π Mute 1h]
[π Logs] [π Diagnose]
For a detailed walkthrough of all features, see the User Guide.
It covers:
- First-run setup and the interactive wizard
- Understanding each alert type and what to do
- Container management workflows (diagnose, restart, logs)
- Using the
/managedashboard - Muting alerts and creating ignore patterns
- AI features and switching LLM providers
- Tips and best practices
- Check the container is running:
docker ps | grep unraid-monitor - Check logs for errors:
docker logs unraid-monitor-bot - Verify
TELEGRAM_BOT_TOKENis correct - Verify your user ID is in
TELEGRAM_ALLOWED_USERS
This means the container can't access the Docker socket.
-
Check your Docker socket GID:
ls -ln /var/run/docker.sock
Look at the 4th column (e.g.,
281on Unraid,999on Ubuntu) -
If using docker-compose, set DOCKER_GID in
.env:echo "DOCKER_GID=999" > .env
-
Rebuild the container:
docker-compose build --no-cache docker-compose up -d
-
Last resort: Add
user: rootto the service indocker-compose.ymlto bypass permission issues (not recommended for production)
- Verify at least one LLM key is set:
ANTHROPIC_API_KEY,OPENAI_API_KEY, orOLLAMA_HOST - Check logs for API errors
- Use
/modelto see which providers are configured and switch between them - If using Ollama, ensure the server is reachable and has models pulled
- The bot works without AI β you'll get basic alerts, but
/diagnoseand natural language chat won't work
Run /health first. It says exactly which of these you have.
- "UPS: βͺ Disabled" - either
nut.enabledis false, or no host resolved. Setnut.hostinconfig.yaml, or turn it on in/manage-> βοΈ Features - "UPS:
β οΈ Unavailable" - the bot found a host but cannot read it. The error is printed alongside. By far the most common cause isupsdlistening on127.0.0.1only: addLISTEN 0.0.0.0 3493toupsd.confand restart it ACCESS-DENIED- yourupsdgates reads. SetNUT_USERNAMEandNUT_PASSWORDinconfig/.envDRIVER-NOT-CONNECTED-upsdis running but its driver is not talking to the UPS. This is a NUT problem, not a bot problem. Checkupsc myupson the NUT host- "serves N UPS devices" - more than one UPS, so set
nut.ups_nameto pick
- Verify
UNRAID_API_KEYis set - Check the
unraidsection inconfig.yamlhas correcthostandport - If using self-signed certs, set
verify_ssl: false
Check logs immediately after start:
docker logs unraid-monitor-botCommon issues:
- Missing
TELEGRAM_BOT_TOKENorTELEGRAM_ALLOWED_USERS - Invalid configuration in
config.yaml - Docker socket permission issues (see above)
Restart the container after editing config:
docker restart unraid-monitor-botAll persistent data is stored in mounted volumes:
config/
βββ config.yaml # Main configuration
βββ .env # Environment variables (secrets)
data/
βββ ignored_errors.json # Ignore patterns
βββ mutes.json # Container mutes
βββ server_mutes.json # Server mutes
βββ array_mutes.json # Array mutes
βββ model_selection.json # Active LLM provider/model choice
βββ chat_ids.json # Persistent Telegram chat IDs for alert delivery across restarts
βββ announced_version.json # Last-announced version (gates the startup "What's new" message)
βββ announced_updates.json # Image-update dedup map (stops restarts re-announcing the same update)
- Docker
- Telegram Bot Token
- (Optional) LLM provider for AI features: Anthropic API key, OpenAI API key, or Ollama instance
- (Optional) Unraid API key for server monitoring
- (Optional) A NUT server for UPS monitoring
MIT







