Ga naar inhoud

Verbinden met een externe server

Elke client is een renderer bovenop een cc_server die de gegevens bezit. De desktop kan er zelf een draaien; de webapp op app.usectrl.dev kan dat niet, omdat een browsertab geen server kan hosten. Hoe dan ook wijst deze gids een client naar een server die ergens anders draait — een kleine machine, een cloud-VM, een buildserver.

  • Een draaiende cc_server. Heb je er geen, zie Een headless server draaien.
  • Ofwel de drie koppelingswaarden die de server heeft aangemaakt — de server-URL (ws://…/rpc of wss://…/rpc), een apparaat-id en een koppelingssleutel — ofwel een eenmalige uitnodigingscode van een werkruimtebeheerder. Als je een uitnodiging inwisselt, wordt je gebruiker ingericht, je lidmaatschap vastgelegd en de referentie van deze client voor je aangemaakt, zodat je nooit zelf een apparaat-id of sleutel hoeft te verwerken.

Een lokale server heeft niets nodig: ws://localhost:9030/rpc werkt zowel vanaf de desktop als vanuit de browser, omdat browsers loopback als een vertrouwde origin beschouwen.

Een server op een andere machine is anders. app.usectrl.dev wordt via HTTPS geserveerd, dus de browser opent alleen een wss://-socket met een certificaat dat hij al vertrouwt — en cc_server weigert sowieso een niet-loopbackadres te binden zonder TLS. Geef hem een van de volgende:

  • een certificaat rechtstreeks, met --tls-cert en --tls-key
  • een TLS-beëindigende reverse proxy ervoor, met de server gestart met --insecure (plaintext achter de proxy, alleen op een vertrouwd netwerk)
  • een tunnel of VPN die het certificaat levert — Tailscale, cloudflared of vergelijkbaar. Instellingen → Server → Verbinding en status heeft de ingebouwde tunneloptie onder Deze server delen.

Twee instellingen aan de serverkant zijn makkelijk te missen. Stel achter een proxy, NAT of tunnel --public-url in op het adres dat clients daadwerkelijk moeten aanspreken — standaard wordt het lokale bindadres gebruikt, dus zonder deze instelling proberen clients de verkeerde host. En als je je eigen kopie van de webbuild host, voeg dan de origin daarvan toe aan --allowed-origins, dat standaard alleen https://app.usectrl.dev toestaat; loopback en native clients zijn altijd toegestaan.

Bij een nieuwe installatie:

  1. Start Control Center. Het eerste scherm vraagt Hoe moet Control Center draaien?
  2. Vul in plaats van In deze app uitvoeren de verbindingsvelden in: de server-URL, plus een uitnodigingscode of een apparaat-id en koppelingssleutel.
  3. Klik op Verbinden. Control Center maakt verbinding met de server en komt uit in het postvak van de werkruimte.

Op een desktop die al zijn eigen server draait:

  1. Open Instellingen → Server → Verbinding en status.
  2. Klik op Server toevoegen. Voer de server-URL in (wss://host:9030/rpc) en een uitnodigingscode of een apparaat-id en koppelingssleutel. Met de knop aan het einde van het URL-veld worden cc_server-instanties op je LAN of tailnet ontdekt.
  3. Klik op Verbinden en daarna op Wisselen in de rij van de nieuwe server.

Wisselen gebeurt live: de app wordt ter plaatse rond de nieuwe sessie opnieuw opgebouwd, zonder herstart. Als het verbinden mislukt, blijf je op de huidige server en zie je de fout. De rij van de server waarop je zit heeft geen Wisselen-actie; de lokale server is de eerste rij, met het label In deze app uitvoeren.

Zodra je gewisseld bent, bezit de desktop geen database meer. Elk scherm leest en schrijft via de externe server over een WebSocket.

De webbuild is altijd extern.

  1. Open app.usectrl.dev, of je eigen kopie van de webbuild.
  2. Voer de server-URL in plus een uitnodigingscode of een apparaat-id en koppelingssleutel.
  3. De client maakt verbinding met de server en rendert dezelfde interface als de desktop.

Als er een koppelingsdeeplink in de URL staat, zijn de velden al ingevuld. De koppelingssleutel reist mee in het fragment van de URL, dat browsers nooit naar de server sturen die de pagina host, zodat de statische host hem nooit te zien krijgt.

De webclient leest en schrijft naar dezelfde server als de desktop, maar een paar onderdelen hebben een native venster of de apparaten van de machine zelf nodig:

  • geen toastmeldingen van het OS, geen meldingsgeluiden en geen ambient bannerrail (het meldingencentrum in de app werkt nog wel)
  • geen LAN- of tailnet-serverdetectie in het dialoogvenster Server toevoegen
  • geen lezer voor artikelen in de app — nieuwsfeedartikelen openen in een nieuw tabblad
  • geen vergadersamenvatting opnieuw uitvoeren en een nog verwerkende samenvatting niet annuleren

Twee dingen gedragen zich anders in plaats van dat ze ontbreken. Het opnemen van vergaderingen werkt in de browser, waarbij je microfoon plus een schermopname met een audiotrack worden vastgelegd. Openen in IDE werkt ook, maar vraagt de server de editor op het scherm van de server te starten, dus tegen een headless host zonder editors verbergt de knop zichzelf.

  • Verbinding krijgt een time-out: de server moet vanaf de client bereikbaar zijn. Controleer de bind (--bind any), of de poort open is en of --public-url het adres noemt dat de client daadwerkelijk kan aanspreken. Over het open internet is TLS verplicht — een plaintext niet-loopbackbind wordt bij het opstarten geweigerd, tenzij de server achter een proxy met --insecure is gestart.
  • De browser weigert te verbinden maar een native client werkt: de origin van de browser staat niet in de --allowed-origins-lijst van de server. De standaardwaarde staat alleen https://app.usectrl.dev toe (plus loopback).
  • Koppelingssleutel geweigerd: voer cc_server pair opnieuw uit op de server om de sleutel van dat apparaat te roteren en voer daarna de nieuwe in. Een ingetrokken apparaat merkt dat zijn referentie verdwenen is en faalt gesloten; intrekking verbreekt een live-sessie binnen enkele seconden.
  • Verkeerde werkruimte: de werkruimte maakt deel uit van de URL (/workspaces/:workspaceId/…) en reist mee met elke aanroep, dus van werkruimte wisselen in de ene client verandert alleen je eigen weergave. Je kunt alleen werkruimtes bereiken waarvan je lid bent — al het andere wordt geweigerd met “Not a member of this workspace”. Zie Werkruimtes en isolatie.