From af43bbc9161a2f593468f8520a7b1ba8a6178e22 Mon Sep 17 00:00:00 2001 From: Micha Albert Date: Mon, 5 Aug 2024 14:02:41 -0400 Subject: [PATCH] Start dockerizing OBS --- docker-compose.yml | 18 +++++++++++++++++ obs/Dockerfile | 35 ++++++++++++++++++++++++++++++++++ obs/requirements.txt | 1 + obs/setup-obs.py | 14 ++++++++++++++ obs/start.sh | 9 +++++++++ requirements.txt | 3 ++- tiling-frontend/.dockerignore | 15 +++++++++++++++ tiling-frontend/Dockerfile | 16 ++++++++++++++++ tiling-frontend/bun.lockb | Bin 104718 -> 132740 bytes tiling-frontend/package.json | 5 ++++- 10 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 docker-compose.yml create mode 100644 obs/Dockerfile create mode 100644 obs/requirements.txt create mode 100644 obs/setup-obs.py create mode 100755 obs/start.sh create mode 100644 tiling-frontend/.dockerignore create mode 100644 tiling-frontend/Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..baad3ea --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '2' + +services: + web-frontend: + build: + # build from Dockerfile + context: ./tiling-frontend + dockerfile: Dockerfile + volumes: + - tiling_frontend_build:/usr/src/app/dist + obs: + build: + context: ./obs + dockerfile: Dockerfile + volumes: + - tiling_frontend_build:/home/obs/html +volumes: + tiling_frontend_build: diff --git a/obs/Dockerfile b/obs/Dockerfile new file mode 100644 index 0000000..8bd3fea --- /dev/null +++ b/obs/Dockerfile @@ -0,0 +1,35 @@ +FROM docker.io/ubuntu:noble + +ENV OBSWS_PASSWORD="" + +RUN apt update && \ +apt install software-properties-common -y && \ +add-apt-repository ppa:obsproject/obs-studio -y && \ +apt update && \ +apt install ffmpeg obs-studio -y + +RUN apt install python3-pip python3-venv xvfb -y + +RUN useradd -ms /bin/bash obs + +USER obs + +RUN mkdir -p /home/obs/.config/obs-studio/basic/profiles/Untitled + +RUN echo -e "\n[OBSWebSocket]\nFirstLoad=false\nServerEnabled=true\nServerPort=4455\nAlertsEnabled=false\nAuthRequired=true\nServerPassword=${OBSWS_PASSWORD}\n" >> /home/obs/.config/obs-studio/global.ini + +RUN echo '{"type":"rtmp_common","settings":{"service":"YouTube - RTMPS","protocol":"RTMPS","server":"rtmps://a.rtmps.youtube.com:443/live2","bwtest":false,"key":"${YT_STREAM_KEY}","stream_key_link":"https://www.youtube.com/live_dashboard","multitrack_video_name":"Multitrack Video","multitrack_video_disclaimer":"Multitrack Video automatically optimizes your settings to encode and send multiple video qualities to YouTube - RTMPS. Selecting this option will send YouTube - RTMPS information about your computer and software setup."}}' > /home/obs/.config/obs-studio/basic/profiles/Untitled/service.json + +COPY requirements.txt /home/obs + +RUN python3 -m venv /home/obs/.venv + +RUN /home/obs/.venv/bin/pip install -r /home/obs/requirements.txt + +COPY start.sh /home/obs + +COPY setup-obs.py /home/obs + +RUN echo $OBSWS_PASSWORD + +ENTRYPOINT /home/obs/start.sh diff --git a/obs/requirements.txt b/obs/requirements.txt new file mode 100644 index 0000000..70cf20c --- /dev/null +++ b/obs/requirements.txt @@ -0,0 +1 @@ +obsws-python diff --git a/obs/setup-obs.py b/obs/setup-obs.py new file mode 100644 index 0000000..09381c2 --- /dev/null +++ b/obs/setup-obs.py @@ -0,0 +1,14 @@ +import obsws_python as obs +import os + +# pass conn info if not in config.toml +client = obs.ReqClient(host='localhost', port=4455, password=os.environ["OBSWS_PASSWORD"]) + +scene = client.get_scene_list().scenes[0]['sceneName'] + +inputs = client.get_scene_item_list(name=scene).scene_items + +print(client.get_input_default_settings("browser_source").default_input_settings) + +if inputs == []: + client.create_input(sceneName=scene, inputName="Browser", inputKind="browser_source", inputSettings={'css': 'body { margin: 0px auto; overflow: hidden; }', 'fps': 30, 'fps_custom': True, 'height': 1080, 'is_local_file': True, 'local_file': '/home/micha/index.html', 'reroute_audio': True, 'restart_when_active': False, 'shutdown': False, 'webpage_control_level': 0, 'width': 1920}, sceneItemEnabled=True) diff --git a/obs/start.sh b/obs/start.sh new file mode 100755 index 0000000..0128d74 --- /dev/null +++ b/obs/start.sh @@ -0,0 +1,9 @@ +#!/usr/bin/bash + +export DISPLAY=:99 +Xvfb $DISPLAY & +obs & +sleep 1 +source /home/obs/.venv/bin/activate +python3 /home/obs/setup-obs.py + diff --git a/requirements.txt b/requirements.txt index b5a1063..0f1543e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,5 @@ requests python-dotenv prisma fastapi-utils -httpx \ No newline at end of file +httpx +obsws-python diff --git a/tiling-frontend/.dockerignore b/tiling-frontend/.dockerignore new file mode 100644 index 0000000..f965aed --- /dev/null +++ b/tiling-frontend/.dockerignore @@ -0,0 +1,15 @@ +node_modules +Dockerfile* +docker-compose* +.dockerignore +.git +.gitignore +README.md +LICENSE +.vscode +Makefile +helm-charts +.env +.editorconfig +.idea +coverage* diff --git a/tiling-frontend/Dockerfile b/tiling-frontend/Dockerfile new file mode 100644 index 0000000..969c7b6 --- /dev/null +++ b/tiling-frontend/Dockerfile @@ -0,0 +1,16 @@ +FROM docker.io/oven/bun:slim AS base +WORKDIR /usr/src/app + +FROM base AS install +RUN mkdir -p /temp/dev +COPY package.json bun.lockb /temp/dev/ +RUN cd /temp/dev && bun install + +RUN mkdir -p /temp/prod +COPY package.json bun.lockb /temp/prod/ +RUN cd /temp/prod && bun install --production + +FROM base AS release +COPY --from=install /temp/dev/node_modules node_modules +COPY . . +RUN bun --bun run build diff --git a/tiling-frontend/bun.lockb b/tiling-frontend/bun.lockb index ac9ea20925231ff24fecce59b7419adf4bbe9919..b65cb8fb6566c8eeb6c7273aff2f9ffdf42963ae 100755 GIT binary patch delta 31638 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 diff --git a/tiling-frontend/package.json b/tiling-frontend/package.json index be14666..fe3c93c 100644 --- a/tiling-frontend/package.json +++ b/tiling-frontend/package.json @@ -25,5 +25,8 @@ "hls.js": "^1.5.13", "unocss": "^0.61.3", "vite-plugin-singlefile": "^2.0.2" - } + }, + "trustedDependencies": [ + "svelte-preprocess" + ] }