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.