move docs to new website.
|
@ -1 +0,0 @@
|
|||
neko.m1k1o.net
|
|
@ -1,44 +0,0 @@
|
|||
<div align="center">
|
||||
<a href="https://neko.m1k1o.net/#/" ><img src="./_media/logo.png" width="450" height="auto"/></a>
|
||||
<br/>
|
||||
<br/>
|
||||
<img src="./_media/intro.gif" width="650" height="auto"/>
|
||||
|
||||
With `NEKO_FILE_TRANSFER_ENABLED=true`:
|
||||
|
||||
<img src="./_media/file-transfer.gif" width="650" height="auto"/>
|
||||
<br/>
|
||||
<br/>
|
||||
</div>
|
||||
|
||||
# n.eko
|
||||
|
||||
Welcome to Neko, a self-hosted virtual browser that runs in Docker and uses WebRTC technology. Neko is a powerful tool that allows you to **run a fully-functional browser in a virtual environment**, giving you the ability to **access the internet securely and privately from anywhere**. With Neko, you can browse the web, **run applications**, and perform other tasks just as you would on a regular browser, all within a **secure and isolated environment**. Whether you are a developer looking to test web applications, a **privacy-conscious user seeking a secure browsing experience**, or simply someone who wants to take advantage of the **convenience and flexibility of a virtual browser**, Neko is the perfect solution.
|
||||
|
||||
In addition to its security and privacy features, Neko offers the **ability for multiple users to access it simultaneously**. This makes it an ideal solution for teams or organizations that need to share access to a browser, as well as for individuals who want to use **multiple devices to access the same virtual environment**. With Neko, you can **easily and securely share access to a browser with others**, without having to worry about maintaining separate configurations or settings. Whether you need to **collaborate on a project**, access shared resources, or simply want to **share access to a browser with friends or family**, Neko makes it easy to do so.
|
||||
|
||||
Neko is also a great tool for **hosting watch parties** and interactive presentations. With its virtual browser capabilities, Neko allows you to host watch parties and presentations that are **accessible from anywhere**, without the need for in-person gatherings. This makes it easy to **stay connected with friends and colleagues**, even when you are unable to meet in person. With Neko, you can easily host a watch party or give an **interactive presentation**, whether it's for leisure or work. Simply invite your guests to join the virtual environment, and you can share the screen and **interact with them in real-time**.
|
||||
|
||||
## About
|
||||
|
||||
This app uses WebRTC to stream a desktop inside a docker container, original author made this because [rabb.it](https://en.wikipedia.org/wiki/Rabb.it) went under, and his internet could not handle streaming and discord kept crashing when his friend attempted to. He just wanted to watch anime with his friends ლ(ಠ益ಠლ) so he started digging throughout the internet and found a few *kinda* clones, but none of them had the virtual browser, then he found [Turtus](https://github.com/Khauri/Turtus), and he was able to figure out the rest.
|
||||
|
||||
Then I found [this](https://github.com/nurdism/neko) project and started to dig into it. I really liked the idea of having collaborative browser browsing together with multiple people, so I created a fork. Initially, I wanted to merge my changes to the upstream repository, but the original author did not have time for this project anymore, and it got eventually archived.
|
||||
|
||||
### Features
|
||||
|
||||
* Text Chat (With basic markdown support, discord flavor)
|
||||
* Admin users (Kick, Ban & Force Give/Release Controls, Lock room)
|
||||
* Clipboard synchronization (on [supported browsers](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/readText))
|
||||
* Emote overlay
|
||||
* Ignore user (chat and emotes)
|
||||
* Persistent settings
|
||||
* Automatic Login with custom url args. (add `?usr=<your-user-name>&pwd=<room-pass>` to the url.)
|
||||
* Broadcasting room content using RTMP (to e.g. twitch or youtube...)
|
||||
* Bidirectional file transfer (if enabled)
|
||||
|
||||
### Why n.eko?
|
||||
|
||||
I like cats 🐱 (`Neko` is the Japanese word for cat), I'm a weeb/nerd.
|
||||
|
||||
***But why the cat butt?*** Because cats are *assholes*, but you love them anyway.
|
|
@ -1,12 +0,0 @@
|
|||
<!-- _coverpage.md -->
|
||||
|
||||
<img src="_media/logo.png" width="450" height="auto"/>
|
||||
|
||||
> A self hosted virtual browser that runs in docker
|
||||
|
||||
[GitHub](https://github.com/m1k1o/neko/)
|
||||
[Get Started](#neko)
|
||||
|
||||
<!-- background color -->
|
||||
|
||||

|
Before Width: | Height: | Size: 662 B |
Before Width: | Height: | Size: 1,003 B |
Before Width: | Height: | Size: 3.4 MiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 631 KiB |
|
@ -1,14 +0,0 @@
|
|||
<!-- _navbar.md -->
|
||||
|
||||
* [Getting Started](/getting-started/)
|
||||
* [Quick Start](/getting-started/quick-start)
|
||||
* [Examples](/getting-started/examples)
|
||||
* [Reverse Proxy](/getting-started/reverse-proxy)
|
||||
* [Configuration](/getting-started/configuration)
|
||||
* [Troubleshooting](/getting-started/troubleshooting)
|
||||
* [Frequently Asked Questions](/getting-started/faq)
|
||||
* [Mobile Support](/mobile-support)
|
||||
* [Contributing](/contributing)
|
||||
* [Non Goals](/non-goals)
|
||||
* [Technologies](/technologies)
|
||||
* [Changelog](/changelog)
|
|
@ -1,318 +0,0 @@
|
|||
# Getting started & FAQ
|
||||
|
||||
<div align="center">
|
||||
<img src="../_media/icons/firefox.svg" title="m1k1o/neko:firefox" width="60" height="auto"/>
|
||||
<img src="../_media/icons/google-chrome.svg" title="m1k1o/neko:google-chrome" width="60" height="auto"/>
|
||||
<img src="../_media/icons/chromium.svg" title="m1k1o/neko:chromium" width="60" height="auto"/>
|
||||
<img src="../_media/icons/microsoft-edge.svg" title="m1k1o/neko:microsoft-edge" width="60" height="auto"/>
|
||||
<img src="../_media/icons/brave.svg" title="m1k1o/neko:brave" width="60" height="auto"/>
|
||||
<img src="../_media/icons/vivaldi.svg" title="m1k1o/neko:vivaldi" width="60" height="auto"/>
|
||||
<img src="../_media/icons/opera.svg" title="m1k1o/neko:opera" width="60" height="auto"/>
|
||||
<img src="../_media/icons/tor-browser.svg" title="m1k1o/neko:tor-browser" width="60" height="auto"/>
|
||||
<img src="../_media/icons/remmina.png" title="m1k1o/neko:remmina" width="60" height="auto"/>
|
||||
<img src="../_media/icons/vlc.svg" title="m1k1o/neko:vlc" width="60" height="auto"/>
|
||||
<img src="../_media/icons/xfce.svg" title="m1k1o/neko:xfce" width="60" height="auto"/>
|
||||
<img src="../_media/icons/kde.svg" title="m1k1o/neko:kde" width="60" height="auto"/>
|
||||
</div>
|
||||
|
||||
Use the following docker images from [Docker Hub](https://hub.docker.com/r/m1k1o/neko) for x86_64:
|
||||
- `m1k1o/neko:latest` or `m1k1o/neko:firefox` - for Firefox.
|
||||
- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:google-chrome` - for Google Chrome (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @whalehub).
|
||||
- `m1k1o/neko:microsoft-edge` - for Microsoft Edge (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:brave` - for [Brave Browser](https://brave.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:vivaldi` - for [Vivaldi Browser](https://vivaldi.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @Xeddius).
|
||||
- `m1k1o/neko:opera` for [Opera Browser](https://opera.com) (requires extra steps to enable DRM, see instructions [here](https://www.reddit.com/r/operabrowser/wiki/opera/linux_widevine_config/). libffmpeg is already configured.) (by @prophetofxenu)
|
||||
- `m1k1o/neko:tor-browser` - for Tor Browser.
|
||||
- `m1k1o/neko:remmina` - for remote desktop connection (by @lowne).
|
||||
- Pass env var `REMMINA_URL=<proto>://[<username>[:<password>]@]server[:port]` (proto being `vnc`, `rdp` or `spice`).
|
||||
- Or create your custom configuration with remmina locally (it's saved in `~/.local/share/remmina/path_to_profile.remmina`) and bind-mount it, then pass env var `REMMINA_PROFILE=<path_to_profile.remmina>`.
|
||||
- `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` or `m1k1o/neko:kde` - for a shared desktop / installing shared software.
|
||||
- `m1k1o/neko:base` - for custom base.
|
||||
|
||||
Dockerhub images are built using GitHub actions on every push and on weekly basis to keep all browsers up-to-date.
|
||||
|
||||
All images are also available on [GitHub Container Registry](https://github.com/m1k1o?tab=packages&repo_name=neko) for faster pulls:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/brave:latest`
|
||||
- `ghcr.io/m1k1o/neko/vivaldi:latest`
|
||||
- `ghcr.io/m1k1o/neko/opera:latest`
|
||||
- `ghcr.io/m1k1o/neko/tor-browser:latest`
|
||||
- `ghcr.io/m1k1o/neko/remmina:latest`
|
||||
- `ghcr.io/m1k1o/neko/vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/xfce:latest`
|
||||
- `ghcr.io/m1k1o/neko/kde:latest`
|
||||
|
||||
For ARM-based images (like Raspberry Pi - with GPU hardware acceleration, Oracle Cloud ARM tier). Currently, not all images are available for ARM, because not all applications are available for ARM. Please note, that `m1k1o/neko:arm-*` images from dockerhub are currently not maintained and they can contain outdated software. Please use images below:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/arm-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-xfce:latest`
|
||||
|
||||
For images with VAAPI GPU hardware acceleration using intel drivers use:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/intel-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-brave:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-vivaldi:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-opera:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-tor-browser:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-remmina:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-kde:latest`
|
||||
|
||||
For images with Nvidia GPU hardware acceleration using EGL (see example below) use (please note, there is a known issue with EGL and Chromium-based browsers, see [here](https://github.com/m1k1o/neko/issues/279)):
|
||||
|
||||
- `ghcr.io/m1k1o/neko/nvidia-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-brave:latest`
|
||||
|
||||
GHCR images are built using GitHub actions for every tag.
|
||||
|
||||
### 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`)-
|
||||
|
||||
Currently, it is not supported to supply multiple NAT addresses directly to neko (see https://github.com/m1k1o/neko/issues/47).
|
||||
|
||||
But it can be acheived by deploying own turn server alongside neko that is accessible from your LAN:
|
||||
|
||||
```yaml
|
||||
version: "3.4"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICESERVERS: '[{ "urls": [ "turn:192.168.1.60:3478" ], "username":"neko", "credential":"neko" }, { "urls": [ "stun:stun.nextcloud.com:3478" ] }]'
|
||||
coturn:
|
||||
image: 'coturn/coturn:latest'
|
||||
network_mode: "host"
|
||||
command: |
|
||||
-n
|
||||
--realm=localhost
|
||||
--fingerprint
|
||||
--listening-ip=0.0.0.0
|
||||
--external-ip=192.168.1.60
|
||||
--listening-port=3478
|
||||
--min-port=49160
|
||||
--max-port=49200
|
||||
--log-file=stdout
|
||||
--user=neko:neko
|
||||
--lt-cred-mech
|
||||
```
|
||||
|
||||
- Replace `192.168.1.60` with your LAN IP address, and allow ports `49160-49200/udp` and `3478/tcp` in your LAN.
|
||||
- Make sure you don't use `NEKO_ICELITE: true` because ICE LITE does not support TURN servers.
|
||||
|
||||
This setup adds local turn server to neko. It won't be reachable by your remote clients and your own IP won't be reachable from your lan. So it effectively just adds local candidate and allows connections from LAN.
|
||||
|
||||
### Why so many ports?
|
||||
- WebRTC needs UDP ports in order to transfer Audio/Video towards user and Mouse/Keyboard events to the server in real time.
|
||||
- If you don't set `NEKO_ICELITE=true`, every user will need 2 UDP ports.
|
||||
- If you set `NEKO_ICELITE=true`, every user will need only 1 UDP port. It is **recommended** to use *ice-lite*.
|
||||
- Do not forget, they are **UDP** ports, that configuration must be correct in your firewall/router/docker.
|
||||
- You can freely limit number of UDP ports. But you can't map them to different ports.
|
||||
- This **WON'T** work: `32000-32100:52000-52100/udp`
|
||||
- You can change API port (8080).
|
||||
- This **WILL** work: `3000:8080`
|
||||
|
||||
### Using mux instead of epr
|
||||
|
||||
When using a mux, not so many ports are needed.
|
||||
|
||||
```yaml
|
||||
version: "3.4"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "8081:8081/tcp"
|
||||
- "8082:8082/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_TCPMUX: 8081
|
||||
NEKO_UDPMUX: 8082
|
||||
NEKO_ICELITE: 1
|
||||
```
|
||||
|
||||
- When using mux, `NEKO_EPR` is ignored.
|
||||
- Mux accepts only one port, not a range.
|
||||
- You only need to expose maximum two ports for WebRTC on your router/firewall and have many users connected.
|
||||
- It can even be the same port number, so e.g. `NEKO_TCPMUX: 8081` and `NEKO_UDPMUX: 8081`.
|
||||
- The same port must be exposed from docker container, you can't map them to different ports. So `8082:8082` is OK, but `"5454:8082` will not work.
|
||||
- You can use them alone (either TCP or UDP) when needed.
|
||||
- UDP is generally better for latency. But some networks block UDP so it is good to have TCP available as fallback.
|
||||
- Still, using `NEKO_ICELITE=true` is recommended.
|
||||
|
||||
### Using turn servers instead of port forwarding
|
||||
|
||||
- If you don't want to use port forwarding, you can use turn servers.
|
||||
- But you need to have your own turn server (e.g. [cotrun](https://github.com/coturn/coturn)) or have access to one.
|
||||
- They are generally not free, because they require a lot of bandwidth.
|
||||
- Please make sure that you correctly escape your turn server credentials in the environment variable or use aphostrophes.
|
||||
|
||||
```yaml
|
||||
NEKO_ICESERVERS: '[{"urls": ["turn:<MY-COTURN-SERVER>:443?transport=udp", "turn:<MY-COTURN-SERVER>:443?transport=tcp", "turns:<MY-COTURN-SERVER>:443?transport=udp", "turns:<MY-COTURN-SERVER>:443?transport=tcp"], "credential": "<MY-COTURN-CREDENTIAL"}, {"urls": ["stun:stun.nextcloud.com:443"]}]'
|
||||
```
|
||||
|
||||
### Want to customize and install own add-ons, set custom bookmarks?
|
||||
- You would need to modify the existing policy file and mount it to your container.
|
||||
- For Firefox, copy [this](https://github.com/m1k1o/neko/blob/master/.docker/firefox/policies.json) file, modify and mount it as: ` -v '${PWD}/policies.json:/usr/lib/firefox/distribution/policies.json'`
|
||||
- For Chromium, copy [this](https://github.com/m1k1o/neko/blob/master/.docker/chromium/policies.json) file, modify and mount it as: ` -v '${PWD}/policies.json:/etc/chromium/policies/managed/policies.json'`
|
||||
- For others, see where existing `policies.json` is placed in their `Dockerfile`.
|
||||
|
||||
#### Allow file uploading & downloading
|
||||
- From security perspective, browser is not enabled to access local file data.
|
||||
- If you want to enable this, you need to modify following policies:
|
||||
```json
|
||||
"DownloadRestrictions": 0,
|
||||
"AllowFileSelectionDialogs": true,
|
||||
"URLAllowlist": [
|
||||
"file:///home/neko/Downloads"
|
||||
],
|
||||
```
|
||||
|
||||
### Want to preserve browser data between restarts?
|
||||
- You need to mount browser profile as volume.
|
||||
- For Firefox, that is this `/home/neko/.mozilla/firefox/profile.default` folder, mount it as: ` -v '${PWD}/data:/home/neko/.mozilla/firefox/profile.default'`
|
||||
- For Chromium, that is this `/home/neko/.config/chromium` folder, mount it as: ` -v '${PWD}/data:/home/neko/.config/chromium'`
|
||||
- For other chromium based browsers, see in `supervisord.conf` folder that is specified in `--user-data-dir`.
|
||||
|
||||
#### Allow persistent data in policies
|
||||
- From security perspective, browser is set up to forget all cookies and browsing history when its closed.
|
||||
- If you want to enable this, you need to modify following policies:
|
||||
```json
|
||||
"DefaultCookiesSetting": 1,
|
||||
"RestoreOnStartup": 1,
|
||||
```
|
||||
|
||||
### Nvidia GPU acceleration
|
||||
|
||||
You need to have [NVIDIA Container Toolkit](https://github.com/NVIDIA/nvidia-container-toolkit) installed, start the container with `--gpus all` flag and use images built for nvidia (see above).
|
||||
|
||||
```bash
|
||||
docker run -d --gpus all \
|
||||
-p 8080:8080 \
|
||||
-p 56000-56100:56000-56100/udp \
|
||||
-e NEKO_SCREEN=1920x1080@30 \
|
||||
-e NEKO_PASSWORD=neko \
|
||||
-e NEKO_PASSWORD_ADMIN=admin \
|
||||
-e NEKO_EPR=56000-56100 \
|
||||
-e NEKO_NAT1TO1=192.168.1.10 \
|
||||
-e NEKO_ICELITE=1 \
|
||||
-e NEKO_VIDEO_CODEC=h264 \
|
||||
-e NEKO_HWENC=nvenc \
|
||||
--shm-size=2gb \
|
||||
--cap-add=SYS_ADMIN \
|
||||
--name neko \
|
||||
ghcr.io/m1k1o/neko/nvidia-google-chrome:latest
|
||||
```
|
||||
|
||||
If you want to use docker-compose, you can use this example:
|
||||
|
||||
```yaml
|
||||
version: "3.4"
|
||||
services:
|
||||
neko:
|
||||
image: "ghcr.io/m1k1o/neko/nvidia-google-chrome:latest"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "56000-56100:56000-56100/udp"
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
environment:
|
||||
NEKO_SCREEN: '1920x1080@30'
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 56000-56100
|
||||
NEKO_NAT1TO1: 192.168.1.10
|
||||
NEKO_VIDEO_CODEC: h264
|
||||
NEKO_HWENC: nvenc
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: nvidia
|
||||
count: 1
|
||||
capabilities: [gpu]
|
||||
```
|
||||
|
||||
- You can verify that GPU is available inside the container by running `docker exec -it neko nvidia-smi` command.
|
||||
- You can verify that GPU is used for encoding by searching for `nvh264enc` in `docker logs neko` output.
|
||||
- If you don'ŧ specify `NEKO_HWENC: nvenc` environment variable, CPU encoding will be used but GPU will still be available for browser rendering.
|
||||
|
||||
Broadcast pipeline is not hardware accelerated by default. You can use this pipeline created by [@evilalmus](https://github.com/m1k1o/neko/issues/276#issuecomment-1498362533).
|
||||
|
||||
```yaml
|
||||
NEKO_BROADCAST_PIPELINE: "flvmux name=mux ! rtmpsink location={url} pulsesrc device={device} ! audio/x-raw,channels=2 ! audioconvert ! voaacenc ! mux. ximagesrc display-name={display} show-pointer=false use-damage=false ! video/x-raw,framerate=30/1 ! videoconvert ! queue ! video/x-raw,format=NV12 ! nvh264enc name=encoder preset=low-latency-hq gop-size=25 spatial-aq=true temporal-aq=true bitrate=2800 vbv-buffer-size=2800 rc-mode=6 ! h264parse config-interval=-1 ! video/x-h264,stream-format=byte-stream,profile=high ! h264parse ! mux."
|
||||
```
|
||||
|
||||
### Want to use VPN for your n.eko browsing?
|
||||
- Check this out: https://github.com/m1k1o/neko-vpn
|
||||
|
||||
### Want to have multiple rooms on demand?
|
||||
- Check this out: https://github.com/m1k1o/neko-rooms
|
||||
|
||||
### Want to use different Apps than Browser?
|
||||
- Check this out: https://github.com/m1k1o/neko-apps
|
||||
|
||||
### Accounts:
|
||||
- There are no accounts, display name (a.k.a. username) can be freely chosen. Only password needs to match. Depending on which password matches, the visitor gets its privilege:
|
||||
- Anyone, who enters with `NEKO_PASSWORD` will be **user**.
|
||||
- Anyone, who enters with `NEKO_PASSWORD_ADMIN` will be **admin**.
|
||||
- Disabling passwords is not possible. However, you can use following query parameters to create auto-join links:
|
||||
- Adding `?pwd=<password>` will prefill password.
|
||||
- Adding `?usr=<display-name>` will prefill username.
|
||||
- Adding `?cast=1` will hide all control and show only video.
|
||||
- Adding `?embed=1` will hide most additional components and show only video.
|
||||
- Adding `?volume=<0-1>` will set volume to given value.
|
||||
- Adding `?lang=<language>` will set language to given value.
|
||||
- Adding `?show_side=1` will show the sidebar on startup.
|
||||
- Adding `?mute_chat=1` will mute the chat on startup.
|
||||
- e.g. `http(s)://<URL:Port>/?pwd=neko&usr=guest&cast=1`
|
||||
|
||||
### Screen size
|
||||
- Only admins can change screen size.
|
||||
- You can set a default screen size, but this size **MUST** be one from the list, that your server supports.
|
||||
- You will get this list in frontend, where you can choose from.
|
||||
|
||||
### Clipboard sharing
|
||||
- Browsers have certain requirements to allow clipboard sharing.
|
||||
- Your instance must be HTTPS.
|
||||
- Firefox does not support clipboard sharing.
|
||||
- Use Chrome for the best experience.
|
||||
- If your browser does not support clipboard sharing:
|
||||
- Clipboard icon in the bottom right corner will be displayed for host.
|
||||
- It opens text area that can share clipboard content bi-directionally.
|
||||
- Only plain-text is supported.
|
|
@ -1,48 +0,0 @@
|
|||
# Quick Start
|
||||
|
||||
Neko is easy to use and requires no technical expertise to get started. All you need to do is download the Docker image and you're ready to go:
|
||||
|
||||
1. Deploy a server or VPS.
|
||||
|
||||
**Recommended Specs:**
|
||||
|
||||
| Resolution | Cores | Ram | Recommendation |
|
||||
|-------------|-------|-------|------------------|
|
||||
| 1024×576@30 | 2 | 2gb | Not Recommended |
|
||||
| 1280x720@30 | 4 | 3gb | Good Performance |
|
||||
| 1280x720@30 | 6 | 4gb | Recommended |
|
||||
| 1280x720@30 | 8 | 4gb+ | Best Performance |
|
||||
|
||||
*Why are the specs so high?* : If you think about it, you have to run a full desktop, a browser (a resource hog on its own) *and* encode/transmit the desktop, there's a lot going on and so it demands some power.
|
||||
|
||||
*Note:* Admin can change the resolution in the GUI.
|
||||
|
||||
2. [Login via SSH](https://www.digitalocean.com/docs/droplets/how-to/connect-with-ssh/).
|
||||
|
||||
3. Install [Docker](https://docs.docker.com/get-docker/):
|
||||
```shell
|
||||
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
|
||||
```
|
||||
|
||||
4. Install [Docker Compose](https://docs.docker.com/compose/install/):
|
||||
```shell
|
||||
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
sudo chmod +x /usr/local/bin/docker-compose
|
||||
```
|
||||
|
||||
5. Download docker compose file and start it:
|
||||
```shell
|
||||
wget https://raw.githubusercontent.com/m1k1o/neko/master/docker-compose.yaml
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
6. Visit the IP address server in your browser and login, the default password is `neko`.
|
||||
|
||||
> 💡 **Protip**: Run `nano docker-compose.yaml` to edit the settings, then press `ctrl+x` to exit and save the file.
|
||||
|
||||
## Well known cloud providers
|
||||
* [Hetzner Cloud](https://www.hetzner.com/cloud)
|
||||
* [Digital Ocean](https://www.digitalocean.com/)
|
||||
* [Contabo](https://contabo.com/)
|
||||
* [Linode](https://www.linode.com/)
|
||||
* [Vultr](https://www.vultr.com/)
|
|
@ -1,173 +0,0 @@
|
|||
# Behind reverse proxy?
|
||||
|
||||
## Traefik2
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.neko-frontend.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.neko.rule=${TRAEFIK_RULE}"
|
||||
- "traefik.http.routers.neko.entrypoints=${TRAEFIK_ENTRYPOINTS}"
|
||||
- "traefik.http.routers.neko.tls.certresolver=${TRAEFIK_CERTRESOLVER}"
|
||||
```
|
||||
|
||||
(by @m1k1o, [example](https://github.com/m1k1o/neko-vpn/blob/a1b934515dcf597992a515d61d307c2450a11002/docker-compose.yml#L38-L43))
|
||||
|
||||
## Nginx
|
||||
|
||||
```conf
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name example.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 86400;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(by @GigaFyde, [source](https://github.com/nurdism/neko/issues/111#issuecomment-742656957))
|
||||
|
||||
## Apache
|
||||
|
||||
After successfully installing and running neko, you might want to get rid of the port in the url, use DNS instead of IP address and also having SSL.
|
||||
This will remove the port from the URL and also enables HTTPS.
|
||||
To do this, you have to get running Apache server. Now you can go into the `/etc/apache2/sites-available` folder and create new config file for example `neko.conf`
|
||||
After creating new config file, you can use this example config and paste it in. Some things may vary on your machine so read through and modify if needed.
|
||||
Bear in mind that your neko server doesn't have to run on the same computer as Apache. They just have to be on the same network, and then you replace localhost with correct internal IP.
|
||||
|
||||
```xml
|
||||
<VirtualHost *:80>
|
||||
# The ServerName directive sets the request scheme, hostname and port that
|
||||
# the server uses to identify itself. This is used when creating
|
||||
# redirection URLs. In the context of virtual hosts, the ServerName
|
||||
# specifies what hostname must appear in the request's Host: header to
|
||||
# match this virtual host. For the default virtual host (this file) this
|
||||
# value is not decisive as it is used as a last resort host regardless.
|
||||
# However, you must set it for any further virtual host explicitly.
|
||||
|
||||
# Paths of those modules might vary across different distros.
|
||||
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
|
||||
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
|
||||
LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so
|
||||
|
||||
ServerName example.com
|
||||
ServerAlias www.example.com
|
||||
|
||||
ProxyRequests Off
|
||||
ProxyPass / http://localhost:8080/
|
||||
ProxyPassReverse / http://localhost:8080/
|
||||
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule /ws(.*) "ws://localhost:8080/ws$1" [P,L]
|
||||
|
||||
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
|
||||
# error, crit, alert, emerg.
|
||||
# It is also possible to configure the loglevel for particular
|
||||
# modules, e.g.
|
||||
#LogLevel info ssl:warn
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||
|
||||
# For most configuration files from conf-available/, which are
|
||||
# enabled or disabled at a global level, it is possible to
|
||||
# include a line for only one particular virtual host. For example the
|
||||
# following line enables the CGI configuration for this host only
|
||||
# after it has been globally disabled with "a2disconf".
|
||||
#Include conf-available/serve-cgi-bin.conf
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
(by @DarkReaper231, [source](https://github.com/nurdism/neko/blob/cad98a62a5bd7f1daf2c11980631bb14ba81a1f6/docs/apache-proxypass-config.md#example-apache-config))
|
||||
|
||||
After creating your new config file, just use `sudo a2ensite neko.conf` and then `sudo systemctl reload apache2`
|
||||
|
||||
### Enabling SSL
|
||||
|
||||
If you want to use SSL for your apache configuration, you can install certbot and use it with `sudo certbot`
|
||||
Then you can just select both `example.com` and `www.example.com` and apply. This will copy your `neko.conf` file and creates one for SSL.
|
||||
|
||||
## Caddy
|
||||
|
||||
```conf
|
||||
https://example.com {
|
||||
reverse_proxy localhost:8080 {
|
||||
header_up Host {host}
|
||||
header_up X-Real-IP {remote_host}
|
||||
header_up X-Forwarded-For {remote_host}
|
||||
header_up X-Forwarded-Proto {scheme}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(by @ccallahan, [source](https://github.com/nurdism/neko/pull/125/commits/eb4ceda75423b0d960c8aea0240acf6d7a10fef4))
|
||||
|
||||
## HAProxy
|
||||
|
||||
Using your frontend section *(mine is called http-in)*, add the ACL to redirect correctly to your n.eko instance.
|
||||
|
||||
```sh
|
||||
frontend http-in
|
||||
#/********
|
||||
#* NEKO *
|
||||
acl neko_rule_http hdr(host) neko.domain.com # Adapt the domain
|
||||
use_backend neko_srv if neko_rule_http
|
||||
#********/
|
||||
|
||||
|
||||
backend neko_srv
|
||||
mode http
|
||||
option httpchk
|
||||
server neko 172.16.0.0:8080 # Adapt the IP
|
||||
```
|
||||
|
||||
Then, restart the haproxy service.
|
||||
```sh
|
||||
service haproxy restart
|
||||
```
|
||||
|
||||
### Having trouble reaching your HAProxy ?
|
||||
|
||||
Try theses solution :
|
||||
|
||||
- Verify the logs / what HAProxy is telling you :
|
||||
> ```sh
|
||||
> service haproxy status
|
||||
> ```
|
||||
|
||||
- If the service is UP and the ACL rule + backend is OK then tail the log and keep them to verify :
|
||||
> ```sh
|
||||
> tail -f /var/log/haproxy.log
|
||||
> # after that, go to your neko.instance.com and look for the logs in the shell
|
||||
> ```
|
||||
|
||||
- Ensure you set the timeout to 60 seconds before the request fail.
|
||||
> ```sh
|
||||
> global
|
||||
> stats timeout 60s
|
||||
> ```
|
||||
|
||||
- Ensure you set the forwardfor and the timeout aswell in the defaults section.
|
||||
> ```sh
|
||||
> defaults
|
||||
> option forwardfor
|
||||
> timeout connect 30000
|
||||
> timeout client 65000
|
||||
> timeout server 65000
|
||||
> ```
|
||||
*(Don't forget to restart the service each time you modify the `.cfg` file !)*
|
||||
|
||||
(by @RisedSky)
|
|
@ -1,43 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>n.eko</title>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta name="description" content="A self hosted virtual browser (rabb.it clone) that runs in docker">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="_media/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="_media/favicon-16x16.png">
|
||||
<style>
|
||||
.app-name img { max-width: 70%; }
|
||||
nav.app-nav li ul { min-width: 100px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script>
|
||||
window.$docsify = {
|
||||
logo: '/_media/logo.png',
|
||||
formatUpdated: '{MM}/{DD} {HH}:{mm}',
|
||||
auto2top: true,
|
||||
coverpage: true,
|
||||
loadSidebar: true,
|
||||
mergeNavbar: true,
|
||||
loadSidebar: true,
|
||||
autoHeader: true,
|
||||
maxLevel: 4,
|
||||
subMaxLevel: 2,
|
||||
name: 'neko',
|
||||
repo: 'm1k1o/neko',
|
||||
themeColor: '#19bd9c'
|
||||
}
|
||||
</script>
|
||||
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
|
||||
<script src="//unpkg.com/docsify-copy-code"></script>
|
||||
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
|
||||
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
|
||||
<script src="//unpkg.com/prismjs/components/prism-yaml.min.js"></script>
|
||||
<script src="//unpkg.com/prismjs/components/prism-diff.min.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,5 +0,0 @@
|
|||
# Mobile support
|
||||
|
||||
N.eko is now working on iOS and Android! Also, the UI screens have been fixed for small screens.
|
||||
|
||||

|
|
@ -1 +0,0 @@
|
|||
# Technologies (WIP)
|
50
webpage/docs/browser-customizations.md
Normal file
|
@ -0,0 +1,50 @@
|
|||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Browser Customizations
|
||||
|
||||
##
|
||||
|
||||
- In order to **install own add-ons, set custom bookmarks** etc. you would need to modify the existing policy file and mount it to your container.
|
||||
- For Firefox, copy [this](https://github.com/m1k1o/neko/blob/master/.docker/firefox/policies.json) file, modify and mount it as: ` -v '${PWD}/policies.json:/usr/lib/firefox/distribution/policies.json'`
|
||||
- For Chromium, copy [this](https://github.com/m1k1o/neko/blob/master/.docker/chromium/policies.json) file, modify and mount it as: ` -v '${PWD}/policies.json:/etc/chromium/policies/managed/policies.json'`
|
||||
- For others, see where existing `policies.json` is placed in their `Dockerfile`.
|
||||
|
||||
## Allow file uploading & downloading
|
||||
|
||||
- From security perspective, browser is not enabled to access local file data.
|
||||
- If you want to enable this, you need to modify following policies:
|
||||
|
||||
```json title="policies.json"
|
||||
{
|
||||
// ...
|
||||
"DownloadRestrictions": 0,
|
||||
"AllowFileSelectionDialogs": true,
|
||||
"URLAllowlist": [
|
||||
"file:///home/neko/Downloads"
|
||||
],
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Preserve browser data between restarts
|
||||
|
||||
- You need to mount browser profile as volume.
|
||||
- For Firefox, that is this `/home/neko/.mozilla/firefox/profile.default` folder, mount it as: ` -v '${PWD}/data:/home/neko/.mozilla/firefox/profile.default'`
|
||||
- For Chromium, that is this `/home/neko/.config/chromium` folder, mount it as: ` -v '${PWD}/data:/home/neko/.config/chromium'`
|
||||
- For other chromium based browsers, see in `supervisord.conf` folder that is specified in `--user-data-dir`.
|
||||
|
||||
### Allow persistent data in policies
|
||||
|
||||
- From security perspective, browser is set up to forget all cookies and browsing history when its closed.
|
||||
- If you want to enable this, you need to modify following policies:
|
||||
|
||||
```json title="policies.json"
|
||||
{
|
||||
// ...
|
||||
"DefaultCookiesSetting": 1,
|
||||
"RestoreOnStartup": 1,
|
||||
// ...
|
||||
}
|
||||
```
|
|
@ -1,3 +1,7 @@
|
|||
---
|
||||
sidebar_position: 8
|
||||
---
|
||||
|
||||
# Configuration
|
||||
|
||||
Config values can be set using three methods, sorted on this page by priority.
|
100
webpage/docs/docker-images.md
Normal file
|
@ -0,0 +1,100 @@
|
|||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Docker Images
|
||||
|
||||
<div align="center">
|
||||
<img src="/img/icons/firefox.svg" title="m1k1o/neko:firefox" width="60" height="auto"/>
|
||||
<img src="/img/icons/google-chrome.svg" title="m1k1o/neko:google-chrome" width="60" height="auto"/>
|
||||
<img src="/img/icons/chromium.svg" title="m1k1o/neko:chromium" width="60" height="auto"/>
|
||||
<img src="/img/icons/microsoft-edge.svg" title="m1k1o/neko:microsoft-edge" width="60" height="auto"/>
|
||||
<img src="/img/icons/brave.svg" title="m1k1o/neko:brave" width="60" height="auto"/>
|
||||
<img src="/img/icons/vivaldi.svg" title="m1k1o/neko:vivaldi" width="60" height="auto"/>
|
||||
<img src="/img/icons/opera.svg" title="m1k1o/neko:opera" width="60" height="auto"/>
|
||||
<img src="/img/icons/tor-browser.svg" title="m1k1o/neko:tor-browser" width="60" height="auto"/>
|
||||
<img src="/img/icons/remmina.png" title="m1k1o/neko:remmina" width="60" height="auto"/>
|
||||
<img src="/img/icons/vlc.svg" title="m1k1o/neko:vlc" width="60" height="auto"/>
|
||||
<img src="/img/icons/xfce.svg" title="m1k1o/neko:xfce" width="60" height="auto"/>
|
||||
<img src="/img/icons/kde.svg" title="m1k1o/neko:kde" width="60" height="auto"/>
|
||||
</div>
|
||||
|
||||
|
||||
Use the following docker images from [Docker Hub](https://hub.docker.com/r/m1k1o/neko) for x86_64:
|
||||
- `m1k1o/neko:latest` or `m1k1o/neko:firefox` - for Firefox.
|
||||
- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:google-chrome` - for Google Chrome (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @whalehub).
|
||||
- `m1k1o/neko:microsoft-edge` - for Microsoft Edge (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:brave` - for [Brave Browser](https://brave.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||
- `m1k1o/neko:vivaldi` - for [Vivaldi Browser](https://vivaldi.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @Xeddius).
|
||||
- `m1k1o/neko:opera` for [Opera Browser](https://opera.com) (requires extra steps to enable DRM, see instructions [here](https://www.reddit.com/r/operabrowser/wiki/opera/linux_widevine_config/). libffmpeg is already configured.) (by @prophetofxenu)
|
||||
- `m1k1o/neko:tor-browser` - for Tor Browser.
|
||||
- `m1k1o/neko:remmina` - for remote desktop connection (by @lowne).
|
||||
- Pass env var `REMMINA_URL=<proto>://[<username>[:<password>]@]server[:port]` (proto being `vnc`, `rdp` or `spice`).
|
||||
- Or create your custom configuration with remmina locally (it's saved in `~/.local/share/remmina/path_to_profile.remmina`) and bind-mount it, then pass env var `REMMINA_PROFILE=<path_to_profile.remmina>`.
|
||||
- `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` or `m1k1o/neko:kde` - for a shared desktop / installing shared software.
|
||||
- `m1k1o/neko:base` - for custom base.
|
||||
|
||||
Dockerhub images are built using GitHub actions on every push and on weekly basis to keep all browsers up-to-date.
|
||||
|
||||
All images are also available on [GitHub Container Registry](https://github.com/m1k1o?tab=packages&repo_name=neko) for faster pulls:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/brave:latest`
|
||||
- `ghcr.io/m1k1o/neko/vivaldi:latest`
|
||||
- `ghcr.io/m1k1o/neko/opera:latest`
|
||||
- `ghcr.io/m1k1o/neko/tor-browser:latest`
|
||||
- `ghcr.io/m1k1o/neko/remmina:latest`
|
||||
- `ghcr.io/m1k1o/neko/vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/xfce:latest`
|
||||
- `ghcr.io/m1k1o/neko/kde:latest`
|
||||
|
||||
For ARM-based images (like Raspberry Pi - with GPU hardware acceleration, Oracle Cloud ARM tier). Currently, not all images are available for ARM, because not all applications are available for ARM.
|
||||
|
||||
:::danger IMPORTANT
|
||||
`m1k1o/neko:arm-*` images from dockerhub are currently not maintained and they can contain outdated software.
|
||||
:::
|
||||
|
||||
Please use images below:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/arm-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/arm-xfce:latest`
|
||||
|
||||
For images with VAAPI GPU hardware acceleration using intel drivers use:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/intel-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-ungoogled-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-brave:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-vivaldi:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-opera:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-tor-browser:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-remmina:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-vlc:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
|
||||
- `ghcr.io/m1k1o/neko/intel-kde:latest`
|
||||
|
||||
For images with Nvidia GPU hardware acceleration using EGL (more info [here](/docs/gpu-acceleration/nvidia)) use:
|
||||
|
||||
- `ghcr.io/m1k1o/neko/nvidia-firefox:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-chromium:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-google-chrome:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-microsoft-edge:latest`
|
||||
- `ghcr.io/m1k1o/neko/nvidia-brave:latest`
|
||||
|
||||
GHCR images are built using GitHub actions for every tag.
|
||||
|
||||
:::tip
|
||||
For more applications, check out [m1k1o/neko-apps](https://github.com/m1k1o/neko-apps).
|
||||
:::
|
|
@ -1,3 +1,7 @@
|
|||
---
|
||||
sidebar_position: 7
|
||||
---
|
||||
|
||||
# Examples
|
||||
|
||||
## Firefox
|
||||
|
@ -66,42 +70,6 @@ services:
|
|||
NEKO_NAT1TO1: <your-IP>
|
||||
```
|
||||
|
||||
## Raspberry Pi
|
||||
|
||||
```yaml
|
||||
version: "3.4"
|
||||
services:
|
||||
neko:
|
||||
# see docs for more variants
|
||||
image: "ghcr.io/m1k1o/neko/arm-chromium:latest"
|
||||
restart: "unless-stopped"
|
||||
# increase on rpi's with more then 1gb ram.
|
||||
shm_size: "520mb"
|
||||
ports:
|
||||
- "8088:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
# note: 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
|
||||
# note: when setting NEKO_VIDEO, then variables NEKO_MAX_FPS and NEKO_VIDEO_BITRATE
|
||||
# are not being used, you can adjust them in this variable.
|
||||
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=1,video_bitrate=1250000;"
|
||||
! h264parse config-interval=3
|
||||
! video/x-h264,stream-format=byte-stream,profile=constrained-baseline
|
||||
NEKO_VIDEO_CODEC: h264
|
||||
```
|
||||
|
||||
## Not using docker?
|
||||
|
||||
You can execute `neko --help` to see available arguments. In [Dockerfile](https://github.com/m1k1o/neko/blob/master/.docker/base/Dockerfile) you can find required dependencies and install them manually.
|
|
@ -1,44 +1,63 @@
|
|||
---
|
||||
sidebar_position: 9
|
||||
---
|
||||
|
||||
# Frequently Asked Questions
|
||||
|
||||
## How to enable debug mode?
|
||||
|
||||
To see verbose information from n.eko server, you can enable debug mode using `NEKO_DEBUG`.
|
||||
|
||||
```diff
|
||||
version: "3.4"
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
+ NEKO_DEBUG: 1
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
# highlight-start
|
||||
NEKO_DEBUG: 1
|
||||
# highlight-end
|
||||
```
|
||||
|
||||
Ensure, that you have enabled debug mode in javascript console too, in order to see verbose information from client.
|
||||
|
||||
## Chinese input method is not working
|
||||
|
||||
There exists an extension for Chrome that allows you to use Chinese input method. You can install it from [here](https://chrome.google.com/webstore/detail/mclkkofklkfljcocdinagocijmpgbhab). Alternatively, you can use Google Input Tools from [here](https://www.google.com/inputtools/chrome/).
|
||||
There exists an extension [Google Input Tools](https://chrome.google.com/webstore/detail/mclkkofklkfljcocdinagocijmpgbhab) for Chrome that allows you to use Chinese input method.
|
||||
|
||||
## Only black screen is displayed but remote cursor is moving for Chromium-based browsers (Chrome, Edge, etc.)
|
||||
|
||||
Check if you did not forget to add cap_add to your docker-compose file.
|
||||
|
||||
```yaml
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:chromium"
|
||||
# highlight-start
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
- SYS_ADMIN
|
||||
# highlight-end
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: '1920x1080@30'
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
```
|
||||
|
||||
## How can I embed the Neko desktop into web page without login prompt coming up for viewers?
|
||||
## How can I embed the Neko desktop into web page without login prompt coming up for viewers?
|
||||
|
||||
You can use the following URL to embed the Neko desktop into a web page without login prompt coming up for viewers:
|
||||
|
Before Width: | Height: | Size: 2.9 MiB After Width: | Height: | Size: 2.9 MiB |
4
webpage/docs/gpu-acceleration/_category_.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"label": "GPU Acceleration",
|
||||
"position": 5
|
||||
}
|
86
webpage/docs/gpu-acceleration/nvidia.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Nvidia GPU Acceleration
|
||||
|
||||
:::danger
|
||||
There is a known issue with EGL and Chromium-based browsers, see [WebGL not working for Nvidia Google Chrome 112.x](https://github.com/m1k1o/neko/issues/279).
|
||||
That means currently only Firefox is supported for Nvidia GPU acceleration.
|
||||
:::
|
||||
|
||||
You need to have [NVIDIA Container Toolkit](https://github.com/NVIDIA/nvidia-container-toolkit) installed, start the container with `--gpus all` flag and use images built for nvidia (see [Docker Images](/docs/docker-images)).
|
||||
|
||||
```bash
|
||||
docker run -d --gpus all \
|
||||
-p 8080:8080 \
|
||||
-p 56000-56100:56000-56100/udp \
|
||||
-e NEKO_SCREEN=1920x1080@30 \
|
||||
-e NEKO_PASSWORD=neko \
|
||||
-e NEKO_PASSWORD_ADMIN=admin \
|
||||
-e NEKO_EPR=56000-56100 \
|
||||
-e NEKO_NAT1TO1=192.168.1.10 \
|
||||
-e NEKO_ICELITE=1 \
|
||||
-e NEKO_VIDEO_CODEC=h264 \
|
||||
-e NEKO_HWENC=nvenc \
|
||||
--shm-size=2gb \
|
||||
--cap-add=SYS_ADMIN \
|
||||
--name neko \
|
||||
ghcr.io/m1k1o/neko/nvidia-google-chrome:latest
|
||||
```
|
||||
|
||||
If you want to use docker-compose, you can use this example:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
neko:
|
||||
image: "ghcr.io/m1k1o/neko/nvidia-google-chrome:latest"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "56000-56100:56000-56100/udp"
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
environment:
|
||||
NEKO_SCREEN: '1920x1080@30'
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 56000-56100
|
||||
NEKO_NAT1TO1: 192.168.1.10
|
||||
NEKO_VIDEO_CODEC: h264
|
||||
NEKO_HWENC: nvenc
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: nvidia
|
||||
count: 1
|
||||
capabilities: [gpu]
|
||||
```
|
||||
|
||||
- You can verify that GPU is available inside the container by running `docker exec -it neko nvidia-smi` command.
|
||||
- You can verify that GPU is used for encoding by searching for `nvh264enc` in `docker logs neko` output.
|
||||
- If you don'ŧ specify `NEKO_HWENC: nvenc` environment variable, CPU encoding will be used but GPU will still be available for browser rendering.
|
||||
|
||||
Broadcast pipeline is not hardware accelerated by default. You can use this pipeline created by [@evilalmus](https://github.com/m1k1o/neko/issues/276#issuecomment-1498362533).
|
||||
|
||||
```yaml
|
||||
NEKO_BROADCAST_PIPELINE: |
|
||||
flvmux name=mux
|
||||
! rtmpsink location={url} pulsesrc device={device}
|
||||
! audio/x-raw,channels=2
|
||||
! audioconvert
|
||||
! voaacenc
|
||||
! mux.
|
||||
ximagesrc display-name={display} show-pointer=false use-damage=false
|
||||
! video/x-raw,framerate=30/1
|
||||
! videoconvert
|
||||
! queue
|
||||
! video/x-raw,format=NV12
|
||||
! nvh264enc name=encoder preset=low-latency-hq gop-size=25 spatial-aq=true temporal-aq=true bitrate=2800 vbv-buffer-size=2800 rc-mode=6
|
||||
! h264parse config-interval=-1
|
||||
! video/x-h264,stream-format=byte-stream,profile=high
|
||||
! h264parse
|
||||
! mux.
|
||||
```
|
43
webpage/docs/gpu-acceleration/raspberry.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Raspberry Pi
|
||||
|
||||
|
||||
To set up GPU acceleration on a Raspberry Pi for the Neko application, you can use the following Docker Compose configuration.
|
||||
|
||||
It is required to run in privileged mode to access the GPU. The `shm_size` should be increased on Raspberry Pi's with more than 1GB of RAM.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
neko:
|
||||
# see docs for more variants
|
||||
image: "ghcr.io/m1k1o/neko/arm-chromium:latest"
|
||||
restart: "unless-stopped"
|
||||
# increase on rpi's with more then 1gb ram.
|
||||
shm_size: "520mb"
|
||||
ports:
|
||||
- "8088:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
# note: 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
|
||||
# note: when setting NEKO_VIDEO, then variables NEKO_MAX_FPS and NEKO_VIDEO_BITRATE
|
||||
# are not being used, you can adjust them in this variable.
|
||||
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=1,video_bitrate=1250000;"
|
||||
! h264parse config-interval=3
|
||||
! video/x-h264,stream-format=byte-stream,profile=constrained-baseline
|
||||
NEKO_VIDEO_CODEC: h264
|
||||
```
|
133
webpage/docs/networking.md
Normal file
|
@ -0,0 +1,133 @@
|
|||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# 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`)-
|
||||
|
||||
Currently, it is not supported to supply multiple NAT addresses directly to neko (see [#47](https://github.com/m1k1o/neko/issues/47)).
|
||||
|
||||
But it can be acheived by deploying own turn server alongside neko that is accessible from your LAN, see [Using turn servers instead of port forwarding](#using-turn-servers-instead-of-port-forwarding).
|
||||
|
||||
## Why so many ports?
|
||||
|
||||
- WebRTC needs UDP ports in order to transfer Audio/Video towards user and Mouse/Keyboard events to the server in real time.
|
||||
- If you don't set `NEKO_ICELITE=true`, every user will need 2 UDP ports.
|
||||
- If you set `NEKO_ICELITE=true`, every user will need only 1 UDP port. It is **recommended** to use *ice-lite*.
|
||||
- Do not forget, they are **UDP** ports, that configuration must be correct in your firewall/router/docker.
|
||||
- You can freely limit number of UDP ports. But you can't map them to different ports.
|
||||
- This **WON'T** work: `32000-32100:52000-52100/udp`
|
||||
- You can change API port (8080).
|
||||
- This **WILL** work: `3000:8080`
|
||||
|
||||
## Using mux instead of epr
|
||||
|
||||
When using a mux, not so many ports are needed.
|
||||
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
# highlight-start
|
||||
- "8081:8081/tcp"
|
||||
- "8082:8082/udp"
|
||||
# highlight-end
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
# highlight-start
|
||||
NEKO_TCPMUX: 8081
|
||||
NEKO_UDPMUX: 8082
|
||||
# highlight-end
|
||||
NEKO_ICELITE: 1
|
||||
```
|
||||
|
||||
- When using mux, `NEKO_EPR` is ignored.
|
||||
- Mux accepts only one port, not a range.
|
||||
- You only need to expose maximum two ports for WebRTC on your router/firewall and have many users connected.
|
||||
- It can even be the same port number, so e.g. `NEKO_TCPMUX: 8081` and `NEKO_UDPMUX: 8081`.
|
||||
- The same port must be exposed from docker container, you can't map them to different ports. So `8082:8082` is OK, but `"5454:8082` will not work.
|
||||
- You can use them alone (either TCP or UDP) when needed.
|
||||
- UDP is generally better for latency. But some networks block UDP so it is good to have TCP available as fallback.
|
||||
- Still, using `NEKO_ICELITE=true` is recommended.
|
||||
|
||||
## Using turn servers instead of port forwarding
|
||||
|
||||
- If you don't want to use port forwarding, you can use turn servers.
|
||||
- But you need to have your own turn server (e.g. [cotrun](https://github.com/coturn/coturn)) or have access to one.
|
||||
- They are generally not free, because they require a lot of bandwidth.
|
||||
- Please make sure that you correctly escape your turn server credentials in the environment variable or use aphostrophes.
|
||||
|
||||
```json title="NEKO_ICESERVERS"
|
||||
[
|
||||
{
|
||||
"urls": [
|
||||
"turn:<MY-COTURN-SERVER>:443?transport=udp",
|
||||
"turn:<MY-COTURN-SERVER>:443?transport=tcp",
|
||||
"turns:<MY-COTURN-SERVER>:443?transport=udp",
|
||||
"turns:<MY-COTURN-SERVER>:443?transport=tcp"
|
||||
],
|
||||
"credential": "<MY-COTURN-CREDENTIAL>"
|
||||
},
|
||||
{
|
||||
"urls": [
|
||||
"stun:stun.nextcloud.com:443"
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Example with coturn
|
||||
|
||||
This setup adds local turn server to neko. It won't be reachable by your remote clients and your own IP won't be reachable from your lan. So it effectively just adds local candidate and allows connections from LAN.
|
||||
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
# highlight-start
|
||||
NEKO_ICESERVERS: |
|
||||
[{
|
||||
"urls": [ "turn:<MY-COTURN-SERVER>:3478" ],
|
||||
"username": "neko",
|
||||
"credential": "neko"
|
||||
},{
|
||||
"urls": [ "stun:stun.nextcloud.com:3478" ]
|
||||
}]
|
||||
# highlight-end
|
||||
coturn:
|
||||
image: 'coturn/coturn:latest'
|
||||
network_mode: "host"
|
||||
command: |
|
||||
-n
|
||||
--realm=localhost
|
||||
--fingerprint
|
||||
--listening-ip=0.0.0.0
|
||||
--external-ip=<MY-COTURN-SERVER>
|
||||
--listening-port=3478
|
||||
--min-port=49160
|
||||
--max-port=49200
|
||||
--log-file=stdout
|
||||
--user=neko:neko
|
||||
--lt-cred-mech
|
||||
```
|
||||
|
||||
- Replace `<MY-COTURN-SERVER>` with your LAN IP address, and allow ports `49160-49200/udp` and `3478/tcp` in your LAN.
|
||||
- Make sure you don't use `NEKO_ICELITE: true` because ICE LITE does not support TURN servers.
|
48
webpage/docs/others.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
---
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
# Others
|
||||
|
||||
- **Want to use VPN for your n.eko browsing?** Check this out: https://github.com/m1k1o/neko-vpn
|
||||
- **Want to have multiple rooms on demand?** Check this out: https://github.com/m1k1o/neko-rooms
|
||||
- **Want to use different Apps than Browser?** Check this out: https://github.com/m1k1o/neko-apps
|
||||
|
||||
## Accounts
|
||||
|
||||
- There are no accounts, display name (a.k.a. username) can be freely chosen. Only password needs to match. Depending on which password matches, the visitor gets its privilege:
|
||||
- Anyone, who enters with `NEKO_PASSWORD` will be **user**.
|
||||
- Anyone, who enters with `NEKO_PASSWORD_ADMIN` will be **admin**.
|
||||
- Disabling passwords is not possible. However, you can use following query parameters to create auto-join links:
|
||||
- Adding `?pwd=<password>` will prefill password.
|
||||
- Adding `?usr=<display-name>` will prefill username.
|
||||
- Adding `?cast=1` will hide all control and show only video.
|
||||
- Adding `?embed=1` will hide most additional components and show only video.
|
||||
- Adding `?volume=<0-1>` will set volume to given value.
|
||||
- Adding `?lang=<language>` will set language to given value.
|
||||
- Adding `?show_side=1` will show the sidebar on startup.
|
||||
- Adding `?mute_chat=1` will mute the chat on startup.
|
||||
- e.g. `http(s)://<URL:Port>/?pwd=neko&usr=guest&cast=1`
|
||||
|
||||
## Screen size
|
||||
|
||||
- Only admins can change screen size.
|
||||
- You can set a default screen size, but this size **MUST** be one from the list, that your server supports.
|
||||
- You will get this list in frontend, where you can choose from.
|
||||
|
||||
## Clipboard sharing
|
||||
|
||||
- Browsers have certain requirements to allow clipboard sharing.
|
||||
- Your instance must be HTTPS.
|
||||
- Firefox does not support clipboard sharing.
|
||||
- Use Chrome for the best experience.
|
||||
- If your browser does not support clipboard sharing:
|
||||
- Clipboard icon in the bottom right corner will be displayed for host.
|
||||
- It opens text area that can share clipboard content bi-directionally.
|
||||
- Only plain-text is supported.
|
||||
|
||||
## File transfer
|
||||
|
||||
With `NEKO_FILE_TRANSFER_ENABLED=true`:
|
||||
|
||||

|
177
webpage/docs/reverse-proxy.md
Normal file
|
@ -0,0 +1,177 @@
|
|||
---
|
||||
sidebar_position: 8
|
||||
---
|
||||
|
||||
# Reverse Proxy
|
||||
|
||||
## Traefik2
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.neko-frontend.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.neko.rule=${TRAEFIK_RULE}"
|
||||
- "traefik.http.routers.neko.entrypoints=${TRAEFIK_ENTRYPOINTS}"
|
||||
- "traefik.http.routers.neko.tls.certresolver=${TRAEFIK_CERTRESOLVER}"
|
||||
```
|
||||
|
||||
(by [@m1k1o](https://github.com/m1k1o), [example](https://github.com/m1k1o/neko-vpn/blob/a1b934515dcf597992a515d61d307c2450a11002/docker-compose.yml#L38-L43))
|
||||
|
||||
## Nginx
|
||||
|
||||
```conf
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name example.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 86400;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(by [@GigaFyde](https://github.com/GigaFyde), [source](https://github.com/nurdism/neko/issues/111#issuecomment-742656957))
|
||||
|
||||
## Apache
|
||||
|
||||
After successfully installing and running neko, you might want to get rid of the port in the url, use DNS instead of IP address and also having SSL.
|
||||
This will remove the port from the URL and also enables HTTPS.
|
||||
|
||||
To do this, you have to get running Apache server. Now you can go into the `/etc/apache2/sites-available` folder and create new config file for example `neko.conf`
|
||||
After creating new config file, you can use this example config and paste it in. Some things may vary on your machine so read through and modify if needed.
|
||||
Bear in mind that your neko server doesn't have to run on the same computer as Apache. They just have to be on the same network, and then you replace localhost with correct internal IP.
|
||||
|
||||
```xml
|
||||
<VirtualHost *:80>
|
||||
# The ServerName directive sets the request scheme, hostname and port that
|
||||
# the server uses to identify itself. This is used when creating
|
||||
# redirection URLs. In the context of virtual hosts, the ServerName
|
||||
# specifies what hostname must appear in the request's Host: header to
|
||||
# match this virtual host. For the default virtual host (this file) this
|
||||
# value is not decisive as it is used as a last resort host regardless.
|
||||
# However, you must set it for any further virtual host explicitly.
|
||||
|
||||
# Paths of those modules might vary across different distros.
|
||||
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
|
||||
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
|
||||
LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so
|
||||
|
||||
ServerName example.com
|
||||
ServerAlias www.example.com
|
||||
|
||||
ProxyRequests Off
|
||||
ProxyPass / http://localhost:8080/
|
||||
ProxyPassReverse / http://localhost:8080/
|
||||
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule /ws(.*) "ws://localhost:8080/ws$1" [P,L]
|
||||
|
||||
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
|
||||
# error, crit, alert, emerg.
|
||||
# It is also possible to configure the loglevel for particular
|
||||
# modules, e.g.
|
||||
#LogLevel info ssl:warn
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||
|
||||
# For most configuration files from conf-available/, which are
|
||||
# enabled or disabled at a global level, it is possible to
|
||||
# include a line for only one particular virtual host. For example the
|
||||
# following line enables the CGI configuration for this host only
|
||||
# after it has been globally disabled with "a2disconf".
|
||||
#Include conf-available/serve-cgi-bin.conf
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
(by [@DarkReaper231](https://github.com/DarkReaper231), [source](https://github.com/nurdism/neko/blob/cad98a62a5bd7f1daf2c11980631bb14ba81a1f6/docs/apache-proxypass-config.md#example-apache-config))
|
||||
|
||||
After creating your new config file, just use `sudo a2ensite neko.conf` and then `sudo systemctl reload apache2`
|
||||
|
||||
### Enabling SSL
|
||||
|
||||
If you want to use SSL for your apache configuration, you can install certbot and use it with `sudo certbot`
|
||||
Then you can just select both `example.com` and `www.example.com` and apply. This will copy your `neko.conf` file and creates one for SSL.
|
||||
|
||||
## Caddy
|
||||
|
||||
```conf
|
||||
https://example.com {
|
||||
reverse_proxy localhost:8080 {
|
||||
header_up Host {host}
|
||||
header_up X-Real-IP {remote_host}
|
||||
header_up X-Forwarded-For {remote_host}
|
||||
header_up X-Forwarded-Proto {scheme}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(by [@ccallahan](https://github.com/ccallahan), [source](https://github.com/nurdism/neko/pull/125/commits/eb4ceda75423b0d960c8aea0240acf6d7a10fef4))
|
||||
|
||||
## HAProxy
|
||||
|
||||
Using your frontend section *(mine is called http-in)*, add the ACL to redirect correctly to your n.eko instance.
|
||||
|
||||
```sh
|
||||
frontend http-in
|
||||
#/********
|
||||
#* NEKO *
|
||||
acl neko_rule_http hdr(host) neko.domain.com # Adapt the domain
|
||||
use_backend neko_srv if neko_rule_http
|
||||
#********/
|
||||
|
||||
backend neko_srv
|
||||
mode http
|
||||
option httpchk
|
||||
server neko 172.16.0.0:8080 # Adapt the IP
|
||||
```
|
||||
|
||||
Then, restart the haproxy service.
|
||||
```sh
|
||||
service haproxy restart
|
||||
```
|
||||
|
||||
### Having trouble reaching your HAProxy ?
|
||||
|
||||
Try the following steps:
|
||||
|
||||
- Verify the logs / what HAProxy is telling you :
|
||||
```sh
|
||||
service haproxy status
|
||||
```
|
||||
|
||||
- If the service is UP and the ACL rule + backend is OK then tail the log and keep them to verify :
|
||||
```sh
|
||||
tail -f /var/log/haproxy.log
|
||||
# after that, go to your neko.instance.com and look for the logs in the shell
|
||||
```
|
||||
|
||||
- Ensure you set the timeout to 60 seconds before the request fail.
|
||||
```sh
|
||||
global
|
||||
stats timeout 60s
|
||||
```
|
||||
|
||||
- Ensure you set the forwardfor and the timeout aswell in the defaults section.
|
||||
```sh
|
||||
defaults
|
||||
option forwardfor
|
||||
timeout connect 30000
|
||||
timeout client 65000
|
||||
timeout server 65000
|
||||
```
|
||||
*(Don't forget to restart the service each time you modify the `.cfg` file !)*
|
||||
|
||||
(by [@RisedSky](https://github.com/RisedSky))
|
|
@ -1,3 +1,7 @@
|
|||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
Neko UI loads, but you don't see the screen, and it gives you `connection timeout` or `disconnected` error?
|
||||
|
@ -23,22 +27,25 @@ Check that your ephemeral port range `NEKO_EPR` is correctly exposed as `/udp` p
|
|||
|
||||
In following example, specified range `52000-52100` must be also exposed using docker.
|
||||
|
||||
```diff
|
||||
version: "3.4"
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
+ - "52000-52100:52000-52100/udp"
|
||||
- "8080:8080"
|
||||
# highlight-start
|
||||
- "52000-52100:52000-52100/udp"
|
||||
# highlight-end
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
+ NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
# highlight-start
|
||||
NEKO_EPR: 52000-52100
|
||||
# highlight-end
|
||||
NEKO_ICELITE: 1
|
||||
```
|
||||
|
||||
### Validate UDP ports reachability
|
||||
|
@ -58,7 +65,7 @@ nc -u [server ip] 52101
|
|||
```
|
||||
Then try to type on one end, you should see characters on the other side.
|
||||
|
||||

|
||||

|
||||
|
||||
If it does not work for you, then most likely your port forwarding is not working correctly. Or your ISP is blocking traffic.
|
||||
|
||||
|
@ -87,44 +94,46 @@ You should see this:
|
|||
|
||||
If your IP is not correct, you can specify own IP resolver using `NEKO_IPFETCH`. It needs to return IP address that will be used.
|
||||
|
||||
```diff
|
||||
version: "3.4"
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
+ NEKO_IPFETCH: https://ifconfig.co/ip
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
# highlight-start
|
||||
NEKO_IPFETCH: https://ifconfig.co/ip
|
||||
# highlight-end
|
||||
```
|
||||
|
||||
Or you can specify your IP address manually using `NEKO_NAT1TO1`: (It's read as NAT 1 to 1, so it's capital letter 'O', not zero '0', in NAT1`TO`1)
|
||||
|
||||
```diff
|
||||
version: "3.4"
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
+ NEKO_NAT1TO1: <your-IP>
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
# highlight-start
|
||||
NEKO_NAT1TO1: <your-IP>
|
||||
# highlight-end
|
||||
```
|
||||
|
||||
If you want to use n.eko only locally, you must put here your local IP address, otherwise public address will be used.
|
||||
|
@ -134,14 +143,14 @@ If you want to use n.eko only locally, you must put here your local IP address,
|
|||
You are probably missing NAT Loopback (NAT Hairpinning) setting on your router.
|
||||
|
||||
Example for pfsense with truecharts docker container:
|
||||
- First, port forward the relevant ports 8080 and 52000-52100/udp for the container.
|
||||
- First, port forward the relevant ports `8080` and `52000-52100/udp` for the container.
|
||||
- Then turn on `Pure NAT` pfsense (under system > advanced > firewall and nat).
|
||||
- Make sure to check the two boxes so it works.
|
||||
- Make sure `NEKO_NAT1TO1` is blank and `NEKO_IPFETCH` address is working correctly (if unset default value is chosen).
|
||||
- Test externally to confirm it works.
|
||||
- Internally you have to access it using `<your-public-ip>:port`
|
||||
|
||||
If your router does not support NAT Loopback (NAT Hairpinning), you can use turn servers to overcome this issue. See [more details here](https://neko.m1k1o.net/#/getting-started/?id=networking) on how to setup local coturn instance.
|
||||
If your router does not support NAT Loopback (NAT Hairpinning), you can use turn servers to overcome this issue. See [more details here](/docs/networking) on how to setup local coturn instance.
|
||||
|
||||
### Neko works locally, but not externally
|
||||
|
||||
|
@ -153,23 +162,23 @@ If you put local ip as `NEKO_NAT1TO1`, external clients try to connect to that i
|
|||
|
||||
To see verbose information from n.eko server, you can enable debug mode using `NEKO_DEBUG`.
|
||||
|
||||
```diff
|
||||
version: "3.4"
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: "m1k1o/neko:firefox"
|
||||
restart: "unless-stopped"
|
||||
shm_size: "2gb"
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
- "8080:8080"
|
||||
- "52000-52100:52000-52100/udp"
|
||||
environment:
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
NEKO_ICELITE: 1
|
||||
+ NEKO_DEBUG: 1
|
||||
NEKO_SCREEN: 1920x1080@30
|
||||
NEKO_PASSWORD: neko
|
||||
NEKO_PASSWORD_ADMIN: admin
|
||||
NEKO_EPR: 52000-52100
|
||||
# highlight-start
|
||||
NEKO_DEBUG: 1
|
||||
# highlight-end
|
||||
```
|
||||
|
||||
Ensure, that you have enabled debug mode in javascript console too, in order to see verbose information from client.
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
@ -67,7 +67,22 @@ const config: Config = {
|
|||
type: 'docSidebar',
|
||||
sidebarId: 'tutorialSidebar',
|
||||
position: 'left',
|
||||
label: 'Tutorial',
|
||||
label: 'Docs',
|
||||
},
|
||||
{
|
||||
to: 'contributing',
|
||||
label: 'Contributing',
|
||||
position: 'left',
|
||||
},
|
||||
{
|
||||
to: 'non-goals',
|
||||
label: 'Non-Goals',
|
||||
position: 'left',
|
||||
},
|
||||
{
|
||||
to: 'changelog',
|
||||
label: 'Changelog',
|
||||
position: 'left',
|
||||
},
|
||||
{
|
||||
href: 'https://github.com/m1k1o/neko',
|
||||
|
@ -80,11 +95,19 @@ const config: Config = {
|
|||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Docs',
|
||||
title: 'Other Projects',
|
||||
items: [
|
||||
{
|
||||
label: 'Tutorial',
|
||||
to: '/docs/intro',
|
||||
label: 'Neko Rooms',
|
||||
href: 'https://github.com/m1k1o/neko-rooms',
|
||||
},
|
||||
{
|
||||
label: 'Neko Apps',
|
||||
href: 'https://github.com/m1k1o/neko-apps',
|
||||
},
|
||||
{
|
||||
label: 'Neko VPN',
|
||||
href: 'https://github.com/m1k1o/neko-vpn',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 237 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |