From f33fa996869818d1ce1b718f26d1f4025ca973a8 Mon Sep 17 00:00:00 2001
From: marvin
Date: Fri, 18 Sep 2026 15:53:04 -0400
Subject: [PATCH] Add missing BACKUP_PASSWORD status row to the System tab
(v0.16.1)
---
README.md | 2 +-
ROADMAP.md | 2 ++
package.json | 2 +-
src/public/features.js | 7 ++++++-
src/public/index.html | 4 ++--
5 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 72197b6..8a628c1 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
-
+
Why Site Gateway ·
diff --git a/ROADMAP.md b/ROADMAP.md
index c96f1da..fabecba 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -49,6 +49,8 @@
- `app.js`/`features.js`/`select-enhance.js` are now served with `Cache-Control: no-cache`, so browsers always revalidate instead of potentially serving a stale cached copy despite the version query string.
- Native `` popups across the app are now replaced with a custom-drawn dark-themed listbox (the underlying native select is kept for form/value/event compatibility) — the `color-scheme` CSS hint shipped in `v0.15.1` turned out not to reliably theme native dropdown popups across real browsers/engines.
+`v0.16.1` is a fix for a gap in `v0.16.0`'s own System tab: the Environment & Integrations section never actually rendered a `BACKUP_PASSWORD` status row (only the Docker socket status was there), despite the backend already exposing that data via `/api/config`. Fixed.
+
## Product direction
Site Gateway stays simpler than a general-purpose proxy manager: one dashboard, clear health reporting, and guided setup instead of exposing raw server configuration. **Caddy** remains the managed gateway — Site Gateway stores a small route model and generates/validates Caddy configuration rather than reimplementing certificate and proxy behavior itself.
diff --git a/package.json b/package.json
index d93cc7d..79482f0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "site-gateway",
- "version": "0.16.0",
+ "version": "0.16.1",
"private": true,
"description": "Site Gateway: simple self-hosted website publishing, reverse proxying, and automatic HTTPS.",
"type": "module",
diff --git a/src/public/features.js b/src/public/features.js
index 15c1ab4..71e9e48 100644
--- a/src/public/features.js
+++ b/src/public/features.js
@@ -537,7 +537,7 @@ function renderSystemPanel() {
panel.dataset.ready = "1";
panel.innerHTML = [
'System What\u2019s configured, what\u2019s running, and what this deployment can do. Nothing here is customizable except the Docker toggle below and the action buttons \u2014 everything else is status.
',
- '',
+ '',
'Environment
Security status
',
'',
'',
@@ -574,6 +574,11 @@ async function renderSystemStatus(panel) {
syncStatus = document.querySelector("#system-sync-status"), restartButton = document.querySelector("#system-restart"),
restartStatus = document.querySelector("#system-restart-status");
if (jobs) jobs.innerHTML = (state.dashboard?.jobs || []).map(job => `${extendedEscape(job.name)} ${job.enabled ? `Active \u00b7 ${extendedEscape(job.schedule)}` : "Disabled"}
`).join("") || 'No scheduled jobs reported.
';
+ const envStatus = document.querySelector("#system-env-status");
+ if (envStatus) {
+ const encryptionAvailable = Boolean(state.config?.backup?.encryptionAvailable);
+ envStatus.innerHTML = `BACKUP_PASSWORD ${encryptionAvailable ? "Configured \u2014 scheduled backups can be encrypted." : "Not set \u2014 configure it in the container\u2019s environment to enable encrypted scheduled backups."}
`;
+ }
if (syncStatus) { const drift = (state.dashboard?.attention || []).some(item => item.kind === "drift"); syncStatus.textContent = drift ? "Configuration drift detected \u2014 the running gateway no longer matches the last known-good configuration." : `Gateway configuration is in sync. Last reload: ${state.dashboard?.gateway?.lastReload ? formatTime(state.dashboard.gateway.lastReload) : "unknown"}.`; syncStatus.className = drift ? "muted status-warning" : "muted"; }
if (version) version.innerHTML = `Site Gateway v${extendedEscape(state.config?.version || "unknown")} Data directory: ${extendedEscape(state.config?.storage?.databasePath ? state.config.storage.databasePath.replace(/\/database\/.*/, "") : "/data")} · Admin port: ${extendedEscape(String(state.config?.adminPort ?? ""))} · Site ports: ${extendedEscape(String(state.config?.minPort ?? ""))}\u2013${extendedEscape(String(state.config?.maxPort ?? ""))}`;
try {
diff --git a/src/public/index.html b/src/public/index.html
index 5fb145e..70433c1 100644
--- a/src/public/index.html
+++ b/src/public/index.html
@@ -8,7 +8,7 @@
Site Gateway
-
+
-
+