Sign inSign up

dockerdiscordcontrol/dockerdiscordcontrol-linux

By dockerdiscordcontrol

β€’Updated 13 days ago

Same image as dockerdiscordcontrol/dockerdiscordcontrol. One build for Linux, Mac and Windows.

Image
0

10K+

dockerdiscordcontrol/dockerdiscordcontrol-linux repository overview

⁠DockerDiscordControl v3.1.1 🐳

Version Python Base Image Tests Coverage Docker Pulls Unraid Wiki

A powerful Discord bot and web interface to manage Docker containers remotely. This application bridges the gap between Discord and your Docker environment, allowing container monitoring and control directly through Discord channels.

Homepage: https://ddc.bot⁠ | Complete Documentation⁠

Control your Docker containers directly from Discord! This application provides a Discord bot and a web interface to manage Docker containers (start, stop, restart, view status) with a focus on stability, security, and performance. The default image is an ultra-optimized Alpine Linux build with the latest security patches and enhanced performance.

β πŸ†• Latest Updates

β βœ… v3.1.1 (2026-10-10) - Empty servers stop, and a cleaner image

Updating from v3.1.0 is a plain image update.

  • A game server nobody plays on can stop itself: a new watchdog rule "a game server nobody plays on" stops it (or notifies) after the minutes you set, 30 by default. It saves RAM and CPU on servers that run empty all night.
  • The overview shows a join at once, in the same minute as the join notice, not at the next update interval.
  • The live-log panel, gone over: up to 4000 characters of readable log lines in your time zone, a πŸ“₯ button that sends the last 5000 lines as a file, and the panel goes after its timeout instead of standing dead.
  • No task for a date that does not exist: Discord no longer offers 31 February.
  • "Validate key" checks by the server's list, the same one the save uses, and no key list sits in the browser any more.
  • A quieter log: a minute without a problem leaves no line at INFO.
  • No known vulnerability in the image (zlib and expat updated).

Everything in detail: docs/CHANGELOG.md⁠

β βœ… v3.1.0 (2026-10-05) - Only when nobody plays, and who is playing

Updating from v3.0 is a plain image update.

  • A restart or stop can wait for an empty server: "restart daily at 4, but only once nobody plays, at the latest at 6", with a warning to the players before it, in scheduled tasks and auto-actions alike. DDC wakes up for the warning time the admin set; if it could not warn in time, it warns and waits that long before acting.
  • Every container has an info display, with who is playing on a game server, its version, uptime, restarts and health, and whether a newer image is in the registry. Player joins can be announced: you choose the channels, and per container which game servers.
  • A dead game server is not shown green: a container that runs but whose game does not answer is drawn ⚠️.
  • The web panel asks Docker once instead of once per container, and only while it is used: on a host with 37 containers, 2 requests instead of 38 every 30 seconds, and none at all once nobody has looked for five minutes.
  • One beat for everything that asks Docker: one loop fetches once per beat and feeds the overviews, player counts, join notices and the watchdog from it, instead of a second loop that fetched on its own. "Every minute" means every minute again.
  • Every message but the status and control overviews has a lifetime, kept over a restart: auto-action notices 1 hour, a join notice 30 minutes, a donation's thank-you 24 hours, an update notice 7 days. The overview stays where it is while only such notices stand below it, and moves to the bottom when someone else writes. Private panels close after at most ten minutes unused and are deleted reliably, also when DDC restarts.
  • A file that cannot be read is not written over: an unreadable admins.json or config.json is reported and left alone instead of being replaced by the next save.
  • A review before the release fixed well over a hundred smaller defects, each with its own test. 8,378 tests pass.

Everything in detail: docs/CHANGELOG.md⁠

β βœ… v3.0.1 (2026-09-27) - Security Patch

GitHub's code scanner checked the v3.0 code when it reached main. Two of its findings were real and are fixed; the others were checked by hand and are false positives. From v3.0.0 it is a plain image update.

  • A login link can no longer send the browser to another host. A crafted next parameter with a tab character slipped past the check and, once the browser removed the tab, pointed to a foreign site right after login.
  • The group list no longer shows a raw error text that could name a file path on the host.
  • The image carries the current Alpine security fixes (expat 2.8.5, CVE-2026-93990): the build no longer takes the package layer from an old cache.
β βœ… v3.0.0 (2026-09-27) - Security, Watchdog & Groups

The biggest DDC release so far. DDC can now only reach the Docker endpoints it needs, watches your containers and tells you when one dies, works with container groups, and has a web panel you can protect with two-factor authentication.

