WIP new docs.

This commit is contained in:
Miroslav Šedivý 2025-02-08 20:30:40 +01:00
parent 004e893921
commit b23ca1af04
28 changed files with 1250 additions and 1204 deletions

View file

@ -0,0 +1,4 @@
{
"position": 1,
"label": "Getting Started"
}

View 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>
);
};

View 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.');
}
});
});

View 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)"
}
]

View 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")

View 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 />

View file

@ -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."
}
}

View file

@ -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.

View file

@ -0,0 +1,144 @@
---
sidebar_position: 1
---
# Docker Setup
<div align="center">
<img src="/img/icons/firefox.svg" title="m1k1o/neko:firefox" width="60" height="auto"/>
<img src="/img/icons/google-chrome.svg" title="m1k1o/neko:google-chrome" width="60" height="auto"/>
<img src="/img/icons/chromium.svg" title="m1k1o/neko:chromium" width="60" height="auto"/>
<img src="/img/icons/microsoft-edge.svg" title="m1k1o/neko:microsoft-edge" width="60" height="auto"/>
<img src="/img/icons/brave.svg" title="m1k1o/neko:brave" width="60" height="auto"/>
<img src="/img/icons/vivaldi.svg" title="m1k1o/neko:vivaldi" width="60" height="auto"/>
<img src="/img/icons/opera.svg" title="m1k1o/neko:opera" width="60" height="auto"/>
<img src="/img/icons/tor-browser.svg" title="m1k1o/neko:tor-browser" width="60" height="auto"/>
<img src="/img/icons/remmina.png" title="m1k1o/neko:remmina" width="60" height="auto"/>
<img src="/img/icons/vlc.svg" title="m1k1o/neko:vlc" width="60" height="auto"/>
<img src="/img/icons/xfce.svg" title="m1k1o/neko:xfce" width="60" height="auto"/>
<img src="/img/icons/kde.svg" title="m1k1o/neko:kde" width="60" height="auto"/>
</div>
Use the following docker images from [Docker Hub](https://hub.docker.com/r/m1k1o/neko) for x86_64:
- `m1k1o/neko:latest` or `m1k1o/neko:firefox` - for Firefox.
- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
- `m1k1o/neko:google-chrome` - for Google Chrome (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
- `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @whalehub).
- `m1k1o/neko:microsoft-edge` - for Microsoft Edge (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
- `m1k1o/neko:brave` - for [Brave Browser](https://brave.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
- `m1k1o/neko:vivaldi` - for [Vivaldi Browser](https://vivaldi.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @Xeddius).
- `m1k1o/neko:opera` for [Opera Browser](https://opera.com) (requires extra steps to enable DRM, see instructions [here](https://www.reddit.com/r/operabrowser/wiki/opera/linux_widevine_config/). libffmpeg is already configured.) (by @prophetofxenu)
- `m1k1o/neko:tor-browser` - for Tor Browser.
- `m1k1o/neko:remmina` - for remote desktop connection (by @lowne).
- Pass env var `REMMINA_URL=<proto>://[<username>[:<password>]@]server[:port]` (proto being `vnc`, `rdp` or `spice`).
- Or create your custom configuration with remmina locally (it's saved in `~/.local/share/remmina/path_to_profile.remmina`) and bind-mount it, then pass env var `REMMINA_PROFILE=<path_to_profile.remmina>`.
- `m1k1o/neko:vlc` - for VLC Video player (needs volume mounted to `/media` with local video files, or setting `VLC_MEDIA=/media` path).
- `m1k1o/neko:xfce` or `m1k1o/neko:kde` - for a shared desktop / installing shared software.
- `m1k1o/neko:base` - for custom base.
Dockerhub images are built using GitHub actions on every push and on weekly basis to keep all browsers up-to-date.
All images are also available on [GitHub Container Registry](https://github.com/m1k1o?tab=packages&repo_name=neko) for faster pulls:
- `ghcr.io/m1k1o/neko/firefox:latest`
- `ghcr.io/m1k1o/neko/chromium:latest`
- `ghcr.io/m1k1o/neko/google-chrome:latest`
- `ghcr.io/m1k1o/neko/ungoogled-chromium:latest`
- `ghcr.io/m1k1o/neko/microsoft-edge:latest`
- `ghcr.io/m1k1o/neko/brave:latest`
- `ghcr.io/m1k1o/neko/vivaldi:latest`
- `ghcr.io/m1k1o/neko/opera:latest`
- `ghcr.io/m1k1o/neko/tor-browser:latest`
- `ghcr.io/m1k1o/neko/remmina:latest`
- `ghcr.io/m1k1o/neko/vlc:latest`
- `ghcr.io/m1k1o/neko/xfce:latest`
- `ghcr.io/m1k1o/neko/kde:latest`
For ARM-based images (like Raspberry Pi - with GPU hardware acceleration, Oracle Cloud ARM tier). Currently, not all images are available for ARM, because not all applications are available for ARM. Please note, that `m1k1o/neko:arm-*` images from dockerhub are currently not maintained and they can contain outdated software. Please use images below:
- `ghcr.io/m1k1o/neko/arm-firefox:latest`
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
- `ghcr.io/m1k1o/neko/arm-ungoogled-chromium:latest`
- `ghcr.io/m1k1o/neko/arm-vlc:latest`
- `ghcr.io/m1k1o/neko/arm-xfce:latest`
For images with VAAPI GPU hardware acceleration using intel drivers use:
- `ghcr.io/m1k1o/neko/intel-firefox:latest`
- `ghcr.io/m1k1o/neko/intel-chromium:latest`
- `ghcr.io/m1k1o/neko/intel-google-chrome:latest`
- `ghcr.io/m1k1o/neko/intel-ungoogled-chromium:latest`
- `ghcr.io/m1k1o/neko/intel-microsoft-edge:latest`
- `ghcr.io/m1k1o/neko/intel-brave:latest`
- `ghcr.io/m1k1o/neko/intel-vivaldi:latest`
- `ghcr.io/m1k1o/neko/intel-opera:latest`
- `ghcr.io/m1k1o/neko/intel-tor-browser:latest`
- `ghcr.io/m1k1o/neko/intel-remmina:latest`
- `ghcr.io/m1k1o/neko/intel-vlc:latest`
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
- `ghcr.io/m1k1o/neko/intel-kde:latest`
For images with Nvidia GPU hardware acceleration using EGL (see example below) use (please note, there is a known issue with EGL and Chromium-based browsers, see [here](https://github.com/m1k1o/neko/issues/279)):
- `ghcr.io/m1k1o/neko/nvidia-firefox:latest`
- `ghcr.io/m1k1o/neko/nvidia-chromium:latest`
- `ghcr.io/m1k1o/neko/nvidia-google-chrome:latest`
- `ghcr.io/m1k1o/neko/nvidia-microsoft-edge:latest`
- `ghcr.io/m1k1o/neko/nvidia-brave:latest`
GHCR images are built using GitHub actions for every tag.
## Running Neko with Docker
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
```

View file

@ -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;
```

View 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 browsers 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.

View file

@ -0,0 +1,63 @@
---
sidebar_position: 2
---
# 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:
1. Deploy a server or VPS with public IP address.
**Recommended Specs:**
| Resolution | Cores | Ram | Recommendation |
|-------------|-------|-------|------------------|
| 1024×576@30 | 2 | 2gb | Not Recommended |
| 1280x720@30 | 4 | 3gb | Good Performance |
| 1280x720@30 | 6 | 4gb | Recommended |
| 1280x720@30 | 8 | 4gb+ | Best Performance |
:::danger[Why are the specs so high?]
If you think about it, you have to run a full desktop, a browser (a resource hog on its own) *and* encode/transmit the desktop, there's a lot going on and so it demands some power.
:::
:::note
Admin can change the resolution in the GUI.
:::
2. [Login via SSH](https://www.digitalocean.com/docs/droplets/how-to/connect-with-ssh/).
3. Install [Docker](https://docs.docker.com/get-docker/):
```shell
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
```
4. Install [Docker Compose Plugin](https://docs.docker.com/compose/install/linux/):
```shell
sudo apt-get update
sudo apt-get install docker-compose-plugin
```
5. Download docker compose file and start it:
```shell
wget https://raw.githubusercontent.com/m1k1o/neko/master/docker-compose.yaml
sudo docker compose up -d
```
:::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`.
:::tip
Run `nano docker-compose.yaml` to edit the settings, then press `ctrl+x` to exit and save the file.
:::
## Well known cloud providers
* [Hetzner Cloud](https://www.hetzner.com/cloud)
* [Digital Ocean](https://www.digitalocean.com/)
* [Contabo](https://contabo.com/)
* [Linode](https://www.linode.com/)
* [Vultr](https://www.vultr.com/)

View file

@ -0,0 +1,7 @@
---
sidebar_position: 4
---
# Running Neko
How to start and manage a Neko instance on different environments.

View file

@ -0,0 +1,7 @@
---
sidebar_position: 7
---
# Troubleshooting
Common issues, error messages, and their solutions.

View file

@ -0,0 +1,7 @@
---
sidebar_position: 6
---
# Updating & Upgrading
Best practices for keeping Neko updated and migrating between versions.