v1.5.0-rc.21
[1.5.0-rc.21] — 2026-05-15
Added
-
i18n coverage extended to the notification outbox, notification rules, and registry/server status badges (discussion #329). Four UI surfaces still rendered hardcoded English even under the zh-CN locale:
NotificationOutboxView(tab labels, table headers, action buttons, toast messages), the notification rule name/description column inNotificationsView, and the connection-status badges inRegistriesViewandServersView. All four are now extracted into the existingt()catalogs (newnotificationOutboxViewnamespace; new entries undernotificationsView.rules.*,registriesView.status.*, andserversView.status.*). Rule names and statuses usete()so backend-supplied custom names fall back to the raw string when the catalog has no entry. Translation files for other locales will pick up the new keys on the next Crowdin sync. -
DD_AGENT_ALLOW_INSECURE_SECRETescape hatch for closed-LAN deployments. rc.20 tightened the agent-secret-over-HTTP check from a warning to a hard error inapp/agent/AgentClient.ts. rc.21 introducesDD_AGENT_ALLOW_INSECURE_SECRET=trueas an explicit controller-side opt-in for environments (isolated private LANs, air-gapped setups) where the operator accepts that the agent secret travels in cleartext. Default behavior is unchanged — without the flag the boot-time error is still thrown. When the flag is set to exactlytrue, the error is downgraded to alog.warnon every startup so the security signal is preserved and visible in logs. Any other value (e.g.1,yes,TRUE) continues to throw. Seecontent/docs/current/configuration/agents/index.mdxfor guidance on recommended alternatives (certfile/cafile, reverse proxy TLS termination).
Changed
- Default watcher cron relaxed from hourly to every 6 hours (#342 follow-up).
app/watchers/providers/docker/Docker.tsnow defaultscronto0 */6 * * *(every 6 hours) instead of0 * * * *(hourly). Hourly polling was the most aggressive default among active 2026 update managers — Diun ships0 */6 * * *, Watchtower (archived Dec 2025) defaulted to 24 h, and our upstream WUD ships no default at all. With fleets of 20+ containers and image tag lists that paginate to thousands of entries (immich-server is 24+ GHCR pages), hourly polling saturates anonymous Docker Hub limits (100 pulls / 6 h) and trips GitHub's 5 k req/h release-notes ceiling. rc.20's per-host token bucket +Retry-Afterhandling stays as the safety net; the default change addresses the root cause. Users who setDD_WATCHER_{name}_CRONexplicitly are unaffected. Users who want near-real-time detection (security patches) can still setDD_WATCHER_{name}_CRON=0 * * * *. Docs (content/docs/current/configuration/watchers/index.mdx,content/docs/current/api/watcher.mdx,content/docs/current/api/agent.mdx) updated to reflect the new default.
Fixed
-
discussion #295 — Release-notes icon in the container table now always opens the same popover, even when only an external release URL is available. Previously the file-text icon in the actions column had two different behaviors depending on what release-notes metadata we'd fetched for the container: containers with structured notes (title + body, e.g. from the GitHub release-notes provider) got an icon button that opened a popover with an expandable preview; containers with only a bare
releaseLinkURL got an icon that was a direct external<a>— no popover. The popover shell now renders uniformly for both cases. When onlyreleaseLinkis available, the popover contains a single row that links out to the external URL (with anexternal-linkindicator instead of the chevron used by expandable rows), and clicking the row dismisses the popover before navigating. No change for containers that already have structured notes — the existing popover and inline-expander behavior are unchanged. -
Docker multi-arch build no longer fails when Alpine repos drift between archs.
Dockerfilepinnedcurl=8.17.0-r1, which broke thelinux/arm64build leg after Alpine'slatest-stable/aarch64mirror rotated tocurl-8.19.0-r0whilelatest-stable/x86_64was still on8.17.0-r1. No single pin can satisfy both archs during a mirror rotation window; the curl entry is now unpinned so apk installs whatever's current per-arch. Other pinned packages still match across both archs and stay pinned. -
#362 —
DD_SESSION_SECRETno longer crashes startup when unset; secret is auto-generated and persisted to the store on first boot. rc.20 madeDD_SESSION_SECRETa hard requirement (commitb9e8be38) to close a real issue — the prior fallback generated a fresh per-process random secret on every restart, which silently invalidated every active session whenever drydock restarted. But the hard-require shipped without a migration path: existing deployments that didn't set the variable hit an immediate boot crash on upgrade. The fallback is now restored as a persisted secret: on first boot withoutDD_SESSION_SECRETset, drydock generates 64 random bytes (randomBytes(64).toString('hex')) and writes them to a newsecretscollection inside/store/dd.json. Subsequent boots read the persisted value, so sessions survive restarts. The env var still takes precedence when set (and whitespace-only values are treated as unset). Operators upgrading from rc.20 with noDD_SESSION_SECRETconfigured will boot cleanly; deployments that already set the variable see no change.