Upgrade guide¶
This guide is the operational companion to the complete historical release reference. It records the source-derived release channel contract and the boundary at which an upgrade may be rolled back.
x86_64-unknown-linux-musl
This edition covers the 0.11 command tree. Review Changes in 0.11.x for configuration selection, enrollment and resource publication. For an existing deployment, follow the complete 0.11 procedure.
Current release and channel status¶
The current candidate is v0.11.0-rc.7; successful publication moves :rc to it.
Documentation latest selects the 0.11 edition.
The last final release is v0.9.0, which remains the target of :latest.
The channel inventories below describe the publication contract. RC publication requires the full gate and an independent reproducibility check.
| Channel | Tag shape | Published status | Gate before publish | Floating container tag |
|---|---|---|---|---|
| alpha | vX.Y.Z-alpha.N | tagged, signed | no gate | none |
| beta | vX.Y.Z-beta.N | tagged, signed | no gate | none |
| rc | vX.Y.Z-rc.N | tagged, signed | full gate + reproducibility | :rc |
| release | vX.Y.Z | tagged, signed | full gate + reproducibility | :latest |
Alpha and beta are published without the full gate. RC and release run the full gate and the independent reproducibility check before publication. Only the rc channel moves :rc, and only the release channel moves :latest. Alpha and beta are requested by their immutable tag.
alpha beta rc release
alpha|tagged|signed|no-gate|none beta|tagged|signed|no-gate|none rc|tagged|signed|full-gate|rc release|tagged|signed|full-gate|latest
0.11.0-rc.7|rc|signed|full-gate|rc
The release script produces the following artifact classes. A local dry-run may omit the detached signature, but a tagged CI publication is signed.
binary sbom checksums signature-optional
Rollout class chooser¶
Use this chooser before selecting a tag channel. It is an operational compatibility classification; when a change fits more than one row, use the stricter row.
| Change class | Minimum rollout channel | Required boundary |
|---|---|---|
| Routine | alpha or beta | No certificate, wire, store, policy, audit-consumer, artifact, or security contract changes; do not imply that the full gate ran |
| Cert or wire | rc, then release | Roll the compatible Authority, proxy, connector, and consumer fleet together; complete the full gate and reproducibility check |
| Store | rc, then release | Take the paired store and key backup, run migration as a planned step, and keep the pre-migration restore point |
| Policy | rc, then release | Validate and migrate the policy vocabulary, preserve the break-glass invariant, and use the approval path |
| Audit or recording consumer | rc, then release | Check event names, codes, classes, recording format, and downstream parsers before opening traffic |
| Artifact or channel | rc, then release | Verify target, SBOM, checksum signature, floating-tag behavior, and reproducibility before publication |
| Security-sensitive | rc, then release | Require the full gate, independent rebuild, paired approval, and an explicit recovery owner |
The chooser does not turn an alpha or beta into a tested candidate. Promote a build to rc when the compatibility evidence is required, then use the release channel only after the candidate evidence and recovery rehearsal are complete.
Compatibility and preflight¶
This is the read-only preflight. The release owner records the exact tag, workspace version, target, change id, and store_url before changing a service.
- Verify the checksum signature, then the checksums and SBOM:
cosign verify-blob --key cosign.pub --signature SHA256SUMS.sig SHA256SUMS,sha256sum -c SHA256SUMS, andjq '.metadata.component.name, (.components | length)' gdsgate-<tag>.cdx.json. Any non-zero result is a stop condition. - Run
gdsgate --config authority.toml doctor --json. Exit 0 is a passing preflight; exit 2 names a configuration or state finding to fix before the window. Doctor is read-only. - Set or confirm
store_auto_migrate = falsefor a planned migration, then rungdsgate --config authority.toml authority store migrate --checkagainst the same store_url. Exit 0 means no pending migration. A non-zero pending result names the migration ids and is not an incident by itself; an unknown-applied result means this binary is older than the store and is a stop condition. - Run
gdsgate --config authority.toml authority audit verifyand preserve the result with the change record. A failed chain verification stops the rollout. - Keep the old binary, configuration, identity directories, store endpoint, and key set available until post-change verification passes.
Paired backup and planned migration¶
This is a planned change, owned by the release operator and approved by the change owner. Stop writes or close the traffic window according to the deployment runbook before taking the final pair.
- Take one transaction-consistent backup or snapshot of the persistent store addressed by store_url. Take the external audit-anchor, approval, delegation, revocation, inventory, and CA key material in the same backup generation. Include identity directories and any transport trust material required by the role.
- Encrypt the backup, store a copy off the Authority host, record its generation and checksums, and prove that the restore owner can read it. A store-only backup cannot verify historical audit integrity. If either the store or paired keys is absent, mismatched, or unreadable, stop before migration.
- Preserve the previous binary, configuration, store_url, and key set. Do not replace only one certificate or key in a pair.
- With services stopped or with the approved migration lock, run:
gdsgate --config authority.toml authority store migrate --check
gdsgate --config authority.toml authority store migrate
The first command changes nothing and exits non-zero when pending work exists. The second opens the store directly, applies pending migrations, and is idempotent. Expected success is an applied-count message followed by a current schema; a second run reports nothing to apply. 5. Run only one planned migration against a shared PostgreSQL store. The store migration lock waits 120 seconds; a timeout is a stop condition to inspect the active writer, not a reason to run a second migration concurrently.
MigrationStatus distinguishes pending migrations, which this binary can apply, from unknown-applied versions, which a newer binary already wrote. An unknown-applied result must use the newer binary or the paired pre-migration restore. Do not delete migration rows, edit migration metadata, or downgrade schema rows.
Verification and recovery boundary¶
This is the post-change verification gate. Start the exact new binary with automatic migration still disabled, then require all of the following:
gdsgate --config authority.toml doctor --jsonexits 0.GET /healthzreturns 200 andGET /readyzreturns 200. A 503 readiness response is not success and traffic stays closed.gdsgate --config authority.toml authority audit verifysucceeds.- The policy version, catalog version, connector serving state, and audit event for the change match the recorded expectation.
- One controlled session and its expected protocol operation succeed, and the relevant recording or audit consumer sees the current event/code shape.
If the binary refuses the store, readiness does not become 200, audit verification fails, or the controlled session shows an incompatibility, stop traffic and keep the old binary stopped or isolated. Restore the paired pre-migration store and keys, restore the previous configuration and binary, verify the audit chain and readiness again, and escalate to the release owner. There is no supported in-place reverse migration. A certificate or wire change requires the compatible fleet to be rolled together; do not mix an old peer with a release that changed its verification contract.
Upgrade notes¶
The v0.8 line uses the current Authority, proxy, connector, and client command
families. Replace historical auth terminology with authority only when
following a current command or configuration contract. Preserve the existing
persistent store_url and identity directories across a service replacement.
To 0.11.x from v0.10.0-rc.10 or rc.13¶
This procedure upgrades v0.10.0-rc.10 or v0.10.0-rc.13 to
v0.11.0-rc.7. Check the migration and compatibility notes for later
0.11 builds separately. The release changelog lists
the changes.
An existing deployment keeps its configuration, node identities, users,
policies and manual resource IDs. Reinstallation, another enrollment token,
connect, join and first-install setup are not required for a binary replacement.
Do not delete protected state or repeat first-install commands to upgrade.
Regenerating a service unit is an in-place registration of that service.
The maintenance-window start order is Authority, Proxy, Connector, Client. Complete the Authority phase on every HA member before the Proxy phase. Existing sessions can end when their owning process stops. This procedure does not promise uninterrupted service or prolonged mixed-version HA. For versions earlier than rc.10, first apply the relevant procedures below, including their older Proxy and Connector ordering restrictions.
1. Inventory and preflight¶
- Record the old version, service binary paths, config paths, store endpoint,
state directories and HA owners. On Linux, inspect each installed unit with
systemctl cat gdsgate-authority,systemctl cat gdsgate-proxyandsystemctl cat gdsgate-connector, as applicable. Client system services usegdsgate-client@<user>.service; optional user services usegdsgate-client.service. Preserve custom environment files and unit drop-ins. - Stage the same verified release build for the whole fleet. Follow
artifact verification to verify signatures
and
SHA256SUMS. Check the target architecture, platform runtime and configured KMS-provider support. A matching--versionalone does not prove identical features or bytes. - With the old deployment still running, check
doctor --json, audit integrity and current serving state. Resolve existing failures before using the upgrade to judge new behavior. Use an explicit config for every role:
gdsgate --version
gdsgate --config /etc/gdsgate/authority.toml doctor --json
gdsgate --config /etc/gdsgate/authority.toml authority verify-audit
gdsgate --config /etc/gdsgate/authority.toml authority list-resources
-
Pause scheduled CA/keyring rotation and do not prepare or activate a distribution-root transition during the rollout. Preserve the existing root provider, owner names, membership and credentials. When upgrading from rc.10, each updated Authority creates its own receiver credential; never copy another member's credential or reinitialize its root.
-
For a manually configured HA Proxy, check its Authority control pool. A single load-balanced address can keep a persistent RPC connection on a follower, leaving the Proxy unready although both Authorities are healthy. Configure the individual Authority addresses with
endpoints.authorityandendpoints.authority_failover, or use verified automatic topology. Keep the configured TLS verification name valid for every member. Public access and Connector load balancers do not replace this control pool.
The Linux examples use standard config paths. Substitute the paths inspected from the actual units. Run administrative checks as the service owner or an authorized operator with access to the protected files; a client context is not a substitute for a local Authority config.
2. Close traffic and preserve a recovery point¶
Schedule the interruption and close new access. Stop residents, Connectors and Proxies, then stop all Authorities and other store writers for the final backup and planned migration. Keep the old binaries available and follow paired backup and migration.
Preserve the following in one identified recovery generation:
| State | What to preserve |
|---|---|
| Persistent store | A consistent backup of the exact configured database. For SQLite, stop writers and use a SQLite backup or include its journal/WAL state; copying a live main file alone is insufficient. |
| Each server node | Config, policy and environment files; enrolled transport identity; CA and audit/control keyrings; activation state; recording buffers and audit outboxes. Include paths outside the standard state root. |
| Each HA Authority | Distribution root/provider, snapshot cache, install journal and receiver credential when present. Preserve continued access to configured DB/KMS providers. |
| Each client | Protected client directory, selected and saved configs, identity/token storage, context records and endpoint/address cache. Preserve manually managed SSH and Kubernetes integrations. |
| Service definitions | Installed unit or service definition, drop-ins, executable location and previous binary. |
Readiness must be checked again after replacement, even if the preflight passed. Do not restore only the shared DB while leaving newer node-local state in place.
3. Replace binaries and migrate once¶
With the relevant processes stopped, replace their executable at the existing
persistent installation path. Do not point a server unit at a build under a
home or temporary directory. For a regular Linux binary at /usr/local/bin,
an atomic replacement is:
sudo install -m 0755 /path/to/staged/gdsgate /usr/local/bin/gdsgate.new
sudo mv /usr/local/bin/gdsgate.new /usr/local/bin/gdsgate
/usr/local/bin/gdsgate --version
sha256sum /usr/local/bin/gdsgate
If the installed path is a managed symlink, replace its intended target using the installation's update mechanism and retain the link. Install the new binary on each host before registering its units. Compare the checksum with the staged artifact for that host's target; do not infer the running process's version from the file on disk.
Both rc.10 and rc.13 have 79 store migrations. This release has 85 and adds:
| Migration | Added state |
|---|---|
m0080_bootstrap_identity |
Stable bootstrap identity |
m0081_resource_identities |
Assigned resource identities and namespaces |
m0082_connector_publication |
Connector publication policy and assignments |
m0083_manual_resource_bindings |
Explicit manual-resource serving membership |
m0084_manual_assignment_revision |
Revision of manual-resource assignments |
m0085_manual_inventory_generation |
Manual inventory generations |
Run these commands with the new binary and the existing Authority config:
gdsgate --config /etc/gdsgate/authority.toml authority store migrate --check
gdsgate --config /etc/gdsgate/authority.toml authority store migrate
gdsgate --config /etc/gdsgate/authority.toml authority store migrate --check
The initial check exits non-zero when migrations are pending; the final check must show a current schema. Run one planned migration for a shared PostgreSQL store, not one simultaneous command per Authority. Separate SQLite stores require their own migration and backup. These commands operate directly on the store and require the configured DB/KMS access.
With store_auto_migrate = true (the default), first Authority startup also
applies pending migrations. The planned procedure applies them before startup;
store_auto_migrate = false keeps a later restart from doing unexpected work.
A schema with unknown applied migrations stops an older binary. There is no
supported reverse migration.
4. Regenerate native service definitions¶
Linux¶
Run the installed new binary as root, once for each installed server role on that host, with its existing config:
sudo /usr/local/bin/gdsgate --config /etc/gdsgate/authority.toml service install authority
sudo /usr/local/bin/gdsgate --config /etc/gdsgate/proxy.toml service install proxy
sudo /usr/local/bin/gdsgate --config /etc/gdsgate/connector.toml service install connector
The installer rewrites the unit, records its config path, runs
systemctl daemon-reload and enables boot startup. A separate daemon-reload
is unnecessary after successful installation. Keep relevant custom drop-ins
and inspect the resulting ExecStart, ExecReload and state paths.
Install the resident from its user's session so elevation preserves that user's protected state. Select the intended existing config explicitly:
This example registers the default protected system service. An intentional user-service installation uses its existing account and access settings; see Resident service.
Installation does not restart a running process, even with --start.
It does not require service uninstall, another enrollment or state deletion.
Existing rc.10 units remain usable for restart with unchanged paths; regenerate
them to receive the new acknowledged configuration reload command:
gdsgate --config PATH reload --role ROLE. Earlier server units use HUP for
certificate refresh, and earlier Connector units have no ExecReload.
See reload.
The normal protected systemd state symlinks are supported. Unknown or untrusted links are refused. Private state and local control-channel directories must retain their service-owner protection; do not make them world-writable to get past a startup error. A reload-channel failure is logged and disables reload until repaired without by itself stopping an otherwise valid server.
Windows¶
Stop the affected services before replacing gdsgate.exe, then use the new
installed executable from an elevated terminal with each existing config:
gdsgate.exe --config C:\ProgramData\gdsgate\authority.toml service install authority
gdsgate.exe --config C:\ProgramData\gdsgate\proxy.toml service install proxy
gdsgate.exe --config C:\ProgramData\gdsgate\connector.toml service install connector
This refreshes service registration and server config access. Use the same
installation path and preserve custom state paths. Windows service install client
registers the privileged network helper; the resident runs in its user's
session. Restart that helper with the updated executable, then start the
resident as the original user. See Windows resident.
After migration, start each installed server role in the phase order below, checking its readiness before proceeding. The service names are:
On client machines, refresh the helper registration from an elevated terminal:
Then run gdsgate up in the original user's session with the intended client
config selected. Apply these commands only to services installed on that host.
Containers and unmanaged processes¶
Replace the image or executable under the existing supervisor. Preserve config
mounts, state volumes, service account, secret-provider access and the same
store endpoint. Do not run service install inside a container. Recreate
processes in the phase order below; persistent volumes must survive replacement.
Keep the old image digest for paired recovery.
An existing agent host also needs its executable replaced and process restarted
with its retained config and identity. Preserve its manually installed unit or
supervisor definition; service install does not offer the agent-host role.
5. Start and verify each phase¶
Use the following order in the closed maintenance window. The Linux commands restart the applicable installed role; if it was stopped, they start it. Run them on its own host, not all roles on every machine.
- Authorities: start the new members one at a time and check each before continuing. Restore a ready leader and verify membership and follower routes before progressing to Proxies.
sudo systemctl restart gdsgate-authority
gdsgate --config /etc/gdsgate/authority.toml doctor --role authority --json
gdsgate --config /etc/gdsgate/authority.toml authority store migrate --check
gdsgate --config /etc/gdsgate/authority.toml authority audit verify
Require that node's configured /healthz and /readyz to return 200.
Where keyring sync is enabled, inspect every Authority locally:
Confirm the expected root epoch, matching material revision and no unexpected preparation. Do not rotate the root before every retained Authority has completed the upgrade and acknowledged the current material.
- Proxies: restart and check Authority routes, peer routes and readiness.
sudo systemctl restart gdsgate-proxy
gdsgate --config /etc/gdsgate/proxy.toml doctor --role proxy --json
- Connectors: restart and confirm identity reuse, verified configured Proxy connections and admitted resources. Do not treat a connected tunnel as proof that every declared resource was admitted.
sudo systemctl restart gdsgate-connector
gdsgate --config /etc/gdsgate/connector.toml doctor --role connector --json
gdsgate --config /etc/gdsgate/authority.toml authority resources list
Run the catalog command from an authorized Authority/operator host.
not_in_catalog means a manual declaration or assignment is missing;
repeating enrollment is not its remedy. Inspect the existing publication
assignment before making catalog changes.
- Clients: from the original user's session, restart the system resident:
sudo systemctl restart "gdsgate-client@$(id -un).service"
gdsgate contexts list
gdsgate contexts show
gdsgate status --refresh --explain
gdsgate resources list
For an existing user unit, use systemctl --user restart gdsgate-client.
Windows uses Start-Service/Restart-Service for registered server services
in the same phase order, then restarts the helper and user resident.
Unmanaged processes must also be replaced; reload or an already-running
up does not load the new executable.
6. Check configuration and native access¶
Configuration and catalog. Existing command spellings remain aliases.
Server operations use their installed role config; client and administrative
RPCs can use the selected cluster. --config makes the choice explicit.
Use contexts list to inspect history and discovered configs, and contexts show
to inspect the current selection. A catalog from another selected cluster can
appear not served even when the local Connector is healthy.
Existing clusters retain their shared publication policy and Connector assignments. Upgrade does not convert manual resources to automatic publication, activate an SSH epoch or grant new access. Existing manual IDs remain stable; changing to automatic publication is a separate operation with qualified IDs, names and collision checks. Existing SSH onward modes are retained; a row without a mode needs an explicit choice before enabling catalog-mode admission. See resource migration before changing assignments.
OIDC. Existing complete profiles keep their defaults. Issuer and client ID
must be set together; partial or conflicting profiles are refused. When adopting
the new scopes, resource, request parameters, device polling or claim mapping,
configure the public Authority profile and upgrade Proxy/client consumers before
distributing it. Existing Proxy and saved client configs are not rewritten merely
by replacing the executable or editing Authority config. Copy the complete public
profile into every existing Proxy, validate and restart affected server roles,
then update client OIDC settings from the same public profile,
or use the documented connect flow to refresh a saved configuration after
reviewing its output paths and replacement options.
See profile update procedure,
OIDC configuration and
connect.
Polling compatibility is opt-in: device.pending_errors matches an exact
invalid_grant description prefix. Omission retains normal terminal-error
handling. device.interval can only increase the provider polling interval;
device.expires_in can only shorten the provider lifetime. Extra parameters
must contain no credentials. Claims come from the verified identity token;
group mapping does not grant a cluster role by itself. Test a fresh login,
token refresh and the intended group policy.
Resident state and integrations. The new resident reads the old version-1 endpoint cache and writes version 2 with cluster binding. Keep the cache to preserve addresses. An older client cannot read a version-2 cache after downgrade. Check regenerated files before updating any manually copied integration.
In an already open Linux shell, load the generated environment again:
Alternatively pass --kubeconfig ~/.gdsgate/kube/<resource-id>.yaml. The
resident's Kubernetes listener is HTTP on its protected local endpoint; the
backend retains its configured transport. A missing context means the generated
kubeconfig was not loaded or that resource was not generated. A Forbidden
response needs both gdsgate policy and Kubernetes RBAC for the impersonated
identity checked. See generated files
and Kubernetes access.
In an already open Windows user shell, load the generated environment with
. "$HOME\.gdsgate\env.ps1" before checking the generated Kubernetes contexts.
Test SSH with both the generated resource name and its resident address. The native session notice appears on stderr and leaves command stdout usable. Check an allowed session, a denied session, audit verification and finalized central recording delivery. Include configured Proxy failover and projected Kubernetes-token refresh where those features are used. Only reopen traffic and resume normal rotation after these checks pass.
Recovery¶
If schema verification, membership, readiness, authorization or recording checks fail, leave access closed and investigate the named failure. Do not erase state, change schema metadata or repeat setup to bypass it.
After migrations or new Authority/client state have been written, reverting only the executable is insufficient. Stop the changed fleet, restore the matching pre-upgrade database and every affected node's protected state, restore configs, service definitions and old binaries, then verify readiness and audit integrity before reopening traffic. Include the old client cache if reverting a resident. For HA distribution credentials and roots, follow paired state recovery.
Order within a mixed fleet¶
For a fleet whose proxies predate v0.8.19, upgrade every proxy before any
authority that introduces the v0.8.23 admission contract. From v0.8.23 an authority refuses a
connector registration that does not state the kind of each resource it
declares, and a proxy older than v0.8.19 forwards no kinds. An authority
upgraded ahead of its proxies therefore refuses every connector reaching it
through one of them, and the proxy logs auth refused connector registration
with the reason registration carries no resource kinds. Upgrading the proxy
restores the registration; nothing on the authority side reopens it. The
reverse order is safe: a proxy that forwards kinds to an older authority is
answered as before.
Connectors before the authority, on a cluster with the SSH gate on¶
Only where gdsgate authority epochs activate has already been run for epoch 1 or
above; a cluster that has switched nothing on is unaffected in either order.
From the release that adds it, an authority admits an SSH resource to a
connector only against a one-time receipt the connector got from its own
activation-lease renewal. A connector older than that sends none, so an
authority upgraded ahead of its connectors withholds every SSH resource from
each one that has not been upgraded yet, answering gate_not_offered; the
connector logs this node declared a resource the cluster is not giving it.
Upgrading the connector restores it at its next registration, within a renewal
interval. Nothing is lost and nothing has to be reprovisioned, but SSH through
those connectors is refused in the meantime.
That is the fail-closed direction on purpose. The recorded capability alone cannot say which process is registering, and a connector rolled back to a binary from before the gate does not clear it, so admitting on the record would admit exactly what the gate exists to refuse.
An empty audit queue before an HA upgrade from v0.10.0-rc.6 or earlier¶
Upgrade only when gdsgate_audit_outbox_depth is 0 on every Authority, or
doctor reports audit queue with 0 rows waiting: a row the old build left
in the queue is held as unsigned after the upgrade.
To v0.10.0-rc.13¶
Against rc.10, this version changes distribution-root state and adds Kubernetes discovery-source configuration without adding store migrations. Complete the rc.10 procedure when upgrading from an earlier version. The operator needs administrative access to each Authority host and a recovery point containing the shared store and every node's protected local state.
- Verify the artifact signature and checksums using the preflight.
Preserve the shared store, keyrings, transport identity and each node's
distribution provider, cache and journal together. Preserve
receiver.keyonce it exists. Wrapped roots also require continued access to their KMS key. Keep these private files under their service owner's protected directory. - Upgrade all Authorities before starting any root preparation. Keep CA and keyring rotation paused during the rollout. Each Authority creates an independent receiver credential and binds it to its existing owner. Keep the configured owner and credential; do not copy another node's receiver.
- On each Authority host, check
doctor --json,/readyzand/healthz. Runauthority keys sync root statuswith that node's configuration. Confirm the current root epoch, matching material revision and absence of an unexpected preparation. A failed store, membership or leader-route check must give not-ready; restore that dependency before opening traffic. - Upgrade Proxies and Connectors in the maintenance window. Preserve the Connector-before-Authority order when upgrading an activated SSH cluster from versions older than rc.10. Check configured distinct Proxy connections, an allowed session, a denied session, audit verification and central recording delivery.
- For in-cluster Kubernetes, use the intended ServiceAccount projection and verify the next token refresh without a Pod restart. API backends need the configured impersonation permissions; discovery sources need only their read-only discovery permissions. Removing permission must refuse requests or withdraw discovery targets after their lease expires.
Root rotation is a separate operation: follow prepare, verify and activate. Every retained owner must provide a durable signed ACK. At least two owners must remain, so add a third Authority before withdrawing one from a two-node cluster. A retained owner can cancel a preparation after loss of the initiator; missing ACKs do not trigger timeout withdrawal. Wait for each retained node's new epoch and readiness before completing the change.
A binary downgrade alone cannot undo receiver bindings, pending transitions or
committed root epochs. Stop the changed fleet and use the paired recovery procedure
with the matching store and every node's local state. Do not restore only the
DB or replace a receiver credential. Before reverting a Connector that uses
discovery_sources, restore its compatible configuration as well; the older
binary cannot run that source. Root membership withdrawal does not revoke CA,
audit/control keys or separate DB/KMS credentials the removed node already held.
To v0.10.0-rc.10¶
Against rc.9, this version adds an Authority bootstrap RPC without adding store migrations. An upgrade from an earlier version must also complete the rc.9 migration procedure.
- Preserve a paired store and key backup, each node's transport identity, and the client configuration. With keyring sync enabled, also back up the distribution root and protected cache with the store.
- Upgrade the Authority and Proxy fleet in a maintenance window. Keep CA rotation paused until the replicas load the same keyring revision. Follow bootstrap and synchronization to enable automatic distribution; a binary upgrade alone does not enable it.
- Upgrade Connectors and verify their configured Proxy connections. Existing tunnels end when their owning process stops. Check a resource session and its recording before reopening ordinary traffic.
- Upgrade the client binary, stop the previous resident, and run
sudo gdsgate --config "$CLIENT_CONFIG" upon the Linux client host. Verify the system unit uses the original user's identity and thatgdsgate --config "$CLIENT_CONFIG" status --explainreports active endpoints. - For
direct, adjust native application ports to the new values in status: the default maps 22 to 10022. Setting the offset to0retains low ports and requires bind privilege. Verify the owning UID can connect and another unprivileged UID cannot. This isolation guarantee applies only to Linux.
A downgrade does not undo firewall or service changes. Stop the upgraded resident before restoring the earlier binary. Before reverting automatic keyring distribution, preserve the current rings and use the paired restore procedure in Authority recovery.
To v0.10.0-rc.9¶
This release adds store migrations m0078 and m0079. Take the paired store
and key backup. Restoring an earlier binary requires restoring that pair.
For an upgrade from rc.6 or earlier, also complete the audit queue and CA
rotation preflight in the rc.7 procedure.
- Withdraw client traffic and stop the older Proxies. Allow established sessions to finish within the maintenance window; remaining streams end when their owner stops.
- Pause CA rotation, stop all older Authorities, and upgrade the Authority fleet in one window. Apply migrations with the first upgraded Authority; start the remaining instances with the same store and keyrings.
- Configure each Authority with a unique lease owner and the full private peer address map. Verify every Authority is ready before resuming CA rotation. The TCP LB must admit ready followers as well as the leader.
- Upgrade all Proxies, preserve their separate identity volumes, and configure their private peer addresses. Check readiness before opening the HA pool.
- Upgrade Connectors. Set
connector.proxy_connection_count = 2for HA peer routing. A Connector configured for two connections can accept peer opens while one tunnel is available. The default1retains local-session compatibility behavior. Remove source-IP affinity from the tunnel LB pool.
Every role in the HA pool must run the same version. Use the HA configuration and ports for DNS or IP-only access. Keep peer listeners private; preserve the store, keyrings and each node's individual identity.
Verify Connector doctor reports the configured number of distinct Proxy
connections. Complete the HA checks, including
fresh access after stopping each Proxy and Authority, a policy denial, and
authority audit verify. Existing streams do not migrate between owners.
To v0.10.0-rc.7¶
This release adds store migrations m0075 through m0077. Take the paired
store and key backup, stop Authority writes, and apply the migrations as a
planned operation. Restore the pair to return to an earlier binary.
Before the first Authority stops, require an empty audit queue as described above. Let every CA rotation already requested finish. Pause scheduled and manual CA rotation for the upgrade window. Upgrade every Authority instance in the same window, then resume rotation after every instance reports ready. An older instance does not enforce this release's leader and wait guarantees for an in-progress rotation.
Upgrade the proxies in the same window as Authority. This release adds policy history and review RPCs and changes how a proxy selects the Authority leader after a write refusal. Upgrade connectors afterwards; their established sessions continue under the existing session rules.
After the fleet is current, run authority audit verify, confirm
gdsgate_audit_outbox_depth remains 0, and exercise one registration renewal
and one administrative policy read through a proxy.
To v0.10.0-rc.6¶
On Linux hosts running the shipped systemd units, each role now has a state
directory of its own under /var/lib/gdsgate. After installing the new binary,
run gdsgate service install <role> as root for every role on the host, then
restart the roles. The first run turns /var/lib/gdsgate from a link into a
directory and names the installed units that still use
StateDirectory=gdsgate. Reinstall each of them before starting it; a unit
left on the old line exits with status 238.
| Symptom | Cause | What to do |
|---|---|---|
service install refuses: ... is outside /var/lib/gdsgate |
The role writes outside the state root. | Move the path under /var/lib/gdsgate/<role> and update the configuration. |
service install refuses: ... is where every role's directory is |
The role writes directly in /var/lib/gdsgate. |
Use /var/lib/gdsgate/<role> for that path. |
| A unit exits with status 238 | The unit still has StateDirectory=gdsgate. |
gdsgate service install <role> for that role. |
A connector installed with install-connector.sh is installed again with
--state-dir under /var/lib/gdsgate/connector.
Scripts that run gdsgate setup apply as root pass --approve-plan <digest>
with the digest --dry-run printed.
Upgrade Authority and the proxies in the same window: authority users forget-name
is forwarded by the Proxy, and an older Proxy does not forward it.
To v0.9.0-rc.11¶
Before starting the new Authority, add onward_auth to every
[[discovery.auto_scopes]] entry whose kinds holds ssh, for example
onward_auth = ["certificate"] for targets reached with the certificate
gdsgate mints. Without it Authority refuses to start and names the scope. A
scope managed with authority scopes set is re-applied with --onward-auth.
Upgrade the proxies in the same window as Authority. A proxy older than
Authority drops the new fields from the administrative responses it relays, and
authority agents list then shows - under seen for every agent; read with
--route certificate until the proxies are upgraded.
A request to a web resource with a gdsgate-identity header is refused unless
the person named in the header is also allowed. Remove the header from scripts
that set it.
Upgrading from v0.6.x¶
Back up the store and paired key material, validate the current policy, run the migration check, and deploy the exact target. Verify audit continuity and connector reconnects before opening traffic. Keep a tested restore path for a forward-only schema migration.
Upgrading from v0.3.x¶
Review endpoint and enrollment changes before replacing a node. Re-enroll only when the existing identity cannot renew. Confirm transport-CA fingerprints and resource catalog declarations after the first start.
Upgrading from v0.2.x¶
Treat the upgrade as an identity and data migration. Preserve the store and
keys, validate the policy schema, and use the current command names from the
CLI reference. Do not copy old listener defaults into a current file without
checking [endpoints].
Upgrading from v0.1.x¶
Use an isolated restore rehearsal first. Verify the current binary version, store state, policy, audit chain, and readiness endpoint before connecting a production client.