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