Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« Gowstream » : différence entre les versions

De Le Wiki de Lug
 
(72 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
= LXC Debian =
== LXC Debian ==
[https://games-on-whales.github.io/wolf/stable/user/quickstart.html Source]
[https://games-on-whales.github.io/wolf/stable/user/quickstart.html Source]
== Prérequis ==
=== Prérequis ===
* LXC avec Privilèges et Nesting
* LXC avec Privilèges et Nesting
== Installation ==
=== Installation ===
=== Virtual devices support ===
==== Virtual devices support ====
[https://games-on-whales.github.io/wolf/stable/user/quickstart.html#_virtual_devices_support Source]
[https://games-on-whales.github.io/wolf/stable/user/quickstart.html#_virtual_devices_support Source]


Ligne 25 : Ligne 25 :
On redémarre le serveur ou l'on charge la configuration avec la commande :
On redémarre le serveur ou l'on charge la configuration avec la commande :
  # udevadm control --reload-rules && udevadm trigger
  # udevadm control --reload-rules && udevadm trigger
== NVidia ==
 
Après création du conteneur, depuis le serveur :
==== NVidia ====
Après création du conteneur LXC, depuis le serveur :
  # vi /etc/pve/lxc/<font color = blue>100</font>.conf
  # vi /etc/pve/lxc/<font color = blue>100</font>.conf


Ligne 52 : Ligne 53 :
On installe docker et docker-compose :
On installe docker et docker-compose :
  # apt install docker.io docker-compose-plugin curl
  # apt install docker.io docker-compose-plugin curl
On install le docker NVidia :
On crée le volume Docker qui contient une copie des bibliothèques NVIDIA :
  # cd /opt/
  # cd /opt/
  # curl <nowiki>https://</nowiki>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) .
  # curl <nowiki>https://</nowiki>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) .
Ligne 96 : Ligne 97 :
  # docker compose up -d
  # docker compose up -d


= Autoriser client =
== 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 :
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
  # docker ps
Ligne 109 : Ligne 110 :
  <font color = grey>...</font> Insert pin at <font color = blue><nowiki>http://</nowiki>192.168.1.123:47989/pin/#EXEMPLE</font>
  <font color = grey>...</font> Insert pin at <font color = blue><nowiki>http://</nowiki>192.168.1.123:47989/pin/#EXEMPLE</font>
  <font color = grey>...</font>
  <font color = grey>...</font>
= Configuration =
== Configuration ==
Par défaut :
Par défaut :
  WOLF_CFG_FILE=/etc/wolf/cfg/config.toml
  WOLF_CFG_FILE=/etc/wolf/cfg/config.toml


  # vi /etc/wolf/cfg/config.toml
  # vi /etc/wolf/cfg/config.toml
== Monter un dossier dans une app ==
=== Monter un dossier dans une app ===
Exemple avec Pegasus : ([https://games-on-whales.github.io/wildlife/apps/pegasus/ source])
Exemple avec Pegasus : ([https://games-on-whales.github.io/wildlife/apps/pegasus/ source])
  # vi /etc/wolf/cfg/config.toml
  # vi /etc/wolf/cfg/config.toml
Ligne 148 : Ligne 149 :
           image = 'ghcr.io/games-on-whales/pegasus:edge'</font>
           image = 'ghcr.io/games-on-whales/pegasus:edge'</font>
           <font color = blue>mounts = [
           <font color = blue>mounts = [
               "/mnt/PATH_TO_ROMS_IN_YOUR_HOST/:/ROMs/:rw" # <-- EDIT HERE
               "/mnt/Emulation/resources:/assets/romm/resources:<font color = red>ro</font>",<font color = white># exemple de compatibilite avec assets ROMM</font>
              "/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:<font color = red>ro</font>",<font color = white># pack de bios pour retroarch</font>
              "/mnt/Emulation/roms:/ROMs:<font color = red>ro</font>"<font color = white># roms dans le dossier par default, a ajouter dans le menu de Pegasus pour certains dossiers..</font>
           ]</font>
           ]</font>
           <font color = grey>name = 'WolfPegasus'
           <font color = grey>name = 'WolfPegasus'
Ligne 154 : Ligne 157 :
           ...</font>
           ...</font>


On redémarre le conteneur :
Redémarrer ensuite le conteneur Wolf :
# docker restart opt-wolf-1
{{Méta bandeau
  | niveau = information
  | icône = loupe
  | texte  = A noter que contrairement à ROMM Retroarch réclame d'avoir tous les bios dans le même dossier.
}}
=== Images personnalisées ===
Le paramètre <code>icon_png_path</code> indique l’icône qui sera affichée dans les clients Moonlight pour chaque application.
 
L’image doit être au format PNG, idéalement en 200x266 ou 628x888 pixels.
 
L’emplacement de l’image peut être indiqué de trois manières différentes :
 
* Une URL, par exemple :
"<nowiki>https://</nowiki>games-on-whales.github.io/wildlife/apps/steam/assets/icon.png"
 
* Un chemin relatif à HOST_APPS_STATE_FOLDER, par exemple :
"icons/icon.png"
 
* Un chemin absolu, par exemple :
"/mnt/path/to/files/icon.png"
{{Méta bandeau
  | niveau = information
  | icône = loupe
  | texte  = Par simplicité, il est conseillé de créer et d’utiliser le chemin absolu <code>/etc/wolf/icons</code>, car le répertoire /etc/wolf est déjà monté par défaut dans les conteneurs de Games on Whales.
}}
=== Changer la disposition du clavier dans une application ===
Par défaut, les applications peuvent se lancer avec une disposition de clavier US. Pour la changer, il faut ajouter les variables "XKB_DEFAULT_LAYOUT" et "XKB_DEFAULT_VARIANT" dans le bloc "env" de l’application concernée.
 
Exemple pour un clavier français :
# vi /etc/wolf/cfg/config.toml
Ajouter :
<font color = grey>...</font>
env = [ 'PROTON_LOG=1', 'RUN_SWAY=true', 'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*'<font color = blue>, 'XKB_DEFAULT_LAYOUT=fr', 'XKB_DEFAULT_VARIANT=azerty'</font> ]
<font color = grey>...</font>
Redémarrer ensuite le conteneur Wolf :
  # docker restart opt-wolf-1
  # docker restart opt-wolf-1
= Importer un thème dans Pegasus =
 
=== Fichier de configuration clavier ===
 
Il est possible d’utiliser un fichier de configuration Sway afin de disposer de plusieurs dispositions de clavier dans les applications Games on Whales utilisant Sway.
 
Créer le fichier de configuration :
 
# vi /etc/wolf/cfg/90-custom.conf
 
Ajouter :
 
input type:keyboard {
    xkb_layout "fr,us"
    xkb_numlock "enable"
}
 
{{Méta bandeau
  | niveau = information
  | icône = information
  | texte  = La première disposition indiquée sera utilisée par défaut. Dans cet exemple, le clavier démarre donc en français, puis peut basculer en US.
}}
 
Ensuite, utiliser [[#Monter_un_dossier_dans_une_app|un point de montage]] dans l’application concernée :
 
"/etc/wolf/cfg/90-custom.conf:/etc/sway/config.d/90-custom.conf"
 
Redémarrer ensuite le conteneur Wolf :
 
# docker restart opt-wolf-1
 
=== Code PIN ===
Exemple :
<nowiki>[[profiles]]</nowiki>
id = 'user'
name = 'Random User'
icon_png_path = '<nowiki>http://</nowiki>192.168.1.155:8888/misc/guest.png'
pin = [ 3, 2, 1, 4 ]
 
 
== Configuration avancée des conteneurs ==
=== Pegasus ===
==== Importer un thème dans Pegasus ====
  # cd /etc/wolf/profile-data/<font color = blue>user</font>/WolfPegasus/.config/pegasus-frontend/themes/  
  # cd /etc/wolf/profile-data/<font color = blue>user</font>/WolfPegasus/.config/pegasus-frontend/themes/  
Exemple avec "gameOS" (normalement déjà présent..) :
Exemple avec "gameOS" (normalement déjà présent..) :
  # wget <nowiki>https://</nowiki>github.com/PlayingKarrde/gameOS/archive/master.zip
  # wget <nowiki>https://</nowiki>github.com/PlayingKarrde/gameOS/archive/master.zip
  # unzip master.zip
  # unzip master.zip
= Moonlight Wev Stream =
[https://github.com/MrCreativ3001/moonlight-web-stream Source]
== Docker ==
[https://github.com/MrCreativ3001/moonlight-web-stream/blob/master/docker/README.md Source]
# mkdir /opt/moonlightwebstream
# cd /opt/moonlightwebstream
# vi docker-compose.yml


  services:
==== Montage utile pour Pegasus ====
  moonlight-web:
Installer des bin d'émulateur :
    image: mrcreativ3001/moonlight-web-stream:latest
"/opt/emulator:/opt/emulator:rw",
    container_name: moonlight-web
Artwork pour Game and Watch (mame) ( exemple avec "/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro") :
    restart: unless-stopped
# mkdir -p <font color = blue>/mnt/Emulation/bios/retroarchbioses</font>/mame
    ports:
# ln -s <font color = blue>/mnt/Emulation/roms/</font>g-and-w_artwork <font color = blue>/mnt/Emulation/bios/retroarchbioses</font>/mame/artwork
      - "<font color = green>8080:8080</font>"
 
      - "<font color = green>40000-40100:40000-40100/udp</font>"
==== Pegasus : Configuration persistante multisession ====
    volumes:
On utilise un montage persistant pour le dossier de configuration de chaque profil, ainsi que pour la configuration de Pegasus.
      - /opt/moonlightwebstream/server:/moonlight-web/server
Cela permet de ne pas perdre les configurations et les sauvegardes des émulateurs lors des mises à jour du conteneur, tout en partageant la configuration de Pegasus entre les utilisateurs afin de conserver les mêmes dossiers de ROMs.
 
On crée un dossier de configuration global pour Pegasus :
 
# mkdir -p /etc/wolfpegasus/global
# chown -R 1000:1000 /etc/wolfpegasus/global
 
Optionnellement, on récupère la configuration déjà faite pour un utilisateur :
 
# cp -a /etc/wolf/profile-data/<font color="blue">user</font>/WolfPegasus/.config/pegasus-frontend/. /etc/wolfpegasus/global/
# chown -R 1000:1000 /etc/wolfpegasus/global
 
On crée ensuite un dossier de configuration pour chaque utilisateur. Exemple avec <code>user2</code> :
 
# mkdir -p /etc/wolfpegasus/<font color="blue">user2</font>
# chown -R 1000:1000 /etc/wolfpegasus/<font color="blue">user2</font>
 
Optionnellement, on peut récupérer les cores déjà installés pour Retroarch :
# mkdir -p /etc/wolfpegasus/<font color="blue">user2</font>/retroarch/cores
# cp -a /etc/wolf/profile-data/<font color="blue">user</font>/WolfPegasus/.config/retroarch/cores/. /etc/wolfpegasus/<font color="blue">user2</font>/retroarch/cores/
# chown -R 1000:1000 /etc/wolfpegasus/<font color="blue">user2</font>
 
On ajoute ensuite les montages a l'utilisateur, exemple :
# vi /etc/wolf/cfg/config.toml


  # docker compose up -d
  <nowiki>[[profiles]]</nowiki>
== Configuration ==
id = '<font color="blue">user2</font>'
# vi /opt/moonlightwebstream/server/config.json
name = '<font color="blue">User2</font>'
=== Auhtentification ===
Au minimum renseigner les champs suivant :
        <font color = grey>...</font>
        "username": "<font color = blue>un_utilisateur</font>",
        "credential": "<font color = blue>un_mot_de_passe</font>"
        <font color = grey>...</font>
== vhost ==
server {
    listen 443 ssl http2;
    server_name <font color = blue>moonlight.tondomaine.com</font>;
   
   
     ssl_certificate /etc/letsencrypt/live/<font color = blue>moonlight.tondomaine.com</font>/fullchain.pem;
     <nowiki>[[profiles.apps]]</nowiki>
     ssl_certificate_key /etc/letsencrypt/live/<font color = blue>moonlight.tondomaine.com</font>/privkey.pem;
     icon_png_path = '<font color="green">/etc/wolf/pegasus.png</font>'
    start_virtual_compositor = true
    title = 'Pegasus'
   
   
     location /api/host/stream {
        <nowiki>[profiles.apps.runner]</nowiki>
         proxy_pass http://<font color = blue>192.168.123:8080</font>/api/host/stream;
        base_create_json = '''{
         proxy_http_version 1.1;
  "HostConfig": {
        proxy_set_header Upgrade $http_upgrade;
     "IpcMode": "host",
        proxy_set_header Connection "upgrade";
    "CapAdd": ["NET_RAW", "MKNOD", "NET_ADMIN", "SYS_ADMIN", "SYS_NICE"],
        proxy_set_header Host $host;
    "Privileged": false,
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    "DeviceCgroupRules": ["c 13:* rmw", "c 244:* rmw"]
        proxy_read_timeout 86400;
  }
     }
}
'''
        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/resources:/assets/romm/resources:ro',
            '/opt/emulator:/opt/emulator:ro',
            '/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro',
            '/mnt/Emulation/roms:/ROMs:ro',
            '/etc/wolfpegasus/<font color="blue">user2</font>:/home/retro/.config:rw',
            '/etc/wolfpegasus/global:/home/retro/.config/pegasus-frontend:<font color="red">ro</font>' # ro pour bloquer modification / rw pour modifier conf, exemple sur compte admin
        ]
        name = 'WolfPegasus'
        ports = []
         type = 'docker'
Enfin, on redémarre GOW :
  # docker restart opt-wolf-1
==== convertir les gamelist.xml en metadata.txt ====
Voir [[ROMM#convertir_les_gamelist.xml_en_metadata.txt|ce lien]]
 
=== Heroic Game Launcher ===
 
"Launcher" pour les jeux Epic et GOG. Pour utiliser le conteneur de GOW :
 
  <nowiki>[[profiles.apps]]</nowiki>
    title = 'Heroic'
    icon_png_path = "<nowiki>https://</nowiki>games-on-whales.github.io/wildlife/apps/heroic-games-launcher/assets/icon.png"
     start_virtual_compositor = true
   
   
    location / {
        <nowiki>[profiles.apps.runner]</nowiki>
         proxy_pass http://<font color = blue>192.168.1.123:8080</font>/;
        type = 'docker'
        proxy_http_version 1.1;
        name = 'WolfHeroic'
        proxy_set_header Host $host;
         image = 'ghcr.io/games-on-whales/heroic-games-launcher:edge'
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        env = [
        proxy_set_header X-Forwarded-Proto https;
            'RUN_SWAY=true',
        proxy_read_timeout 86400;
            'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*',
    }
            <font color="blue">'HEROIC_STARTUP_FLAGS=--ozone-platform=x11 --enable-features=UseOzonePlatform,WaylandWindowDecorations GenericName=gs_hgl'</font>
  }
        ]
        devices = []
        mounts = []
        ports = []
        base_create_json = '''{
          "HostConfig": {
            "IpcMode": "host",
            "CapAdd": ["SYS_ADMIN", "SYS_NICE", "SYS_PTRACE", "NET_RAW", "MKNOD", "NET_ADMIN"],
            "SecurityOpt": ["seccomp=unconfined", "apparmor=unconfined"],
            "Ulimits": [{"Name":"nofile", "Hard":10240, "Soft":10240}],
            "Privileged": false,
            "DeviceCgroupRules": ["c 13:* rmw", "c 244:* rmw"]
          }
        }'''
 
{{Méta bandeau
  | niveau = information
  | icône = information
  | texte  = La ligne en bleu permet de contourner les problèmes de lenteur liés à Electron sur les dernières versions de Heroic Game Launcher. Voir : [https://github.com/games-on-whales/gow/issues/291 Source].
}}
 
== Recréer le volume NVIDIA après mise à jour du pilote ==
 
Après une mise à jour du pilote NVIDIA sur l’hôte, Games on Whales / Wolf peut ne plus produire de vidéo dans Moonlight, avec un symptôme du type :
 
<nowiki>No video received from host</nowiki>
 
La cause fréquente est un décalage entre :
* la version du pilote NVIDIA chargée sur l’hôte ;
* les bibliothèques NVIDIA stockées dans le volume Docker <code>nvidia-driver-vol</code> utilisé par Wolf.
 
Il ne suffit pas toujours de reconstruire l’image <code>gow/nvidia-driver:latest</code>. Il faut aussi supprimer les anciens conteneurs qui utilisent encore le volume, puis recréer le volume proprement.
 
* Arrêter Games on Whales / Wolf :
# cd /opt/gow
# docker compose down
 
* Supprimer tous les conteneurs qui utilisent <code>nvidia-driver-vol</code> :
# docker rm -f $(docker ps -aq --filter volume=nvidia-driver-vol)
 
{{Méta bandeau
  | niveau = modéré
  | icône = attention
  | texte  = Cette commande supprime les conteneurs utilisant le volume <code>nvidia-driver-vol</code>, mais ne supprime pas les images Docker ni les volumes de configuration des applications. Les conteneurs Wolf / Games on Whales seront recréés au prochain démarrage.
}}
 
* Supprimer le volume obsolète :
# docker volume rm -f nvidia-driver-vol
 
* Reconstruire l’image <code>gow/nvidia-driver:latest</code> avec la version actuelle du pilote NVIDIA :
# cd /opt
# curl <nowiki>https://</nowiki>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
 
* Redémarrer Games on Whales / Wolf :
# cd /opt/gow
  # docker compose up -d

Dernière version du 17 juin 2026 à 19:46

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 LXC, 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 crée le volume Docker qui contient une copie des bibliothèques 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/resources:/assets/romm/resources:ro",# exemple de compatibilite avec assets ROMM
             "/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro",# pack de bios pour retroarch
             "/mnt/Emulation/roms:/ROMs:ro"# roms dans le dossier par default, a ajouter dans le menu de Pegasus pour certains dossiers..
         ]
         name = 'WolfPegasus'
         ports = []
         ...

Redémarrer ensuite le conteneur Wolf :

# docker restart opt-wolf-1

Images personnalisées

Le paramètre icon_png_path indique l’icône qui sera affichée dans les clients Moonlight pour chaque application.

L’image doit être au format PNG, idéalement en 200x266 ou 628x888 pixels.

L’emplacement de l’image peut être indiqué de trois manières différentes :

  • Une URL, par exemple :
"https://games-on-whales.github.io/wildlife/apps/steam/assets/icon.png"
  • Un chemin relatif à HOST_APPS_STATE_FOLDER, par exemple :
"icons/icon.png"
  • Un chemin absolu, par exemple :
"/mnt/path/to/files/icon.png"

Changer la disposition du clavier dans une application

Par défaut, les applications peuvent se lancer avec une disposition de clavier US. Pour la changer, il faut ajouter les variables "XKB_DEFAULT_LAYOUT" et "XKB_DEFAULT_VARIANT" dans le bloc "env" de l’application concernée.

Exemple pour un clavier français :

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

Ajouter :

...
env = [ 'PROTON_LOG=1', 'RUN_SWAY=true', 'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*', 'XKB_DEFAULT_LAYOUT=fr', 'XKB_DEFAULT_VARIANT=azerty' ]
...

Redémarrer ensuite le conteneur Wolf :

# docker restart opt-wolf-1

Fichier de configuration clavier

Il est possible d’utiliser un fichier de configuration Sway afin de disposer de plusieurs dispositions de clavier dans les applications Games on Whales utilisant Sway.

Créer le fichier de configuration :

# vi /etc/wolf/cfg/90-custom.conf

Ajouter :

input type:keyboard {
    xkb_layout "fr,us"
    xkb_numlock "enable"
}

Ensuite, utiliser un point de montage dans l’application concernée :

"/etc/wolf/cfg/90-custom.conf:/etc/sway/config.d/90-custom.conf"

Redémarrer ensuite le conteneur Wolf :

# docker restart opt-wolf-1

Code PIN

Exemple :

[[profiles]]
id = 'user' 
name = 'Random User' 
icon_png_path = 'http://192.168.1.155:8888/misc/guest.png' 
pin = [ 3, 2, 1, 4 ]


Configuration avancée des conteneurs

Pegasus

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

Montage utile pour Pegasus

Installer des bin d'émulateur :

"/opt/emulator:/opt/emulator:rw",

Artwork pour Game and Watch (mame) ( exemple avec "/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro") :

# mkdir -p /mnt/Emulation/bios/retroarchbioses/mame
# ln -s /mnt/Emulation/roms/g-and-w_artwork /mnt/Emulation/bios/retroarchbioses/mame/artwork

Pegasus : Configuration persistante multisession

On utilise un montage persistant pour le dossier de configuration de chaque profil, ainsi que pour la configuration de Pegasus. Cela permet de ne pas perdre les configurations et les sauvegardes des émulateurs lors des mises à jour du conteneur, tout en partageant la configuration de Pegasus entre les utilisateurs afin de conserver les mêmes dossiers de ROMs.

On crée un dossier de configuration global pour Pegasus :

# mkdir -p /etc/wolfpegasus/global
# chown -R 1000:1000 /etc/wolfpegasus/global

Optionnellement, on récupère la configuration déjà faite pour un utilisateur :

# cp -a /etc/wolf/profile-data/user/WolfPegasus/.config/pegasus-frontend/. /etc/wolfpegasus/global/
# chown -R 1000:1000 /etc/wolfpegasus/global

On crée ensuite un dossier de configuration pour chaque utilisateur. Exemple avec user2 :

# mkdir -p /etc/wolfpegasus/user2
# chown -R 1000:1000 /etc/wolfpegasus/user2

Optionnellement, on peut récupérer les cores déjà installés pour Retroarch :

# mkdir -p /etc/wolfpegasus/user2/retroarch/cores
# cp -a /etc/wolf/profile-data/user/WolfPegasus/.config/retroarch/cores/. /etc/wolfpegasus/user2/retroarch/cores/
# chown -R 1000:1000 /etc/wolfpegasus/user2

On ajoute ensuite les montages a l'utilisateur, exemple :

# vi /etc/wolf/cfg/config.toml
[[profiles]]
id = 'user2'
name = 'User2'

    [[profiles.apps]]
    icon_png_path = '/etc/wolf/pegasus.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 = [
            '/mnt/Emulation/resources:/assets/romm/resources:ro',
            '/opt/emulator:/opt/emulator:ro',
            '/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro',
            '/mnt/Emulation/roms:/ROMs:ro',
            '/etc/wolfpegasus/user2:/home/retro/.config:rw',
            '/etc/wolfpegasus/global:/home/retro/.config/pegasus-frontend:ro' # ro pour bloquer modification / rw pour modifier conf, exemple sur compte admin
        ]
        name = 'WolfPegasus'
        ports = []
        type = 'docker'

Enfin, on redémarre GOW :

 # docker restart opt-wolf-1

convertir les gamelist.xml en metadata.txt

Voir ce lien

Heroic Game Launcher

"Launcher" pour les jeux Epic et GOG. Pour utiliser le conteneur de GOW :

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

        [profiles.apps.runner]
        type = 'docker'
        name = 'WolfHeroic'
        image = 'ghcr.io/games-on-whales/heroic-games-launcher:edge'
        env = [
            'RUN_SWAY=true',
            'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*',
            'HEROIC_STARTUP_FLAGS=--ozone-platform=x11 --enable-features=UseOzonePlatform,WaylandWindowDecorations GenericName=gs_hgl'
        ]
        devices = []
        mounts = []
        ports = []
        base_create_json = {
          "HostConfig": {
            "IpcMode": "host",
            "CapAdd": ["SYS_ADMIN", "SYS_NICE", "SYS_PTRACE", "NET_RAW", "MKNOD", "NET_ADMIN"],
            "SecurityOpt": ["seccomp=unconfined", "apparmor=unconfined"],
            "Ulimits": [{"Name":"nofile", "Hard":10240, "Soft":10240}],
            "Privileged": false,
            "DeviceCgroupRules": ["c 13:* rmw", "c 244:* rmw"]
          }
        }

Recréer le volume NVIDIA après mise à jour du pilote

Après une mise à jour du pilote NVIDIA sur l’hôte, Games on Whales / Wolf peut ne plus produire de vidéo dans Moonlight, avec un symptôme du type :

No video received from host

La cause fréquente est un décalage entre :

  • la version du pilote NVIDIA chargée sur l’hôte ;
  • les bibliothèques NVIDIA stockées dans le volume Docker nvidia-driver-vol utilisé par Wolf.

Il ne suffit pas toujours de reconstruire l’image gow/nvidia-driver:latest. Il faut aussi supprimer les anciens conteneurs qui utilisent encore le volume, puis recréer le volume proprement.

  • Arrêter Games on Whales / Wolf :
# cd /opt/gow
# docker compose down
  • Supprimer tous les conteneurs qui utilisent nvidia-driver-vol :
# docker rm -f $(docker ps -aq --filter volume=nvidia-driver-vol)
  • Supprimer le volume obsolète :
# docker volume rm -f nvidia-driver-vol
  • Reconstruire l’image gow/nvidia-driver:latest avec la version actuelle du pilote 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
  • Redémarrer Games on Whales / Wolf :
# cd /opt/gow
# docker compose up -d