Self-Hosted E2EE Сервер синхронизации
Shellit поставляется с готовым автономным сервером синхронизации (servers/sync_server), который можно развернуть на любом собственном оборудовании — от Raspberry Pi и домашнего NAS до мощного облачного VPS.
Архитектурные принципы
- Zero-Knowledge E2EE (End-to-End Encryption): Все клиентские данные шифруются локально на вашем устройстве с помощью алгоритма
XChaCha20-Poly1305илиAES-256-GCMна базе производного ключа от вашего Мастер-пароля. На сервер передаются исключительно зашифрованные бинарные пакеты (nonce + tag + ciphertext). Сервер функционирует как слепой ретранслятор и криптографически не способен прочитать имена ваших серверов, IP-адреса, пароли или SSH-ключи. - Минималистичный стек: Сервер скомпилирован в нативный AOT-бинарник на Dart и потребляет всего 15–25 МБ оперативной памяти под нагрузкой.
- Встроенный SQLite: Все метаданные ревизий и зашифрованные блобы сохраняются во встроенную базу данных SQLite с режимом WAL (Write-Ahead Logging). Внешние СУБД (PostgreSQL, Redis) не требуются.
- WebSocket шина событий: Сервер поддерживает постоянные WebSocket соединения с активными клиентами для мгновенной рассылки уведомлений об изменении ревизий (
sync:revision_pushed).
Схема взаимодействия
+-----------------------+ +-----------------------+| Shellit Desktop | | Shellit Mobile || (Local Vault DB) | | (Local Vault DB) |+-----------+-----------+ +-----------+-----------+ | | (Encrypted) (Encrypted) | +----------------------+ | +------>| Shellit Sync Server |<------+ | (Zero-Knowledge Relay| | SQLite + WebSockets)| +----------------------+Системные переменные окружения
| Переменная | По умолчанию | Описание |
|---|---|---|
PORT | 8080 | TCP-порт, который слушает HTTP/WS сервер |
BIND_ADDRESS | 0.0.0.0 | Сетевой интерфейс для прослушивания соединений |
DATA_PATH | /data/shellit-sync.db | Путь к файлу базы данных SQLite на диске |
REGISTRATION_TOKEN | (пусто) | Секретный токен для регистрации новых устройств. Если задан, регистрация без токена отклоняется со статусом 403 Forbidden |
MAX_PAYLOAD_MB | 50 | Максимальный размер пакета синхронизации в мегабайтах |
Протокол синхронизации
- Регистрация устройства (
POST /api/v1/auth/register): Клиент передает публичный идентификатор устройства и токен регистрации. В ответ сервер выдает временный JWT-токен сессии. - Получение текущей версии (
GET /api/v1/sync/head): Клиент проверяет хеш текущей ревизии на сервере перед отправкой изменений. - Отправка зашифрованного пакета (
POST /api/v1/sync/push): Передача диффа изменений с инкрементом номера ревизии. - Загрузка изменений (
GET /api/v1/sync/pull?since={rev}): Загрузка пропущенных зашифрованных блоков для локального слияния. - WebSocket уведомления (
WS /api/v1/sync/ws): Автоматическое пробуждение фоновой синхронизации на всех подключенных устройствах при выходе изменений.