Compare commits

...

2 commits

Author SHA1 Message Date
heather
720ab819fc heather: route MatrixRTC auth and signalling through Caddy 2026-11-05 20:02:25 +00:00
heather
ea620058f8 heather: update Tuwunel 1.9.4 and enable MatrixRTC calling 2026-11-05 20:01:24 +00:00
3 changed files with 56 additions and 1 deletions

View file

@ -122,6 +122,7 @@ in
# Custom network for jitsi (FQDN-based comms, prosody alias xmpp.meet.jitsi)
networks.meet-jitsi.driver = "bridge";
networks.matrix-rtc.driver = "bridge";
services = {
# === Forgejo (git.iscg.dev) ===
# Первый сервис, proof-of-concept для цепочки arion→docker→Caddy.
@ -153,7 +154,7 @@ in
# /var/lib/tuwunel-secrets/tuwunel.toml (root:docker 0640, bind-mount ro)
# Cinny config: /var/lib/tuwunel-secrets/cinny-config.json (bind-mount ro).
tuwunel = {
service.image = "ghcr.io/matrix-construct/tuwunel:v1.9.3";
service.image = "ghcr.io/matrix-construct/tuwunel:v1.9.4";
service.container_name = "tuwunel";
service.restart = "unless-stopped";
service.volumes = [
@ -166,6 +167,51 @@ in
TUWUNEL_CONFIG = "/etc/tuwunel/tuwunel.toml";
};
};
# MatrixRTC: SFU and OpenID authorization. Secrets never enter the Nix store.
matrix-livekit = {
service.image = "livekit/livekit-server:v1.13.11";
service.container_name = "matrix-livekit";
out.service.mem_limit = "1g";
service.restart = "unless-stopped";
service.user = "65532:65532";
service.capabilities.ALL = false;
out.service.security_opt = [ "no-new-privileges:true" ];
out.service.read_only = true;
out.service.pids_limit = 256;
service.networks = [ "matrix-rtc" ];
service.command = "--config /run/secrets/livekit.yaml";
service.volumes = [
"/var/lib/matrix-rtc-secrets/livekit.yaml:/run/secrets/livekit.yaml:ro"
"/var/lib/matrix-rtc-secrets/turn-secret:/run/secrets/turn-secret:ro"
];
service.ports = [ "127.0.0.1:7880:7880" "7881:7881/tcp" "7882:7882/udp" ];
};
matrix-rtc-jwt = {
service.image = "ghcr.io/element-hq/lk-jwt-service:0.9.0";
service.container_name = "matrix-rtc-jwt";
# Avoid public-IP hairpin NAT for same-host OpenID and SFU calls; TLS stays verified.
out.service.extra_hosts = [ "iscg.dev:host-gateway" ];
out.service.mem_limit = "256m";
service.restart = "unless-stopped";
service.user = "65532:65532";
service.capabilities.ALL = false;
out.service.security_opt = [ "no-new-privileges:true" ];
out.service.read_only = true;
out.service.pids_limit = 256;
service.networks = [ "matrix-rtc" ];
service.ports = [ "127.0.0.1:8081:8080" ];
service.volumes = [
"/var/lib/matrix-rtc-secrets/api-key:/run/secrets/api-key:ro"
"/var/lib/matrix-rtc-secrets/api-secret:/run/secrets/api-secret:ro"
];
service.environment = {
LIVEKIT_URL = "wss://iscg.dev/livekit/sfu";
LIVEKIT_KEY_FROM_FILE = "/run/secrets/api-key";
LIVEKIT_SECRET_FROM_FILE = "/run/secrets/api-secret";
LIVEKIT_FULL_ACCESS_HOMESERVERS = "iscg.dev";
LIVEKIT_JWT_BIND = ":8080";
};
};
cinny = {
service.image = "ajbura/cinny:latest";
service.container_name = "cinny";

View file

@ -58,6 +58,13 @@ Allow: /" 200
# Matrix tuwunel (homeserver)
"iscg.dev".extraConfig = ''
# MatrixRTC signalling and auth share the existing TLS hostname.
handle_path /livekit/jwt/* {
reverse_proxy 127.0.0.1:8081
}
handle_path /livekit/sfu/* {
reverse_proxy 127.0.0.1:7880
}
# Static file sharing (https://iscg.dev/files/<name>).
# handle_path stripает /files/ prefix → file_server ищет в root.
# Не конфликтует с matrix (использует /_matrix/*, /.well-known/matrix).

View file

@ -96,11 +96,13 @@
22000 # syncthing sync
22067 # strelaysrv (relay)
22070 # strelaysrv (status)
7881 # MatrixRTC LiveKit ICE/TCP
3478 # coturn TURN (tcp+udp)
];
firewall.allowedUDPPorts = [
22000 # syncthing sync (QUIC)
10000 # jitsi jvb (RTP media)
7882 # MatrixRTC LiveKit ICE/UDP mux
3478 # coturn TURN
];
# coturn RTP relay range