From c85abb3b630bc7782585b2221880ae07e3d8bea4 Mon Sep 17 00:00:00 2001 From: Craig Date: Mon, 13 Jan 2020 11:28:14 +0000 Subject: [PATCH] some tweeks --- .docker/build.sh | 4 ++- .docker/{pulseaudio.pa => default.pa} | 7 +++-- .docker/entrypoint.sh | 5 ++-- .docker/policies.json | 40 +++++++++++++++++++++++++- .docker/supervisord.conf | 9 +++--- .docker/supervisord.dev.conf | 3 +- .docker/test.sh | 3 +- .github/.gitkeep | 0 .github/logo.png | Bin 0 -> 54572 bytes Dockerfile | 27 +++++++++++------ README.md | 28 ++++++++++++++++-- client/README.md | 1 + server/README.md | 1 + server/internal/webrtc/peer.go | 8 +++--- 14 files changed, 105 insertions(+), 31 deletions(-) mode change 100644 => 100755 .docker/build.sh rename .docker/{pulseaudio.pa => default.pa} (54%) mode change 100644 => 100755 .docker/entrypoint.sh delete mode 100644 .github/.gitkeep create mode 100644 .github/logo.png diff --git a/.docker/build.sh b/.docker/build.sh old mode 100644 new mode 100755 index 79a95f1..2de139c --- a/.docker/build.sh +++ b/.docker/build.sh @@ -7,4 +7,6 @@ cd ../client npm install && npm run build cd ../ -docker build -f Dockerfile -t neko . \ No newline at end of file +sudo docker build -f Dockerfile -t neko . + +# sudo docker run -p 8080:8080 --shm-size=2gb neko:latest \ No newline at end of file diff --git a/.docker/pulseaudio.pa b/.docker/default.pa similarity index 54% rename from .docker/pulseaudio.pa rename to .docker/default.pa index 62ba416..799bba5 100644 --- a/.docker/pulseaudio.pa +++ b/.docker/default.pa @@ -1,4 +1,7 @@ -unload-module module-suspend-on-idle +#!/usr/bin/pulseaudio -nF # Allow pulse audio to be accessed via TCP (from localhost only), to allow other users to access the virtual devices -load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket auth-anonymous=1 \ No newline at end of file +load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket auth-anonymous=1 + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink \ No newline at end of file diff --git a/.docker/entrypoint.sh b/.docker/entrypoint.sh old mode 100644 new mode 100755 index fbd9fdc..92d1361 --- a/.docker/entrypoint.sh +++ b/.docker/entrypoint.sh @@ -1,7 +1,6 @@ #!/bin/bash -echo "Starting dbus" -/etc/init.d/dbus start +sudo /etc/init.d/dbus start echo "Starting supervisord" -su -p -l $NEKO_USER -c '/usr/bin/supervisord -c /etc/neko/supervisord.conf' -s /bin/bash \ No newline at end of file +/usr/bin/supervisord -c /etc/neko/supervisord.conf \ No newline at end of file diff --git a/.docker/policies.json b/.docker/policies.json index 5cf126a..f60e52d 100644 --- a/.docker/policies.json +++ b/.docker/policies.json @@ -3,10 +3,40 @@ "DisableAppUpdate": true, "DisableTelemetry": true, "DontCheckDefaultBrowser": true, + "DisableFirefoxAccounts": true, + "DisablePrivateBrowsing": true, + "DisableProfileImport": true, "BlockAboutConfig": true, + "BlockAboutProfiles": true, + "BlockAboutSupport": true, "OverrideFirstRunPage": "", "OfferToSaveLogins": false, "PromptForDownloadLocation":false, + "DisableSetDesktopBackground":false, + "DisableDeveloperTools":false, + "DisableFeedbackCommands":false, + "DisableFirefoxScreenshots":false, + "DisableProfileRefresh":false, + "OfferToSaveLoginsDefault":false, + "PasswordManagerEnabled":false, + "SanitizeOnShutdown": { + "Cache": true, + "Cookies": true, + "Downloads": true, + "FormData": true, + "History": true, + "Sessions": true, + "SiteSettings": true, + "OfflineApps": true + }, + "FirefoxHome": { + "Search": true, + "TopSites": true, + "Highlights": false, + "Pocket": false, + "Snippets": false, + "Locked": false + }, "ExtensionSettings": { "uBlock0@raymondhill.net": { "installation_mode": "force_installed", @@ -20,6 +50,14 @@ "Homepage": { "Additional": [], "StartPage": "none" - } + }, + "Bookmarks": [ + { + "Title": "9 Anime", + "URL": "https://9anime.xyz/", + "Favicon": "https://9anime.xyz/favicon.png", + "Placement": "toolbar" + } + ] } } \ No newline at end of file diff --git a/.docker/supervisord.conf b/.docker/supervisord.conf index 2b38f39..875488a 100644 --- a/.docker/supervisord.conf +++ b/.docker/supervisord.conf @@ -1,18 +1,17 @@ [supervisord] environment=PULSE_SERVER="unix:/tmp/pulseaudio.socket",DISPLAY=":%(ENV_NEKO_DISPLAY)s" nodaemon=true -pidfile=/var/run/supervisord.pid logfile=/dev/null logfile_maxbytes=0 +loglevel=debug [program:xvfb] command=/usr/bin/Xvfb :%(ENV_NEKO_DISPLAY)s -screen 0 %(ENV_NEKO_WIDTH)sx%(ENV_NEKO_HEIGHT)sx24+32 -redirect_stderr=true autorestart=true priority=300 [program:pulseaudio] -command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1 --file=/etc/neko/pulseaudio.pa +command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1 autorestart=true priority=300 @@ -27,6 +26,6 @@ autorestart=true priority=400 [program:neko] -command=/usr/bin/neko serve -d --static "/var/www" +command=/usr/bin/neko serve --static "/var/www" autorestart=true -priority=500 \ No newline at end of file +priority=800 \ No newline at end of file diff --git a/.docker/supervisord.dev.conf b/.docker/supervisord.dev.conf index 9bf4927..ef0e19d 100644 --- a/.docker/supervisord.dev.conf +++ b/.docker/supervisord.dev.conf @@ -1,7 +1,6 @@ [supervisord] environment=PULSE_SERVER="unix:/tmp/pulseaudio.socket",DISPLAY=":%(ENV_NEKO_DISPLAY)s" nodaemon=true -pidfile=/var/run/supervisord.pid #logfile=/dev/null #logfile_maxbytes=0 loglevel=debug @@ -13,7 +12,7 @@ autorestart=true priority=300 [program:pulseaudio] -command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1 --file=/etc/neko/pulseaudio.pa +command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1 autorestart=true priority=300 diff --git a/.docker/test.sh b/.docker/test.sh index 41857d6..19ce65f 100755 --- a/.docker/test.sh +++ b/.docker/test.sh @@ -6,8 +6,9 @@ sudo mkdir -p /var/run/dbus /etc/neko sudo /etc/init.d/dbus start sudo cp supervisord.conf /etc/neko/supervisord.conf -sudo cp pulseaudio.pa /etc/neko/pulseaudio.pa sudo cp openbox.xml /etc/neko/openbox.xml + +sudo cp default.pa /etc/pulse/default.pa sudo cp policies.json /usr/lib/firefox-esr/distribution/policies.json if [ ! -f /usr/lib/firefox-esr/distribution/extensions/uBlock0@raymondhill.net.xpi ]; then diff --git a/.github/.gitkeep b/.github/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/.github/logo.png b/.github/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..46ffaba934e7206833550a1fba53b9043aeaa325 GIT binary patch literal 54572 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 literal 0 HcmV?d00001 diff --git a/Dockerfile b/Dockerfile index 007524f..43dcf8f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM buildpack-deps:stretch +FROM debian:stretch-slim ARG USERNAME=neko ARG USER_UID=1000 @@ -7,9 +7,9 @@ ARG USER_GID=$USER_UID # Avoid warnings by switching to noninteractive ENV DEBIAN_FRONTEND=noninteractive -# Install dependencies +# Install dependencies ttf-freefont RUN apt-get update \ - && apt-get -y install curl supervisor openbox dbus-x11 ttf-freefont xvfb pulseaudio consolekit firefox-esr \ + && apt-get -y install curl supervisor openbox dbus-x11 xvfb pulseaudio firefox-esr \ && apt-get -y install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-pulseaudio libxcb-xkb-dev libxkbcommon-x11-dev \ # # Create a non-root user @@ -19,18 +19,23 @@ RUN apt-get update \ && adduser $USERNAME video \ && adduser $USERNAME pulse \ # + # Add sudo support for the non-root user + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME \ + # # Install uBlock && mkdir -p /usr/lib/firefox-esr/distribution/extensions \ && curl -o /usr/lib/firefox-esr/distribution/extensions/uBlock0@raymondhill.net.xpi https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/addon-607454-latest.xpi \ # - # Make directories for neko - && mkdir -p /etc/neko /var/www \ - # # Setup Pulse Audio mkdir -p /home/$USERNAME/.config/pulse/ \ && echo "default-server=unix:/tmp/pulseaudio.socket" > /home/$USERNAME/.config/pulse/client.conf \ && chown -R $USERNAME:$USERNAME /home/$USERNAME \ # + # Make directories for neko + && mkdir -p /etc/neko /var/www \ + # # Clean up && apt-get autoremove -y \ && apt-get clean -y \ @@ -38,9 +43,9 @@ RUN apt-get update \ # # Copy configuation files -COPY .docker/pulseaudio.pa /etc/neko/pulseaudio.pa COPY .docker/openbox.xml /etc/neko/openbox.xml COPY .docker/supervisord.conf /etc/neko/supervisord.conf +COPY .docker/default.pa /etc/pulse/default.pa COPY .docker/policies.json /usr/lib/firefox-esr/distribution/policies.json # @@ -48,18 +53,22 @@ COPY .docker/policies.json /usr/lib/firefox-esr/distribution/policies.json COPY client/dist/ /var/www COPY server/bin/neko /usr/bin/neko +USER $USERNAME + # # Neko Env ENV NEKO_USER=$USERNAME ENV NEKO_DISPLAY=0 ENV NEKO_WIDTH=1280 ENV NEKO_HEIGHT=720 -ENV NEKO_URL=https://www.youtube.com/embed/QH2-TGUlwu4 ENV NEKO_PASSWORD=neko -ENV NEKO_BIND=0.0.0.0:80 +ENV NEKO_BIND=0.0.0.0:8080 ENV NEKO_KEY= ENV NEKO_CERT= +# Nayn +ENV NEKO_URL=https://www.youtube.com/embed/QH2-TGUlwu4 + # # Copy entrypoint COPY .docker/entrypoint.sh /entrypoint.sh diff --git a/README.md b/README.md index 9eabea0..bb9bf03 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +
+ +
+ # n.eko This is a proof of concept project I threw together over the last few days, its ugly its not perfect but it looks nice. This uses web rtc to stream a desktop inside of a docker container, I made this because [rabb.it](https://en.wikipedia.org/wiki/Rabb.it) went under and my internet can't handle streaming and discord keeps crashing. I just want to watch anime with my friends ლ(ಠ益ಠლ) so I started digging throughout the net and found a few *kinda* clones, but non of them had the virtual browser, then I found [Turtus](https://github.com/Khauri/Turtus) and I was able to figure out the rest. @@ -7,10 +11,28 @@ This is by no means a fully featured clone of rabbit. It has no concept of other I like cats, I'm a weeb and a nerd, I own the domain [n.eko.moe](https://n.eko.moe/) and I love that logo I came across, had to use it for something /shrug ### I need help setting this up! -Its a docker container, you need to have docker installed and then run - +Its a docker container, you need to have docker installed, you then need to build the image ``` -TODO: +cd .docker && ./build.sh +``` + +Then run the container: +``` +sudo docker run -p 8080:8080 --shm-size=2gb neko:latest +``` + +*Note:* `--shm-size=2gb` is required, firefox-esr tabs will crash (not sure if 2gb is *really* needed) + +### Config +``` +NEKO_USER=$USERNAME // User +NEKO_DISPLAY=0 // Display number +NEKO_WIDTH=1280 // Display width +NEKO_HEIGHT=720 // Display width +NEKO_PASSWORD=neko // Password +NEKO_BIND=0.0.0.0:8080 // Bind +NEKO_KEY= // Key (SSL) +NEKO_CERT= // Cert (SSL) ``` ### Development diff --git a/client/README.md b/client/README.md index e69de29..04b4fc2 100644 --- a/client/README.md +++ b/client/README.md @@ -0,0 +1 @@ +# n.eko Client diff --git a/server/README.md b/server/README.md index e69de29..d314c98 100644 --- a/server/README.md +++ b/server/README.md @@ -0,0 +1 @@ +# n.eko Server diff --git a/server/internal/webrtc/peer.go b/server/internal/webrtc/peer.go index b1172c6..d5e098a 100644 --- a/server/internal/webrtc/peer.go +++ b/server/internal/webrtc/peer.go @@ -152,16 +152,16 @@ func (manager *WebRTCManager) onData(session *session, msg webrtc.DataChannelMes if key, ok := keys.Mouse[int(payload.Key)]; ok { switch int(payload.Key) { case keys.MOUSE_WHEEL_DOWN: - robotgo.Scroll(0, -10) + robotgo.Scroll(0, -1) break case keys.MOUSE_WHEEL_UP: - robotgo.Scroll(0, 10) + robotgo.Scroll(0, 1) break case keys.MOUSE_WHEEL_LEFT: - robotgo.Scroll(-10, 0) + robotgo.Scroll(-1, 0) break case keys.MOUSE_WHEEL_RIGH: - robotgo.Scroll(10, 0) + robotgo.Scroll(1, 0) break default: robotgo.Click(key, false)