Use the bundled Synapsis logo on maintenance pages without custom branding

Hop-State: A_06FP9KPYV5CQ0X9F467H58G
Hop-Proposal: R_06FP9KNN01X6RVC106905HG
Hop-Task: T_06FP9KBX6WGXFK0K5XYQSR0
Hop-Attempt: AT_06FP9KBX6Y81G7RGHF7RCK8
This commit is contained in:
2026-07-15 01:05:06 -07:00
committed by Hop
parent be3425994f
commit 8935bdf5c5
3 changed files with 16 additions and 2 deletions
+14 -1
View File
@@ -7,8 +7,10 @@ const host = process.env.MAINTENANCE_HOST || '127.0.0.1';
const port = Number.parseInt(process.env.PORT || '43821', 10); const port = Number.parseInt(process.env.PORT || '43821', 10);
const dataDir = process.env.MAINTENANCE_DATA_DIR const dataDir = process.env.MAINTENANCE_DATA_DIR
|| dirname(process.env.DATABASE_PATH || '/var/lib/synapsis/synapsis.db'); || dirname(process.env.DATABASE_PATH || '/var/lib/synapsis/synapsis.db');
const appDir = process.env.MAINTENANCE_APP_DIR || process.cwd();
const brandingPath = join(dataDir, 'maintenance-branding.json'); const brandingPath = join(dataDir, 'maintenance-branding.json');
const logoPath = join(dataDir, 'maintenance-logo'); const logoPath = join(dataDir, 'maintenance-logo');
const defaultLogoPath = join(appDir, 'public', 'logotext.svg');
function validAccent(value) { function validAccent(value) {
return typeof value === 'string' && /^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(value) return typeof value === 'string' && /^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(value)
@@ -69,7 +71,8 @@ const externalLogoUrl = typeof branding.externalLogoUrl === 'string' && /^https?
? branding.externalLogoUrl ? branding.externalLogoUrl
: null; : null;
const hasStoredLogo = existsSync(logoPath); const hasStoredLogo = existsSync(logoPath);
const logoMarkup = hasStoredLogo || externalLogoUrl const hasDefaultLogo = existsSync(defaultLogoPath);
const logoMarkup = hasStoredLogo || externalLogoUrl || hasDefaultLogo
? '<img class="logo" src="/maintenance-logo" alt="Node logo">' ? '<img class="logo" src="/maintenance-logo" alt="Node logo">'
: '<div class="brand-fallback">Synapsis</div>'; : '<div class="brand-fallback">Synapsis</div>';
@@ -131,6 +134,16 @@ const server = http.createServer((request, response) => {
response.end(); response.end();
return; return;
} }
if (hasDefaultLogo) {
const logo = readFileSync(defaultLogoPath);
response.writeHead(200, {
'Content-Type': 'image/svg+xml',
'Content-Length': logo.byteLength,
'Cache-Control': 'no-store, max-age=0',
});
response.end(logo);
return;
}
} }
response.writeHead(503, { response.writeHead(503, {
+1 -1
View File
@@ -10,6 +10,7 @@ User=synapsis
Group=synapsis Group=synapsis
WorkingDirectory=/opt/synapsis WorkingDirectory=/opt/synapsis
EnvironmentFile=/etc/synapsis.env EnvironmentFile=/etc/synapsis.env
Environment=MAINTENANCE_APP_DIR=/opt/synapsis
ExecStart=/usr/bin/env node /opt/synapsis/deploy/maintenance-server.mjs ExecStart=/usr/bin/env node /opt/synapsis/deploy/maintenance-server.mjs
Restart=on-failure Restart=on-failure
RestartSec=1 RestartSec=1
@@ -17,4 +18,3 @@ NoNewPrivileges=true
PrivateTmp=true PrivateTmp=true
ProtectSystem=strict ProtectSystem=strict
ProtectHome=true ProtectHome=true
+1
View File
@@ -69,6 +69,7 @@ fi
install_update_units install_update_units
if ! runuser -u synapsis -- env \ if ! runuser -u synapsis -- env \
PORT="${PORT:-43821}" \ PORT="${PORT:-43821}" \
MAINTENANCE_APP_DIR="$APP_DIR" \
MAINTENANCE_DATA_DIR="$DATA_DIR" \ MAINTENANCE_DATA_DIR="$DATA_DIR" \
node "$APP_DIR/deploy/maintenance-server.mjs" --capture-branding; then node "$APP_DIR/deploy/maintenance-server.mjs" --capture-branding; then
echo "Warning: could not refresh maintenance-page branding; using the last captured branding." >&2 echo "Warning: could not refresh maintenance-page branding; using the last captured branding." >&2