From 99abffb51885b356899c17ce9ad3782cb80cb6bc Mon Sep 17 00:00:00 2001 From: lassulus Date: Sun, 27 Dec 2020 14:56:25 +0100 Subject: l prism.r: add tv.nix --- lass/2configs/tv.nix | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 lass/2configs/tv.nix (limited to 'lass/2configs') diff --git a/lass/2configs/tv.nix b/lass/2configs/tv.nix new file mode 100644 index 00000000..8e208d5e --- /dev/null +++ b/lass/2configs/tv.nix @@ -0,0 +1,160 @@ +{ config, pkgs, ... }: with import ; 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" '' + + + + + lassulus livestream + + +
+ + +
+ + + + + ''}; + } + } + } + + 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"; } + ]; +} -- cgit v1.2.3