Skip to content

Production deploy logs still name a node address on the cluster-update summary line #4612

Description

@devantler

🤖 Generated by the Agentic Engineer

Evidence

  • fix(ci): mask the production API endpoint address for the rest of the job #4594 masks the production API endpoint address in deploy logs. Its own merge-queue deploy (run 37560566838, 2026-10-07) confirms that: the cluster-update summary line now shows the endpoint as ***, and no address followed by the API port appears anywhere in the 1,093-line deploy log.
  • The same summary line still ends by naming the address of the node the settings were read from. That is the only unmasked address left in that log (one line of 1,093).
  • The line is printed on every successful production deploy, in a public repository's logs.

As on #4588 and #4591, the value is referred to only as a production node address. Please do not repeat it here, in the fix, or in any comment.

Audience and problem

Anyone can read these logs. A node's public address is less sensitive than the API endpoint, but it is still part of the cluster's layout that the earlier two fixes set out to keep out of public logs, and it is disclosed again on each deploy.

Hypothesis

Registering every production node address as a masked value at the point the endpoint is masked today closes this the same way, whichever tool prints one later.

Smallest useful change

Extend the existing masking step to cover the node addresses it can already read, with the same rule as before: the mask command only ever reaches the runner, never a file, summary or artifact.

Acceptance criteria

  • A production deploy log contains no IPv4 address at all (checked on a real deploy, not only in a local test).
  • The heal job and the manual deploy workflow are covered by the same step.
  • If the summary line comes from KSail and can simply stop naming the node, a KSail issue is filed for that as the longer-term fix.

Activity

  1. self-assigned this
    on Oct 7, 2026
  2. added a commit that references this issue on Oct 7, 2026
  3. devantler commented on Oct 7, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer

    Draft fix: #4615. Where the line comes from and what the fix covers:

    • The line is KSail's. Its Talos update path names the control-plane node it reads cluster secrets from, and the node concerned on each line that reads or applies a node's configuration. So the address shown can be any node's, and differs between deploys.
    • The fix therefore registers every address of every server the Hetzner token lists (public IPv4, the prefix of a public IPv6 network, private and alias addresses), not one node's. It runs in the step the deploy, heal and manual deploy jobs already share, and in the ten operator workflows that call the same step.
    • If the server list cannot be read or does not yield addresses, the job stops there.
    • The longer-term fix is filed as Cluster update prints server addresses in its default output ksail#7593: KSail should name nodes, not addresses, in its default output.

    The first acceptance criterion needs a real deploy, so it is checked after #4615 merges, on that merge's own deploy log.

  4. devantler commented on Oct 7, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer

    Verified on a real production deploy. #4615 merged at 07:59Z (bdf93290); its own merge changed no manifests, so that merge ran no deploy. The next change through the queue did:

    • Deploy job 112694624860 — built on bdf93290, finished success, ran the cluster update.
    • Its public log is 1,093 lines. A scan for anything shaped like an IPv4 address found none (not even loopback or private ranges); 30 lines carry the masked marker instead.

    Still open by design, as recorded on the pull request: a server created during the same deploy is not known when the mask step runs. devantler-tech/ksail#7594 (merged) fixes that at the source once production moves to a KSail release that includes it; devantler-tech/ksail#7595 covers the remaining error and create paths.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Fields

No fields configured for Security.

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions