diff --git a/hosts/server/natsu/default.nix b/hosts/server/natsu/default.nix index dd6dd4b..90ba444 100644 --- a/hosts/server/natsu/default.nix +++ b/hosts/server/natsu/default.nix @@ -12,7 +12,7 @@ nixpkgs.lib.nixosSystem { # ./services/attic.nix ./services/caddy.nix ./services/forgejo-runner.nix - ./services/rtmps.nix + ./services/stream.nix # ./services/harmonia.nix ./configuration.nix ./hardware-configuration.nix diff --git a/hosts/server/natsu/services/caddy.nix b/hosts/server/natsu/services/caddy.nix index 39a46f0..45bccff 100644 --- a/hosts/server/natsu/services/caddy.nix +++ b/hosts/server/natsu/services/caddy.nix @@ -1,5 +1,8 @@ { pkgs, ... }: +let + streamPlayer = pkgs.writeTextDir "index.html" (builtins.readFile ./stream.html); +in { services.caddy = { enable = true; @@ -92,8 +95,23 @@ reverse_proxy 127.0.0.1:4321 ''; - virtualHosts."rtmps.mizuki.guru".extraConfig = '' - respond 204 + virtualHosts."stream.mizuki.guru".extraConfig = '' + handle_path /hls/* { + root * /var/lib/nginx-rtmp/hls + header Cache-Control "no-store" + file_server + } + + handle /live/* { + root * ${streamPlayer} + rewrite * /index.html + file_server + } + + handle { + root * ${streamPlayer} + file_server + } ''; virtualHosts."netbird.mizuki.guru".extraConfig = '' diff --git a/hosts/server/natsu/services/stream.html b/hosts/server/natsu/services/stream.html new file mode 100644 index 0000000..b57a55b --- /dev/null +++ b/hosts/server/natsu/services/stream.html @@ -0,0 +1,85 @@ + + + + + + stream.mizuki.guru + + + +
+ +

+
+ + + + + diff --git a/hosts/server/natsu/services/rtmps.nix b/hosts/server/natsu/services/stream.nix similarity index 70% rename from hosts/server/natsu/services/rtmps.nix rename to hosts/server/natsu/services/stream.nix index 6e1e5da..7e8dc6f 100644 --- a/hosts/server/natsu/services/rtmps.nix +++ b/hosts/server/natsu/services/stream.nix @@ -1,7 +1,8 @@ { pkgs, ... }: let - domain = "rtmps.mizuki.guru"; + domain = "stream.mizuki.guru"; + hlsDir = "/var/lib/nginx-rtmp/hls"; caddyCertDir = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/${domain}"; in { @@ -20,14 +21,25 @@ in application live { live on; record off; + + hls on; + hls_path ${hlsDir}; + hls_fragment 2s; + hls_playlist_length 10s; + hls_cleanup on; } } } ''; }; - systemd.services.rtmps-stunnel = { - description = "RTMPS TLS terminator for nginx-rtmp"; + systemd.tmpfiles.rules = [ + "d /var/lib/nginx-rtmp 0755 nginx nginx - -" + "d ${hlsDir} 0755 nginx nginx - -" + ]; + + systemd.services.stream-stunnel = { + description = "RTMPS TLS terminator for stream.mizuki.guru"; after = [ "network-online.target" "caddy.service" @@ -41,11 +53,11 @@ in Type = "simple"; User = "caddy"; Group = "caddy"; - ExecStart = "${pkgs.stunnel}/bin/stunnel ${pkgs.writeText "rtmps-stunnel.conf" '' + ExecStart = "${pkgs.stunnel}/bin/stunnel ${pkgs.writeText "stream-stunnel.conf" '' foreground = yes pid = - [rtmps] + [stream] accept = 0.0.0.0:1935 connect = 127.0.0.1:19350 cert = ${caddyCertDir}/${domain}.crt