diff options
author | lassulus <lassulus@lassul.us> | 2020-12-27 14:56:25 +0100 |
---|---|---|
committer | lassulus <lassulus@lassul.us> | 2020-12-27 14:56:25 +0100 |
commit | 99abffb51885b356899c17ce9ad3782cb80cb6bc (patch) | |
tree | 5eae081ab117438c0873ceab3a254324b7650d6f /lass | |
parent | 2cbed4cab9bf40fa6d712375b740bfcd41503470 (diff) |
l prism.r: add tv.nix
Diffstat (limited to 'lass')
-rw-r--r-- | lass/1systems/prism/config.nix | 1 | ||||
-rw-r--r-- | lass/2configs/tv.nix | 160 |
2 files changed, 161 insertions, 0 deletions
diff --git a/lass/1systems/prism/config.nix b/lass/1systems/prism/config.nix index 1206f1655..1b63246c6 100644 --- a/lass/1systems/prism/config.nix +++ b/lass/1systems/prism/config.nix @@ -6,6 +6,7 @@ with import <stockholm/lib>; <stockholm/lass> <stockholm/lass/2configs/retiolum.nix> <stockholm/lass/2configs/libvirt.nix> + <stockholm/lass/2configs/tv.nix> { services.nginx.enable = true; imports = [ diff --git a/lass/2configs/tv.nix b/lass/2configs/tv.nix new file mode 100644 index 000000000..8e208d5e5 --- /dev/null +++ b/lass/2configs/tv.nix @@ -0,0 +1,160 @@ +{ config, pkgs, ... }: with import <stockholm/lib>; let + +nginxCfg = pkgs.writeText "nginx.conf" '' + daemon off; + pid /var/lib/rtmp/nginx.pid; + events { + use epoll; + worker_connections 128; + } + error_log stderr info; + http { + client_body_temp_path /var/lib/rtmp/nginx_cache_client_body; + proxy_temp_path /var/lib/rtmp/nginx_cache_proxy; + fastcgi_temp_path /var/lib/rtmp/nginx_cache_fastcgi; + uwsgi_temp_path /var/lib/rtmp/nginx_cache_uwsgi; + scgi_temp_path /var/lib/rtmp/nginx_cache_scgi; + + server { + listen 8080; + root /var/lib/rtmp; + access_log stderr; + error_log stderr; + + # This URL provides RTMP statistics in XML + location /stat { + rtmp_stat all; + } + + location /hls { + # Serve HLS fragments + types { + application/vnd.apple.mpegurl m3u8; + video/mp2t ts; + } + root /tmp; + add_header Cache-Control no-cache; + + # CORS setup + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Expose-Headers' 'Content-Length'; + + # Allow CORS preflight requests + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + } + + location /dash { + # Serve DASH fragments + types { + application/dash+xml mpd; + video/mp4 mp4; + } + root /tmp; + add_header Cache-Control no-cache; + + # CORS setup + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Expose-Headers' 'Content-Length'; + + # Allow CORS preflight requests + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + } + + location "/dash.all.min.js" { + default_type "text/javascript"; + alias ${pkgs.fetchurl { + url = "http://cdn.dashjs.org/v3.2.0/dash.all.min.js"; + sha256 = "16f0b40gdqsnwqi01s5sz9f1q86dwzscgc3m701jd1sczygi481c"; + }}; + } + + location /player { + default_type "text/html"; + alias ${pkgs.writeText "player.html" '' + <!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="utf-8"> + <title>lassulus livestream</title> + </head> + <body> + <div> + <video id="player" controls></video> + </video> + </div> + <script src="/dash.all.min.js"></script> + <script> + (function(){ + var url = "http://lassul.us:8080/dash/nixos.mpd"; + var player = dashjs.MediaPlayer().create(); + player.initialize(document.querySelector("#player"), url, true); + })(); + </script> + </body> + </html> + ''}; + } + } + } + + rtmp { + server { + access_log stderr; + listen 1935; + ping 30s; + notify_method get; + + application stream { + live on; + + hls on; + hls_path /tmp/hls; + + dash on; + dash_path /tmp/dash; + } + } + } +''; + +in { + users.users.rtmp = { + home = "/var/lib/rmtp"; + uid = genid_uint31 "rtmp"; + isNormalUser = true; + createHome = true; + }; + + systemd.services.nginx-rtmp = { + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + restartIfChanged = true; + script = '' + ${pkgs.nginx.override { + modules = [ + pkgs.nginxModules.rtmp + ]; + }}/bin/nginx -c ${nginxCfg} -p /var/lib/rtmp + ''; + serviceConfig = { + User = "rtmp"; + }; + }; + + krebs.iptables.tables.filter.INPUT.rules = [ + { predicate = "-p tcp --dport 1935"; target = "ACCEPT"; } + { predicate = "-p tcp --dport 8080"; target = "ACCEPT"; } + ]; +} |