feat(hub): implement native in-app container updates

Introduces the ability for registered users to trigger Beszel container updates directly from the web interface.

- Added `app_update` logic to the hub to pull the latest image from GHCR and recreate the container.
- Implemented `/api/beszel/update` and `/api/beszel/update/apply` endpoints.
- Added a new `AppUpdatePanel` in the settings UI to check for and apply updates.
- Added update notifications in the navbar and settings.
- Updated `docker-compose.yml` and `README.md` to include the required Docker socket mount for update functionality.
- Added a new public status page route that bypasses authentication.
- Refactored several TypeScript interfaces to replace `any` with `unknown` or specific types for better type safety.
- Updated localization files to support new update-related strings.
This commit is contained in:
Tomas Dvorak
2026-04-30 14:38:13 +02:00
parent 67254f89a9
commit 7727be166b
63 changed files with 582907 additions and 636 deletions
+43 -10
View File
@@ -146,8 +146,8 @@ msgid "Add Monitor"
msgstr "Add Monitor"
#: src/components/systems-table/systems-table.tsx
msgid "Add System"
msgstr "Add System"
#~ msgid "Add System"
#~ msgstr "Add System"
#: src/components/routes/settings/notifications.tsx
msgid "Add URL"
@@ -198,12 +198,10 @@ msgstr "Alert History"
msgid "Alerts"
msgstr "Alerts"
#. placeholder {0}: data.length
#. placeholder {0}: stats.total
#. placeholder {0}: statusCounts.total
#: src/components/domains-table/domains-table.tsx
#: src/components/monitors-table/monitors-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "All ({0})"
msgstr "All ({0})"
@@ -219,9 +217,14 @@ msgstr "All Containers"
#: src/components/command-palette.tsx
#: src/components/routes/settings/quiet-hours.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "All Systems"
msgstr "All Systems"
#: src/components/routes/settings/general.tsx
msgid "App update"
msgstr "App update"
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Are you sure you want to delete {name}?"
@@ -333,6 +336,10 @@ msgstr "Beszel supports OpenID Connect and many OAuth2 authentication providers.
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
#: src/components/routes/settings/general.tsx
msgid "Beszel will pull ghcr.io/dvorinka/beszel:latest, recreate the running container, and restart the app. All signed-in users can start this action."
msgstr "Beszel will pull ghcr.io/dvorinka/beszel:latest, recreate the running container, and restart the app. All signed-in users can start this action."
#: src/components/add-system.tsx
msgid "Binary"
msgstr "Binary"
@@ -380,6 +387,7 @@ msgstr "Can stop"
#: src/components/domains-table/domains-table.tsx
#: src/components/monitors-table/add-monitor-dialog.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/quiet-hours.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Cancel"
@@ -442,6 +450,10 @@ msgstr "Check {email} for a reset link."
msgid "Check logs for more details."
msgstr "Check logs for more details."
#: src/components/routes/settings/general.tsx
msgid "Check now"
msgstr "Check now"
#: src/components/routes/monitor.tsx
msgid "Check Now"
msgstr "Check Now"
@@ -477,8 +489,8 @@ msgid "Click to copy"
msgstr "Click to copy"
#: src/components/systems-table/systems-table.tsx
msgid "Columns"
msgstr "Columns"
#~ msgid "Columns"
#~ msgstr "Columns"
#: src/components/login/forgot-pass-form.tsx
#: src/components/login/forgot-pass-form.tsx
@@ -1745,6 +1757,10 @@ msgstr "Response"
#~ msgid "Response Times"
#~ msgstr "Response Times"
#: src/components/routes/settings/general.tsx
msgid "Restarting"
msgstr "Restarting"
#: src/components/systemd-table/systemd-table.tsx
msgid "Restarts"
msgstr "Restarts"
@@ -1912,8 +1928,8 @@ msgid "SMTP settings"
msgstr "SMTP settings"
#: src/components/systems-table/systems-table.tsx
#~ msgid "Sort By"
#~ msgstr "Sort By"
msgid "Sort By"
msgstr "Sort By"
#: src/components/routes/domain.tsx
#~ msgid "SSL Certificate"
@@ -1924,6 +1940,10 @@ msgstr "SMTP settings"
msgid "Start Time"
msgstr "Start Time"
#: src/components/routes/settings/general.tsx
msgid "Start update"
msgstr "Start update"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/quiet-hours.tsx
@@ -2243,10 +2263,23 @@ msgstr "Up ({upSystemsLength})"
msgid "Update"
msgstr "Update"
#: src/components/navbar.tsx
#: src/components/navbar.tsx
msgid "Update available"
msgstr "Update available"
#: src/components/routes/settings/general.tsx
msgid "Update Beszel now?"
msgstr "Update Beszel now?"
#: src/components/monitors-table/add-monitor-dialog.tsx
msgid "Update Monitor"
msgstr "Update Monitor"
#: src/components/routes/settings/general.tsx
msgid "Update now"
msgstr "Update now"
#: src/components/containers-table/containers-table-columns.tsx
#: src/components/routes/system/smart-table.tsx
#: src/components/systemd-table/systemd-table-columns.tsx
@@ -2330,8 +2363,8 @@ msgid "View your 200 most recent alerts."
msgstr "View your 200 most recent alerts."
#: src/components/systems-table/systems-table.tsx
#~ msgid "Visible Fields"
#~ msgstr "Visible Fields"
msgid "Visible Fields"
msgstr "Visible Fields"
#: src/components/routes/domain.tsx
#: src/components/routes/monitor.tsx