EnglishРусский Map

moonshine

title
moonshine
type
toolbox
summary
Headless-сервер стриминга Moonlight для Linux, запускающий каждую игру в отдельном Wayland-композиторе
tags
rust, game-streaming, self-hosted, linux, wayland
language
Rust
license
BSD-2-Clause
created
2026-07-23
updated
2026-07-29
lang
ru
translation_of
moonshine
source_updated
2026-07-29
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Moonshine - это серверная часть для клиентов игрового стриминга Moonlight. Вы запускаете её на машине с GPU, подключаетесь с телефона, планшета, ТВ-приставки или другого ПК и играете: ввод с клавиатуры, мыши и контроллера передаётся обратно на хост. Она выполняет ту же роль, что и Sunshine, привычный хост GameStream, но использует другой подход к рендерингу игры.

Как это устроено

Каждое стриминговое приложение получает собственный Wayland-композитор, а не дублирует существующий рабочий стол. Из этого архитектурного решения вытекает всё остальное: хосту не нужен монитор, заглушка HDMI dummy plug или открытая графическая сессия, а тот, кто сидит за хост-машиной, может продолжать работать за ней, пока кто-то другой стримит игру. Сама идея взята из magic-mirror, где впервые применили связку Vulkan и headless-композитора.

Захват и кодирование выполняются через Vulkan video encoding на GPU - H.264, H.265 или AV1, с 10-битным HDR там, где его поддерживает игра. Слой Vulkan WSI (libmoonshine_wsi.so, устанавливаемый как implicit layer) перехватывает swapchain игры и отдаёт кадры в сессию стриминга. Звук кодируется в Opus - стерео или 5.1/7.1. Устройства ввода эмулируются через uinput и uhid на базе реализаций из inputtino, поэтому гироскоп геймпада, тачпад и тактильная отдача передаются без потерь.

systemd - обязательное требование, а не вопрос удобства пакетирования: именно он запускает процессы приложений и следит за ними. Чтобы сервер работал для пользователя без активного входа в систему, нужно включить lingering:

sudo loginctl enable-linger $USER
sudo systemctl enable --now moonshine@$USER

Настройка

Один TOML-файл. Приложения объявляются записями с командой и опциональными хуками, которые выполняются синхронно до и после сессии:

[[application]]
title = "Steam"
boxart = "/path/to/steam.png"
command = ["/usr/bin/steam", "steam://open/bigpicture"]
pre_command = [
    ["/usr/bin/systemctl", "stop", "conflicting.service"],
    ["/usr/bin/nvidia-smi", "pstate", "50"],
]
post_command = [
    ["/usr/bin/nvidia-smi", "pstate", "performance"],
]

Сканнеры избавляют от необходимости прописывать всё вручную. Сканнер Steam обходит каталог библиотеки и создаёт по записи на каждую установленную игру; desktop-сканнер читает файлы .desktop и умеет подтягивать из их иконок обложки.

[[application_scanner]]
type = "steam"
library = "$HOME/.local/share/Steam"
command = ["/usr/bin/steam", "-bigpicture", "steam://rungameid/{game_id}"]

Сопряжение происходит по HTTP на порту 47989. Moonlight показывает PIN-код, после чего можно либо кликнуть по уведомлению на хосте, либо отправить его POST-запросом вручную:

curl -X POST "http://localhost:47989/submit-pin" -d "uniqueid=0123456789ABCDEF&pin=<PIN>"

Ограничения

Только Linux, тестировалось в основном на Arch. GPU должен поддерживать Vulkan video encoding, что на практике означает NVIDIA RTX, AMD RDNA2 или новее, либо Intel Arc. Клиенты должны быть версии Moonlight 6.0.0 или новее; работа неофициальных портов не гарантируется. Стриминг на два клиента одновременно не поддерживается, и автор прямо указывает, что такой цели нет.

Перед открытием портов стоит ознакомиться с моделью безопасности. GameStream, протокол Moonlight, не шифрует трафик на прикладном уровне целиком, и в README прямо сказано, что Moonshine не рассчитан на работу в публичных сетях. Для удалённой игры его придётся спрятать за VPN.

По сравнению с Sunshine Moonshine жертвует широтой охвата ради модели изолированных сессий: Sunshine работает на большем числе платформ и предлагает больше возможностей, зато Moonshine обеспечивает headless-режим и оставляет хост доступным для работы во время стрима. Если цель стриминга - эмуляция ретро-игр, а не библиотека Steam, то другую часть этой задачи решает romm. yap делает зеркальную ставку на macOS: нативные API одного вендора в обмен на минимум собственного кода, тогда как Moonshine точно так же опирается на Wayland, Vulkan и systemd.

Репозиторий: github.com/hgaiser/moonshine - ~920 звёзд, BSD-2-Clause, Rust.