Files
OwnCord/docs/port-forwarding.md
T
J3vb c3a8aa477c fix: resolve 20 code review bugs across Rust, TypeScript, and Go
Critical/High Rust (Tauri client):
- BUG-140: replace .run() with .build() + RunEvent::Exit handler; native error dialog on startup failure
- BUG-141: eliminate PTT thread TOCTOU race with Mutex critical section; add AtomicBool shutdown and catch_unwind
- BUG-144: fix TOFU cert store corruption — read-before-write rollback restores previous fingerprint on save failure (all 3 write sites)
- BUG-145: add VK code range guard (1..=254) in is_key_down; fix cast to (state as i16) < 0
- BUG-147: replace bare spawns with JoinSet; abort_all + drain on exit; unconditional closed event
- BUG-150: add CRLF guard in handle_connection before header rewriting
- BUG-151: wrap header read loop in tokio::time::timeout(10s)
- BUG-158: extract CERTS_STORE/SETTINGS_STORE to constants.rs (eliminate 3 duplicates)
- HIGH-2: PTT thread self-cleanup uses unwrap_or_else defensive pattern
- HIGH-4: ws_send distinguishes Full vs Closed errors; warn log on backpressure

Critical/High TypeScript (Tauri client):
- BUG-142: join-generation counter prevents stale connectAndSetup completions
- BUG-143: replace 8 mutable LiveKit session fields with discriminated union SessionState
- BUG-146: 60s token refresh deadline; cleared on reply or voice leave
- BUG-148: ResizeObserver hoisted to outer scope; disconnect() in destroy() before ac.abort()
- BUG-152: dismissSignal.aborted guard already present (no change needed)
- BUG-153: measureRendered split into two-pass read-then-write; eliminates per-message reflow
- BUG-154: WS dedup cache batch-evicts to 80% on overflow (amortised O(1))
- BUG-157: pendingUpdates replaced with coalesced function-composition slot (O(1) queue depth)

Go server:
- BUG-149: safe two-value type assertion in getOutboundIP with localhost fallback
- BUG-155: broadcast buffer 256→1024; broadcastDrops atomic counter exposed in /api/v1/metrics
- BUG-156: LiveKitHealthCheck and implementations accept ctx context.Context; all call sites pass r.Context() (12 files)
- BUG-159: MaxMessageBytes constant in config/constants.go; replaces 1<<20 literals in serve.go and updater.go
- HIGH-1: cert store rollback reads old value before write; restores previous cert on save failure

All validation passes: go build, go vet, cargo check, npm typecheck
2026-04-03 23:18:06 +02:00

1.4 KiB

Port Forwarding Guide

How to make your OwnCord server reachable from outside your LAN.

Before You Start

If you want a simpler remote-access path, use Tailscale and skip manual forwarding.

Required Ports

Always required

Port Protocol Purpose
8443 TCP OwnCord HTTPS + WebSocket

Required only for voice/video

Port Protocol Purpose
7880 TCP LiveKit signaling
7881 TCP LiveKit TCP fallback
50000-60000 UDP LiveKit media

Router Steps

  1. Open your router admin page (often 192.168.1.1 or 192.168.0.1).
  2. Find the port forwarding section (sometimes called NAT, virtual server, or firewall rules).
  3. Set static/reserved LAN IP for your server machine.
  4. Add forwarding rule for 8443/TCP to that LAN IP.
  5. If using voice/video, add 7880/TCP, 7881/TCP, and 50000-60000/UDP.
  6. Save and apply rules.

Connect Address to Share

Share https://<your-public-ip>:8443 (or your DNS name) with users.

Troubleshooting Checklist

  • Confirm the server is listening on 8443.
  • Confirm router rules point to the correct LAN IP.
  • Confirm OS firewall allows forwarded ports.
  • Confirm ISP is not blocking inbound ports.
  • Test from a different network (mobile hotspot), not from the same LAN.

Dynamic Public IP

If your public IP changes, use dynamic DNS so users connect with a stable hostname.