Chegaram as férias: Moonlight-Stream. Vamos jogar remotamente?

Olá a todos,

No seguimento da nossa serie de posts de férias, venho apresentar o Moonlight-Stream para quem tenha internet ilimitada para onde vai de ferias e quer jogar um joguito mas o tablet que tem não pode, ou o portátil que leva não tem força suficiente.

Warning: Antes de começarmos, tenham noção que este guia pressupõe que tenham uma compreensão básica dos comandos e conceitos de Linux. Além disso, é importante ter um computador poderoso o suficiente para lidar com o workload de streaming e banda para fazer upload. Irão também precisará de um dispositivo cliente com o aplicativo Moonlight instalado e por favor, se o vosso computador seja um risco de incêndio não o deixem ligado de férias. Descansem e divirtam-se sem computador.
Para este post, foi escolhido utilizar um servidor virtual debian 12, com um vGPU nvidia exportado apartir do host pelo que os comandos de package manager são diferentes dos habituais.
Igualmente, para aceder de forma segura ao vosso servidor, recomendo vivamente utilizarem uma VPN em UDP, recomendando ipsec ou wireguard para o efeito.

Vamos começar!

Passo 1: Instalar e configurar os drivers NVIDIA

O Moonlight-Stream usa a tecnologia GameStream da NVIDIA, portanto, você é fundamental garantir que o nosso sistema tenha os drivers necessários instalados.

Para instalar os drivers NVIDIA mais recentes, siga as instruções fornecidas no LEIA-ME do driver gráfico NVIDIA Linux.
Como certamente já sabem podem descarregar o driver apropriado para o vossa GPU no site da NVIDIA.

Depois de instalar os drivers, verifique se eles estão configurados corretamente. Isto é possivel executando o seguinte comando:

sudo nvidia-xconfig

Isso gerará um arquivo de configuração X que especifica o driver NVIDIA como o driver principal no nosso sistema.

Passo 2: Instalar o Moonlight-Stream

Em seguida, irá ser necessário instalar o Moonlight-Stream no nosso servidor. Podemos instalá-lo a partir do PPA oficial usando os seguintes comandos:

sudo add-apt-repository ppa:moonlight-gamestream/moonlight
sudo apt update
sudo apt install moonlight-embedded

Etapa 3: configurar o Moonlight-Stream

Quando o Moonlight-Stream estiver instalado, será necessário configurá-lo para funcionar com o nosso sistema. Podemos fazer isso criando um arquivo de configuração em `/etc/moonlight-embedded/config` com o seguinte conteúdo:

app_name=Minha transmissão de jogo
host=0.0.0.0
porta=47989
codificador=h264

A configuração `app_name` é o nome que será exibido para os clientes quando eles se ligarem ao vosso servidor. A configuração `host` especifica o endereço IP ao qual o servidor (programa) está binded. Definir como `0.0.0.0` permitirá conexões a qualquer ip de interface de rede presente no vosso servidor.
A configuração `port` especifica a porta na qual o servidor irá escutar.
Finalmente, a configuração `encoder` especifica o codificador de vídeo que será usado. H.264 é uma boa escolha para a maioria das situações. Pessoalmente e tendo em conta que a minha grafica o suporta, utilizo h265 pois o muito pouco tempo que perco com a compressão extra, melhoro em latência e consumo de banda.

Etapa 4: adicionar jogos ao Moonlight-Stream

Agora que o Moonlight-Stream está instalado e configurado, precisaremos de adicionar alguns jogos ao nosso servidor.
Para fazer isso, é necessário criar um novo diretório em `/home/user/Games` (substitua `user` pelo seu nome de utilizador) e copie o executável/diretoria instalada do jogo e quaisquer arquivos necessários para esse diretório.

Em seguida, crie um novo arquivo em `/etc/moonlight-embedded/apps.conf` com o seguinte conteúdo:

[Game Title]
exec=/home/user/Games/GameExecutable

Substituam `Game Title` pelo nome do jogo e `GameExecutable` pelo nome do executável do jogo.

Etapa 5: Inicie o servidor Moonlight-Stream

Por fim, podemos iniciar o servidor Moonlight-Stream executando o seguinte comando:

moonlight stream -app "My Game Stream"

Substitua `”My Game Stream”` pelo nome que especificamos anteriormente no arquivo de configuração.

Passo 6: Conectar-se com o cliente Moonlight

Agora que o servidor está em execução, podemos nos conectar a ele usando o aplicativo cliente Moonlight no nosso dispositivo cliente. Iniciem o aplicativo e selecionem o  nosso servidor na lista de dispositivos disponíveis. Você deve ver uma lista dos jogos adicionados na Etapa 4.

Selecione o jogo que deseja jogar e comecem a transmitir!

Passo 7: E se forem mais que um a querer jogar?

Claro que poderá haver o caso em que mais que uma stream seja necessária – experimentem ter dois filhos em idade de gostarem de jogar. Neste caso entra o Sunshine que tem o seu código fonte publicado no github em https://github.com/LizardByte/Sunshine

O Sunshine é um projeto de opensource hospedado no GitHub, criado por LizardByte. É projetado para fornecer uma experiência de streaming de jogo self-hosted usando o protocolo Moonlight.

O Sunshine fornece uma interface da Web para gerir a nossa biblioteca de jogos, iniciar jogos e definir suas configurações de streaming. Ele também inclui recursos como autenticação de utilizador (inclui ldap), criptografia SSL e streaming de taxa de bits adaptável.

Para começar a usar o Sunshine, você precisará apenas instalar o cliente incorporado ao Moonlight em seu dispositivo cliente depois de seguir os passos de instalação e configuração web descritos abaixo e para mim a maneira mais fácil de fazer isto é usando um container em Docker.
Basta executar o seguinte comando para iniciar um container do Sunshine:

docker run -d -p 8080:8080 -p 47989:47989 lizardbyte/sunshine

Isso iniciará um contêiner Sunshine e exporá as portas 8080 e 47989. A porta 8080 é usada para a interface da Web, enquanto a porta 47989 é usada para streaming.

Depois do container estiar em execução, podemos aceder a interface da web navegando para `http://localhost:8080` no nosso internet browser.
A partir daí, você pode adicionar jogos à sua biblioteca, definir suas configurações de streaming e iniciar jogos. Nota que sunshine por estar dependente de aceleramento gráfico terá de ter que ter o device do gpu passado a ele.

E assim acabou mais um post sobre coisas giras para fazer e levar em férias.
Até ao próximo post e se tiverem alguma duvida ou reparo, já sabem onde me encontrar.

Abraço!
Nuno