mirror of
https://github.com/m1k1o/neko.git
synced 2025-06-02 02:42:47 +02:00
WIP new docs.
This commit is contained in:
parent
004e893921
commit
b23ca1af04
28 changed files with 1250 additions and 1204 deletions
|
@ -1,50 +0,0 @@
|
||||||
---
|
|
||||||
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,247 +0,0 @@
|
||||||
---
|
|
||||||
sidebar_position: 8
|
|
||||||
---
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
|
|
||||||
Config values can be set using three methods, sorted on this page by priority.
|
|
||||||
|
|
||||||
Example, setting `nat1to1` variable:
|
|
||||||
- As env variable: `NEKO_NAT1TO1=<ip>`
|
|
||||||
- As argument: `--nat1to1=<ip>`
|
|
||||||
- In YAML config file:
|
|
||||||
```yaml
|
|
||||||
nat1to1: <ip>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Environment variables
|
|
||||||
|
|
||||||
#### `NEKO_SCREEN`:
|
|
||||||
- Resolution after startup. Only Admins can change this later.
|
|
||||||
- e.g. `1920x1080@30`
|
|
||||||
#### `NEKO_PASSWORD`:
|
|
||||||
- Password for the user login.
|
|
||||||
- e.g. `user_password`
|
|
||||||
#### `NEKO_PASSWORD_ADMIN`:
|
|
||||||
- Password for the admin login.
|
|
||||||
- e.g. `admin_password`
|
|
||||||
#### `NEKO_CONTROL_PROTECTION`:
|
|
||||||
- Control protection means, users can gain control only if at least one admin is in the room.
|
|
||||||
- e.g. `false`
|
|
||||||
#### `NEKO_IMPLICIT_CONTROL`:
|
|
||||||
- If enabled members can gain control implicitly, they don't need to request control.
|
|
||||||
- e.g. `false`
|
|
||||||
#### `NEKO_LOCKS`:
|
|
||||||
- Resources, that will be locked when starting, separated by whitespace.
|
|
||||||
- Currently supported:
|
|
||||||
- `control`
|
|
||||||
- `login`
|
|
||||||
- `file_transfer`
|
|
||||||
- e.g. `control`
|
|
||||||
|
|
||||||
### WebRTC
|
|
||||||
|
|
||||||
#### `NEKO_EPR`:
|
|
||||||
- For WebRTC needed range of UDP ports.
|
|
||||||
- e.g. `52000-52099`
|
|
||||||
#### `NEKO_UDPMUX`:
|
|
||||||
- Alternative to epr with only one UDP port.
|
|
||||||
- e.g. `52100`
|
|
||||||
#### `NEKO_TCPMUX`:
|
|
||||||
- Use TCP connection, meant as fallback for UDP.
|
|
||||||
- e.g. `52100`
|
|
||||||
#### `NEKO_NAT1TO1`:
|
|
||||||
- IP of the server that will be sent to client, if not specified, public IP is automatically resolved.
|
|
||||||
- e.g. `10.0.0.1`
|
|
||||||
#### `NEKO_IPFETCH`:
|
|
||||||
- Automatically fetch IP address from given URL when `nat1to1` is not specified.
|
|
||||||
- e.g. `http://checkip.amazonaws.com`
|
|
||||||
#### `NEKO_ICELITE`:
|
|
||||||
- Use the ice lite protocol.
|
|
||||||
- e.g. `false`
|
|
||||||
#### `NEKO_ICESERVER`:
|
|
||||||
- Describes a single STUN and TURN server that can be used by the ICEAgent to establish a connection with a peer (simple usage for server without authentication).
|
|
||||||
- e.g. `stun:stun.l.google.com:19302`
|
|
||||||
#### `NEKO_ICESERVERS`:
|
|
||||||
- Describes multiple STUN and TURN server that can be used by the ICEAgent to establish a connection with a peer.
|
|
||||||
- e.g. `[{"urls": ["turn:turn.example.com:19302", "stun:stun.example.com:19302"], "username": "name", "credential": "password"}, {"urls": ["stun:stun.example2.com:19302"]}]`
|
|
||||||
- [More information](https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer)
|
|
||||||
|
|
||||||
### Video
|
|
||||||
|
|
||||||
#### `NEKO_VIDEO_CODEC`:
|
|
||||||
- vp8 *(default encoder)*
|
|
||||||
- vp9 *(parameter not optimized yet)*
|
|
||||||
- h264 *(second best option)*
|
|
||||||
#### `NEKO_VIDEO_BITRATE`:
|
|
||||||
- Bitrate of the video stream in kb/s.
|
|
||||||
- e.g. 3500
|
|
||||||
#### `NEKO_VIDEO`:
|
|
||||||
- Makes it possible to create custom gstreamer video pipeline. With this you could find the best quality for your CPU.
|
|
||||||
- Installed are
|
|
||||||
- `gstreamer1.0-plugins-base`
|
|
||||||
- `gstreamer1.0-plugins-good`
|
|
||||||
- `gstreamer1.0-plugins-bad`
|
|
||||||
- `gstreamer1.0-plugins-ugly`
|
|
||||||
- e.g. `ximagesrc display-name=%s show-pointer=true use-damage=false ! video/x-raw,framerate=30/1 ! videoconvert ! queue ! video/x-raw,format=NV12 ! x264enc threads=4 bitrate=3500 key-int-max=60 vbv-buf-capacity=4000 byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline`
|
|
||||||
#### `NEKO_MAX_FPS`:
|
|
||||||
- The resulting stream frames per seconds should be capped *(0 for uncapped)*.
|
|
||||||
- e.g. `0`
|
|
||||||
#### `NEKO_HWENC`:
|
|
||||||
- none *(default CPU encoding)*
|
|
||||||
- vaapi
|
|
||||||
- nvenc
|
|
||||||
|
|
||||||
### Audio
|
|
||||||
|
|
||||||
#### `NEKO_AUDIO_CODEC`:
|
|
||||||
- opus *(default encoder)*
|
|
||||||
- g722
|
|
||||||
- pcmu
|
|
||||||
- pcma
|
|
||||||
#### `NEKO_AUDIO_BITRATE`:
|
|
||||||
- Bitrate of the audio stream in kb/s.
|
|
||||||
- e.g. `196`
|
|
||||||
#### `NEKO_AUDIO`:
|
|
||||||
- Makes it possible to create custom gstreamer audio pipeline, same as for video.
|
|
||||||
e.g. `pulsesrc device=%s ! audio/x-raw,channels=2 ! audioconvert ! opusenc bitrate=128000`
|
|
||||||
|
|
||||||
### Broadcast
|
|
||||||
|
|
||||||
#### `NEKO_BROADCAST_PIPELINE`:
|
|
||||||
- Makes it possible to create custom gstreamer pipeline used for broadcasting, strings `{url}`, `{device}` and `{display}` will be replaced.
|
|
||||||
#### `NEKO_BROADCAST_URL`:
|
|
||||||
- Set a default URL for broadcast streams. It can be disabled/changed later by admins in the GUI.
|
|
||||||
- e.g. `rtmp://<your-server>:1935/ingest/<stream-key>`
|
|
||||||
#### `NEKO_BROADCAST_AUTOSTART`:
|
|
||||||
- Automatically start broadcasting when neko starts and broadcast_url is set.
|
|
||||||
- e.g. `true`
|
|
||||||
### Server
|
|
||||||
|
|
||||||
#### `NEKO_BIND`:
|
|
||||||
- Address/port/socket where neko binds to *(default 127.0.0.1:8080)*.
|
|
||||||
- e.g. `:8080`
|
|
||||||
#### `NEKO_CERT`:
|
|
||||||
- Path to the SSL-Certificate.
|
|
||||||
- e.g. `/certs/cert.pem`
|
|
||||||
#### `NEKO_KEY`:
|
|
||||||
- Path to the SSL-Certificate private key.
|
|
||||||
- e.g. `/certs/key.pem`
|
|
||||||
#### `NEKO_PROXY`:
|
|
||||||
- Enable reverse proxy mode, so that neko trusts `X-Forwarded-For` headers.
|
|
||||||
- e.g. `false`
|
|
||||||
#### `NEKO_PATH_PREFIX`:
|
|
||||||
- Path prefix for HTTP requests.
|
|
||||||
- e.g. `/neko/`
|
|
||||||
#### `NEKO_CORS`:
|
|
||||||
- Cross origin request sharing, whitespace separated list of allowed hosts, `*` for all.
|
|
||||||
- e.g. `127.0.0.1 neko.example.com`
|
|
||||||
|
|
||||||
### File Transfer
|
|
||||||
|
|
||||||
#### `NEKO_FILE_TRANSFER_ENABLED`:
|
|
||||||
- Enable file transfer feature.
|
|
||||||
- e.g. `true`
|
|
||||||
#### `NEKO_FILE_TRANSFER_PATH`:
|
|
||||||
- Path where files will be transferred between the host and users. By default, this is
|
|
||||||
`/home/neko/Downloads`. If the path doesn't exist, it will be created.
|
|
||||||
- e.g. `/home/neko/Desktop`
|
|
||||||
|
|
||||||
### Expert settings
|
|
||||||
|
|
||||||
#### `NEKO_DISPLAY`:
|
|
||||||
- XDisplay to capture.
|
|
||||||
#### `NEKO_DEVICE`:
|
|
||||||
- Audio device be to captured.
|
|
||||||
#### `NEKO_STATIC`:
|
|
||||||
- Path to neko client files to serve.
|
|
||||||
|
|
||||||
## Arguments
|
|
||||||
|
|
||||||
You can execute `neko serve --help` to see available arguments.
|
|
||||||
|
|
||||||
```
|
|
||||||
Usage:
|
|
||||||
neko serve [flags]
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
--audio string audio codec parameters to use for streaming
|
|
||||||
--audio_bitrate int audio bitrate in kbit/s (default 128)
|
|
||||||
--audio_codec string audio codec to be used (default "opus")
|
|
||||||
--bind string address/port/socket to serve neko (default "127.0.0.1:8080")
|
|
||||||
--broadcast_pipeline string custom gst pipeline used for broadcasting, strings {url} {device} {display} will be replaced
|
|
||||||
--broadcast_url string URL for broadcasting, setting this value will automatically enable broadcasting
|
|
||||||
--cert string path to the SSL cert used to secure the neko server
|
|
||||||
--control_protection control protection means, users can gain control only if at least one admin is in the room
|
|
||||||
--cors strings list of allowed origins for CORS (default [*])
|
|
||||||
--device string audio device to capture (default "audio_output.monitor")
|
|
||||||
--display string XDisplay to capture (default ":99.0")
|
|
||||||
--epr string limits the pool of ephemeral ports that ICE UDP connections can allocate from (default "59000-59100")
|
|
||||||
--file_transfer_enabled enable file transfer feature (default false)
|
|
||||||
--file_transfer_path string path to use for file transfer (default "/home/neko/Downloads")
|
|
||||||
--g722 DEPRECATED: use audio_codec
|
|
||||||
--h264 DEPRECATED: use video_codec
|
|
||||||
-h, --help help for serve
|
|
||||||
--hwenc string use hardware accelerated encoding
|
|
||||||
--icelite configures whether or not the ice agent should be a lite agent
|
|
||||||
--iceserver strings describes a single STUN and TURN server that can be used by the ICEAgent to establish a connection with a peer (default [stun:stun.l.google.com:19302])
|
|
||||||
--iceservers string describes a single STUN and TURN server that can be used by the ICEAgent to establish a connection with a peer
|
|
||||||
--implicit_control if enabled members can gain control implicitly
|
|
||||||
--ipfetch string automatically fetch IP address from given URL when nat1to1 is not present (default "http://checkip.amazonaws.com")
|
|
||||||
--key string path to the SSL key used to secure the neko server
|
|
||||||
--locks strings resources, that will be locked when starting (control, login)
|
|
||||||
--max_fps int maximum fps delivered via WebRTC, 0 is for no maximum (default 25)
|
|
||||||
--nat1to1 strings sets a list of external IP addresses of 1:1 (D)NAT and a candidate type for which the external IP address is used
|
|
||||||
--opus DEPRECATED: use audio_codec
|
|
||||||
--password string password for connecting to stream (default "neko")
|
|
||||||
--password_admin string admin password for connecting to stream (default "admin")
|
|
||||||
--path_prefix string path prefix for HTTP requests (default "/")
|
|
||||||
--pcma DEPRECATED: use audio_codec
|
|
||||||
--pcmu DEPRECATED: use audio_codec
|
|
||||||
--proxy enable reverse proxy mode
|
|
||||||
--screen string default screen resolution and framerate (default "1280x720@30")
|
|
||||||
--static string path to neko client files to serve (default "./www")
|
|
||||||
--tcpmux int single TCP mux port for all peers
|
|
||||||
--udpmux int single UDP mux port for all peers
|
|
||||||
--video string video codec parameters to use for streaming
|
|
||||||
--video_bitrate int video bitrate in kbit/s (default 3072)
|
|
||||||
--video_codec string video codec to be used (default "vp8")
|
|
||||||
--vp8 DEPRECATED: use video_codec
|
|
||||||
--vp9 DEPRECATED: use video_codec
|
|
||||||
|
|
||||||
Global Flags:
|
|
||||||
--config string configuration file path
|
|
||||||
-d, --debug enable debug mode
|
|
||||||
-l, --logs save logs to file
|
|
||||||
```
|
|
||||||
|
|
||||||
## Config file
|
|
||||||
|
|
||||||
You can mount YAML config file to docker container on this path `/etc/neko/neko.yaml` and store your configuration there.
|
|
||||||
|
|
||||||
Config uses the keys from arguments, that can be viewed in program's help output.
|
|
||||||
|
|
||||||
Example (with just some of the available arguments):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# audio bitrate in kbit/s
|
|
||||||
audio_bitrate: 128
|
|
||||||
|
|
||||||
# video bitrate in kbit/s
|
|
||||||
video_bitrate: 3072
|
|
||||||
|
|
||||||
# maximum fps delivered via WebRTC, 0 is for no maximum
|
|
||||||
max_fps: 25
|
|
||||||
|
|
||||||
# password for connecting to stream
|
|
||||||
password: "neko"
|
|
||||||
|
|
||||||
# admin password for connecting to stream
|
|
||||||
password_admin: "admin"
|
|
||||||
|
|
||||||
# default screen resolution and framerate
|
|
||||||
screen: "1280x720@30"
|
|
||||||
|
|
||||||
# limits the pool of ephemeral ports that ICE UDP connections can allocate from
|
|
||||||
epr: "59000-59100"
|
|
||||||
```
|
|
|
@ -1,75 +0,0 @@
|
||||||
---
|
|
||||||
sidebar_position: 7
|
|
||||||
---
|
|
||||||
|
|
||||||
# Examples
|
|
||||||
|
|
||||||
## Firefox
|
|
||||||
|
|
||||||
```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_NAT1TO1: <your-IP>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Chromium
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: "3.4"
|
|
||||||
services:
|
|
||||||
neko:
|
|
||||||
image: "m1k1o/neko:chromium"
|
|
||||||
restart: "unless-stopped"
|
|
||||||
shm_size: "2gb"
|
|
||||||
ports:
|
|
||||||
- "8080:8080"
|
|
||||||
- "52000-52100:52000-52100/udp"
|
|
||||||
cap_add:
|
|
||||||
- SYS_ADMIN
|
|
||||||
environment:
|
|
||||||
NEKO_SCREEN: '1920x1080@30'
|
|
||||||
NEKO_PASSWORD: neko
|
|
||||||
NEKO_PASSWORD_ADMIN: admin
|
|
||||||
NEKO_EPR: 52000-52100
|
|
||||||
NEKO_NAT1TO1: <your-IP>
|
|
||||||
```
|
|
||||||
|
|
||||||
## VLC
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: "3.4"
|
|
||||||
services:
|
|
||||||
neko:
|
|
||||||
image: "m1k1o/neko:vlc"
|
|
||||||
restart: "unless-stopped"
|
|
||||||
shm_size: "2gb"
|
|
||||||
volumes:
|
|
||||||
- "<your-video-folder>:/video"
|
|
||||||
ports:
|
|
||||||
- "8080:8080"
|
|
||||||
- "52000-52100:52000-52100/udp"
|
|
||||||
cap_add:
|
|
||||||
- SYS_ADMIN
|
|
||||||
environment:
|
|
||||||
NEKO_SCREEN: '1920x1080@30'
|
|
||||||
NEKO_PASSWORD: neko
|
|
||||||
NEKO_PASSWORD_ADMIN: admin
|
|
||||||
NEKO_EPR: 52000-52100
|
|
||||||
NEKO_NAT1TO1: <your-IP>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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,76 +0,0 @@
|
||||||
---
|
|
||||||
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`.
|
|
||||||
|
|
||||||
```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_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 [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 title="docker-compose.yml"
|
|
||||||
services:
|
|
||||||
neko:
|
|
||||||
image: "m1k1o/neko:chromium"
|
|
||||||
# highlight-start
|
|
||||||
cap_add:
|
|
||||||
- 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?
|
|
||||||
|
|
||||||
You can use the following URL to embed the Neko desktop into a web page without login prompt coming up for viewers:
|
|
||||||
|
|
||||||
```
|
|
||||||
http://<your-neko-server-ip>:8080/?usr=neko&pwd=neko
|
|
||||||
```
|
|
||||||
|
|
||||||
https://stackoverflow.com/questions/15276929/how-to-make-a-video-fullscreen-when-it-is-placed-inside-an-iframe
|
|
||||||
|
|
||||||
Your iframe needs an attribute: `allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"` or more modern `allow="fullscreen *"`. For the second you can remove the star if your iframe has the same origin or replace it with your iframe origin.
|
|
||||||
|
|
||||||
## Can I use neko without docker?
|
|
||||||
|
|
||||||
It is strongly recommended to use Neko with Docker, as it is the easiest way to run it. But you should be able to install Neko "natively" on your host system. Neko is based on Debian and uses Xorg and Pulseaudio. You would just need to follow steps that are in Dockerfile, install all dependencies on your host system and then just run it.
|
|
||||||
|
|
||||||
However, it is recommend to start with existing system that has GUI with desktop manager, is based on Xorg and uses Pulseaudio (e.g. Ubuntu Desktop 22.04). For that matter you only need to install gstreamer dependencies, configure pulseaudio properly and run neko binary (you don't need to build it from scratch, you can copy it from docker image).
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.9 MiB |
4
webpage/docs/getting-started/_category_.json
Normal file
4
webpage/docs/getting-started/_category_.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"label": "Getting Started"
|
||||||
|
}
|
106
webpage/docs/getting-started/configuration/configuration.tsx
Normal file
106
webpage/docs/getting-started/configuration/configuration.tsx
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
import React from 'react';
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
import CodeBlock from '@theme/CodeBlock';
|
||||||
|
import configOptions from './help.json';
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const environmentVariables = () => {
|
||||||
|
let code = '';
|
||||||
|
configOptions.forEach(option => {
|
||||||
|
let value = ""
|
||||||
|
if (option.defaultValue) {
|
||||||
|
value = `"${option.defaultValue}"`
|
||||||
|
} else if (option.type) {
|
||||||
|
value = `<${option.type}>`
|
||||||
|
}
|
||||||
|
code += `# ${option.description}\n`;
|
||||||
|
code += `NEKO_${option.key.join('_').toUpperCase()}: ${value}\n`;
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<CodeBlock language="yaml">
|
||||||
|
{code}
|
||||||
|
</CodeBlock>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cmdArguments = () => {
|
||||||
|
let code = '';
|
||||||
|
configOptions.forEach(option => {
|
||||||
|
code += `# ${option.description}\ \n`;
|
||||||
|
code += `--${option.key.join('.')}`;
|
||||||
|
if (option.type) {
|
||||||
|
code += ` <${option.type}>`;
|
||||||
|
}
|
||||||
|
code += '\n';
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<CodeBlock language="shell">
|
||||||
|
{code}
|
||||||
|
</CodeBlock>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const yamlFile = () => {
|
||||||
|
const final = Symbol('final');
|
||||||
|
|
||||||
|
const buildYaml = (obj, prefix = '') => {
|
||||||
|
let code = '';
|
||||||
|
Object.keys(obj).forEach(key => {
|
||||||
|
const value = obj[key];
|
||||||
|
if (typeof value === 'object' && !Array.isArray(value) && !value[final]) {
|
||||||
|
code += prefix+`${key}:\n`;
|
||||||
|
code += buildYaml(value, prefix + ' ');
|
||||||
|
} else {
|
||||||
|
let val = '';
|
||||||
|
if (value.defaultValue) {
|
||||||
|
val = `"${value.defaultValue}"`;
|
||||||
|
} else if (value.type) {
|
||||||
|
val = `<${value.type}>`;
|
||||||
|
}
|
||||||
|
code += prefix+`# ${value.description || ''}\n`;
|
||||||
|
code += prefix+`${key}: ${val}\n`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return code;
|
||||||
|
};
|
||||||
|
|
||||||
|
const yamlCode = buildYaml(configOptions.reduce((acc, option) => {
|
||||||
|
const keys = option.key;
|
||||||
|
let current = acc;
|
||||||
|
keys.forEach((key, index) => {
|
||||||
|
if (!current[key]) {
|
||||||
|
current[key] = index === keys.length - 1 ? option : {};
|
||||||
|
}
|
||||||
|
current = current[key];
|
||||||
|
});
|
||||||
|
current[final] = true;
|
||||||
|
return acc;
|
||||||
|
}, {}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<CodeBlock language="yaml">
|
||||||
|
{yamlCode}
|
||||||
|
</CodeBlock>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Tabs>
|
||||||
|
<TabItem value="env" label="Environment Variables">
|
||||||
|
<p>You can set the following environment variables in your <code>docker-compose.yaml</code> file or in your shell environment.</p>
|
||||||
|
{environmentVariables()}
|
||||||
|
</TabItem>
|
||||||
|
<TabItem value="args" label="Command Line Arguments">
|
||||||
|
<p>You can list the following command line arguments using <code>neko serve --help</code>.</p>
|
||||||
|
{cmdArguments()}
|
||||||
|
</TabItem>
|
||||||
|
<TabItem value="yaml" label="YAML Configuration File">
|
||||||
|
<p>You can create a <code>/etc/neko/neko.yaml</code> file with the following configuration options.</p>
|
||||||
|
{yamlFile()}
|
||||||
|
</TabItem>
|
||||||
|
</Tabs>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
33
webpage/docs/getting-started/configuration/help.js
Normal file
33
webpage/docs/getting-started/configuration/help.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/* This script reads the help.txt file and generates a help.json file with the configuration options. */
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const parseConfigOptions = (text) => {
|
||||||
|
const lines = text.split('\n');
|
||||||
|
return lines.map(line => {
|
||||||
|
const match = line.match(/--([\w.]+)(?:\s(\w+))?\s+(.*?)(?:\s+\(default\s+"?([\w\/.@]+)"?\))?$/);
|
||||||
|
if (match) {
|
||||||
|
const [, key, type, description, defaultValue] = match;
|
||||||
|
return { key: key.split('.'), type, defaultValue: defaultValue || undefined, description };
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}).filter(option => option !== null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const filePath = path.resolve(__dirname, 'help.txt');
|
||||||
|
const outputFilePath = path.resolve(__dirname, 'help.json');
|
||||||
|
|
||||||
|
fs.readFile(filePath, 'utf8', (err, data) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error reading help file:', err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const configOptions = parseConfigOptions(data);
|
||||||
|
fs.writeFile(outputFilePath, JSON.stringify(configOptions, null, 2), (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error writing help file:', err);
|
||||||
|
} else {
|
||||||
|
console.log('Help file generated successfully.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
789
webpage/docs/getting-started/configuration/help.json
Normal file
789
webpage/docs/getting-started/configuration/help.json
Normal file
|
@ -0,0 +1,789 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"audio",
|
||||||
|
"codec"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "opus",
|
||||||
|
"description": "audio codec to be used"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"audio",
|
||||||
|
"device"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "audio_output.monitor",
|
||||||
|
"description": "pulseaudio device to capture"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"audio",
|
||||||
|
"pipeline"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "gstreamer pipeline used for audio streaming"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"audio_bitrate"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "128",
|
||||||
|
"description": "broadcast audio bitrate in KB/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"autostart"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "automatically start broadcasting when neko starts and broadcast_url is set"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"pipeline"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "gstreamer pipeline used for broadcasting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"preset"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "veryfast",
|
||||||
|
"description": "broadcast speed preset for h264 encoding"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"url"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "initial URL for broadcasting, setting this value will automatically start broadcasting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"broadcast",
|
||||||
|
"video_bitrate"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "4096",
|
||||||
|
"description": "broadcast video bitrate in KB/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"microphone",
|
||||||
|
"device"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "audio_input",
|
||||||
|
"description": "pulseaudio device used for microphone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"microphone",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "enable microphone stream"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"screencast",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"description": "enable screencast"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"screencast",
|
||||||
|
"pipeline"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "gstreamer pipeline used for screencasting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"screencast",
|
||||||
|
"quality"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "60",
|
||||||
|
"description": "screencast JPEG quality"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"screencast",
|
||||||
|
"rate"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "10/1",
|
||||||
|
"description": "screencast frame rate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"video",
|
||||||
|
"codec"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "vp8",
|
||||||
|
"description": "video codec to be used"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"video",
|
||||||
|
"display"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "X display to capture"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"video",
|
||||||
|
"ids"
|
||||||
|
],
|
||||||
|
"type": "strings",
|
||||||
|
"description": "ordered list of video ids"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"video",
|
||||||
|
"pipelines"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "pipelines config in JSON used for video streaming (default \"[]\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"webcam",
|
||||||
|
"device"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "/dev/video0",
|
||||||
|
"description": "v4l2sink device used for webcam"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"webcam",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"description": "enable webcam stream"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"webcam",
|
||||||
|
"height"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "720",
|
||||||
|
"description": "webcam stream height"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"capture",
|
||||||
|
"webcam",
|
||||||
|
"width"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "1280",
|
||||||
|
"description": "webcam stream width"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"display"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "X display to use for desktop sharing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"file_chooser_dialog"
|
||||||
|
],
|
||||||
|
"description": "whether to handle file chooser dialog externally"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"input",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "whether custom xf86 input driver should be used to handle touchscreen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"input",
|
||||||
|
"socket"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "socket path for custom xf86 input driver connection (default \"/tmp/xf86-input-neko.sock\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"screen"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "1280x720@30",
|
||||||
|
"description": "default screen size and framerate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"unminimize"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "automatically unminimize window when it is minimized"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"desktop",
|
||||||
|
"upload_drop"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "whether drop upload is enabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"file",
|
||||||
|
"hash"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "member file provider: whether to hash passwords using sha256 (recommended)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"file",
|
||||||
|
"path"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "member file provider: storage path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"multiuser",
|
||||||
|
"admin_password"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "admin",
|
||||||
|
"description": "member multiuser provider: admin password"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"multiuser",
|
||||||
|
"admin_profile"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "member multiuser provider: admin profile in JSON format (default \"{}\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"multiuser",
|
||||||
|
"user_password"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "neko",
|
||||||
|
"description": "member multiuser provider: user password"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"multiuser",
|
||||||
|
"user_profile"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "member multiuser provider: user profile in JSON format (default \"{}\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"object",
|
||||||
|
"users"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "member object provider: users in JSON format (default \"[]\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"member",
|
||||||
|
"provider"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "multiuser",
|
||||||
|
"description": "choose member provider"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"plugins",
|
||||||
|
"dir"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "./bin/plugins",
|
||||||
|
"description": "path to neko plugins to load"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"plugins",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"description": "load plugins in runtime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"plugins",
|
||||||
|
"required"
|
||||||
|
],
|
||||||
|
"description": "if true, neko will exit if there is an error when loading a plugin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"bind"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "address/port/socket to serve neko (default \"127.0.0.1:8080\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"cert"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "path to the SSL cert used to secure the neko server"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"cors"
|
||||||
|
],
|
||||||
|
"type": "strings",
|
||||||
|
"description": "list of allowed origins for CORS, if empty CORS is disabled, if '*' is present all origins are allowed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"key"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "path to the SSL key used to secure the neko server"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"metrics"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "enable prometheus metrics available at /metrics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"path_prefix"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "/",
|
||||||
|
"description": "path prefix for HTTP requests"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"pprof"
|
||||||
|
],
|
||||||
|
"description": "enable pprof endpoint available at /debug/pprof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"proxy"
|
||||||
|
],
|
||||||
|
"description": "trust reverse proxy headers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"server",
|
||||||
|
"static"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "path to neko client files to serve"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"api_token"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "API token for interacting with external services"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"control_protection"
|
||||||
|
],
|
||||||
|
"description": "users can gain control only if at least one admin is in the room"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"cookie",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "whether cookies authentication should be enabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"cookie",
|
||||||
|
"expiration"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "8760",
|
||||||
|
"description": "expiration of the cookie in hours"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"cookie",
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "NEKO_SESSION",
|
||||||
|
"description": "name of the cookie that holds token"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"cookie",
|
||||||
|
"secure"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "use secure cookies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"file"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "if sessions should be stored in a file, otherwise they will be stored only in memory"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"heartbeat_interval"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "120",
|
||||||
|
"description": "interval in seconds for sending heartbeat messages"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"implicit_hosting"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "allow implicit control switching"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"inactive_cursors"
|
||||||
|
],
|
||||||
|
"description": "show inactive cursors on the screen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"locked_controls"
|
||||||
|
],
|
||||||
|
"description": "whether controls should be locked for users initially"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"locked_logins"
|
||||||
|
],
|
||||||
|
"description": "whether logins should be locked for users initially"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"merciful_reconnect"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "allow reconnecting to websocket even if previous connection was not closed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"session",
|
||||||
|
"private_mode"
|
||||||
|
],
|
||||||
|
"description": "whether private mode should be enabled initially"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"epr"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "limits the pool of ephemeral ports that ICE UDP connections can allocate from"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"debug"
|
||||||
|
],
|
||||||
|
"description": "enables debug logging for the bandwidth estimator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"diff_threshold"
|
||||||
|
],
|
||||||
|
"type": "float",
|
||||||
|
"defaultValue": "0.15",
|
||||||
|
"description": "how bigger the difference between estimated and stream bitrate must be to trigger upgrade/downgrade"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"downgrade_backoff"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "10s",
|
||||||
|
"description": "how long to wait before downgrading again after previous downgrade"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"enabled"
|
||||||
|
],
|
||||||
|
"description": "enables the bandwidth estimator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"initial_bitrate"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"defaultValue": "1000000",
|
||||||
|
"description": "initial bitrate for the bandwidth estimator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"passive"
|
||||||
|
],
|
||||||
|
"description": "passive estimator mode, when it does not switch pipelines, only estimates"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"read_interval"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "2s",
|
||||||
|
"description": "how often to read and process bandwidth estimation reports"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"stable_duration"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "12s",
|
||||||
|
"description": "how long to wait for stable connection (upward or neutral trend) before upgrading"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"stalled_duration"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "24s",
|
||||||
|
"description": "how long to wait for stalled bandwidth estimation before downgrading"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"unstable_duration"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "6s",
|
||||||
|
"description": "how long to wait for stalled connection (neutral trend with low bandwidth) before downgrading"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"estimator",
|
||||||
|
"upgrade_backoff"
|
||||||
|
],
|
||||||
|
"type": "duration",
|
||||||
|
"defaultValue": "5s",
|
||||||
|
"description": "how long to wait before upgrading again after previous upgrade"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"icelite"
|
||||||
|
],
|
||||||
|
"description": "configures whether or not the ICE agent should be a lite agent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"iceservers",
|
||||||
|
"backend"
|
||||||
|
],
|
||||||
|
"type": "urls",
|
||||||
|
"description": "Backend only STUN and TURN servers in JSON format with urls, `username` and `credential` keys (default \"[]\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"iceservers",
|
||||||
|
"frontend"
|
||||||
|
],
|
||||||
|
"type": "urls",
|
||||||
|
"description": "Frontend only STUN and TURN servers in JSON format with urls, `username` and `credential` keys (default \"[]\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"icetrickle"
|
||||||
|
],
|
||||||
|
"defaultValue": "true",
|
||||||
|
"description": "configures whether cadidates should be sent asynchronously using Trickle ICE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"ip_retrieval_url"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "URL address used for retrieval of the external IP address (default \"https://checkip.amazonaws.com\")"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"nat1to1"
|
||||||
|
],
|
||||||
|
"type": "strings",
|
||||||
|
"description": "sets a list of external IP addresses of 1:1 (D)NAT and a candidate type for which the external IP address is used"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"tcpmux"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"description": "single TCP mux port for all peers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"webrtc",
|
||||||
|
"udpmux"
|
||||||
|
],
|
||||||
|
"type": "int",
|
||||||
|
"description": "single UDP mux port for all peers, replaces EPR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"config"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "configuration file path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"debug"
|
||||||
|
],
|
||||||
|
"description": "enable debug mode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"log",
|
||||||
|
"dir"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "logging directory to store logs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"log",
|
||||||
|
"json"
|
||||||
|
],
|
||||||
|
"description": "logs in JSON format"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"log",
|
||||||
|
"level"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "info",
|
||||||
|
"description": "set log level (trace, debug, info, warn, error, fatal, panic, disabled)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"log",
|
||||||
|
"nocolor"
|
||||||
|
],
|
||||||
|
"description": "no ANSI colors in non-JSON output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": [
|
||||||
|
"log",
|
||||||
|
"time"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"defaultValue": "unix",
|
||||||
|
"description": "time format used in logs (unix, unixms, unixmicro)"
|
||||||
|
}
|
||||||
|
]
|
93
webpage/docs/getting-started/configuration/help.txt
Normal file
93
webpage/docs/getting-started/configuration/help.txt
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
--capture.audio.codec string audio codec to be used (default "opus")
|
||||||
|
--capture.audio.device string pulseaudio device to capture (default "audio_output.monitor")
|
||||||
|
--capture.audio.pipeline string gstreamer pipeline used for audio streaming
|
||||||
|
--capture.broadcast.audio_bitrate int broadcast audio bitrate in KB/s (default 128)
|
||||||
|
--capture.broadcast.autostart automatically start broadcasting when neko starts and broadcast_url is set (default true)
|
||||||
|
--capture.broadcast.pipeline string gstreamer pipeline used for broadcasting
|
||||||
|
--capture.broadcast.preset string broadcast speed preset for h264 encoding (default "veryfast")
|
||||||
|
--capture.broadcast.url string initial URL for broadcasting, setting this value will automatically start broadcasting
|
||||||
|
--capture.broadcast.video_bitrate int broadcast video bitrate in KB/s (default 4096)
|
||||||
|
--capture.microphone.device string pulseaudio device used for microphone (default "audio_input")
|
||||||
|
--capture.microphone.enabled enable microphone stream (default true)
|
||||||
|
--capture.screencast.enabled enable screencast
|
||||||
|
--capture.screencast.pipeline string gstreamer pipeline used for screencasting
|
||||||
|
--capture.screencast.quality string screencast JPEG quality (default "60")
|
||||||
|
--capture.screencast.rate string screencast frame rate (default "10/1")
|
||||||
|
--capture.video.codec string video codec to be used (default "vp8")
|
||||||
|
--capture.video.display string X display to capture
|
||||||
|
--capture.video.ids strings ordered list of video ids
|
||||||
|
--capture.video.pipelines string pipelines config in JSON used for video streaming (default "[]")
|
||||||
|
--capture.webcam.device string v4l2sink device used for webcam (default "/dev/video0")
|
||||||
|
--capture.webcam.enabled enable webcam stream
|
||||||
|
--capture.webcam.height int webcam stream height (default 720)
|
||||||
|
--capture.webcam.width int webcam stream width (default 1280)
|
||||||
|
--desktop.display string X display to use for desktop sharing
|
||||||
|
--desktop.file_chooser_dialog whether to handle file chooser dialog externally
|
||||||
|
--desktop.input.enabled whether custom xf86 input driver should be used to handle touchscreen (default true)
|
||||||
|
--desktop.input.socket string socket path for custom xf86 input driver connection (default "/tmp/xf86-input-neko.sock")
|
||||||
|
--desktop.screen string default screen size and framerate (default "1280x720@30")
|
||||||
|
--desktop.unminimize automatically unminimize window when it is minimized (default true)
|
||||||
|
--desktop.upload_drop whether drop upload is enabled (default true)
|
||||||
|
--member.file.hash member file provider: whether to hash passwords using sha256 (recommended) (default true)
|
||||||
|
--member.file.path string member file provider: storage path
|
||||||
|
--member.multiuser.admin_password string member multiuser provider: admin password (default "admin")
|
||||||
|
--member.multiuser.admin_profile string member multiuser provider: admin profile in JSON format (default "{}")
|
||||||
|
--member.multiuser.user_password string member multiuser provider: user password (default "neko")
|
||||||
|
--member.multiuser.user_profile string member multiuser provider: user profile in JSON format (default "{}")
|
||||||
|
--member.object.users string member object provider: users in JSON format (default "[]")
|
||||||
|
--member.provider string choose member provider (default "multiuser")
|
||||||
|
--plugins.dir string path to neko plugins to load (default "./bin/plugins")
|
||||||
|
--plugins.enabled load plugins in runtime
|
||||||
|
--plugins.required if true, neko will exit if there is an error when loading a plugin
|
||||||
|
--server.bind string address/port/socket to serve neko (default "127.0.0.1:8080")
|
||||||
|
--server.cert string path to the SSL cert used to secure the neko server
|
||||||
|
--server.cors strings list of allowed origins for CORS, if empty CORS is disabled, if '*' is present all origins are allowed
|
||||||
|
--server.key string path to the SSL key used to secure the neko server
|
||||||
|
--server.metrics enable prometheus metrics available at /metrics (default true)
|
||||||
|
--server.path_prefix string path prefix for HTTP requests (default "/")
|
||||||
|
--server.pprof enable pprof endpoint available at /debug/pprof
|
||||||
|
--server.proxy trust reverse proxy headers
|
||||||
|
--server.static string path to neko client files to serve
|
||||||
|
--session.api_token string API token for interacting with external services
|
||||||
|
--session.control_protection users can gain control only if at least one admin is in the room
|
||||||
|
--session.cookie.enabled whether cookies authentication should be enabled (default true)
|
||||||
|
--session.cookie.expiration int expiration of the cookie in hours (default 8760)
|
||||||
|
--session.cookie.name string name of the cookie that holds token (default "NEKO_SESSION")
|
||||||
|
--session.cookie.secure use secure cookies (default true)
|
||||||
|
--session.file string if sessions should be stored in a file, otherwise they will be stored only in memory
|
||||||
|
--session.heartbeat_interval int interval in seconds for sending heartbeat messages (default 120)
|
||||||
|
--session.implicit_hosting allow implicit control switching (default true)
|
||||||
|
--session.inactive_cursors show inactive cursors on the screen
|
||||||
|
--session.locked_controls whether controls should be locked for users initially
|
||||||
|
--session.locked_logins whether logins should be locked for users initially
|
||||||
|
--session.merciful_reconnect allow reconnecting to websocket even if previous connection was not closed (default true)
|
||||||
|
--session.private_mode whether private mode should be enabled initially
|
||||||
|
--webrtc.epr string limits the pool of ephemeral ports that ICE UDP connections can allocate from
|
||||||
|
--webrtc.estimator.debug enables debug logging for the bandwidth estimator
|
||||||
|
--webrtc.estimator.diff_threshold float how bigger the difference between estimated and stream bitrate must be to trigger upgrade/downgrade (default 0.15)
|
||||||
|
--webrtc.estimator.downgrade_backoff duration how long to wait before downgrading again after previous downgrade (default 10s)
|
||||||
|
--webrtc.estimator.enabled enables the bandwidth estimator
|
||||||
|
--webrtc.estimator.initial_bitrate int initial bitrate for the bandwidth estimator (default 1000000)
|
||||||
|
--webrtc.estimator.passive passive estimator mode, when it does not switch pipelines, only estimates
|
||||||
|
--webrtc.estimator.read_interval duration how often to read and process bandwidth estimation reports (default 2s)
|
||||||
|
--webrtc.estimator.stable_duration duration how long to wait for stable connection (upward or neutral trend) before upgrading (default 12s)
|
||||||
|
--webrtc.estimator.stalled_duration duration how long to wait for stalled bandwidth estimation before downgrading (default 24s)
|
||||||
|
--webrtc.estimator.unstable_duration duration how long to wait for stalled connection (neutral trend with low bandwidth) before downgrading (default 6s)
|
||||||
|
--webrtc.estimator.upgrade_backoff duration how long to wait before upgrading again after previous upgrade (default 5s)
|
||||||
|
--webrtc.icelite configures whether or not the ICE agent should be a lite agent
|
||||||
|
--webrtc.iceservers.backend urls Backend only STUN and TURN servers in JSON format with urls, `username` and `credential` keys (default "[]")
|
||||||
|
--webrtc.iceservers.frontend urls Frontend only STUN and TURN servers in JSON format with urls, `username` and `credential` keys (default "[]")
|
||||||
|
--webrtc.icetrickle configures whether cadidates should be sent asynchronously using Trickle ICE (default true)
|
||||||
|
--webrtc.ip_retrieval_url string URL address used for retrieval of the external IP address (default "https://checkip.amazonaws.com")
|
||||||
|
--webrtc.nat1to1 strings sets a list of external IP addresses of 1:1 (D)NAT and a candidate type for which the external IP address is used
|
||||||
|
--webrtc.tcpmux int single TCP mux port for all peers
|
||||||
|
--webrtc.udpmux int single UDP mux port for all peers, replaces EPR
|
||||||
|
|
||||||
|
Global Flags:
|
||||||
|
-c, --config string configuration file path
|
||||||
|
-d, --debug enable debug mode
|
||||||
|
--log.dir string logging directory to store logs
|
||||||
|
--log.json logs in JSON format
|
||||||
|
--log.level string set log level (trace, debug, info, warn, error, fatal, panic, disabled) (default "info")
|
||||||
|
--log.nocolor no ANSI colors in non-JSON output
|
||||||
|
--log.time string time format used in logs (unix, unixms, unixmicro) (default "unix")
|
13
webpage/docs/getting-started/configuration/index.mdx
Normal file
13
webpage/docs/getting-started/configuration/index.mdx
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
|
||||||
|
Configuration options can be set using Environment Variables, as an argument to the CLI, or in a configuration file.
|
||||||
|
|
||||||
|
Highest priority is given to the Environment Variables, followed by CLI arguments, and then the configuration file.
|
||||||
|
|
||||||
|
import Configuration from './configuration.tsx'
|
||||||
|
|
||||||
|
<Configuration />
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"label": "Installation",
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "There are multiple ways to install neko, choose the one that fits your needs."
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Cloud Deployments
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This page is a work in progress. [Docker Setup](./docker-setup.md) is the recommended way to install Neko.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Neko can be deployed to various cloud platforms for scalable, high-availability solutions. This guide walks you through deploying Neko on popular cloud providers such as AWS, Google Cloud, and Azure.
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 2
|
sidebar_position: 1
|
||||||
---
|
---
|
||||||
|
|
||||||
# Docker Images
|
# Docker Setup
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="/img/icons/firefox.svg" title="m1k1o/neko:firefox" width="60" height="auto"/>
|
<img src="/img/icons/firefox.svg" title="m1k1o/neko:firefox" width="60" height="auto"/>
|
||||||
|
@ -19,7 +19,6 @@ sidebar_position: 2
|
||||||
<img src="/img/icons/kde.svg" title="m1k1o/neko:kde" width="60" height="auto"/>
|
<img src="/img/icons/kde.svg" title="m1k1o/neko:kde" width="60" height="auto"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
Use the following docker images from [Docker Hub](https://hub.docker.com/r/m1k1o/neko) for x86_64:
|
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: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:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||||
|
@ -55,13 +54,7 @@ All images are also available on [GitHub Container Registry](https://github.com/
|
||||||
- `ghcr.io/m1k1o/neko/xfce:latest`
|
- `ghcr.io/m1k1o/neko/xfce:latest`
|
||||||
- `ghcr.io/m1k1o/neko/kde: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.
|
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:
|
||||||
|
|
||||||
:::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-firefox:latest`
|
||||||
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
|
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
|
||||||
|
@ -85,7 +78,7 @@ For images with VAAPI GPU hardware acceleration using intel drivers use:
|
||||||
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
|
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
|
||||||
- `ghcr.io/m1k1o/neko/intel-kde: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:
|
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-firefox:latest`
|
||||||
- `ghcr.io/m1k1o/neko/nvidia-chromium:latest`
|
- `ghcr.io/m1k1o/neko/nvidia-chromium:latest`
|
||||||
|
@ -95,6 +88,57 @@ For images with Nvidia GPU hardware acceleration using EGL (more info [here](/do
|
||||||
|
|
||||||
GHCR images are built using GitHub actions for every tag.
|
GHCR images are built using GitHub actions for every tag.
|
||||||
|
|
||||||
:::tip
|
## Running Neko with Docker
|
||||||
For more applications, check out [m1k1o/neko-apps](https://github.com/m1k1o/neko-apps).
|
|
||||||
:::
|
To start a basic Neko container, use the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -d --rm \
|
||||||
|
-p 8080:8080 \
|
||||||
|
-p 56000-56100:56000-56100/udp \
|
||||||
|
-e NEKO_EPR=56000-56100 \
|
||||||
|
-e NEKO_PASSWORD=neko \
|
||||||
|
-e NEKO_PASSWORD_ADMIN=admin \
|
||||||
|
-e NEKO_NAT1TO1=<your-ip> \
|
||||||
|
--shm-size=2g \
|
||||||
|
m1k1o/neko:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Explanation
|
||||||
|
|
||||||
|
- `-d` - Run the container in the background.
|
||||||
|
- `--rm` - Automatically remove the container when it exits.
|
||||||
|
- `-p 8080:8080` - Map the host's port `8080` to the container's port `8080`.
|
||||||
|
- `-p 56000-56100:56000-56100/udp` - Map the host's ports `56000-56100` to the container's ports `56000-56100` using UDP.
|
||||||
|
- `-e NEKO_EPR=56000-56100` - Set the range of ports for the WebRTC connection, it must match the port range mapped above.
|
||||||
|
- `-e NEKO_PASSWORD=neko` and `-e NEKO_PASSWORD_ADMIN=admin` - Set passwords for the user and admin user.
|
||||||
|
- `-e NEKO_NAT1TO1=<your-ip>` - Set the public or local IP address for the NAT1:1 connection.
|
||||||
|
- `--shm-size=2g` - Set the shared memory size to 2GB, otherwise, the browser may crash.
|
||||||
|
- `m1k1o/neko:latest` - The name of the image to run, change it to the desired image.
|
||||||
|
|
||||||
|
Now, open your browser and go to: `http://localhost:8080`. You should see the Neko interface.
|
||||||
|
|
||||||
|
## Using Docker Compose
|
||||||
|
|
||||||
|
You can also use Docker Compose to run Neko. Create a `docker-compose.yml` file with the following content:
|
||||||
|
|
||||||
|
```yaml title="docker-compose.yml"
|
||||||
|
services:
|
||||||
|
neko:
|
||||||
|
image: m1k1o/neko:latest
|
||||||
|
shm_size: 2g
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
- "56000-56100:56000-56100/udp"
|
||||||
|
environment:
|
||||||
|
NEKO_EPR: 56000-56100
|
||||||
|
NEKO_PASSWORD: neko
|
||||||
|
NEKO_PASSWORD_ADMIN: admin
|
||||||
|
NEKO_NAT1TO1: <your-ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, run the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose up -d
|
||||||
|
```
|
|
@ -0,0 +1,74 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Manual Installation
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This page is a work in progress. [Docker Setup](./docker-setup.md) is the recommended way to install Neko.
|
||||||
|
:::
|
||||||
|
|
||||||
|
In some cases, you may want to install Neko manually without Docker. This guide walks you through the process of setting up Neko on your local machine or server.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Before proceeding, ensure that you have the following installed on your system:
|
||||||
|
|
||||||
|
- [node.js](https://nodejs.org/) and [npm](https://www.npmjs.com/) (for building the frontend).
|
||||||
|
- [go](https://golang.org/) (for building the server).
|
||||||
|
- [gstreamer](https://gstreamer.freedesktop.org/) (for video processing).
|
||||||
|
```shell
|
||||||
|
sudo apt-get install 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;
|
||||||
|
```
|
||||||
|
- [x.org](https://www.x.org/) (for X11 server).
|
||||||
|
```shell
|
||||||
|
sudo apt-get install libx11-dev libxrandr-dev libxtst-dev libxcvt-dev xorg;
|
||||||
|
```
|
||||||
|
- [pulseaudio](https://www.freedesktop.org/wiki/Software/PulseAudio/) (for audio support).
|
||||||
|
```shell
|
||||||
|
sudo apt-get install pulseaudio;
|
||||||
|
```
|
||||||
|
- other dependencies:
|
||||||
|
```shell
|
||||||
|
sudo apt-get install xdotool xclip libgtk-3-0 libgtk-3-dev libopus0 libvpx6;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 1: Clone the Repository
|
||||||
|
|
||||||
|
Start by cloning the Neko Git repository to your machine:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/m1k1o/neko.git
|
||||||
|
cd neko
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 2: Build the Frontend
|
||||||
|
|
||||||
|
Navigate to the `client` directory and install the dependencies:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd client;
|
||||||
|
npm install;
|
||||||
|
npm run build;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 3: Build the Server
|
||||||
|
|
||||||
|
Navigate to the `server` directory and build the server:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd server;
|
||||||
|
go build;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 4: Run the Server
|
||||||
|
|
||||||
|
Finally, run the server:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
./server/server;
|
||||||
|
```
|
||||||
|
|
33
webpage/docs/getting-started/overview-of-neko.md
Normal file
33
webpage/docs/getting-started/overview-of-neko.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
---
|
||||||
|
title: Overview of Neko
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# Overview of Neko
|
||||||
|
|
||||||
|
Neko is an open-source self-hosted virtual browser solution that allows multiple users to share a single web browser instance remotely. It is designed for use cases such as collaborative browsing, remote access to web-based applications, and private cloud-based browsing.
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- **Multi-User Collaboration** – Multiple users can interact with the same browser session.
|
||||||
|
- **Audio & Video Streaming** – Real-time streaming of the browser’s output with low latency.
|
||||||
|
- **Secure & Self-Hosted** – You control the server, ensuring privacy and security.
|
||||||
|
- **GPU Acceleration** – Supports hardware acceleration for improved performance.
|
||||||
|
- **Customization Options** – Configure bookmarks, extensions, persistent data, and more.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Remote Browsing** – Access a web browser from any device without installing software.
|
||||||
|
- **Watch Parties** – Stream content together with friends and interact in real time.
|
||||||
|
- **Web Development & Testing** – Test websites in a controlled browser environment.
|
||||||
|
- **Cloud-Based Browsing** – Securely browse the web from a dedicated remote environment.
|
||||||
|
|
||||||
|
## Supported Platforms
|
||||||
|
|
||||||
|
Neko runs on various platforms, including:
|
||||||
|
|
||||||
|
- **Linux & Docker** – Easy deployment using Docker containers.
|
||||||
|
- **Cloud Services** – Deployable on AWS, Azure, Google Cloud, and other providers.
|
||||||
|
- **Raspberry Pi & ARM Devices** – Optimized versions for embedded and low-power hardware.
|
||||||
|
|
||||||
|
Explore the documentation to learn how to deploy, configure, and optimize Neko for your use case.
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 1
|
sidebar_position: 2
|
||||||
---
|
---
|
||||||
|
|
||||||
# Quick Start
|
# Quick Start Guide
|
||||||
|
|
||||||
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:
|
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.
|
1. Deploy a server or VPS with public IP address.
|
||||||
|
|
||||||
**Recommended Specs:**
|
**Recommended Specs:**
|
||||||
|
|
||||||
|
@ -45,6 +45,10 @@ Neko is easy to use and requires no technical expertise to get started. All you
|
||||||
sudo docker compose up -d
|
sudo docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
:::note
|
||||||
|
If you want to run Neko on your local network, you have to add `NEKO_NAT1TO1=<your-local-ip>` to the `docker-compose.yaml` file.
|
||||||
|
:::
|
||||||
|
|
||||||
6. Visit the IP address server in your browser and login, the default password is `neko`.
|
6. Visit the IP address server in your browser and login, the default password is `neko`.
|
||||||
|
|
||||||
:::tip
|
:::tip
|
7
webpage/docs/getting-started/running-neko.md
Normal file
7
webpage/docs/getting-started/running-neko.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# Running Neko
|
||||||
|
|
||||||
|
How to start and manage a Neko instance on different environments.
|
7
webpage/docs/getting-started/troubleshooting.md
Normal file
7
webpage/docs/getting-started/troubleshooting.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 7
|
||||||
|
---
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
Common issues, error messages, and their solutions.
|
7
webpage/docs/getting-started/updating-and-upgrading.md
Normal file
7
webpage/docs/getting-started/updating-and-upgrading.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 6
|
||||||
|
---
|
||||||
|
|
||||||
|
# Updating & Upgrading
|
||||||
|
|
||||||
|
Best practices for keeping Neko updated and migrating between versions.
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"label": "GPU Acceleration",
|
|
||||||
"position": 5
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
---
|
|
||||||
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.
|
|
||||||
```
|
|
|
@ -1,43 +0,0 @@
|
||||||
---
|
|
||||||
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
|
|
||||||
```
|
|
|
@ -1,133 +0,0 @@
|
||||||
---
|
|
||||||
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.
|
|
|
@ -1,48 +0,0 @@
|
||||||
---
|
|
||||||
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`:
|
|
||||||
|
|
||||||

|
|
|
@ -1,177 +0,0 @@
|
||||||
---
|
|
||||||
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,248 +0,0 @@
|
||||||
---
|
|
||||||
sidebar_position: 10
|
|
||||||
---
|
|
||||||
|
|
||||||
# Troubleshooting
|
|
||||||
|
|
||||||
Neko UI loads, but you don't see the screen, and it gives you `connection timeout` or `disconnected` error?
|
|
||||||
|
|
||||||
## Test your client
|
|
||||||
|
|
||||||
Some browsers may block WebRTC access by default. You can check if it is enabled by going to `about:webrtc` or `chrome://webrtc-internals` in your browser.
|
|
||||||
|
|
||||||
Check if your extensions are not blocking WebRTC access. Following extensions are known to block or does not work properly with WebRTC:
|
|
||||||
- Privacy Badger
|
|
||||||
- Private Internet Access
|
|
||||||
- PIA VPN (even if disabled)
|
|
||||||
|
|
||||||
Test whether your client [supports](https://www.webrtc-experiment.com/DetectRTC/) and can [connect to WebRTC](https://www.webcasts.com/webrtc/).
|
|
||||||
|
|
||||||
## Networking
|
|
||||||
|
|
||||||
If you are absolutely sure, that your client is working correctly, then most likely your networking is not set up correctly.
|
|
||||||
|
|
||||||
### Check if your ports are correctly exposed using docker
|
|
||||||
|
|
||||||
Check that your ephemeral port range `NEKO_EPR` is correctly exposed as `/udp` port range.
|
|
||||||
|
|
||||||
In following example, specified range `52000-52100` must be also exposed using docker.
|
|
||||||
|
|
||||||
```yaml title="docker-compose.yml"
|
|
||||||
services:
|
|
||||||
neko:
|
|
||||||
image: "m1k1o/neko:firefox"
|
|
||||||
restart: "unless-stopped"
|
|
||||||
shm_size: "2gb"
|
|
||||||
ports:
|
|
||||||
- "8080:8080"
|
|
||||||
# highlight-start
|
|
||||||
- "52000-52100:52000-52100/udp"
|
|
||||||
# highlight-end
|
|
||||||
environment:
|
|
||||||
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
|
|
||||||
|
|
||||||
Ensure, that your ports are reachable through your external IP.
|
|
||||||
|
|
||||||
To validate UDP connection the simplest way, run this on your server:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
nc -ul 52101
|
|
||||||
```
|
|
||||||
|
|
||||||
And this on your local client:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
If you get [`Command 'nc' not found.`](https://command-not-found.com/nc) error, you can install `netcat` package using:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo apt-get install netcat
|
|
||||||
```
|
|
||||||
|
|
||||||
### Check if your external IP was determined correctly
|
|
||||||
|
|
||||||
One of the first logs, when the server starts, writes down your external IP that will be sent to your clients to connect to.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
docker-compose logs neko | grep nat_ips
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: Some newer versions of docker-compose use `docker compose` instead of `docker-compose`.
|
|
||||||
|
|
||||||
You should see this:
|
|
||||||
|
|
||||||
```
|
|
||||||
11:11AM INF webrtc starting ephemeral_port_range=52000-52100 ice_lite=true ice_servers="[{URLs:[stun:stun.l.google.com:19302] Username: Credential:<nil> CredentialType:password}]" module=webrtc nat_ips=<your-IP>
|
|
||||||
```
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
```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
|
|
||||||
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)
|
|
||||||
|
|
||||||
```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
|
|
||||||
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.
|
|
||||||
|
|
||||||
### Neko works externally, but not locally
|
|
||||||
|
|
||||||
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.
|
|
||||||
- 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](/docs/networking) on how to setup local coturn instance.
|
|
||||||
|
|
||||||
### Neko works locally, but not externally
|
|
||||||
|
|
||||||
Make sure, that you are exposing your ports correctly.
|
|
||||||
|
|
||||||
If you put local ip as `NEKO_NAT1TO1`, external clients try to connect to that ip. But it is unreachable for them, because it is your local IP. You must use your public IP address with port forwarding.
|
|
||||||
|
|
||||||
## Debug mode
|
|
||||||
|
|
||||||
To see verbose information from n.eko server, you can enable debug mode using `NEKO_DEBUG`.
|
|
||||||
|
|
||||||
```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_DEBUG: 1
|
|
||||||
# highlight-end
|
|
||||||
```
|
|
||||||
|
|
||||||
Ensure, that you have enabled debug mode in javascript console too, in order to see verbose information from client.
|
|
||||||
|
|
||||||
## Frequently Encountered Errors
|
|
||||||
|
|
||||||
### Common server errors
|
|
||||||
|
|
||||||
```
|
|
||||||
WRN session created with and error error="invalid 1:1 NAT IP mapping"
|
|
||||||
```
|
|
||||||
|
|
||||||
Check your `NEKO_NAT1TO1` or ensure, that `NEKO_IPFETCH` returns correct IP.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
```
|
|
||||||
WRN could not get server reflexive address udp6 stun:stun.l.google.com:19302: write udp6 [::]:52042->[2607:f8b0:4001:c1a::7f]:19302: sendto: cannot assign requested address
|
|
||||||
```
|
|
||||||
|
|
||||||
Check if your DNS is set up correctly, and if your IPv6 connectivity is working properly, or is disabled.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
```
|
|
||||||
WRN undeclaredMediaProcessor failed to open SrtcpSession: the DTLS transport has not started yet module=webrtc subsystem=
|
|
||||||
```
|
|
||||||
|
|
||||||
Check if your UDP ports are exposed correctly and reachable.
|
|
||||||
|
|
||||||
### Common client errors
|
|
||||||
|
|
||||||
```
|
|
||||||
Firefox can’t establish a connection to the server at ws://<your-IP>/ws?password=neko.
|
|
||||||
```
|
|
||||||
|
|
||||||
Check if your TCP port is exposed correctly and your reverse proxy is correctly proxying websocket connections. And if your browser has not disabled websocket connections.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
```
|
|
||||||
Getting black screen with a cursor, but no browser.
|
|
||||||
```
|
|
||||||
|
|
||||||
Most likely you forgot to add `-cap-add=SYS_ADMIN` when using chromium-based browsers.
|
|
||||||
|
|
||||||
### Unrelated server errors
|
|
||||||
|
|
||||||
```
|
|
||||||
[ERROR:bus.cc(393)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
|
|
||||||
```
|
|
||||||
|
|
||||||
This error originates from browser, that it could not connect to dbus. This does not affect us and can be ignored.
|
|
||||||
|
|
||||||
### Broadcast pipeline not working with some ingest servers
|
|
||||||
|
|
||||||
See [related issue](https://github.com/m1k1o/neko/issues/276).
|
|
||||||
|
|
||||||
```
|
|
||||||
Could not connect to RTMP stream "'rtmp://<ingest-url>/live/<stream-key-removed> live=1'" for writing
|
|
||||||
```
|
|
||||||
|
|
||||||
Some ingest servers require `live=1` parameter in the URL (e.g. nginx-rtmp-module). Some do not and do not accept aphostrophes (e.g. owncast). You can try to change the pipeline to:
|
|
||||||
|
|
||||||
```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=28/1 ! videoconvert ! queue ! x264enc bframes=0 key-int-max=0 byte-stream=true tune=zerolatency speed-preset=veryfast ! mux."
|
|
||||||
```
|
|
Binary file not shown.
Before Width: | Height: | Size: 5.4 KiB |
Loading…
Add table
Add a link
Reference in a new issue