← all projects

mashiro-together

анонимный сервер релей для комнат "слушать вместе" в клиенте mashiro: без аккаунтов и паролей, вход по сид-фразе, payload шифруется на клиенте

github

mashiro together

клиент яндекс музыки, для которого написан этот релей: 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 за 5 минут

нужен любой самый дешёвый vps и домен, направленный на его адрес. 128 мб памяти хватает с запасом.

шаг 1. склонируйте репорзиторий

git clone https://github.com/elytrya/mashiro-together
cd mashiro-together

шаг 2. поднять релей

вариант с 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

шаг 3. повесить tls

релей слушает только петлю. наружу его отдаёт 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
}

шаг 4. проверить

curl -s https://mydomain.example/health

ответ вроде такого:

{"status":"ok","version":"0.1.0","uptime_seconds":12,"rooms_open":0,"connections_open":0}

шаг 5. вписать адрес в клиент

в 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