summaryrefslogtreecommitdiffstats
path: root/lass
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2020-12-27 16:45:17 +0100
committertv <tv@krebsco.de>2020-12-27 16:45:17 +0100
commit642795daec7b100d94776be4ca5cda1d7d0edb43 (patch)
tree50e2a44db72fe172a95ff5eda09c89c16b119521 /lass
parentf78ceaffa2c35cf6b665ed827018ad080cf51aa9 (diff)
parent99abffb51885b356899c17ce9ad3782cb80cb6bc (diff)
Merge remote-tracking branch 'prism/master'
Diffstat (limited to 'lass')
-rw-r--r--lass/1systems/prism/config.nix1
-rw-r--r--lass/2configs/tv.nix160
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"; }
+ ];
+}