diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..dd6bd594 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,104 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.166.0/containers/go/.devcontainer/base.Dockerfile + +# [Choice] Go version: 1, 1.16, 1.15 +ARG VARIANT="1" +FROM mcr.microsoft.com/vscode/devcontainers/go:0-${VARIANT} + +# [Option] Install Node.js +ARG INSTALL_NODE="true" +ARG NODE_VERSION="lts/*" +RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi + +# build dependencies +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + libx11-dev libxrandr-dev libxtst-dev libgtk-3-dev \ + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev + +# runtime dependencies +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + wget ca-certificates supervisor \ + pulseaudio dbus-x11 xserver-xorg-video-dummy xserver-xorg-input-void \ + libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx5 \ + # + # file chooser handler, clipboard + xdotool xclip \ + # + # gst + gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \ + gstreamer1.0-pulseaudio; + +# browser dependencies +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends openbox chromium; + +# configure runtime +ARG USERNAME=neko +ARG USER_UID=1001 +ARG USER_GID=$USER_UID +RUN set -eux; \ + # + # 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; \ + # + # add sudo support + apt-get update; \ + apt-get install -y sudo; \ + echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME; \ + chmod 0440 /etc/sudoers.d/$USERNAME; \ + # + # 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 + +# copy runtime files +COPY runtime/dbus /usr/bin/dbus +COPY runtime/default.pa /etc/pulse/default.pa +COPY runtime/supervisord.conf /etc/neko/supervisord.conf +COPY runtime/xorg.conf /etc/neko/xorg.conf +COPY runtime/icon-theme /home/$USERNAME/.icons/default + +# copy browser files +COPY runtime/browser/env_wrapper /usr/bin/env_wrapper +# COPY runtime/browser/openbox.xml /etc/neko/openbox.xml +COPY runtime/browser/supervisord.chromium.conf /etc/neko/supervisord/chromium.conf +COPY runtime/browser/extension /usr/share/chromium/extensions/neko +# COPY runtime/browser/policies.json /etc/chromium/policies/managed/policies.json +COPY --chown=$USERNAME runtime/browser/preferences.json /home/neko/.config/chromium/Default/Preferences + +# copy dev files +COPY dev/runtime/openbox.xml /etc/neko/openbox.xml +COPY dev/runtime/policies.json /etc/chromium/policies/managed/policies.json +COPY dev/runtime/config.yml /etc/neko/neko.yml +COPY dev/runtime/supervisord.debug.conf /etc/neko/supervisord/debug.conf + +# customized scripts +RUN chmod +x /usr/bin/dbus;\ + echo '#!/bin/sh\nsleep infinity' > /usr/bin/neko; \ + chmod +x /usr/bin/neko; \ + echo '#!/bin/sh\nsudo sh -c "export USER='$USERNAME'\nexport HOME=/home/'$USERNAME'\n/usr/bin/supervisord -c /etc/neko/supervisord.conf"' > /usr/bin/deps; \ + chmod +x /usr/bin/deps; + +# set default envs +ENV USER=$USERNAME +ENV DISPLAY=:99.0 +ENV NEKO_SERVER_BIND=:3000 +ENV NEKO_WEBRTC_EPR=3001-3004 +ENV BROWSER_KIOSK=false diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 00000000..a6069f1c --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,5 @@ +# dev container + +You need to run all dependencies with `deps` command before you start debugging. + +Make sure your local IP is correct in `.vscode/launch.json`, diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..90b40ad0 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,40 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.166.0/containers/go +{ + "name": "Go", + "build": { + "dockerfile": "Dockerfile", + "context": "../", + "args": { + // Update the VARIANT arg to pick a version of Go: 1, 1.16, 1.15 + "VARIANT": "1.16", + // Options + "INSTALL_NODE": "false", + "NODE_VERSION": "lts/*" + } + }, + "runArgs": [ "--cap-add=SYS_PTRACE", "--cap-add=SYS_ADMIN", "--shm-size=2G", "--security-opt", "seccomp=unconfined" ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "go.toolsManagement.checkForUpdates": "local", + "go.useLanguageServer": true, + "go.gopath": "/go", + "go.goroot": "/usr/local/go" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "golang.Go" + ], + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "appPort": ["3000:3000", "3001:3001/udp", "3002:3002/udp", "3003:3003/udp", "3004:3004/udp"], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "go version", + + // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "neko" +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..1cf4b94e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "launch", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${workspaceFolder}/cmd/neko", + "output": "${workspaceFolder}/bin/debug/neko", + "cwd": "${workspaceFolder}/", + "args": ["serve", "-d", "--webrtc.nat1to1", "192.168.1.80"] + } + ] +}