Operations

August 28, 2026 · View on GitHub

Node lifecycle

vosx space new team
vosx space up team \
  --service-pvm services/vos-service/vos-service.pvm \
  --production-trust-socket /run/vos/trust.sock
vosx space info team

Production roots also require a configured trust provider. Route publication happens only after the local service has caught up, validated its trust policy, and—when applicable—proved committed final Raft membership.

Built-in ingress

HTTP listeners are configured per node in <space-data>/local.toml. Issue and revoke their protocol-neutral credentials through the canonical authority:

vosx space access team issue --expires 24h
vosx space access team issue-ssh ~/.ssh/id_ed25519.pub --expires 30d
vosx space access team list
vosx space access team revoke <full-credential-id>

The authority binds each credential to a stable member. Owners can revoke a credential by its full ID; prefix lookup and listing require credential-management authority. Add --subject <hex> only when an administrator is adding a device for someone else. HTTP actor calls and SSH shell actions both pass the actor's signed method policy and the member's live capability decision. See HTTP ingress and the SSH space shell.

Each member may have 32 live credentials and may issue 256 credential identities over the lifetime of one authority installation. Revoked identities remain as bounded tombstones so an old bearer can never be activated again.

Backup and restore

Stop the local daemon before backup:

vosx space backup team /safe/team-backup
vosx space restore /safe/team-backup --data-dir /srv/vos/team

The backup is a self-contained directory with a signed-content manifest, service images, local databases, private side stores, node identity, and the required blob cache. Restore verifies every file before replacing anything.

A restored replicated node may be behind. This is expected: keep the same node identity and replication incarnation, reconnect it, and wait until its durable applied cursor reaches the current cluster commit before relying on local reads. Never restore one identity onto two live machines.

Raft membership

Add a prepared replica before promoting it. Remove a voter only through the replacement workflow; the retiring replica stays available until the final configuration and retirement acknowledgement are durable. Status is steady only when the active configuration index is committed and no joint membership remains.

Upgrades

An upgrade is a signed actor transition, not a catalog rewrite. Stage the full replacement package on every voter, propose the upgrade, wait for application, then update the catalog with compare-and-swap. Exact retries recover the already committed result.

Host state-machine changes use a separate identity in every new Raft application entry and applied snapshot. Before replacing binaries, pause ingress and transport acknowledgement and verify last_applied == commit_index on every voter. Replace the complete voter set, then resume traffic. A host with a different state-machine identity cannot apply a new-format entry: it rejects the entry before guest execution and leaves its applied cursor unchanged. This turns a mixed deployment into an explicit unavailable replica instead of two replicas silently committing different service images.

The role authority's replication incarnation is fixed when a space is created. Rebuilding or upgrading its signed package does not derive a new incarnation.

Platform identities are clean compatibility boundaries. This repository is not released yet, so the capability-role and SSH-shell cutover deliberately does not retain a decoder or conversion bridge for earlier development spaces. Recreate those spaces from packages and application exports.

Release artifacts

just package-production-release
cargo run -p vosx -- release verify target/production-release

Release verification rejects symlinks, special files, extra files, digest mismatches, and non-reproducible PVM output.