mirror of
https://github.com/m1k1o/neko.git
synced 2025-05-21 13:07:04 +02:00
add docker images and docker run docs.
This commit is contained in:
parent
70b9992a59
commit
d22f014fc6
11 changed files with 570 additions and 250 deletions
|
@ -4,4 +4,66 @@ sidebar_position: 2
|
|||
|
||||
# Building from Source
|
||||
|
||||
How to compile and run Neko from the source code.
|
||||
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;
|
||||
```
|
||||
|
|
217
webpage/docs/getting-started/docker-images.md
Normal file
217
webpage/docs/getting-started/docker-images.md
Normal file
|
@ -0,0 +1,217 @@
|
|||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Available Docker Images
|
||||
|
||||
Neko as a standalone streaming server is available as a Docker image. But that is rarely interesting for general use. The real power of Neko is in its ability to accommodate custom applications in the virtual desktop environment. This is where the various flavors of Neko Docker images come in.
|
||||
|
||||
The base image is available at [`ghcr.io/m1k1o/neko/base`](https://ghcr.io/m1k1o/neko/base).
|
||||
|
||||
## Naming Convention
|
||||
|
||||
Neko Docker images are available on [GitHub Container Registry (GHCR)](https://github.com/m1k1o?tab=packages&repo_name=neko). The naming convention for Neko Docker images is as follows:
|
||||
|
||||
```
|
||||
ghcr.io/m1k1o/neko/[<flavor>-]<application>:<version>
|
||||
```
|
||||
|
||||
- `<flavor>` is the optional flavor of the image, see [Available Flavors](#available-flavors) for more information.
|
||||
- `<application>` is the application name or base image, see [Available Applications](#available-applications) for more information.
|
||||
- `<version>` is the [semantic version](https://semver.org/) of the image from the [GitHub tags](https://github.com/m1k1o/neko/tags). There is always a `latest` tag available.
|
||||
|
||||
An alternative registry is also available on [Docker Hub](https://hub.docker.com/r/m1k1o/neko), however, only images without flavor and with the latest version are available there.
|
||||
|
||||
```
|
||||
m1k1o/neko:<application>
|
||||
```
|
||||
|
||||
:::info
|
||||
You should always prefer the GHCR registry with the ability to use flavors and specific versions.
|
||||
:::
|
||||
|
||||
## Available Applications
|
||||
|
||||
The following applications are available as Neko Docker images:
|
||||
|
||||
### Firefox-based browsers
|
||||
|
||||
In comparison to Chromium-based browsers, Firefox-based browsers do not require additional capabilities or a bigger shared memory size to not crash.
|
||||
|
||||
| Icon | Name | Docker Image |
|
||||
| ---- | ---- | ------------ |
|
||||
| <img src="/img/icons/firefox.svg" width="60" height="60" /> | [Firefox](https://www.mozilla.org/firefox/) <br /> The open-source browser from Mozilla. | [`ghcr.io/m1k1o/neko/firefox`](https://ghcr.io/m1k1o/neko/firefox) |
|
||||
| <img src="/img/icons/tor-browser.svg" width="60" height="60" /> | [Tor Browser](https://www.torproject.org/) <br /> The privacy-focused browser from the Tor Project. | [`ghcr.io/m1k1o/neko/tor-browser`](https://ghcr.io/m1k1o/neko/tor-browser) |
|
||||
|
||||
### Chromium-based browsers
|
||||
|
||||
There are multiple flavors of Chromium-based browsers available as Neko Docker images.
|
||||
|
||||
They need `--cap-add=SYS_ADMIN` (see [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container) for more information) and extended shared memory size (`--shm-size=2g`) to work properly.
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="docker-run" label="Docker run command">
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
--cap-add=SYS_ADMIN \
|
||||
--shm-size=2g \
|
||||
ghcr.io/m1k1o/neko/chromium
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="docker-compose" label="Docker Compose configuration">
|
||||
|
||||
```yaml title="docker-compose.yml"
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
shm_size: 2g
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
| Icon | Name | Docker Image |
|
||||
| ---- | ---- | ------------ |
|
||||
| <img src="/img/icons/chromium.svg" width="60" height="60" /> | [Chromium](https://www.chromium.org/chromium-projects/) <br /> The open-source project behind Google Chrome. | [`ghcr.io/m1k1o/neko/chromium`](https://ghcr.io/m1k1o/neko/chromium) |
|
||||
| <img src="/img/icons/google-chrome.svg" width="60" height="60" /> | [Google Chrome](https://www.google.com/chrome/) <br /> The most popular browser in the world. | [`ghcr.io/m1k1o/neko/google-chrome`](https://ghcr.io/m1k1o/neko/google-chrome) |
|
||||
| <img src="/img/icons/chromium.svg" width="60" height="60" /> | [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) <br /> A fork of Chromium without Google integration. | [`ghcr.io/m1k1o/neko/ungoogled-chromium`](https://ghcr.io/m1k1o/neko/ungoogled-chromium) |
|
||||
| <img src="/img/icons/microsoft-edge.svg" width="60" height="60" /> | [Microsoft Edge](https://www.microsoft.com/edge) <br/> The new Microsoft Edge is based on Chromium. | [`ghcr.io/m1k1o/neko/microsoft-edge`](https://ghcr.io/m1k1o/neko/microsoft-edge) |
|
||||
| <img src="/img/icons/brave.svg" width="60" height="60" /> | [Brave](https://brave.com/) <br /> A privacy-focused browser. | [`ghcr.io/m1k1o/neko/brave`](https://ghcr.io/m1k1o/neko/brave) |
|
||||
| <img src="/img/icons/vivaldi.svg" width="60" height="60" /> | [Vivaldi](https://vivaldi.com/) <br /> A highly customizable browser. | [`ghcr.io/m1k1o/neko/vivaldi`](https://ghcr.io/m1k1o/neko/vivaldi) |
|
||||
| <img src="/img/icons/opera.svg" width="60" height="60" /> | [Opera](https://www.opera.com/)* <br /> A fast and secure browser. | [`ghcr.io/m1k1o/neko/opera`](https://ghcr.io/m1k1o/neko/opera) |
|
||||
|
||||
\* requires extra steps to enable DRM, see instructions [here](https://www.reddit.com/r/operabrowser/wiki/opera/linux_widevine_config/). `libffmpeg` is already configured.
|
||||
|
||||
### Desktop Environments
|
||||
|
||||
These images feature a full desktop environment where you can install and run multiple applications, use window management, and more. This is useful for people who want to run multiple applications in a single container.
|
||||
|
||||
| Icon | Name | Docker Image |
|
||||
| ---- | ---- | ------------ |
|
||||
| <img src="/img/icons/xfce.svg" width="60" height="60" /> | [Xfce](https://xfce.org/) <br /> A lightweight desktop environment. | [`ghcr.io/m1k1o/neko/xfce`](https://ghcr.io/m1k1o/neko/xfce) |
|
||||
| <img src="/img/icons/kde.svg" width="60" height="60" /> | [KDE Plasma](https://kde.org/plasma-desktop) <br /> A feature-rich desktop environment. | [`ghcr.io/m1k1o/neko/kde`](https://ghcr.io/m1k1o/neko/kde) |
|
||||
|
||||
### Other Applications
|
||||
|
||||
As it would be impossible to include all possible applications in the repository, a couple of the most popular ones that work well with Neko have been chosen. Custom images can be created by using the base image and installing the desired application.
|
||||
|
||||
| Icon | Name | Docker Image |
|
||||
| ---- | ---- | ------------ |
|
||||
| <img src="/img/icons/remmina.svg" width="60" height="60" /> | [Remmina](https://remmina.org/) <br /> A remote desktop client. | [`ghcr.io/m1k1o/neko/remmina`](https://ghcr.io/m1k1o/neko/remmina) |
|
||||
| <img src="/img/icons/vlc.svg" width="60" height="60" /> | [VLC](https://www.videolan.org/vlc/) <br /> A media player. | [`ghcr.io/m1k1o/neko/vlc`](https://ghcr.io/m1k1o/neko/vlc) |
|
||||
|
||||
#### Remmina Configuration
|
||||
|
||||
To use Remmina with Neko, you can either pass the `REMMINA_URL=<proto>://[<username>[:<password>]@]server[:port]` environment variable (proto being `vnc`, `rdp` or `spice`):
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-e REMMINA_URL=vnc://server:5900 \
|
||||
ghcr.io/m1k1o/neko/remmina
|
||||
```
|
||||
|
||||
Or bind-mount a custom configuration file to `~/.local/share/remmina/path_to_profile.remmina`. Then pass the `REMMINA_PROFILE=<path_to_profile.remmina>` environment variable:
|
||||
|
||||
```ini title="default.remmina"
|
||||
[remmina]
|
||||
name=Default
|
||||
protocol=VNC
|
||||
server=server.local
|
||||
port=5900
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-v /path/to/default.remmina:/root/.local/share/remmina/default.remmina \
|
||||
-e REMMINA_PROFILE=/root/.local/share/remmina/default.remmina \
|
||||
ghcr.io/m1k1o/neko/remmina
|
||||
```
|
||||
|
||||
#### VLC Configuration
|
||||
|
||||
To use VLC with Neko, you can either pass the `VLC_MEDIA=<url>` environment variable:
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-e VLC_MEDIA=http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 \
|
||||
ghcr.io/m1k1o/neko/vlc
|
||||
```
|
||||
|
||||
You can also bind-mount your local media files to the container, create a custom playlist, and pass the `VLC_MEDIA=<path_to_playlist>` environment variable:
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-v /path/to/media:/media \
|
||||
-e VLC_MEDIA=/media/playlist.xspf \
|
||||
ghcr.io/m1k1o/neko/vlc
|
||||
```
|
||||
|
||||
:::tip
|
||||
See [neko-apps](https://github.com/m1k1o/neko-apps) repository for more applications.
|
||||
:::
|
||||
|
||||
## Available Flavors
|
||||
|
||||
The following flavors are available for Neko Docker images:
|
||||
|
||||
- `arm` - ARM64 and ARMv7 architecture support.
|
||||
- `nvidia` - NVIDIA GPU support.
|
||||
- `intel` - Intel GPU support.
|
||||
|
||||
:::note
|
||||
Not all flavors are available for all applications. Since not all applications support ARM architecture or GPU acceleration, the flavors are only available where they make sense.
|
||||
:::
|
||||
|
||||
### ARM
|
||||
|
||||
For ARM-based images (like Raspberry Pi - with GPU hardware acceleration, [Oracle Cloud ARM free tier](https://www.oracle.com/cloud/free/)). Currently, not all images are available for ARM, because not all applications are available for ARM. Please use the images below:
|
||||
|
||||
- [`ghcr.io/m1k1o/neko/arm-firefox`](https://ghcr.io/m1k1o/neko/arm-firefox)
|
||||
- [`ghcr.io/m1k1o/neko/arm-chromium`](https://ghcr.io/m1k1o/neko/arm-chromium)
|
||||
- [`ghcr.io/m1k1o/neko/arm-ungoogled-chromium`](https://ghcr.io/m1k1o/neko/arm-ungoogled-chromium)
|
||||
- [`ghcr.io/m1k1o/neko/arm-vlc`](https://ghcr.io/m1k1o/neko/arm-vlc)
|
||||
- [`ghcr.io/m1k1o/neko/arm-xfce`](https://ghcr.io/m1k1o/neko/arm-xfce)
|
||||
|
||||
The base image is available at [`ghcr.io/m1k1o/neko/arm-base`](https://ghcr.io/m1k1o/neko/arm-base).
|
||||
|
||||
### Intel
|
||||
|
||||
For images with VAAPI GPU hardware acceleration using Intel drivers use:
|
||||
|
||||
- [`ghcr.io/m1k1o/neko/intel-firefox`](https://ghcr.io/m1k1o/neko/intel-firefox)
|
||||
- [`ghcr.io/m1k1o/neko/intel-chromium`](https://ghcr.io/m1k1o/neko/intel-chromium)
|
||||
- [`ghcr.io/m1k1o/neko/intel-google-chrome`](https://ghcr.io/m1k1o/neko/intel-google-chrome)
|
||||
- [`ghcr.io/m1k1o/neko/intel-ungoogled-chromium`](https://ghcr.io/m1k1o/neko/intel-ungoogled-chromium)
|
||||
- [`ghcr.io/m1k1o/neko/intel-microsoft-edge`](https://ghcr.io/m1k1o/neko/intel-microsoft-edge)
|
||||
- [`ghcr.io/m1k1o/neko/intel-brave`](https://ghcr.io/m1k1o/neko/intel-brave)
|
||||
- [`ghcr.io/m1k1o/neko/intel-vivaldi`](https://ghcr.io/m1k1o/neko/intel-vivaldi)
|
||||
- [`ghcr.io/m1k1o/neko/intel-opera`](https://ghcr.io/m1k1o/neko/intel-opera)
|
||||
- [`ghcr.io/m1k1o/neko/intel-tor-browser`](https://ghcr.io/m1k1o/neko/intel-tor-browser)
|
||||
- [`ghcr.io/m1k1o/neko/intel-remmina`](https://ghcr.io/m1k1o/neko/intel-remmina)
|
||||
- [`ghcr.io/m1k1o/neko/intel-vlc`](https://ghcr.io/m1k1o/neko/intel-vlc)
|
||||
- [`ghcr.io/m1k1o/neko/intel-xfce`](https://ghcr.io/m1k1o/neko/intel-xfce)
|
||||
- [`ghcr.io/m1k1o/neko/intel-kde`](https://ghcr.io/m1k1o/neko/intel-kde)
|
||||
|
||||
The base image is available at [`ghcr.io/m1k1o/neko/intel-base`](https://ghcr.io/m1k1o/neko/intel-base).
|
||||
|
||||
### Nvidia
|
||||
|
||||
For images with Nvidia GPU hardware acceleration using EGL use:
|
||||
|
||||
- [`ghcr.io/m1k1o/neko/nvidia-firefox`](https://ghcr.io/m1k1o/neko/nvidia-firefox)
|
||||
- [`ghcr.io/m1k1o/neko/nvidia-chromium`](https://ghcr.io/m1k1o/neko/nvidia-chromium)
|
||||
- [`ghcr.io/m1k1o/neko/nvidia-google-chrome`](https://ghcr.io/m1k1o/neko/nvidia-google-chrome)
|
||||
- [`ghcr.io/m1k1o/neko/nvidia-microsoft-edge`](https://ghcr.io/m1k1o/neko/nvidia-microsoft-edge)
|
||||
- [`ghcr.io/m1k1o/neko/nvidia-brave`](https://ghcr.io/m1k1o/neko/nvidia-brave)
|
||||
|
||||
The base image is available at [`ghcr.io/m1k1o/neko/nvidia-base`](https://ghcr.io/m1k1o/neko/nvidia-base).
|
||||
|
||||
:::danger
|
||||
There is a known issue with EGL and Chromium-based browsers, see [m1k1o/neko #279](https://github.com/m1k1o/neko/issues/279).
|
||||
:::
|
||||
|
85
webpage/docs/getting-started/docker-run.md
Normal file
85
webpage/docs/getting-started/docker-run.md
Normal file
|
@ -0,0 +1,85 @@
|
|||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Running Neko in 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_WEBRTC_EPR=56000-56100 \
|
||||
-e NEKO_WEBRTC_NAT1TO1=127.0.0.1 \
|
||||
-e NEKO_MEMBER_MULTIUSER_USER_PASSWORD=neko \
|
||||
-e NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD=admin \
|
||||
ghcr.io/m1k1o/neko/firefox:latest
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- `-d` - Run the container in the background.
|
||||
- `--rm` - Automatically remove the container when it exits.
|
||||
- `-p 8080:8080` - Map the container's port `8080` to the host's port `8080`.
|
||||
- `-p 56000-56100:56000-56100/udp` - Map the container's UDP ports `56000-56100` to the host's ports `56000-56100`.
|
||||
- `-e NEKO_WEBRTC_EPR=56000-56100` - Set the WebRTC endpoint range, must match the mapped ports.
|
||||
- See [WebRTC Ephemeral Port Range](/docs/v3/getting-started/configuration/webrtc#ephemeral-udp-port-range) for more information about this setting.
|
||||
- `-e NEKO_WEBRTC_NAT1TO1=127.0.0.1` - Set the NAT1TO1 IP address.
|
||||
- To test only on the local computer, use `127.0.0.1`.
|
||||
- To use it in a private network, use the host's IP address (e.g., `192.168.1.5`).
|
||||
- To use it in a public network, you need to correctly set up port forwarding on your router and remove this env variable.
|
||||
- See [WebRTC Server IP Address](/docs/v3/getting-started/configuration/webrtc#server-ip-address) for more information about this setting.
|
||||
- `-e NEKO_MEMBER_MULTIUSER_USER_PASSWORD=neko` - Set the password for the user account.
|
||||
- `-e NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD=admin` - Set the password for the admin account.
|
||||
- See [Multiuser Configuration](/docs/v3/getting-started/configuration/authentication#multi-user-provider) for more information about this setting.
|
||||
- `ghcr.io/m1k1o/neko/firefox:latest` - The Neko Docker image to use.
|
||||
- See [Available Docker Images](/docs/v3/getting-started/docker-images) for more information about the available images.
|
||||
|
||||
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. It is preferred to use Docker Compose for running Neko in production because you can easily manage the container, update it, and configure it.
|
||||
|
||||
Create a `docker-compose.yml` file with the following content:
|
||||
|
||||
```yaml title="docker-compose.yml"
|
||||
services:
|
||||
neko:
|
||||
image: ghcr.io/m1k1o/neko/firefox:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "56000-56100:56000-56100/udp"
|
||||
environment:
|
||||
NEKO_WEBRTC_EPR: "56000-56100"
|
||||
NEKO_WEBRTC_NAT1TO1: "127.0.0.1"
|
||||
NEKO_MEMBER_MULTIUSER_USER_PASSWORD: "neko"
|
||||
NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD: "admin"
|
||||
```
|
||||
|
||||
Then, run the following command:
|
||||
|
||||
```sh
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
To stop Neko, run:
|
||||
|
||||
```sh
|
||||
docker compose down
|
||||
```
|
||||
|
||||
To update Neko, run:
|
||||
|
||||
```sh
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Learn more about [how compose works](https://docs.docker.com/compose/intro/compose-application-model/).
|
||||
|
||||
:::note
|
||||
You need to be in the same directory as the `docker-compose.yml` file to run the `docker compose` commands.
|
||||
:::
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"position": 3,
|
||||
"label": "Installation",
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "There are multiple ways to install neko, choose the one that fits your needs."
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
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,144 +0,0 @@
|
|||
---
|
||||
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
|
||||
```
|
|
@ -1,74 +0,0 @@
|
|||
---
|
||||
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;
|
||||
```
|
||||
|
|
@ -6,7 +6,7 @@ sidebar_position: 2
|
|||
|
||||
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.
|
||||
1. Deploy a server or VPS with a public IP address.
|
||||
|
||||
**Recommended Specs:**
|
||||
|
||||
|
@ -23,7 +23,7 @@ Neko is easy to use and requires no technical expertise to get started. All you
|
|||
:::
|
||||
|
||||
:::note
|
||||
Admin can change the resolution in the GUI.
|
||||
The admin can change the resolution in the GUI.
|
||||
:::
|
||||
|
||||
2. [Login via SSH](https://www.digitalocean.com/docs/droplets/how-to/connect-with-ssh/).
|
||||
|
@ -39,7 +39,7 @@ Neko is easy to use and requires no technical expertise to get started. All you
|
|||
sudo apt-get install docker-compose-plugin
|
||||
```
|
||||
|
||||
5. Download docker compose file and start it:
|
||||
5. Download the docker compose file and start it:
|
||||
```shell
|
||||
wget https://raw.githubusercontent.com/m1k1o/neko/master/docker-compose.yaml
|
||||
sudo docker compose up -d
|
||||
|
@ -49,13 +49,13 @@ Neko is easy to use and requires no technical expertise to get started. All you
|
|||
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 server's IP address in your browser and log in, 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
|
||||
## Well-known cloud providers
|
||||
* [Hetzner Cloud](https://www.hetzner.com/cloud)
|
||||
* [Digital Ocean](https://www.digitalocean.com/)
|
||||
* [Contabo](https://contabo.com/)
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Running Neko
|
||||
|
||||
How to start and manage a Neko instance on different environments.
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
200
webpage/static/img/icons/remmina.svg
Normal file
200
webpage/static/img/icons/remmina.svg
Normal file
|
@ -0,0 +1,200 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64.956261mm"
|
||||
height="64.956261mm"
|
||||
viewBox="0 0 64.956261 64.956261"
|
||||
version="1.1"
|
||||
id="svg4705"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="org.remmina.Remmina.svg">
|
||||
<defs
|
||||
id="defs4699">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient954"
|
||||
id="linearGradient11065"
|
||||
x1="104"
|
||||
y1="44"
|
||||
x2="200"
|
||||
y2="268"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.26458333,0,0,0.26458333,-202.74643,-217.02023)" />
|
||||
<linearGradient
|
||||
id="linearGradient954">
|
||||
<stop
|
||||
id="stop950"
|
||||
offset="0"
|
||||
style="stop-color:#faf8f6;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop952"
|
||||
offset="1"
|
||||
style="stop-color:#f1f0e9;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter11191"
|
||||
x="-0.012"
|
||||
width="1.024"
|
||||
y="-0.012"
|
||||
height="1.024">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.12"
|
||||
id="feGaussianBlur11193" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter11210"
|
||||
x="-0.048"
|
||||
width="1.096"
|
||||
y="-0.048"
|
||||
height="1.096">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="4.48"
|
||||
id="feGaussianBlur11212" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="-2105.8194"
|
||||
inkscape:cy="228.46628"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2098"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="30"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata4702">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-130.05163,-144.32544)">
|
||||
<circle
|
||||
style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter11210);enable-background:new"
|
||||
id="path11042-0"
|
||||
r="112"
|
||||
cy="122.752"
|
||||
cx="122.752"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,130.05163,144.32544)" />
|
||||
<circle
|
||||
style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter11191);enable-background:new"
|
||||
id="path11042-6"
|
||||
r="112"
|
||||
cy="120.75198"
|
||||
cx="122.752"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,130.05163,144.32544)" />
|
||||
<circle
|
||||
style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
|
||||
id="path11042-7"
|
||||
cy="175.74524"
|
||||
cx="162.52977"
|
||||
r="30.162498" />
|
||||
<circle
|
||||
style="display:inline;opacity:1;fill:url(#linearGradient11065);fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
|
||||
id="path11042"
|
||||
r="29.633333"
|
||||
cy="-175.74524"
|
||||
cx="-162.52977"
|
||||
transform="scale(-1)" />
|
||||
<path
|
||||
style="display:inline;opacity:0.1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.82222199;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
|
||||
d="m 132.89643,178.31061 a 29.774753,29.77474 0 0 0 29.62739,27.06796 29.774753,29.77474 0 0 0 29.63928,-27.06796 z"
|
||||
id="rect12119"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="display:inline;enable-background:new"
|
||||
id="g1019"
|
||||
transform="matrix(0.66107098,0,0,0.66107098,137.13009,150.39924)">
|
||||
<g
|
||||
id="g863">
|
||||
<g
|
||||
id="g855">
|
||||
<polygon
|
||||
style="fill:#20aa73"
|
||||
class="st1"
|
||||
points="20.618,17.742 20.618,26.923 29.549,32.877 20.618,38.831 20.618,48.012 43.32,32.877 "
|
||||
id="polygon853" />
|
||||
</g>
|
||||
<g
|
||||
id="g861">
|
||||
<g
|
||||
id="g859">
|
||||
<polygon
|
||||
style="fill:#4a93dd"
|
||||
class="st2"
|
||||
points="55.388,59.232 55.388,50.051 46.457,44.097 55.388,38.143 55.388,28.962 32.685,44.097 "
|
||||
id="polygon857" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g873">
|
||||
<g
|
||||
id="g867">
|
||||
<path
|
||||
style="fill:#20aa73"
|
||||
inkscape:connector-curvature="0"
|
||||
class="st1"
|
||||
d="m 64.776,23.074 c 2.632,4.509 4.147,9.75 4.147,15.348 0,16.845 -13.656,30.5 -30.5,30.5 -9.922,0 -18.734,-4.741 -24.304,-12.077 L 7.53,61.238 c 7.005,9.461 18.243,15.607 30.892,15.607 21.186,0 38.423,-17.236 38.423,-38.423 0,-7.215 -2.002,-13.97 -5.476,-19.744 z"
|
||||
id="path865" />
|
||||
</g>
|
||||
<g
|
||||
id="g871">
|
||||
<path
|
||||
style="fill:#4a93dd"
|
||||
inkscape:connector-curvature="0"
|
||||
class="st2"
|
||||
d="m 7.922,38.423 c 0,-16.845 13.656,-30.5 30.5,-30.5 9.826,0 18.561,4.652 24.139,11.868 l 6.596,-4.397 C 62.142,6.053 50.976,0 38.423,0 17.236,0 0,17.236 0,38.423 0,45.543 1.954,52.212 5.343,57.936 L 11.937,53.54 C 9.387,49.083 7.922,43.925 7.922,38.423 Z"
|
||||
id="path869" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="display:inline;opacity:0.3;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
|
||||
d="m 162.52976,146.11191 a 29.633333,29.633333 0 0 0 -29.63333,29.63333 29.633333,29.633333 0 0 0 0.0108,0.30954 29.633333,29.633333 0 0 1 29.62248,-29.41371 29.633333,29.633333 0 0 1 29.62248,29.32379 29.633333,29.633333 0 0 0 0.0109,-0.21962 29.633333,29.633333 0 0 0 -29.63333,-29.63333 z"
|
||||
id="path11042-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="display:inline;opacity:0.2;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
|
||||
d="m 162.52976,205.37857 a 29.633333,29.633333 0 0 1 -29.63333,-29.63333 29.633333,29.633333 0 0 1 0.0108,-0.30954 29.633333,29.633333 0 0 0 29.62248,29.4137 29.633333,29.633333 0 0 0 29.62248,-29.32379 29.633333,29.633333 0 0 1 0.0109,0.21963 29.633333,29.633333 0 0 1 -29.63333,29.63333 z"
|
||||
id="path11042-1-7" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.9 KiB |
Loading…
Add table
Add a link
Reference in a new issue