v260609
Pre-releaseHermes SEG v260609
Release notes and per-release update artifacts for v260609. This file is the canonical
v260609 upgrade document and doubles as the GitHub Release body
(gh release create v260609 --notes-file updates/v260609/README.md).
What's new in v260609
v260609 is a backup, disaster-recovery, and upgrade-tooling release on top of the v260119
baseline. Highlights:
- Docker-aware backup & restore. A rebuilt
system_backup.shandsystem_restore.sh—
hot (zero-downtime) backups, scoped/slim storage tiers, a directory-style backup format,
streamed restore (no double-staging), disk-space pre-checks, and email notifications
(--notify-email,--notify-on-success). (#219) - Cross-host disaster recovery + re-host. Restore a backup onto fresh hardware:
system_restore.shauto-remaps the storage topology when it differs from the source,
reconciles per-service DB credentials (including Nextcloud'sconfig.php) to the target
host's owncreds/, and detects a cross-host restore and offers to runsystem_rehost.sh
for you.system_rehost.shthen rewires host identity — console hostname, regenerated
service configs, and the Nextcloud OIDC provider's discovery + end-session URLs. A
version-match gate guards against accidental cross-version restores. After any restore, follow
the Post-Restore Steps
checklist. (#220) - Smoother in-place upgrades. The
system_update_docker.shorchestrator gains a
pre-containerpre-scripts/hook and self-re-exec, so upgrades that must migrate files or
credentials before containers restart now work cleanly. (#221) - Authelia credential cleanup. Authelia DB credentials moved from
keys/tocreds/
(alongside the other service-account credentials). This upgrade migrates them for you
automatically — see the required procedure below. - Install-script reliability fixes. All bundled scripts are now marked executable (fixes a
"There was an error executing …" failure on some admin disk-usage panels), clearer install
progress output, corrected install-summary paths, and removal of a misleading console-host
prompt. - Documentation. README rewrite with logo + screenshots, full end-user portal docs
(11 pages), an expanded backup/restore admin guide, and a BookStack documentation-sync
pipeline. (#259)
Note: Email Policies (Disclaimers, External Sender Banner), Organizational/Personal
Signatures, ARC, two-factor enforcement, the device-setup wizard, and the certificate UX
all shipped in v260119 — they are not new here.
Bugs fixed
- #266 — repo
.shscripts
shipped non-executable (100644), so CFML admin panels that shell out failed with "There was an
error executing …" (e.g. the dashboard disk-usage panel viadisk_space_usage_archive.sh). Now
chmod +xat build time and re-applied on install/restore viaensure_scripts_executable. - #267 —
hermes_smoke_test.sh
hardcodedbuild_no=v260119, so the post-install smoke test falsely failed on every release after
v260119. Now version-agnostic (reportsbuild_no; optionalEXPECTED_BUILD=vYYMMDDto assert).
After a cross-host restore
Restoring onto fresh hardware is now largely automatic, but a few items remain operator-driven.
The full checklist lives at
Post-Restore Steps
(also docs/install/post-restore-steps.md in the repo). In short:
- Accept the restore script's offer to run
system_rehost.shwhen it detects a cross-host
restore (or run it manually with--force). - Re-validate the Pro license (the activation is host-bound).
- Re-save Content Checks once, so the Postfix
smtpd_milterschain is rewritten for this
host (#268 — restore does
not yet reapply it automatically). - Turn Nextcloud maintenance mode off if the restore left it on, then run the smoke test.
⚠️ REQUIRED — upgrading from v260119 to v260609
Do not run the normal system_update_docker.sh v260609 command for this upgrade. It
will fail when containers restart (docker compose up → "bind source path does not exist"
for a new Authelia storage secret).
v260609 is the first release to add the orchestrator's pre-scripts/ hook and self-re-exec.
The v260119 orchestrator predates both, so it cannot run this release's pre-container
Authelia credential migration before restarting containers. Because the fix ships inside
v260609, it can't bootstrap itself onto a v260119 box — you must run v260609's orchestrator
directly, via the one-time bridge below.
Recommended — one command (from your install directory):
cd /opt/hermes-seg # your Hermes install directory
git fetch --tags origin
sudo bash <(git show v260609:updates/v260609/upgrade-to-v260609.sh)Manual equivalent (same steps, if you prefer to run them yourself):
cd /opt/hermes-seg
git stash # set aside install-time config drift
git fetch --tags origin
git checkout v260609
sudo ./scripts/system_update_docker.sh --skip-git v260609This procedure is required only for the v260119 → v260609 hop. Every later upgrade uses
the normal system_update_docker.sh <tag> command, because v260609+ self-re-execs.
Already ran the normal command and hit the error? No harm done — run the procedure above and
the upgrade completes cleanly.
What this release ships
| Path | Phase | Purpose |
|---|---|---|
pre-scripts/01-migrate-authelia-creds.sh |
2 (pre) | Moves Authelia DB creds keys/ → creds/ before compose up (new AUTHELIA_STORAGE_USERNAME/PASSWORD secrets) |
scripts/01-regen-authelia-config.sh |
3 | Regenerates Authelia configuration.yml for the MySQL storage backend + restarts the container |
sql/schema_updates.sql |
3 | Schema deltas + the build_no version stamp |
upgrade-to-v260609.sh |
— | The one-time bridge above (wraps stash → fetch → checkout → --skip-git) |
Why two issues compound on this one hop
- Bootstrap gap. v260119's orchestrator has no
pre-scripts/handling and no
self-re-exec, so it never runspre-scripts/01-migrate-authelia-creds.sh. The Authelia
creds stay inkeys/, while v260609'sdocker-compose.ymlreferencescreds/authelia_*
→docker compose upfails on the missing secret. The bridge runs v260609's orchestrator
instead (git checkout v260609+--skip-git), so the pre-script fires. - #256 dirty tree. A fresh v260119 install mutates tracked files (fail2ban defaults,
SpamAssassin bayes DB, slapd ldif, install-substituted templates), so the orchestrator
preflight (git diff --quiet) aborts with "uncommitted changes." The bridge'sgit stash
clears it. (The forward fix — gitignore +git rm --cachedthe runtime-mutable files — is
tracked separately and does not help this hop, since the v260119 preflight is already shipped.)
Apply order (once v260609's orchestrator is running)
Per the standard orchestrator flow (system_update_docker.sh, #221):
- Phase 2 pre-scripts —
pre-scripts/*.shrun BEFOREdocker compose pull && up -d - Phase 2 —
docker compose pull+up -d - Phase 3 —
sql/*.sql, thencfml/*.cfm(none this release), thenscripts/*.sh - Phase 4 / 5 — standard finalize + post-upgrade hook
Each artifact is idempotent; re-running is a no-op.
See docs/install/release-and-update-methodology.md
for the full release/upgrade methodology.