Updating on Unraid: just update. Settings, containers, channels, tasks, auto-action rules, translation pairs, the mech, the bot token and your password carry over (checked by replaying an update from v2.4.1 on Unraid). You may have to log in once more - the panel has a login page now. Behind a reverse proxy, set DDC_TRUSTED_PROXIES. Going back to v2.4.1 is not supported.

  • Allowlist proxy in front of the Docker socket: only list, inspect, logs, stats, start, stop and restart get through; create, exec and everything else are refused.
  • Container watchdog: react when a container stops, turns unhealthy, restarts repeatedly, stays above a CPU or memory threshold, or has a newer image - with maintenance pauses and alarms to ntfy, Gotify or any webhook when Discord is down.
  • Container groups in scheduled tasks, auto-action rules and the Discord admin list.
  • Two-factor authentication and HTTPS for the web panel (offered, never forced).
  • Backup & restore of the whole configuration as one file, with a preview.
  • Channel translation of followed announcement channels, explained in the panel.
  • The mech's energy is a battery, a reworked panel with five tabs, and all 40 languages complete.

Every part of DDC was reviewed end to end; 7,771 tests pass. Everything in detail: docs/CHANGELOG.md⁠ · security model: docs/SECURITY.md⁠ · Unraid: docs/UNRAID.md⁠

β βœ… v2.4.1 (2026-09-22) - Security Patch

GitHub's code scanner flagged ten places after v2.4.0. Four were real and are fixed, six were false positives. No migration and no logout: from v2.4.0 it is a plain image update.

  • Two Web UI error answers no longer pass raw error text (which can contain host paths) to the browser; the details go to the log.
  • The first-time setup page shows its messages as text instead of HTML.
  • The image build workflow limits its GitHub token to read-only by default.

Coming from v2.3.1 or earlier? Read the v2.4.0 upgrade notes below first.

β βœ… v2.4.0 (2026-09-22) - Audit Release

A complete audit of DDC, followed by a second review pass focused on what changes for existing installations on upgrade. 188 findings fixed and a suite of 5,715 tests. Every source file in the project carries written evidence that it was read: 184 of 184.

⚠️ Please read the upgrade notes⁠ before updating. You will be logged out once, long-dead scheduled tasks are paused instead of being resurrected, and your bot token stays in plaintext until you encrypt it.

Fixed, among others

  • One container can no longer make all your servers disappear. A container whose image had been removed from the host emptied the whole container list.
  • Admin users can be saved again. Every save failed with "Failed to save admin users".
  • Scheduled tasks run the way you set them up. Weekly tasks were dropped, cron tasks silently switched off, and one missed run could stop a recurring task for good.
  • The bot stays responsive. Docker calls no longer block it, which caused repeated container timeouts and the flood of "SLOW batched processing" warnings.
  • Every button answers. A failure now gets a message instead of an endless "thinking…".
  • Auto-actions with several containers work. They locked themselves out and never ran.
  • "Change password" changes the password. It used to do nothing and stored the new password in plaintext.

πŸ”’ Security

  • The Encrypt token button really encrypts the token; before, it reported success and changed nothing. If you pressed it on an earlier version, press it again (see the upgrade notes).
  • CSRF protection on every route; rejected requests get a clear message.
  • Session cookie renamed to ddc_session with SameSite=Lax; new passwords require 12 characters.
  • Auto-action regex patterns are validated, and each search runs in a separate process with a hard 0.5 s budget, so a catastrophic pattern can no longer freeze the bot.

Full details in the changelog⁠.

β βœ… v2.3.1 (2026-08-08) - Security Patch

πŸ”’ Dependency security fix

  • Bumped cryptography β†’ 50.0.0 to resolve CVE-2026-69247 (GHSA-g6cj-pr64-35w5): a Bleichenbacher timing/error oracle in PKCS#7 EnvelopedData decryption (High severity).
  • No functional changes β€” dependency-only patch release across all platform images.
β βœ… v2.3.0 (2026-07-01) - Live Game-Server Player Counts

Show live player counts for your game servers right in the Discord status overview (e.g. Valheim 3/8).

New: per-container player-count feature

  • Live "players online / max" for game servers via the opengsq⁠ library β€” shown compactly behind the server name in the community status overview (Name 3/8) and in the per-container control box (β”‚ Players: 3/8).
  • 4 protocols: Source / A2S (most Steam games β€” Valheim, Enshrouded, V Rising, Icarus, Rust, CS, Project Zomboid, …), Minecraft, Satisfactory (app token) and Palworld (REST admin password).
  • Automatic detection: DDC probes each online container across all its published ports (transport-aware ordering), auto-detects Source vs Minecraft, and unlocks the per-server "Players" toggle only for servers that actually answer β€” with a 15-minute probe window, permanent verdicts, and a manual "Test now" re-check for slow-booting servers.
  • Guided setup: the container name/image suggests the right protocol, and token games (Satisfactory / Palworld) make the Info button glow until a credential is entered.
  • Fully non-blocking & best-effort β€” a dead or slow game server never affects or delays the Discord status loop.
  • Localized in all 40 supported languages.

