Upgrade Nora
Keep self-hosted Nora current with the manual host command or the Admin Settings one-click upgrade runner.Nora supports two upgrade paths for source-based self-hosted installs:
Both paths rebuild the same Docker Compose stack. For public TLS and Kubernetes backends, make sure the deploy env file and compose file list match the command you normally use.
Both supported upgrade runners also refresh generated public nginx policy, pre-validate it in a
one-off container, and recreate only nginx after the main rebuild. This remount is required
because
nginx.public.conf is replaced atomically and an already-running single-file bind mount
otherwise remains attached to the previous inode.
Manual upgrade
Run the manual upgrade from the Nora repo root on the host:setup.sh, refresh the public config and run the same Compose
stack that started the instance. Public TLS plus any Kubernetes backend uses:
Enable one-click upgrades
One-click upgrades are disabled by default. Enable them only on instances where the backend can reach the Docker socket and the host Nora checkout.backend-api container. Set NORA_UPGRADE_COMPOSE_FILES when you want an explicit stack:
/nora-host-repo for preflight file checks. The temporary upgrade runner mounts NORA_HOST_REPO_DIR read-write so it can fetch the target release, update release tracking in the deploy env file, refresh and activate generated nginx policy, and rebuild the stack.
Admin flow
Open Admin Settings -> Platform Release. The one-click panel shows:- Current and latest version metadata.
- The exact deploy env file and compose files the runner will use.
- Preflight checks for auto-upgrade enablement, target release, host repo path, source repo safety, Docker socket access, and file presence.
- Recent runner logs and the current phase: queued, fetching source, applying release, rebuilding stack, checking health, succeeded, or failed.
Recovery
If an upgrade fails, Nora does not automatically roll back. Review the Admin log tail or thenora_upgrade_state volume, fix the reported issue, and rerun the manual command from the host repo.
Before retrying, verify the host checkout is clean:

