Skip to content

Upgrade iroh to 1.0.2 across app, iroh-gateway, and infra #168

Description

@drewr

Summary

iroh reached its first stable 1.0 release. The original target here was the v1.0.0-rc.0 candidate (May 11 2026); that and the later RCs are now obsolete — stable 1.0.0 shipped 2026-06-15 and 1.0.2 is the current latest (2026-07-06). This upgrade now targets stable 1.0.2 directly and skips all release candidates.

Three repos need work:

Repo What changes
datum-cloud/iroh-gateway Rust crate bump + API migration + Dockerfile MSRV bump
datum-cloud/app Rust workspace crate bumps + API migration
datum-cloud/infra n0computer/iroh-relay Docker image v0.97.0v1.0.2

Note: datum-cloud/network-services-operator has no Rust iroh code — iroh resources are managed via Kubernetes manifests in datum-cloud/infra. This issue tracks the overall upgrade; child issues are filed in each affected repo.


Status (2026-07-08)

  • Target retargeted v1.0.0-rc.0 → stable 1.0.2 across all three repos.
  • Step 0 pre-flight complete — every companion crate has a published release compatible with iroh 1.0.x (see checked boxes below). The iroh-proxy-utils / iroh-services blocking risk is cleared; the scaffolded [patch] escape hatch is no longer needed.
  • iroh-services version skew resolved upstream — both app and iroh-gateway converge on 1.0.0 (no more 0.12 vs 0.13 split).
  • iroh-gateway (Step 1): merged (feat: upgrade iroh to 1.0.2 iroh-gateway#13) and released v0.1.0 (2026-07-08). ghcr image publish + FluxCD image-updater rollout in flight.
  • app (Step 2): merged (feat: upgrade iroh to 1.0.2 app#165) and released v0.1.0; the macOS desktop bundle notarized successfully (an earlier Apple legal-agreement 403 that had blocked bundles since 2026-07-02, unrelated to this upgrade, has since been resolved).
  • infra (Step 3): merged (datum-cloud/infra#3212). Staging iroh-relay verified live on v1.0.2 (1/1 ready, restartCount 0). Edge rollout pending (Talos fleet, out of infra-MCP reach).

Dependency Map: Current → Target

Crate / Image Used In Current Target (latest verified)
iroh app, iroh-gateway 0.97.0 1.0.2
iroh-base app, iroh-gateway 0.97.0 1.0.2
iroh-relay (Rust crate) app, iroh-gateway 0.97.0 1.0.2
iroh-metrics app, iroh-gateway 0.38.3 1.0.1
iroh-blobs app/lib 0.99.0 0.103.0
iroh-proxy-utils app, iroh-gateway 0.1.0 0.3.0
iroh-services app (0.12), iroh-gateway (0.13) 0.12/0.13 1.0.0 (unified)
iroh-n0des app/n0des-local 0.10 0.10.0
irpc-iroh app/n0des-local 0.13 0.17.0
n0computer/iroh-relay (Docker) infra v0.97.0 v1.0.2 ✅ image published
Rust base image iroh-gateway Dockerfile rust:1.89-bookworm rust:1.91-bookworm (MSRV bump)

MSRV for iroh 1.0.2 is Rust 1.91 (unchanged from the RC target).


Breaking API Changes (iroh 0.97 → 1.0.x)

Old API New API Files likely affected
PathWatcher Connection::paths() (snapshot) + Connection::path_events()PathEventStream app/lib/src/node.rs
Connection::to_info()ConnectionInfo Connection::weak_handle() app/lib/src/node.rs
Incoming::local_ip Incoming::local_addr (returns IncomingLocalAddr) iroh-gateway/src/endpoint.rs
Source type removed node.rs, endpoint.rs
CertConfig::Reloading AcmeConfig builder endpoint.rs, node.rs (relay config)
iroh_relay::dns::* modules now private iroh-gateway/src/endpoint.rs
Exhaustive enum/struct patterns many types now #[non_exhaustive] — add _ => arms all pattern-match sites

The breaking-change surface above was compiled against rc.0; re-verify against the stable 1.0.2 changelog before/while doing the Rust work, as APIs may have shifted further between the RC and stable.


Implementation Sequence

Step 0 — Pre-flight (blocking check before any edits)

Companion crates all have published releases compatible with iroh 1.0.x (verified on crates.io 2026-07-08):

  • iroh-proxy-utils → 0.3.0 published

  • iroh-services → 1.0.0 published (supersedes the 0.12/0.13 split)

  • iroh-metrics → 1.0.1 published

  • iroh-n0des (0.10.0), irpc-iroh (0.17.0) published

  • relay.toml config format unchanged for iroh-relay:v1.0.x — current config uses manual TLS cert paths (cert_mode = "Manual"), and enable_relay / [tls] / [metrics] keys are all still valid.

Step 1 — datum-cloud/iroh-gateway (do first — simpler, unblocks infra rollout)

  • Bump Cargo.toml: iroh/iroh-base/iroh-relay → 1.0, iroh-metrics 1.0, iroh-proxy-utils 0.3, iroh-services 1.0, n0-error 1.0
  • Update Dockerfile: rust:1.89-bookwormrust:1.91-bookworm
  • Fix source breakages (compile-driven):
    • src/endpoint.rs: iroh_relay::dns::*iroh::dns, Endpoint::empty_builder()builder(presets::Empty)
    • gateway.rs/diagnostics.rs AnyError/context() errors resolved by the n0-error 1.0 bump (version skew, no source edit); SecretKey::generate() arg dropped, unused rand removed
  • cargo build && cargo clippy && cargo test clean
  • Cut a tagged release (v0.1.0, 2026-07-08) → publish-docker.yml publishes the ghcr image → FluxCD auto-rolls iroh-gateway

Tracked in: datum-cloud/iroh-gateway#11PR datum-cloud/iroh-gateway#13 open

Step 2 — datum-cloud/app

  • Bump workspace Cargo.toml: iroh/iroh-base/iroh-relay/iroh-tickets → 1.0, iroh-metrics 1.0, iroh-proxy-utils 0.3, iroh-services 1.0, n0-error 1.0
  • app/lib/Cargo.toml: iroh-blobs → 0.103.0 (also removed the obsolete pkcs8 = "=0.11.0-rc.11" pin)
  • app/n0des-local/Cargo.toml: irpc/irpc-iroh → 0.17
  • Fix source breakages:
    • flagged PathWatcher / conn.to_info() sites not present in current codebase
    • iroh_relay::dnsiroh::dns, Endpoint::empty_builder()builder(presets::Empty) (node.rs)
    • iroh-services net_diagnostics/client_host features removed (now unconditional) — dropped features list
    • iroh_tickets::Ticket: to_bytes/from_bytesencode_bytes/decode_bytes, deserializedecode_string (state.rs)
    • SecretKey::generate() arg dropped (repo.rs, n0des-local)
  • cargo check --workspace clean, cargo test --workspace 34 passed, cargo clippy clean
  • Align iroh-services version between app and iroh-gateway — upstream unified on 1.0.0, so both target the same version

Tracked in: datum-cloud/app#161PR datum-cloud/app#165 open

Step 3 — datum-cloud/infra

  • apps/network-services-operator/downstream/base/iroh-relay/deployment.yaml: v0.97.0v1.0.2merged in datum-cloud/infra#3212 (also adds the relay image to Renovate)
  • Review relay.toml ConfigMap for any format changes — unchanged, manual-TLS keys valid on v1.0.x
  • iroh-gateway image updates are handled automatically by FluxCD ImageUpdateAutomation once Step 1 releases

Tracked in: datum-cloud/infra#2563

Step 4 — Verification

  • CI green in all three repos (gateway build/clippy/test, app 34 tests, infra kustomize)
  • iroh-relay pod starts cleanly with new image — staging datum-downstream-gateway/iroh-relay on v1.0.2, 1/1 ready, restartCount 0, new ReplicaSet progressed 2026-07-08T13:45
  • iroh-gateway DaemonSet rolls out on edge — verified on us-central-1-alice after cutting infra v0.67.9 (the gateway image-updater commit missed the v0.67.8 tag; edge Flux tracks semver >=0.0.0, so it needed a new tag). DS on v0.1.0, 2/2, restartCount 0; endpoint 47fed51bfd bound, live QUIC-over-relay, no errors.
  • End-to-end tunnel connectivity — promoted to a proper Chainsaw integration test (tunnel stands up + flows traffic), tracked in Chainsaw integration test: tunnel stands up and flows traffic #240
  • Prometheus scrape on port 9090 — iroh-relay :9090/metrics scraped directly on edge (relayserver_* series present, got_ping/sent_pong incrementing). iroh-gateway exposes :9090 (--metrics-port 9090) and is scraped by its PodMonitor; direct ad-hoc curl is correctly blocked by the namespace NetworkPolicy.

Post-upgrade finding (edge log volume): the v0.1.0 gateway emits TRACE-level QUIC packet logs. RUST_LOG=iroh=debug,iroh_proxy_utils=debug,datum_connect=debug no longer muzzles the QUIC stack because iroh 1.0 replaced quinn with its own fork crate noq/noq_proto, which the iroh= directive doesn't match. Recommend adding noq=warn,noq_proto=warn (or =info) to RUST_LOG in the downstream base/edge overlay. Tracked separately — does not block the upgrade.


Risks

Risk Mitigation Status
iroh-proxy-utils not yet updated Local [patch] override or wait for release ✅ Cleared — 0.3.0 published
relay.toml format changed Test staging first; keep v0.97.0 manifest on a branch as rollback ✅ Cleared — format unchanged
#[non_exhaustive] compile failures in match blocks cargo check first; fix exhaustive patterns systematically Open
MSRV bump breaks CI Pin GitHub Actions Rust toolchain to ≥1.91 Open
Version skew: iroh-services 0.12 (app) vs 0.13 (iroh-gateway) Align to same version during this upgrade ✅ Cleared — upstream unified on 1.0.0
Breaking-change list compiled against rc.0, not stable Re-verify API surface against 1.0.2 changelog during Rust work Open

Metadata

Metadata

Assignees

Labels

dependenciesPull requests that update a dependency file

Type

No type

Fields

Priority

None yet

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions