Deploy: make the LXC updater a real file so existing containers can bootstrap it
ci / build-test (push) Successful in 1m28s

The updater was emitted from a heredoc inside the installer, so a container
provisioned before it existed had no way to obtain /usr/bin/update — 'update'
just reported command not found, with no path forward short of reinstalling.

Ship it as deploy/install/metervault-update.sh and have the installer
install(1) it from the checkout it just built. An already-provisioned
container can now bootstrap from its own source tree after a git pull, and the
updater refreshes itself (atomic rename, since bash reads a running script
lazily) so the same stranding does not recur.

Uses echo rather than msg_warn for the missing-file case: msg_warn is not
otherwise relied on in this script, and an undefined function under the
framework ERR trap would abort an otherwise-successful install.

Claude-Session: https://claude.ai/code/session_01V6joyergfvVLFEizH1hJLd
This commit is contained in:
2026-07-18 09:48:02 +02:00
parent a3af4838e8
commit 813d96709e
2 changed files with 62 additions and 20 deletions
+10 -20
View File
@@ -224,27 +224,17 @@ WantedBy=multi-user.target
EOF
}
# A self-contained in-container updater: pull the latest source and rebuild, no host round-trip and
# no re-fetch of the community-scripts framework (safer + simpler than re-running the ct script).
# Install the in-container updater from the checkout we just built, rather than emitting it from a
# heredoc here. Keeping it a real file in the repo means an already-provisioned container can
# bootstrap /usr/bin/update itself after a git pull, instead of being stranded on whatever the
# installer wrote the day it ran.
write_update_command() {
cat <<'EOF' >/usr/bin/update
#!/usr/bin/env bash
set -euo pipefail
if ! systemd-detect-virt --container --quiet 2>/dev/null; then
echo "Run 'update' inside the MeterVault LXC, not on the Proxmox host." >&2
exit 1
fi
export DOTNET_CLI_TELEMETRY_OPTOUT=1 DOTNET_NOLOGO=1
echo "Stopping metervault…"; systemctl stop metervault || true
echo "Pulling latest source…"
git -C /opt/metervault-src fetch --depth 1 origin master
git -C /opt/metervault-src reset --hard origin/master
echo "Rebuilding (dotnet publish)…"
dotnet publish /opt/metervault-src/src/App/MeterVault.App.csproj -c Release -o /opt/metervault /p:UseAppHost=false
echo "Starting metervault…"; systemctl start metervault
echo "MeterVault updated."
EOF
chmod +x /usr/bin/update
local src="${SOURCE_DIR}/deploy/install/metervault-update.sh"
if [[ ! -f "${src}" ]]; then
echo "Updater script not found at ${src} — skipping 'update' command." >&2
return 0
fi
install -m 0755 "${src}" /usr/bin/update
}
main() {