MirvDesk — мой self-hosted вариант системы удалённого доступа, выросший из RustDesk. Цель проекта не в том, чтобы переписать хороший движок удалённого рабочего стола с нуля, а в том, чтобы получить полностью самостоятельную связку клиент + сервер с собственной идентичностью, аккаунтами, адресной книгой и без обязательной зависимости от чужой инфраструктуры.
Версия 1.6.0 — первый релиз, который я считаю уже нормально оформленной публичной точкой проекта.
Что входит в MirvDesk
Проект разделён на два репозитория:
- MirvDesk Client — клиент для Windows, Linux, macOS и Android;
- MirvDesk Server — self-hosted сервер в Docker, включающий RustDesk Server OSS и собственный API MirvDesk.
Клиент и оригинальный RustDesk могут быть установлены одновременно. MirvDesk использует отдельные имена приложения, каталоги конфигурации, службы, URI scheme и package IDs. Внутренние имена некоторых Rust crate и ABI оставлены upstream-совместимыми там, где их переименование ничего не даёт пользователю и только усложняет дальнейшее сопровождение форка.
Самостоятельный сервер обязателен
У MirvDesk нет публичного сервера по умолчанию. Это принципиальное решение: проект рассчитан на self-hosting, а не на то, чтобы все собранные кем-то клиенты ходили через мою инфраструктуру.
Перед сборкой клиента нужно поднять собственный MirvDesk Server и задать repository variable:
MIRVDESK_SERVER_URL=https://desk.example.com
В GitHub она создаётся в Settings → Secrets and variables → Actions → Variables. Для локальной сборки эту же переменную нужно экспортировать в окружение.
Если переменная отсутствует, пуста, содержит неправильную схему или credentials, сборка намеренно завершается ошибкой. Никакого скрытого fallback на мой сервер нет.
При первом запуске клиент обращается к /.well-known/mirvdesk своего сервера и получает адреса ID/relay/API, публичный ключ и список поддерживаемых возможностей.
Адресная книга и аккаунты
MirvDesk Server хранит локальные пользовательские аккаунты и персональные адресные книги. Пароли хешируются Argon2id, сессии хранятся в виде хэшей токенов. Создание первого администратора и дальнейшее управление пользователями выполняется локальной утилитой mirvdesk-admin внутри контейнера — публичного HTTP bootstrap endpoint для этого нет.
Например:
docker exec -it mirvdesk-server mirvdesk-admin
docker exec -it mirvdesk-server mirvdesk-admin create-user
docker exec -it mirvdesk-server mirvdesk-admin list
Группы и доступные устройства в 1.6.0
В 1.6.0 появилась серверная поддержка штатной вкладки RustDesk Accessible devices / Groups. Клиент не получил отдельный самописный экран — вместо этого сервер реализует API, который уже ожидает существующий интерфейс.
Устройство автоматически регистрируется на сервере после входа его владельца в аккаунт MirvDesk. Администратор может создать группу, назначить в неё устройства и дать пользователю доступ к группе:
docker exec -it mirvdesk-server mirvdesk-admin group-create Operations
docker exec -it mirvdesk-server mirvdesk-admin devices
docker exec -it mirvdesk-server mirvdesk-admin device-group 123456789 Operations
docker exec -it mirvdesk-server mirvdesk-admin group-add-user Operations alice
Обычный пользователь видит свои устройства и устройства из разрешённых ему групп. Администратор сервера видит все зарегистрированные устройства. Сервер сообщает клиенту capability groups, поэтому вкладка включается только тогда, когда подключённый сервер действительно поддерживает этот API. Со старым сервером она останется скрытой.
Клиент теперь проще отличить от RustDesk
Помимо собственных иконок MirvDesk 1.6.0 получил отдельную бирюзово-циановую цветовую схему. Я не стал полностью переделывать интерфейс: близость к upstream полезна и пользователю, и для последующих merge. Но если RustDesk и MirvDesk открыты рядом, теперь их не приходится различать только по заголовку окна.
Сборка и CI
Заодно была переделана слишком тяжёлая upstream CI-схема. Раньше практически каждый push запускал кроссплатформенную сборочную мясорубку на десятки минут. Теперь есть три уровня:
- Fast CI — быстрые проверки на каждый push/PR;
- Full CI — полная матрица Windows/Linux/macOS/Android вручную, nightly или на специальной ветке;
- Release CI — полная упаковка и публикация только для version tag.
Linux release pipeline дополнительно распаковывает собранные DEB-пакеты и проверяет, что заданный MIRVDESK_SERVER_URL действительно попал внутрь клиента. Это защита от уже однажды найденного случая, когда repository variable была задана правильно, но терялась на границе GitHub runner → Docker build container.
Что пока не сделано
Персональная адресная книга работает, но shared address books пока не реализованы. Также у MirvDesk ещё нет собственного канала автоматического обновления клиента. Upstream updater RustDesk намеренно отключён: MirvDesk не должен однажды «обновить» сам себя обратно в оригинальный RustDesk.
Установка и исходники
Готовые пакеты MirvDesk 1.6.0 публикуются в релизе клиента. Инструкции по серверу находятся в репозитории MirvDesk Server. Для самостоятельной сборки клиента обязательно прочитайте раздел про MIRVDESK_SERVER_URL в README.
MirvDesk распространяется под AGPL-3.0 и остаётся независимым downstream-проектом RustDesk. RustDesk/Purslane не связан с MirvDesk и не отвечает за этот форк.