Gowstream

De Le Wiki de Lug
Aller à la navigation Aller à la recherche

LXC Debian

Source

Prérequis

  • LXC avec Privilèges et Nesting

Installation

Virtual devices support

Source

Depuis le serveur :

# vi /etc/udev/rules.d/85-wolf-virtual-inputs.rules
# Allows Wolf to acces /dev/uinput (only needed for joypad support)
KERNEL=="uinput", SUBSYSTEM=="misc", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput", TAG+="uaccess"

# Allows Wolf to access /dev/uhid (only needed for DualSense emulation)
KERNEL=="uhid", GROUP="input", MODE="0660", TAG+="uaccess"

# Joypads
KERNEL=="hidraw*", ATTRS{name}=="Wolf PS5 (virtual) pad", GROUP="input", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf X-Box One (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf PS5 (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf gamepad (virtual) motion sensors", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf Nintendo (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"

On redémarre le serveur ou l'on charge la configuration avec la commande :

# udevadm control --reload-rules && udevadm trigger

NVidia

Après création du conteneur, depuis le serveur :

# vi /etc/pve/lxc/100.conf
...
dev0: /dev/uinput
dev1: /dev/uhid
dev2: /dev/nvidia0
dev3: /dev/nvidiactl
dev4: /dev/nvidia-modeset
dev5: /dev/nvidia-uvm
dev6: /dev/nvidia-uvm-tools
dev7: /dev/nvidia-caps/nvidia-cap1
dev8: /dev/nvidia-caps/nvidia-cap2
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /run/udev mnt/udev none bind,optional,create=dir
lxc.mount.entry: /dev mnt/dev none bind,optional,create=dir

On démarre le LXC, ensuite depuis le LXC :

# apt update && apt upgrade

On installe le pilote NVidia (référence), exemple :

# bash /opt/nvidia-driver/NVIDIA-Linux-x86_64-590.48.01.run --no-kernel-module
# bash /opt/nvidia-driver/nvidia-patch/patch.sh
# bash /opt/nvidia-driver/nvidia-patch/patch-fbc.sh

On installe docker et docker-compose :

# apt install docker.io docker-compose-plugin curl

On install le docker NVidia :

# cd /opt/
# curl https://raw.githubusercontent.com/games-on-whales/gow/master/images/nvidia-driver/Dockerfile | docker build -t gow/nvidia-driver:latest -f - --build-arg NV_VERSION=$(cat /sys/module/nvidia/version) .
# docker create --rm --mount source=nvidia-driver-vol,destination=/usr/nvidia gow/nvidia-driver:latest sh

On installe le conteneur de GOW :

# mkdir /opt/gow
# cd /opt/gow/
# vi docker-compose.yml
version: "3"
services:
  wolf:
    image: ghcr.io/games-on-whales/wolf:stable
    environment:
      - NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol
      #- WOLF_RENDER_NODE=/dev/dri/renderD12X  ##pour multiGPU
    volumes:
      - /etc/wolf/:/etc/wolf:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /mnt/udev:/run/udev:rw
      - /mnt/dev:/dev:rw
      - nvidia-driver-vol:/usr/nvidia:rw
    devices:
      - /dev/dri
      - /dev/uinput
      - /dev/uhid
      - /dev/nvidia-uvm
      - /dev/nvidia-uvm-tools
      - /dev/nvidia-caps/nvidia-cap1
      - /dev/nvidia-caps/nvidia-cap2
      - /dev/nvidiactl
      - /dev/nvidia0
      - /dev/nvidia-modeset
    device_cgroup_rules:
      - 'c 13:* rmw'
    network_mode: host
    restart: unless-stopped

volumes:
  nvidia-driver-vol:
    external: true
# docker compose up -d

Autoriser client

Lors de la première tentative de connexion d'un client il faut rentrer le pin dans un lien web pour l'autoriser, depuis le LXC :

# docker ps

Exemple :

CONTAINER ID   IMAGE                                       COMMAND            CREATED          STATUS          PORTS      NAMES
c5e43d2fc724   ghcr.io/games-on-whales/pulseaudio:master   "/entrypoint.sh"   29 minutes ago   Up 29 minutes   4713/tcp   WolfPulseAudio
c581ab5d8827   ghcr.io/games-on-whales/wolf:stable         "/entrypoint.sh"   29 minutes ago   Up 29 minutes              opt-wolf-1
# docker logs opt-wolf-1
...
... Insert pin at http://192.168.1.123:47989/pin/#EXEMPLE
...

Configuration

Par défaut :

WOLF_CFG_FILE=/etc/wolf/cfg/config.toml
# vi /etc/wolf/cfg/config.toml

Monter un dossier dans une app

Exemple avec Pegasus : (source)

# vi /etc/wolf/cfg/config.toml

Modifier :

    [[profiles.apps]]
    icon_png_path = 'https://games-on-whales.github.io/wildlife/apps/pegasus/assets/icon.png'
    start_virtual_compositor = true
    title = 'Pegasus'

        [profiles.apps.runner]
        base_create_json = {
  "HostConfig": {
    "IpcMode": "host",
    "CapAdd": ["NET_RAW", "MKNOD", "NET_ADMIN", "SYS_ADMIN", "SYS_NICE"],
    "Privileged": false,
    "DeviceCgroupRules": ["c 13:* rmw", "c 244:* rmw"]
  }
}

        devices = []
        env = [ 'RUN_SWAY=1', 'GOW_REQUIRED_DEVICES=/dev/input/event* /dev/dri/* /dev/nvidia*' ]
        image = 'ghcr.io/games-on-whales/pegasus:edge'
        mounts = []
        name = 'WolfPegasus'
        ports = []
        type = 'docker'

Par, exemple :

         ...
         devices = []
         env = [ 'RUN_SWAY=1', 'GOW_REQUIRED_DEVICES=/dev/input/event* /dev/dri/* /dev/nvidia*' ]
         image = 'ghcr.io/games-on-whales/pegasus:edge'
         mounts = [
             "/mnt/Emulation:/assets/romm:ro",# exemple de compatibilite avec ROMM
             "/mnt/Emulation/roms:/ROMs:ro"
         ]
         name = 'WolfPegasus'
         ports = []
         ...

On redémarre le conteneur :

# docker restart opt-wolf-1

Importer un thème dans Pegasus

# cd /etc/wolf/profile-data/user/WolfPegasus/.config/pegasus-frontend/themes/ 

Exemple avec "gameOS" (normalement déjà présent..) :

# wget https://github.com/PlayingKarrde/gameOS/archive/master.zip
# unzip master.zip

convertir les gamelist.xml en metadata.txt

Voir ce lien

Moonlight Wev Stream

Source

Docker

Source

# mkdir /opt/moonlightwebstream
# cd /opt/moonlightwebstream
# vi docker-compose.yml
 services:
  moonlight-web:
    image: mrcreativ3001/moonlight-web-stream:latest
    container_name: moonlight-web
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "40000-40100:40000-40100/udp"
    volumes:
      - /opt/moonlightwebstream/server:/moonlight-web/server
# docker compose up -d

Configuration

# vi /opt/moonlightwebstream/server/config.json

Auhtentification

Au minimum renseigner les champs suivant :

        ...
        "username": "un_utilisateur",
        "credential": "un_mot_de_passe"
        ...

vhost

server {
    listen 443 ssl http2;
    server_name moonlight.tondomaine.com;

    ssl_certificate /etc/letsencrypt/live/moonlight.tondomaine.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/moonlight.tondomaine.com/privkey.pem;

    location /api/host/stream {
        proxy_pass http://192.168.123:8080/api/host/stream;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 86400;
    }

    location / {
        proxy_pass http://192.168.1.123:8080/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 86400;
    }
}