клиент яндекс музыки, для которого написан этот релей: mashiro
сервер релей для функции «слушать вместе» десктопного клиента mashiro. позволяет слушать вместе через интернет без проброса портов и без vpn. сервер намеренно тупой. он перекладывает байты между участниками комнаты и не делает больше ничего: не знает про яндекс музыку, не хранит треки, не имеет базы данных и не видит содержимого сообщений.
нет аккаунтов. личность - это bip39 сид фраза и ключ ed25519 из неё. ни почты, ни телефона, ни пароля, ни регистрации. валидная подпись и есть пропуск.
нет базы. всё состояние живёт в памяти. перезапуск - полный сброс.
нет доступа к содержимому. ключ комнаты выводится на клиенте из кода приглашения и никогда не передаётся по сети. сервер видит только шифротекст.
нет журнала про людей. ни payload, ни адреса, ни ключи не пишутся никогда. остаются только счётчики.
подробности: docs/protocol.md, docs/privacy.md.
crates/crypto - сид фразы, подписи, коды приглашения, шифрование payload
crates/server - сам релей на tokio и axum
docs - протокол, приватность, изменения в клиенте
deploy - systemd unit и пример nginx с wss
нужен любой самый дешёвый vps и домен, направленный на его адрес. 128 мб памяти хватает с запасом.
git clone https://github.com/elytrya/mashiro-together
cd mashiro-togetherвариант с docker:
docker compose up -d --build
curl -s http://127.0.0.1:7332/healthвариант без docker:
cargo build --release --bin mashiro-together-server
sudo useradd --system --no-create-home mashiro
sudo mkdir -p /opt/mashiro-together
sudo cp target/release/mashiro-together-server /opt/mashiro-together/
sudo cp config.example.toml /opt/mashiro-together/config.toml
sudo chown -R mashiro:mashiro /opt/mashiro-together
sudo cp deploy/mashiro-together.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now mashiro-togetherрелей слушает только петлю. наружу его отдаёт nginx:
sudo cp deploy/nginx/mashiro-together.conf /etc/nginx/sites-available/
sudo sed -i 's/together.example.org/mydomain.example/g' \
/etc/nginx/sites-available/mashiro-together.conf
sudo ln -s /etc/nginx/sites-available/mashiro-together.conf /etc/nginx/sites-enabled/
sudo certbot --nginx -d mydomain.example
sudo nginx -t && sudo systemctl reload nginxс caddy всё ещё короче:
together.example.org {
reverse_proxy /ws 127.0.0.1:7332
reverse_proxy /health 127.0.0.1:7332
}
curl -s https://mydomain.example/healthответ вроде такого:
{"status":"ok","version":"0.1.0","uptime_seconds":12,"rooms_open":0,"connections_open":0}в mashiro: «слушать вместе», вкладка «через сервер», адрес wss://mydomain.example/ws.
дальше кнопка «создать комнату» или «войти по коду».
порядок приоритетов: значения по умолчанию, затем config.toml, затем переменные окружения.
полный список с пояснениями - в config.example.toml и .env.example.
| настройка | переменная | по умолчанию |
|---|---|---|
| адрес прослушивания | MASHIRO_TOGETHER_ADDRESS |
127.0.0.1 |
| порт | MASHIRO_TOGETHER_PORT |
7332 |
| участников в комнате | MASHIRO_TOGETHER_MAX_PEERS_PER_ROOM |
16 |
| сообщений в секунду | MASHIRO_TOGETHER_MESSAGES_PER_SECOND |
20 |
| размер сообщения | MASHIRO_TOGETHER_MAX_MESSAGE_BYTES |
65536 |
| соединений с адреса | MASHIRO_TOGETHER_MAX_CONNECTIONS_PER_IP |
8 |
| комнат с адреса | MASHIRO_TOGETHER_MAX_ROOMS_PER_IP |
4 |
| таймаут pong | MASHIRO_TOGETHER_PONG_TIMEOUT_SECONDS |
30 |
| льгота ведущему | MASHIRO_TOGETHER_HOST_GRACE_SECONDS |
15 |
| пустая комната | MASHIRO_TOGETHER_EMPTY_ROOM_TTL_SECONDS |
600 |
| уровень журнала | MASHIRO_TOGETHER_LOG_LEVEL |
info |
| метрики | MASHIRO_TOGETHER_METRICS_ENABLED |
false |
путь к файлу настроек задаётся MASHIRO_TOGETHER_CONFIG. файла может и не быть: с одними значениями по умолчанию сервер запускается нормально.
GET /health - состояние, версия, аптайм, число комнат и соединений.
GET /metrics - prometheus, по умолчанию выключен. наружу его лучше не отдавать.
GET /ws - сам протокол.
gpl-3.0, см. LICENSE