πŸ”’ Quality: built and hardened across three independent multi-agent code reviews; +102 unit tests; validated live against real game servers.

β βœ… v2.2.4 (2026-06-30) - Alpine 3.24 / Python 3.14 Base Bump

🐳 Updated runtime base

  • Base image bumped Alpine 3.23.3 β†’ 3.24 (Python 3.12 β†’ 3.14)
  • Fixes the bundled-OpenSSL-independent SQLite advisories CVE-2026-11822 / CVE-2026-11824 (sqlite-libs 3.51.2 β†’ 3.53.2, FTS5 memory corruption)
  • gevent bumped 25.5.1 β†’ 25.9.1 for Python 3.14 wheel compatibility
  • Validated with a full soak test against a live Discord server before release: bot connects, fetches containers, posts overviews, all v2.2.3 fixes work β€” zero runtime errors on 3.14

Note: the Alpine busybox advisory CVE-2025-60876 (Medium) has no upstream fix in any branch yet and remains until Alpine ships a patched package β€” apk upgrade (already in the Dockerfile) will pick it up automatically on a future rebuild.

β βœ… v2.2.3 (2026-06-29) - Overview Reliability & Dependency Security

πŸ› No more duplicate overview messages

  • Long-lived overviews (edited in place) older than 30 days were skipped by the age-limited cleanup, so a regeneration could post a fresh overview on top of the stale one β€” now the tracked overview is deleted by its known message ID first
  • Concurrent posters (inactivity regeneration, event recreate, recovery, /ss, /control, initial send, channel hot-reload/teardown) are serialized by a per-channel lock with re-validation, so two paths can never produce a duplicate
  • Overview message IDs are persisted and restored on restart (atomic mech_state.json writes), so a restart deletes the previous overview by ID instead of orphaning it

✨ Overview re-posts below the bot's own messages

  • The "move overview to the bottom" feature now also triggers when the bot's own notifications (restart/update-watcher triggers) bury the overview β€” previously only foreign messages counted. The managed overview is never treated as foreign, so in-place editing is untouched
  • Regeneration is skipped while a user is mid-interaction (e.g. expanding the mech)

πŸ”’ Dependencies

  • cryptography>=48.0.1 (GHSA-537c-gmf6-5ccf β€” vulnerable OpenSSL bundled in wheels < 48.0.1)

Upgrade note: on the first restart after this version, mech_state.json does not yet contain the new channel_overview_message_ids key, so a pre-existing >30-day overview may survive that first regeneration once. It is removed automatically on the next cycle (self-healing); thereafter the persisted ID prevents duplicates across restarts.

β βœ… v2.2.2 (2026-04-26) - Hardening, Performance & Test-Suite Sanitization

πŸ”’ Security Hardening

  • New /logout endpoint clears session and forces Basic-Auth re-prompt
  • Session idle-timeout (default 30 min, override via DDC_SESSION_IDLE_TIMEOUT)
  • SSRF whitelist on Translation API: only DeepL Pro/Free, Google, Microsoft endpoints accepted
  • Setup-phase rate-limit (5 req/min) protects the bootstrap window
  • 12-char password policy with complexity (only enforced on /setup β€” existing passwords unaffected)
  • SESSION_COOKIE_SAMESITE=Strict (was Lax)
  • CSRF foundation via Flask-WTF (all blueprints currently exempted; infrastructure ready)
  • Alpine base image pinned to multi-arch digest (@sha256:25109184…)

⚑ Performance & RAM

  • Locale lazy-loading: ~5 MB β†’ ~120 KB initial RAM (en pre-loaded, others on-demand)
  • Animation disk cache LRU eviction at 200 MB (DDC_ANIM_DISK_LIMIT_MB)
  • Waitress thread pool now CPU-aware (DDC_WAITRESS_THREADS, default min(4, cpu_count, 8))
  • Request-scoped config caching (eliminates repeated disk reads per page render)
  • 8 dataclasses with slots=True for memory efficiency

