Перейти к содержимому

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)|
+----------------------+

Системные переменные окружения

ПеременнаяПо умолчаниюОписание
PORT8080TCP-порт, который слушает HTTP/WS сервер
BIND_ADDRESS0.0.0.0Сетевой интерфейс для прослушивания соединений
DATA_PATH/data/shellit-sync.dbПуть к файлу базы данных SQLite на диске
REGISTRATION_TOKEN(пусто)Секретный токен для регистрации новых устройств. Если задан, регистрация без токена отклоняется со статусом 403 Forbidden
MAX_PAYLOAD_MB50Максимальный размер пакета синхронизации в мегабайтах

Протокол синхронизации

  1. Регистрация устройства (POST /api/v1/auth/register): Клиент передает публичный идентификатор устройства и токен регистрации. В ответ сервер выдает временный JWT-токен сессии.
  2. Получение текущей версии (GET /api/v1/sync/head): Клиент проверяет хеш текущей ревизии на сервере перед отправкой изменений.
  3. Отправка зашифрованного пакета (POST /api/v1/sync/push): Передача диффа изменений с инкрементом номера ревизии.
  4. Загрузка изменений (GET /api/v1/sync/pull?since={rev}): Загрузка пропущенных зашифрованных блоков для локального слияния.
  5. WebSocket уведомления (WS /api/v1/sync/ws): Автоматическое пробуждение фоновой синхронизации на всех подключенных устройствах при выходе изменений.