aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blog/rtmp-server-setup-2020-01-11.markdown122
1 files changed, 122 insertions, 0 deletions
diff --git a/blog/rtmp-server-setup-2020-01-11.markdown b/blog/rtmp-server-setup-2020-01-11.markdown
new file mode 100644
index 0000000..edd6cbb
--- /dev/null
+++ b/blog/rtmp-server-setup-2020-01-11.markdown
@@ -0,0 +1,122 @@
+---
+title: Live Streaming Server Setup
+date: 2020-01-11
+series: howto
+tags:
+ - rtmp
+ - live-streaming
+---
+
+# Live Streaming Server Setup
+
+I have set up my own [RTMP][rtmp] server that allows me to live stream to [my own
+infrastructure][streampage]. This allows me to own my own setup and not need to
+rely on other services such as Twitch or YouTube. As a side effect of doing
+this, I can enable people who use my streaming server to use picture-in-picture
+mode in iPadOS without having to hack the streaming app, among other things.
+
+This is part of my 2020 goal to reduce my dependencies on corporate social
+platforms as much as possible.
+
+[rtmp]: https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol
+[streampage]: https://home.cetacean.club/stream
+
+I chose to do my setup with a few key parts:
+
+- [docker-nginx-rtmp][docker-rtmp]
+- [hls.js][hlsjs]
+- [stream.html][streamhtml]
+- [Caddy][caddy]
+
+[docker-rtmp]: https://github.com/alfg/docker-nginx-rtmp
+[hlsjs]: https://hls-js.netlify.com/demo/
+[streamhtml]: https://gist.github.com/Xe/fadf1100a8152a3f328fc07522cf8176
+[caddy]: https://caddyserver.com
+
+## RTMP Server
+
+I chose to use [docker-nginx-rtmp][docker-rtmp] as a pre-packaged solution for
+my RTMP server. This means I could set it up to ingest via my [WireGuard
+VPN][sts-wireguard] with very little work. Here is the docker command I run on
+my VPN host:
+
+[sts-wireguard]: https://christine.website/blog/series/site-to-site-wireguard
+
+```console
+$ docker run \
+ --restart always \
+ -dit \
+ -p 10.77.0.1:1935:1935 \
+ -p 127.0.0.1:8080:80 \
+ --name rtmp-server \
+ alfg/nginx-rtmp
+```
+
+This starts my RTMP server in a container named `rtmp-server` and automatically
+restarts it when it goes down. The IP address in the first `--port` (`-p`) flag
+is the VPN IP address of my main VPN server. This makes me have to be behind my
+VPN in order to stream to my server, given the total lack of authentication
+that's involved in RTMP.
+
+## stream.html
+
+I have a custom stream page set up [on my server][streampage] that has a
+friendly little wrapper to the video player. [Here][streamhtml] is the source
+code for it. It's very short and easy to follow. I have these files at
+`/srv/http/home.cetacean.club` on my VPN server.
+
+This wraps [hls.js][hlsjs] so that users on every browser I care to support can
+watch the stream as it happens.
+
+## Caddy
+
+In order to expose the stream data to the world, I use [Caddy][caddy] as a
+reverse proxy. Here is the configuration that I use for Caddy:
+
+```
+home.cetacean.club {
+ # Set up automagic Let's Encrypt
+ tls me@christine.website
+
+ # Proxy the playlist, stream data
+ # and statistics to the rtmp server
+ proxy /hls http://127.0.0.1:8080
+ proxy /live http://127.0.0.1:8080
+ proxy /stat http://127.0.0.1:8080
+
+ # make /stream.html show up as /stream
+ ext .html
+
+ # serve data out of /srv/http/home.cetacan.club
+ # you can put your HTTP document root
+ # anywhere you want, but I like it being
+ # here.
+ root /srv/http/home.cetacean.club
+}
+```
+
+For more information on the Caddy configuration directives used here, see the
+following:
+
+- [tls](https://caddyserver.com/v1/docs/tls)
+- [proxy](https://caddyserver.com/v1/docs/proxy)
+- [ext](https://caddyserver.com/v1/docs/ext)
+- [root](https://caddyserver.com/v1/docs/root)
+
+## Caveats
+
+Live streaming like this uses _ABSURD_ amounts of bandwidth. Do not set this up
+on a server that has limited bandwidth. If you need a server that has unlimited
+bandwidth, check out [SoYouStart][sys]. It's what I use.
+
+[sys]: https://www.soyoustart.com/ca/en/
+
+There isn't a good story for recording or announcing streams to this server
+automatically. I don't consider this a problem, as links can always be sent out
+manually on social media platforms.
+
+I hope this little overview of my setup was informative. I'll be
+streaming [there][streampage] very irregularly, mostly as time permits/the
+spirit moves me. I plan to stream art, gaming and code.
+
+Thanks for reading, have a good day.