🧹 Architecture / Bug Fixes

  • gevent monkey-patching is now opt-in (DDC_ENABLE_GEVENT=1); standard waitress runtime uses plain threading and no longer fights asyncio
  • Scheduler service: hosted/standalone modes (auto-detected) β€” eliminates "Cannot start scheduler service in existing event loop" warning
  • import docker.errors explicit (fixes silent AttributeError on docker daemon errors)
  • pytz.UnknownTimeZoneError properly caught with UTC fallback
  • _debug_mode_lock upgraded to RLock (re-entry safety)
  • DDC_CONFIG_DIR, DDC_PROGRESS_DATA_DIR, DDC_METRICS_DIR env-var support for custom config layouts

πŸ“‹ Logging & Storage

  • discord.log rotation (10 MB Γ— 5 backups), bot_error.log (5 MB Γ— 3), user_actions.log (5 MB Γ— 3) β€” bounded growth
  • Debug-Mode-Toggle UI now shows restart-required hint
  • Stripped misleading [DEBUG INIT] / [SETUP DEBUG] prefixes from INFO logs

βœ… Testing

  • 3353 tests pass single-pass in container (was 184 with 48 failing pre-v2.2.2)
  • Coverage 86% (was 27% at v2.2.2 release; +59pp from post-release coverage push)
  • 5 new test directories added in v2.2.2: security, performance, storage, infrastructure, i18n
  • 4 production bugs uncovered + fixed via test sanitization
  • Suite pollution fixes: sys.modules mutations and importlib.reload leaks in fixtures eliminated

⚠️ Breaking Changes (rare edge cases)

  • Translation API: self-hosted DeepL/LibreTranslate endpoints are now blocked. Set deepl_api_url to one of the four whitelisted hosts.
  • SESSION_COOKIE_SAMESITE=Strict: Web UI embedded in cross-site iframes (e.g. some dashboard tools) may lose session; use same eTLD+1 or open directly.
  • Idle session timeout 30 min default β€” override with DDC_SESSION_IDLE_TIMEOUT=<seconds> if you want longer (or shorter, floor 60s).

πŸ†• New Environment Variables

VariableDefaultPurpose
DDC_ENABLE_GEVENTunset (off)Re-enable gevent monkey-patching for legacy gunicorn workers
DDC_SESSION_IDLE_TIMEOUT1800Session idle timeout in seconds (floor 60)
DDC_WAITRESS_THREADSautoWeb UI thread pool size (2..16)
DDC_ANIM_DISK_LIMIT_MB200Animation disk cache cap; 0 disables eviction
DDC_CONFIG_DIR/app/configOverride config directory (testing/custom layouts)
DDC_PROGRESS_DATA_DIR(auto)Override mech progress data directory
DDC_METRICS_DIR(auto)Override performance metrics directory

β βœ… v2.2.1 (2026-03-27) - Full Internationalization (40 Languages)

🌍 New Feature: Multi-Language Support (i18n)

  • 40 languages for both Web UI and Discord Bot, independently selectable
  • Web UI Language dropdown with instant switch (no save needed, auto-reloads)
  • Bot Language dropdown for Discord bot messages
  • All 40 languages fully translated (1457 keys each): English, German, French, Spanish, Portuguese (BR/PT), Italian, Dutch, Polish, Czech, Slovak, Romanian, Hungarian, Bulgarian, Croatian, Greek, Turkish, Russian, Ukrainian, Arabic, Hebrew, Persian, Hindi, Thai, Vietnamese, Indonesian, Malay, Japanese, Korean, Chinese (Simplified/Traditional), Swedish, Norwegian, Danish, Finnish, Estonian, Latvian, Lithuanian, Slovenian, Serbian
  • RTL support for Arabic, Hebrew, and Persian
  • JSON-based translation system (1457 keys per language)
  • Translation Manager rewritten from 2541-line inline dict to modular JSON loader

πŸ› Bug Fixes:

  • Fixed double save button click causing infinite spinner (duplicate onclick + addEventListener)
  • Fixed channel translation losing embed preview images (link previews from Steam, YouTube, etc. now preserved in translated messages)
  • Fixed channel translation duplicating text when embed descriptions repeat message content
  • "Requires restart" badge now only shows when the value has actually been changed
  • Fixed duplicate "Configuration saved" notification on page reload

β βœ… v2.2.0 (2026-03-26) - Channel Translation & Hot-Reload

