# Per-recipe harness config for rustdesk-server (hbbs/hbbr rendezvous+relay — NOT HTTP-native). # # RustDesk's server speaks its own protobuf protocol on host-published ports # (21115-21119 tcp + 21116 udp; 21118/21119 are its websocket listeners) — there is NO HTTP # API and no web UI, and the stock compose's traefik labels point at a port nothing serves # (vestigial). To fit cc-ci's HTTP-readiness model we deploy a cc-ci ENVIRONMENTAL overlay # (compose.ccci.yml, auto-provided by lifecycle.provide_ccci_overlay): # - a `status` sidecar (nginx) that serves EXACTLY ONE real artifact of the app — hbbs's # generated identity key — at /id_ed25519.pub on the app domain via Traefik. The health # gate then asserts the domain routes AND the app actually booted far enough to mint its # keypair (a canned page would prove nothing; the key file only exists because hbbs # created it). The private key and the sqlite peer DB in the same volume are NEVER # exposed (nginx serves only the exact .pub location; everything else 404s). # - host ports 21115-21119 need NO overlay: the stock compose already publishes them # mode:host, so on-host protocol tests reach hbbs/hbbr at 127.0.0.1 directly. # # Distinctive config markers (read back by the recipe-specific tests — the app's own # artifacts, not hard-coded upstream values): the identity key is asserted EQUAL across three # independent surfaces — the HTTPS status route, hbbs's own startup log line ("Key: …"), and # the volume file — proving our deploy actually produced the state we're reading. HEALTH_PATH = "/id_ed25519.pub" # real hbbs artifact served by the status sidecar HEALTH_OK = (200,) DEPLOY_TIMEOUT = 600 # both images are tiny (~6 MB) and nginx is pre-pulled on the node HTTP_TIMEOUT = 300 # key file appears seconds after hbbs starts; generous for a cold node # Environmental overlay for EVERY deploy (base install AND upgrade head): adds the status # sidecar + its Traefik router (priority beats the stock app's dead :80 router, which is left # untouched — no version-specific pins, no service add/drop beyond the CI-only sidecar). EXTRA_ENV = { "COMPOSE_FILE": "compose.yml:compose.ccci.yml", } # Extra readiness beyond the HTTP gate: the rendezvous server must be STABLY listening on its # core udp/tcp port 21116 (3 consecutive connects) before the harness proceeds — mirrors # mumble's voice-port probe. The remaining ports + the websocket + protocol surfaces are # asserted by the custom tier. def READY_PROBE(ctx): return [{"tcp_host": "127.0.0.1", "tcp_port": 21116, "stable": 3}] # canon §2.B: enroll as a DATA-WARM canonical (all recipes enrolled — operator 2026-06-17). # The weekly sweep promotes this recipe's canonical to its latest green RELEASE TAG. WARM_CANONICAL = True