diff --git a/.m1k1o/.env.default b/.m1k1o/.env.default new file mode 100644 index 00000000..b15828d9 --- /dev/null +++ b/.m1k1o/.env.default @@ -0,0 +1,18 @@ +# +# you can copy this file to .env.local, if you don't want to have it pushed to repository +# + +# this is how will be your images called. you can change it to your fork. +# only need to do this once. here. +BUILD_IMAGE="m1k1o/neko" + +# this is where your services will be acessible +CLIENT_PORT=8080 +SERVER_PORT=8081 + +# on which image you want to test it +SERVER_TAG="chromium" + +# this is needed for WebRTC. specify your local IP address and free UDP port range. +SERVER_EPR=55000-55009 +SERVER_IP=10.8.0.1 diff --git a/.m1k1o/README.md b/.m1k1o/README.md new file mode 100644 index 00000000..f99db0a3 --- /dev/null +++ b/.m1k1o/README.md @@ -0,0 +1,39 @@ +# How to contribute to neko + +If you want to contribute, but don't want to install anything on your host system, we got you covered. You only need docker. Technically, it could be donw using vs code development in container, but this is more fun:). + +You need to copy `.env.development` to `.env` and customize values. + +## Step 1: Building server + +- `./build` - You can use this command to build your specified `SERVER_TAG` along with base image. + +If you want, you can build other tags. `base` tag needs to be build first: + +- `./build base` +- `./build firefox` +- `./build chromium` +- etc... + +## Step 2: Starting server + +- `./start-server` - Starting server image you specified in `.env`. +- `./start-server -r` - Shortcut for rebuilding server binary and then starting. + +If you are changing something in the server code, you don't want to rebuild container each time. You can just rebuild your binary: + +- `./rebuild-server` - Rebuild only server binary. +- `./rebuild-server -f` - Force to rebuild whole golang environment (you should do this only of you change some dependencies). + +## Step 3: Seving client + +- `./serve-client` - Serving vue.js client. +- `./serve-client -i` - Install all depenencies. + +## Debug + +You can navigate to `CLIENT_PORT` and see live client there. It will be connected to your local server on `SERVER_PORT`. + +If you are leaving client as is and not changing it, you don't need to start `./serve-client` and you can access server's GUI directly on `SERVER_PORT`. + +Feel free to open new PR. diff --git a/.m1k1o/arm-base/Dockerfile b/.m1k1o/arm-base/Dockerfile new file mode 100644 index 00000000..db861687 --- /dev/null +++ b/.m1k1o/arm-base/Dockerfile @@ -0,0 +1,136 @@ +# +# STAGE 1: SERVER +# +FROM arm32v7/golang:1.16-buster as server +WORKDIR /src + +# +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends git cmake make python2 libx11-dev libxrandr-dev libxtst-dev \ + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-omx; \ + # + # install libclipboard + set -eux; \ + cd /tmp; \ + git clone https://github.com/jtanx/libclipboard; \ + cd libclipboard; \ + cmake .; \ + make -j4; \ + make install; \ + rm -rf /tmp/libclipboard; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# build server +COPY server/ . +RUN go get -v -t -d . && go build -o bin/neko cmd/neko/main.go + +# +# STAGE 2: CLIENT +# +FROM node:14-buster-slim as client + +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends python2 build-essential + +WORKDIR /src + +# +# install dependencies +COPY client/package*.json ./ +RUN npm install + +# +# build client +COPY client/ . +RUN npm run build + +# +# STAGE 3: RUNTIME +# +FROM balenalib/raspberry-pi-debian:latest + +# +# avoid warnings by switching to noninteractive +ENV DEBIAN_FRONTEND=noninteractive + +# +# set custom user +ARG USERNAME=neko +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends wget ca-certificates supervisor; \ + apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \ + apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx5; \ + # + # gst + apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ + gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-omx; \ + # + # create a non-root user + groupadd --gid $USER_GID $USERNAME; \ + useradd --uid $USER_UID --gid $USERNAME --shell /bin/bash --create-home $USERNAME; \ + adduser $USERNAME audio; \ + adduser $USERNAME video; \ + adduser $USERNAME pulse; \ + # + # setup pulseaudio + mkdir -p /home/$USERNAME/.config/pulse/; \ + echo "default-server=unix:/tmp/pulseaudio.socket" > /home/$USERNAME/.config/pulse/client.conf; \ + # + # workaround for an X11 problem: http://blog.tigerteufel.de/?p=476 + mkdir /tmp/.X11-unix; \ + chmod 1777 /tmp/.X11-unix; \ + chown $USERNAME /tmp/.X11-unix/; \ + # + # make directories for neko + mkdir -p /etc/neko /var/www /var/log/neko; \ + chmod 1777 /var/log/neko; \ + chown $USERNAME /var/log/neko/; \ + chown -R $USERNAME:$USERNAME /home/$USERNAME; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy config files +COPY .m1k1o/base/dbus /usr/bin/dbus +COPY .m1k1o/base/default.pa /etc/pulse/default.pa +COPY .m1k1o/base/supervisord.conf /etc/neko/supervisord.conf +COPY .m1k1o/base/xorg.conf /etc/neko/xorg.conf + +# +# set default envs +ENV USER=$USERNAME +ENV DISPLAY=:99.0 +ENV NEKO_PASSWORD=neko +ENV NEKO_PASSWORD_ADMIN=admin +ENV NEKO_BIND=:8080 + +# +# custom arm values -> video pipeline with GPU encoding +ENV NEKO_H264=1 +ENV NEKO_VIDEO='ximagesrc display-name=%s use-damage=0 show-pointer=true use-damage=false ! video/x-raw,framerate=30/1 ! videoconvert ! queue ! video/x-raw,framerate=30/1,format=NV12 ! v4l2h264enc extra-controls="controls,h264_profile=0,video_bitrate=1250000;" ! h264parse config-interval=3 ! video/x-h264,profile=baseline,stream-format=byte-stream' + +# +# copy static files from previous stages +COPY --from=server /src/bin/neko /usr/bin/neko +COPY --from=client /src/dist/ /var/www + +HEALTHCHECK --interval=10s --timeout=5s --retries=8 \ + CMD wget -O - http://localhost:${NEKO_BIND#*:}/health || exit 1 + +# +# run neko +CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"] + diff --git a/.m1k1o/build b/.m1k1o/build index 221b81b7..70f1a00b 100755 --- a/.m1k1o/build +++ b/.m1k1o/build @@ -2,7 +2,24 @@ cd "$(dirname "$0")" BASE="${PWD}/../" -IMAGE="m1k1o/neko" + +if [ -f ".env.default" ] +then + export $(cat .env.default | sed 's/#.*//g' | xargs) +fi + +if [ -f ".env" ] +then + export $(cat .env | sed 's/#.*//g' | xargs) +fi + +if [ -z "${1}" ] && [ ! -z "${SERVER_TAG}" ] +then + ./build base + ./build ${SERVER_TAG} + exit 0 +fi + build_client() { docker build -t neko-dev-client -f base/Dockerfile --target client "${BASE}" @@ -20,17 +37,35 @@ build_server() { neko-dev-server sh -c "rm -rf /tmp/bin/neko; cp /src/bin/neko /tmp/bin" } -build_base() { - docker build -t "${IMAGE}:base" -f base/Dockerfile "${BASE}" +build() { + if [ "$1" = "base" ] + then + # build base + docker build -t "${BUILD_IMAGE}:base" -f base/Dockerfile "${BASE}" + else + # buld image + docker build -t "${BUILD_IMAGE}:$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:base" -f "$1/Dockerfile" "$1/" + fi } -build() { - docker build -t "${IMAGE}:$1" -f "$1/Dockerfile" "$1/" +build_arm() { + if [ "$1" = "base" ] + then + # build ARM base + docker build -t "${BUILD_IMAGE}:arm-base" -f arm-base/Dockerfile "${BASE}" + else + # buld ARM image + docker build -t "${BUILD_IMAGE}:arm-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:arm-base" -f "$1/Dockerfile" "$1/" + fi } case $1 in client) build_client;; server) build_server;; - base) build_base;; + + # build arm- images + arm-*) build_arm "${1#arm-}";; + + # build images *) build "$1";; esac diff --git a/.m1k1o/chromium/Dockerfile b/.m1k1o/chromium/Dockerfile index f207cf64..a6e7d62b 100644 --- a/.m1k1o/chromium/Dockerfile +++ b/.m1k1o/chromium/Dockerfile @@ -1,19 +1,10 @@ -FROM m1k1o/neko:base - -ARG SRC_URL="https://github.com/macchrome/linchrome/releases/download/v89.0.4389.90-r843830-portable-ungoogled-Lin64/ungoogled-chromium_89.0.4389.90_1.vaapi_linux.tar.xz" +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE # -# install custom chromium build from woolyss with support for hevc/x265 +# install neko chromium RUN set -eux; apt-get update; \ - apt-get install -y --no-install-recommends wget unzip libatk1.0-0 libatk-bridge2.0-0 libatomic1 \ - libcups2 libgtk-3-0 libnss3 libpci3 libxcomposite1 libxss1 openbox xz-utils; \ - wget -O - /tmp/chromium.tar.xz "${SRC_URL}" | tar -xJf- -C /tmp; \ - mv /tmp/ungoogled-chromium_* /usr/lib/chromium; \ - # - # make required changes for sandbox mode - mv /usr/lib/chromium/chrome_sandbox /usr/lib/chromium/chrome-sandbox; \ - chown root:root /usr/lib/chromium/chrome-sandbox; \ - chmod 4755 /usr/lib/chromium/chrome-sandbox; \ + apt-get install -y --no-install-recommends unzip chromium openbox; \ # # install widevine module WIDEVINE_VERSION=$(wget --quiet -O - https://dl.google.com/widevine-cdm/versions.txt | tail -n 1); \ @@ -23,17 +14,13 @@ RUN set -eux; apt-get update; \ rm /tmp/widevine.zip; \ # # clean up - apt-get --purge autoremove -y xz-utils; \ + apt-get --purge autoremove -y unzip; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/chromium.conf -COPY preferences.json /usr/lib/chromium/master_preferences +COPY --chown=neko preferences.json /home/neko/.config/chromium/Default/Preferences COPY policies.json /etc/chromium/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml - -# -# copy extensions and policy files -COPY extensions /usr/share/chromium/extensions diff --git a/.m1k1o/chromium/openbox.xml b/.m1k1o/chromium/openbox.xml index 577510c8..fd1f8941 100644 --- a/.m1k1o/chromium/openbox.xml +++ b/.m1k1o/chromium/openbox.xml @@ -13,7 +13,7 @@ - + no true yes diff --git a/.m1k1o/chromium/policies.json b/.m1k1o/chromium/policies.json index 5c4362cd..786c2b15 100644 --- a/.m1k1o/chromium/policies.json +++ b/.m1k1o/chromium/policies.json @@ -24,6 +24,10 @@ "file://*", "chrome://policy" ], + "ExtensionInstallForcelist": [ + "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", + "fjoaledfpmneenckfbpdfhkmimnjocfa;https://clients2.google.com/service/update2/crx" + ], "ExtensionInstallWhitelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "fjoaledfpmneenckfbpdfhkmimnjocfa" diff --git a/.m1k1o/chromium/supervisord.conf b/.m1k1o/chromium/supervisord.conf index 0ccd6b8d..a9720173 100644 --- a/.m1k1o/chromium/supervisord.conf +++ b/.m1k1o/chromium/supervisord.conf @@ -1,6 +1,6 @@ [program:chromium] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" -command=/usr/lib/chromium/chrome-wrapper --window-position=0,0 --display=%(ENV_DISPLAY)s --start-maximized --bwsi --test-type --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage +command=/usr/bin/chromium --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/chromium --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage autorestart=true priority=800 user=%(ENV_USER)s diff --git a/.m1k1o/firefox/Dockerfile b/.m1k1o/firefox/Dockerfile index e7a34010..0f4d7b01 100644 --- a/.m1k1o/firefox/Dockerfile +++ b/.m1k1o/firefox/Dockerfile @@ -1,4 +1,5 @@ -FROM m1k1o/neko:base +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE # # install firefox-esr diff --git a/.m1k1o/rebuild-server b/.m1k1o/rebuild-server new file mode 100755 index 00000000..a46e15a9 --- /dev/null +++ b/.m1k1o/rebuild-server @@ -0,0 +1,21 @@ +#!/bin/bash + +if [ -f ".env.default" ] +then + export $(cat .env.default | sed 's/#.*//g' | xargs) +fi + +if [ -f ".env" ] +then + export $(cat .env | sed 's/#.*//g' | xargs) +fi + +# use -f to force rebuild +if [ "$(docker images -q neko_dev_server 2> /dev/null)" == "" ] || [ "$1" == "-f" ]; then + docker build -t neko_dev_server -f base/Dockerfile --target server ../ +fi + +docker run --rm -it \ + -v "${PWD}/../server:/src" \ + --entrypoint="go" \ + neko_dev_server build -o "bin/neko" -i "cmd/neko/main.go" diff --git a/.m1k1o/serve-client b/.m1k1o/serve-client new file mode 100755 index 00000000..48053f17 --- /dev/null +++ b/.m1k1o/serve-client @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ -f ".env.default" ] +then + export $(cat .env.default | sed 's/#.*//g' | xargs) +fi + +if [ -f ".env" ] +then + export $(cat .env | sed 's/#.*//g' | xargs) +fi + +# use -i to install +if [ ! -d "${PWD}/../client/node_modules" ] || [ "$1" == "-i" ]; then + docker run --rm -it \ + -v "${PWD}/../client:/app" \ + --workdir="/app" \ + --entrypoint="npm" \ + node:14-buster-slim install +fi + +docker run --rm -it \ + -p "${CLIENT_PORT}:8080" \ + -v "${PWD}/../client:/app" \ + -e "VUE_APP_SERVER_PORT=${SERVER_PORT}" \ + --workdir="/app" \ + --entrypoint="npm" \ + node:14-buster-slim run serve + \ No newline at end of file diff --git a/.m1k1o/start-server b/.m1k1o/start-server new file mode 100755 index 00000000..7613dc8f --- /dev/null +++ b/.m1k1o/start-server @@ -0,0 +1,32 @@ +#!/bin/bash + +if [ -f ".env.default" ] +then + export $(cat .env.default | sed 's/#.*//g' | xargs) +fi + +if [ -f ".env" ] +then + export $(cat .env | sed 's/#.*//g' | xargs) +fi + +BINARY_PATH="${PWD}/../server/bin/neko" + +# use -r to rebuild +if [ ! -f "${BINARY_PATH}" ] || [ "$1" == "-r" ]; then + ./rebuild-server +fi + +docker run --rm -it \ + --name "neko_dev" \ + -p "${SERVER_PORT}:8080" \ + -p "${SERVER_EPR}:${SERVER_EPR}/udp" \ + -e "NEKO_SCREEN=1920x1080@60" \ + -e "NEKO_EPR=${SERVER_EPR}" \ + -e "NEKO_NAT1TO1=${SERVER_IP}" \ + -e "NEKO_ICELITE=true" \ + -e "NEKO_MAX_FPS=25" \ + -v "${BINARY_PATH}:/usr/bin/neko" \ + --shm-size=2G \ + --cap-add SYS_ADMIN \ + ${BUILD_IMAGE}:${SERVER_TAG} diff --git a/.m1k1o/ungoogled-chromium/Dockerfile b/.m1k1o/ungoogled-chromium/Dockerfile new file mode 100644 index 00000000..0b6141be --- /dev/null +++ b/.m1k1o/ungoogled-chromium/Dockerfile @@ -0,0 +1,40 @@ +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE + +ARG SRC_URL="https://github.com/macchrome/linchrome/releases/download/v89.0.4389.90-r843830-portable-ungoogled-Lin64/ungoogled-chromium_89.0.4389.90_1.vaapi_linux.tar.xz" + +# +# install custom chromium build from woolyss with support for hevc/x265 +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends wget unzip libatk1.0-0 libatk-bridge2.0-0 libatomic1 \ + libcups2 libgtk-3-0 libnss3 libpci3 libxcomposite1 libxss1 openbox xz-utils; \ + wget -O - /tmp/chromium.tar.xz "${SRC_URL}" | tar -xJf- -C /tmp; \ + mv /tmp/ungoogled-chromium_* /usr/lib/chromium; \ + # + # make required changes for sandbox mode + mv /usr/lib/chromium/chrome_sandbox /usr/lib/chromium/chrome-sandbox; \ + chown root:root /usr/lib/chromium/chrome-sandbox; \ + chmod 4755 /usr/lib/chromium/chrome-sandbox; \ + # + # install widevine module + WIDEVINE_VERSION=$(wget --quiet -O - https://dl.google.com/widevine-cdm/versions.txt | tail -n 1); \ + wget -O /tmp/widevine.zip "https://dl.google.com/widevine-cdm/$WIDEVINE_VERSION-linux-x64.zip"; \ + unzip -p /tmp/widevine.zip libwidevinecdm.so > /usr/lib/chromium/libwidevinecdm.so; \ + chmod 644 /usr/lib/chromium/libwidevinecdm.so; \ + rm /tmp/widevine.zip; \ + # + # clean up + apt-get --purge autoremove -y xz-utils; \ + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy configuation files +COPY supervisord.conf /etc/neko/supervisord/ungoogled-chromium.conf +COPY preferences.json /usr/lib/chromium/master_preferences +COPY policies.json /etc/chromium/policies/managed/policies.json +COPY openbox.xml /etc/neko/openbox.xml + +# +# copy extensions and policy files +COPY extensions /usr/share/chromium/extensions diff --git a/.m1k1o/chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.crx b/.m1k1o/ungoogled-chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.crx similarity index 100% rename from .m1k1o/chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.crx rename to .m1k1o/ungoogled-chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.crx diff --git a/.m1k1o/chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.json b/.m1k1o/ungoogled-chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.json similarity index 100% rename from .m1k1o/chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.json rename to .m1k1o/ungoogled-chromium/extensions/cjpalhdlnbpafiamejdnhcphjbkeiagm.json diff --git a/.m1k1o/chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.crx b/.m1k1o/ungoogled-chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.crx similarity index 100% rename from .m1k1o/chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.crx rename to .m1k1o/ungoogled-chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.crx diff --git a/.m1k1o/chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.json b/.m1k1o/ungoogled-chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.json similarity index 100% rename from .m1k1o/chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.json rename to .m1k1o/ungoogled-chromium/extensions/fjoaledfpmneenckfbpdfhkmimnjocfa.json diff --git a/.m1k1o/ungoogled-chromium/openbox.xml b/.m1k1o/ungoogled-chromium/openbox.xml new file mode 100644 index 00000000..577510c8 --- /dev/null +++ b/.m1k1o/ungoogled-chromium/openbox.xml @@ -0,0 +1,763 @@ + + + + + + + + 10 + 20 + + + + + + no + true + yes + normal + + + + + yes + + no + + yes + + no + + 200 + + no + + + + + Smart + +
yes
+ + Primary + + 1 + +
+ + + Clearlooks + NLIMC + + yes + yes + + sans + 8 + + bold + + normal + + + + sans + 8 + + bold + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + bold + + normal + + + + sans + 9 + + bold + + normal + + + + + + + 1 + 1 + + + + 875 + + + + + yes + Nonpixel + + Center + + + + + 10 + + 10 + + + + + + + 0 + 0 + 0 + 0 + + + + TopLeft + + 0 + 0 + no + Above + + Vertical + + no + 300 + + 300 + + Middle + + + + + C-g + + + + leftno + + + rightno + + + upno + + + downno + + + leftno + + + rightno + + + upno + + + downno + + + 1 + + + 2 + + + 3 + + + 4 + + + + + + + + + + + + + + + + + + + + scrot -s + + + + + + + + + + + + + + + + + + + + + + + + yesyes + + + + + + + + + + + + right + + + + + left + + + + + up + + + + + down + + + + + + + + true + Konqueror + + kfmclient openProfile filemanagement + + + + + scrot + + + + + 1 + + 500 + + 400 + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + no + + + + + + + + + + + yes + + + + + + + + + + + + + + + + + + + + + + + + + + + top + + + + + + left + + + + + + right + + + + + + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vertical + + + horizontal + + + + + + + + + + + + + + + + + previous + + + next + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + menu.xml + 200 + + no + + 100 + + 400 + + yes + + yes + + + + + + + +
diff --git a/.m1k1o/ungoogled-chromium/policies.json b/.m1k1o/ungoogled-chromium/policies.json new file mode 100644 index 00000000..5c4362cd --- /dev/null +++ b/.m1k1o/ungoogled-chromium/policies.json @@ -0,0 +1,34 @@ +{ + "HomepageLocation": "", + "AutoFillEnabled": false, + "AutofillAddressEnabled": false, + "AutofillCreditCardEnabled": false, + "BrowserSignin": 0, + "DefaultNotificationsSetting": 2, + "DeveloperToolsAvailability": 2, + "EditBookmarksEnabled": false, + "FullscreenAllowed": true, + "IncognitoModeAvailability": 1, + "SyncDisabled": true, + "AutoplayAllowed": true, + "BrowserAddPersonEnabled": false, + "BrowserGuestModeEnabled": false, + "DefaultPopupsSetting": 2, + "DownloadRestrictions": 3, + "VideoCaptureAllowed": true, + "AllowFileSelectionDialogs": false, + "PromptForDownloadLocation": false, + "BookmarkBarEnabled": false, + "PasswordManagerEnabled": false, + "URLBlacklist": [ + "file://*", + "chrome://policy" + ], + "ExtensionInstallWhitelist": [ + "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "fjoaledfpmneenckfbpdfhkmimnjocfa" + ], + "ExtensionInstallBlacklist": [ + "*" + ] +} diff --git a/.m1k1o/ungoogled-chromium/preferences.json b/.m1k1o/ungoogled-chromium/preferences.json new file mode 100644 index 00000000..31cd367a --- /dev/null +++ b/.m1k1o/ungoogled-chromium/preferences.json @@ -0,0 +1,110 @@ +{ + "homepage": "http://www.google.com", + "homepage_is_newtabpage": false, + "first_run_tabs": [ + "https://www.google.com/_/chrome/newtab?ie=UTF-8" + ], + "custom_links": { + "initialized": true, + "list": [ + { + "title": "YouTube", + "url": "https://www.youtube.com/" + }, + { + "title": "Netflix", + "url": "https://netflix.com" + }, + { + "title": "Hulu", + "url": "https://www.hulu.com/" + }, + { + "title": "9Anime", + "url": "https://9anime.to/" + }, + { + "title": "Crunchy Roll", + "url": "https://www.crunchyroll.com/" + }, + { + "title": "Funimation", + "url": "https://www.funimation.com/" + }, + { + "title": "Disney+", + "url": "https://www.disneyplus.com/" + }, + { + "title": "HBO Now", + "url": "https://play.hbonow.com/" + }, + { + "title": "Amazon Video", + "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" + }, + { + "title": "VRV", + "url": "https://vrv.co/" + }, + { + "title": "Twitch", + "url": "https://www.twitch.tv/" + }, + { + "title": "Mixer", + "url": "https://mixer.com/" + } + ] + }, + "browser": { + "custom_chrome_frame": false, + "show_home_button": true, + "window_placement": { + "maximized": true + } + }, + "bookmark_bar": { + "show_on_all_tabs": false + }, + "sync_promo": { + "show_on_first_run_allowed": false + }, + "distribution": { + "import_bookmarks_from_file": "bookmarks.html", + "import_bookmarks": true, + "import_history": true, + "import_home_page": true, + "import_search_engine": true, + "ping_delay": 60, + "do_not_create_desktop_shortcut": true, + "do_not_create_quick_launch_shortcut": true, + "do_not_create_taskbar_shortcut": true, + "do_not_launch_chrome": true, + "do_not_register_for_update_launch": true, + "make_chrome_default": true, + "make_chrome_default_for_user": true, + "system_level": false, + "verbose_logging": false + }, + "profile": { + "avatar_index": 19, + "default_content_setting_values": { + "clipboard": 2, + "cookies": 4, + "geolocation": 2, + "media_stream_camera": 2, + "media_stream_mic": 2, + "midi_sysex": 2, + "payment_handler": 2, + "usb_guard": 2 + }, + "name": "neko", + "using_default_avatar": false, + "using_default_name": false, + "using_gaia_avatar": false + }, + "signin": { + "allowed": false + } +} diff --git a/.m1k1o/ungoogled-chromium/supervisord.conf b/.m1k1o/ungoogled-chromium/supervisord.conf new file mode 100644 index 00000000..6637b851 --- /dev/null +++ b/.m1k1o/ungoogled-chromium/supervisord.conf @@ -0,0 +1,21 @@ +[program:ungoogled-chromium] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/lib/chromium/chrome-wrapper --window-position=0,0 --display=%(ENV_DISPLAY)s --start-maximized --bwsi --test-type --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage +autorestart=true +priority=800 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/ungoogled-chromium.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:openbox] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/openbox --config-file /etc/neko/openbox.xml +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/openbox.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true diff --git a/.m1k1o/vlc/Dockerfile b/.m1k1o/vlc/Dockerfile index c9dccb11..aea2e1d6 100644 --- a/.m1k1o/vlc/Dockerfile +++ b/.m1k1o/vlc/Dockerfile @@ -1,4 +1,5 @@ -FROM m1k1o/neko:base +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE # # install vlc diff --git a/.m1k1o/vncviewer/Dockerfile b/.m1k1o/vncviewer/Dockerfile index 6deea331..e6303872 100644 --- a/.m1k1o/vncviewer/Dockerfile +++ b/.m1k1o/vncviewer/Dockerfile @@ -1,4 +1,5 @@ -FROM m1k1o/neko:base +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE # # install vncviewer diff --git a/.m1k1o/xfce/Dockerfile b/.m1k1o/xfce/Dockerfile index 6c7da06a..b1aa6a7d 100644 --- a/.m1k1o/xfce/Dockerfile +++ b/.m1k1o/xfce/Dockerfile @@ -1,4 +1,5 @@ -FROM m1k1o/neko:base +ARG BASE_IMAGE=m1k1o/neko:base +FROM $BASE_IMAGE # # install xfce diff --git a/README.md b/README.md index cdcbbb16..31ed619c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ For n.eko room management software visit https://github.com/m1k1o/neko-rooms. ### New Features - Clipboard button with text area - for browsers, that don't support clipboard syncing (FireFox, what a shame...) or for HTTP. - Keyboard modifier state synchronization (Num Lock, Caps Lock, Scroll Lock) for each hosting. -- Added chromium ungoogled (with h265 support) an kept up to date by @whalehub. +- Added chromium ungoogled (with h265 support) an kept up to date (by @whalehub). - Added Picture in Picture button (only for watching screen, controlling not possible). - Added RTMP broadcast. Enables broadcasting neko screen to local RTMP server, YouTube or Twitch. - Stereo sound (works properly only in Firefox host). @@ -34,6 +34,9 @@ For n.eko room management software visit https://github.com/m1k1o/neko-rooms. - Added `MAX_FPS`, where you can specify max WebRTC frame rate. When set to `0`, frame rate won't be capped and you can enjoy your real `60fps` experience. Originally, it was constant at `25fps`. - Invite links. You can invite people and they don't need to enter passwords by themselves (and get confused about user accounts that do not exits). You can put your password in URL using `?pwd=` and it will be automatically used when logging in. - Added `/stats?pwd=` endpoint to get total active connections, host and members. +- Added `m1k1o/neko:vlc` tag, use VLC to watch local files together (by @mbattista). +- Added `m1k1o/neko:xfce` tag, as an non video related showcase (by @mbattista). +- Added ARM-based images, for Raspberry Pi support (by @mbattista). ### Bugs - Fixed minor gst pipeline bug. @@ -59,19 +62,23 @@ For n.eko room management software visit https://github.com/m1k1o/neko-rooms. - Added `m1k1o/neko:vncviewer` tag, use `NEKO_VNC_URL` to specify VNC target and use n.eko as a bridge. - Abiltiy to include neko as a component in another Vue.Js project (by @gbrian). - Added HEALTHCHECK to Dockerfile. -- Added `m1k1o/neko:vlc` tag, use VLC to watch local files together (by @mbattista). -- Added `m1k1o/neko:xfce` tag, as an non video related showcase (by @mbattista). # Getting started & FAQ Use following docker images: - `m1k1o/neko:latest` - for Firefox. -- `m1k1o/neko:chromium` - for Chromium Ungoogled (needs `--cap-add=SYS_ADMIN`). +- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`). +- `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`) (by @whalehub). - `m1k1o/neko:vncviewer` - for simple VNC viewer (specify `NEKO_VNC_URL` to your VNC target). - `m1k1o/neko:vlc` - for VLC Video player (needs volume mounted to `/media` with local video files, or setting `VLC_MEDIA=/media` path). - `m1k1o/neko:xfce` - for an shared desktop / installing shared software. - `m1k1o/neko:base` - for custom base. +For ARM-based devices (like Raspberry Pi, with GPU hardware acceleration): +- `m1k1o/neko:arm-firefox` - for Firefox. +- `m1k1o/neko:arm-chromium` - for Chromium. +- `m1k1o/neko:arm-base` - for custom arm based. + Networking: - If you want to use n.eko in **external** network, you can omit `NEKO_NAT1TO1`. It will automatically get your Public IP. - If you want to use n.eko in **internal** network, set `NEKO_NAT1TO1` to your local IP address (e.g. `NEKO_NAT1TO1: 192.168.1.20`)- @@ -122,7 +129,7 @@ services: NEKO_NAT1TO1: ``` -## Chromium Ungoogled +## Chromium ```yaml version: "3.4" @@ -168,6 +175,40 @@ services: NEKO_NAT1TO1: ``` +## Raspberry Pi + +Note! Since this pipeline is using H264, that enables GPU HW acceleration for Raspberry Pi, you are only able to connect from browsers supporting H264 for WebRTC. At the time of implementing, [Firefox does not support this](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs#supported-foot-1). + +```yaml +version: "3.4" +services: + neko: + image: "m1k1o/neko:arm-chromium" + restart: "unless-stopped" + # increase on rpi's with more then 1gb ram. + shm_size: "520mb" + ports: + - "8088:8080" + - "52000-52100:52000-52100/udp" + # this is important since we need a GPU for hardware acceleration alternatively mount the devices into the docker. + privileged: true + environment: + NEKO_SCREEN: '1280x720@30' + NEKO_PASSWORD: 'neko' + NEKO_PASSWORD_ADMIN: 'admin' + NEKO_EPR: 52000-52100 + # optional: change target bitrate and framerate on this parameter. + NEKO_VIDEO: | + ximagesrc display-name=%s use-damage=0 show-pointer=true use-damage=false + ! video/x-raw,framerate=30/1 + ! videoconvert + ! queue + ! video/x-raw,framerate=30/1,format=NV12 + ! v4l2h264enc extra-controls="controls,h264_profile=0,video_bitrate=1250000;" + ! h264parse config-interval=3 + ! video/x-h264,profile=baseline,stream-format=byte-stream +``` + ## Mobile support Neko is now working on iOS and Android! Also, the UI screens have been fixed for small screens. @@ -231,3 +272,7 @@ NEKO_KEY: - e.g. '/certs/key.pem' ``` + +# How to contribute? + +Navigate to `.m1k1o/README.md` for further information.