✨ New Feature: Channel Translation

  • Automatically translate Discord messages between channels using DeepL, Google Translate, or Microsoft Translator
  • Multiple sourceβ†’target channel pairs with per-pair configuration
  • Text, embeds, images, and videos are forwarded with translations
  • Videos are re-uploaded as real Discord files for proper video player display
  • YouTube, Twitter/X, Twitch, Reddit, Vimeo URLs get auto-previewed in translations
  • Encrypted API key storage (independent of password, survives password changes)
  • Rate limiting, retry logic, and auto-disable after consecutive failures
  • Loop prevention (3 layers: bot message check, translated ID tracking, target channel exclusion)
  • Configurable via Web UI: provider selection, test translation, toggle Original link & provider footer
  • Web UI Advanced Settings: rate limit, max text length, show/hide Original link & footer

✨ New Feature: Channel Hot-Reload

  • Adding or removing channels in the Web UI takes effect immediately β€” no container restart needed
  • Bot automatically detects config changes, sets up new channels, and tears down removed ones
  • "Requires restart" badge on Bot Token and Guild ID fields (the only settings that still need a restart)

πŸ› Bug Fixes:

  • Fixed channel form parser skipping channels after deleted rows (numbering gap caused data loss)
  • Fixed JS row numbering creating duplicate field names after channel deletion
  • Fixed non-numeric channel IDs bypassing parser validation
  • Fixed Web UI console errors: ReferenceError: rawLogsCache (JS scoping), log auto-refresh using hardcoded URLs
  • Fixed race condition in translation encryption key creation (double-checked locking + atomic write)

πŸ”’ Security:

  • Bumped requests to >=2.33.0 (CVE-2026-25645)

β βœ… v2.1.9 (2026-03-21) - Critical Channel Save Fix

πŸ› Critical Bug Fix:

  • Jinja2 Scoping Bug (Root Cause of Issue #14): Fixed {% set %} variable inside {% for %} loop not surviving outer scope in Jinja2 templates. This caused the empty default channel row to ALWAYS render alongside existing channels, creating duplicate form fields. When saved, Flask received lists instead of strings for channel IDs, corrupting the data and causing all existing channels to be deleted. Fixed using Jinja2 namespace() objects.

πŸ› Additional Bug Fixes:

  • Channel Delete Button: Fixed delete button not working for existing channel rows in the web UI. The click handler was only attached to dynamically added rows, not template rendered ones. Fixed via event delegation.

πŸ“ Improvements:

  • Port Diagnostics: Cleaned up false "PORT ISSUES DETECTED" warnings when port mapping detection is unavailable from inside the container. Now only warns when the port is genuinely not listening.

β βœ… v2.1.8 (2026-03-21) - Channel Config & Startup Fixes

πŸ› Bug Fixes:

  • Admin Channel Persistence (Issue #14): Fixed channels not being saved/loaded correctly after restart
    • Added fallback chain for channel loading: individual files β†’ config.json β†’ channels_config.json (legacy)
    • Auto-migration from legacy channels_config.json to individual channel files
    • Safe save order: new channel files are saved BEFORE old ones are deleted (prevents data loss)
    • Added safety check preventing deletion of all channels if saves fail
    • Reduced config.json writes from N+2 to 1 per save cycle (SMB/NFS stability)
  • Startup Port Diagnostics: Removed false "Port 9374 NOT LISTENING" warning during startup (diagnostics ran before Waitress was ready)
  • Config Cache Staleness: Bot now uses force_reload=True when loading config at startup to avoid stale cached data

πŸ“ Improvements:

  • Enhanced diagnostic logging for channel save/load operations
  • Channel save return values are now checked and logged

β βœ… v2.1.7 (2026-03-20) - Security Patch

πŸ”’ Security Fixes:

  • CVE-2026-32767 (Critical 9.8): Updated expat to 2.7.5-r0 β€” fixes XML parsing vulnerability
  • CVE-2026-32777, CVE-2026-32776 (Medium): Additional expat security patches
  • CVE-2026-32778 (Low): Expat minor security fix
  • CVE-2025-60876 (Medium): Busybox wget HTTP header injection mitigated (wget removed)

β βœ… v2.1.6 (2026-03-08) - Bugfixes & Story Service

πŸ› Bug Fixes:

  • Donation Restore: Fixed toggle-count pattern across all three layers (delete, rebuild, list/stats) β€” restoring deleted donations now works correctly
  • Mech Story Reading: Added missing get_all_chapters() and get_chapter_key_for_level() methods to MechStoryService β€” "Geschichte lesen" button no longer crashes

β βœ… v2.1.5 (2026-03-08) - Security Hardening & Stability

πŸ”’ Security Hardening:

  • Dependencies: Flask 3.1.3, Werkzeug 3.1.6, cryptography 46.0.5, P

Tag summary

Content type

Image

Digest

sha256:753679ae4…

Size

57.8 MB

Last updated

13 days ago

docker pull dockerdiscordcontrol/dockerdiscordcontrol-linux