fix(installer): make redeploy, repair and repo-built bundles install cleanly - #46
Merged
Developer-Simon merged 12 commits intoSep 21, 2026
Merged
Conversation
The UI text field gets no shell expansion, so ~/dev/energy-node was reported as not a checkout. Expand a leading ~ before checking and building. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Send the detail with every run-finished failure and show it on the result screen. A failure before the first step no longer reads "At step". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ntly Emit a note per 5 % of the archive upload and write over SFTP with concurrent writes, which is much faster on high-latency links. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ting A manual install can leave a root-owned selection.json in the state directory, which the SSH user owns. Opening it with O_TRUNC failed with "permission denied" and stopped the run before its first step. Upload to a temporary name next to the target and rename over it, which only needs the directory (and never exposes a half-written file). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ploy and repair A redeploy or repair collects no credentials, so 20-mosquitto.sh got no --user/--password-file and failed with MOSQUITTO_ARGS_MISSING before it could notice there was nothing to do. Read the user and password file from the node's config (or the bundle's template on a first install), like the dashboard's updater does; report MQTT_CONFIG_UNREADABLE when neither is readable. Add texts for both codes, which showed up as "unknown error code". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tep 40 Debian's /etc/default/tailscaled, and the defaults template in the Tailscale tarball, carry #FLAGS="--tun=userspace-networking" as a comment. The guard grepped the whole file, so it aborted with TAILSCALE_FLAG_INVALID on a healthy node (tailscale0 up, no flags) and would have failed a first install on its own template. Only look at the part of a line before a #. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
pip download --python-version evaluates markers such as python_version < "3.13" with the build machine's own interpreter. Built on Python 3.14, the bundle lacked typing_extensions, which aiohttp needs on the node's Python 3.11, and step 50 failed offline with "No matching distribution found". After each download, check every wheel's requirements against the target's markers and fetch what is missing, until the set is closed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…as no Caddy pack The Caddy pack is only in a bundle built with --caddy-binary, but step 70 demanded caddy/caddy before it looked at the node, so a repo-built bundle failed with CADDY_BINARY_MISSING on a node whose apt-owned Caddy it would not have replaced anyway. Require the pack only when the step has to install a binary, and the Caddyfile template only when there is no Caddyfile yet. The configuration is still validated and the service enabled. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
29 codes that the steps report (CADDY_BINARY_MISSING, PIP_INSTALL_FAILED, MOSQUITTO_PASSWD_FAILED, ...) had no catalog entry, so the result screen said "Unknown error code" instead of what went wrong and what to do. Add message and remediation in English and German for each. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Developer-Simon
force-pushed
the
fix/installer-repo-path-and-install-errors
branch
from
September 21, 2026 21:50
98dabc9 to
23a64c3
Compare
shellcheck flagged round as unused (SC2034). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Developer-Simon
deleted the
fix/installer-repo-path-and-install-errors
branch
September 21, 2026 21:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Squash-merge commit message
Summary
Checklist
(
type(scope): summary) and matches the style ingit log.CONTRIBUTING.md → Running the checks
pass locally (Python bridges, HA integration, Go dashboard, dashboard JS,
dashboard smoke test — whichever the change touches).
./scripts/deploy/check_tracked_secrets.shis clean — no realcredentials, private-range IPs, or device serials.
AI-DISCLAIMER.md.
🤖 Generated with Claude Code