No description
  • C# 98.6%
  • Dockerfile 1.4%
Find a file
DSvinka ac938378bf
All checks were successful
ci / ci (push) Successful in 40s
CI Fix
2026-05-30 02:16:48 +03:00
.forgejo/workflows CI Fix 2026-05-30 02:16:48 +03:00
Config Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Core Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Peer Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Security Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
tests/CaviCodeVPN.Plugin.UserSync.Tests Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Workers Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
.dockerignore Init 2026-04-13 01:36:09 +03:00
.gitignore gitignore 2026-05-29 16:15:26 +03:00
CaviCodeVPN.Plugin.UserSync.csproj Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Dockerfile Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
Program.cs Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00
README.md Рефакторинг на новый бренд 2026-05-28 18:39:37 +03:00

CaviCodeVPN Plugin: UserSync

Replication-плагин для CaviCodeVPN, обеспечивающий P2P-синхронизацию пользователей, подписок и API-ключей между независимыми нодами.

Принцип работы

Каждая нода CaviCodeVPN — самодостаточный deployment (Core + плагины + PostgreSQL). UserSync связывает ноды в mesh-сеть с eventual consistency:

  • Push: при локальном изменении — немедленная рассылка peer'ам
  • Pull (anti-entropy): каждые 60 секунд сравнение Merkle root'ов, при расхождении — drill-down по Merkle node paths и точечная выборка entries
  • Конфликты: Last-Write-Wins по Lamport clock, tiebreaker — NodeId

Что реплицируется

Сущность Реплицируется Примечания
User Да Имя, TelegramId, заметки
Subscription Да Логин, учётные данные, лимиты, статус
ApiKey Да Для ботов, обращающихся к любой ноде
Admin Нет Локальная для каждой ноды
Метрики/Логи Нет Runtime-данные каждой ноды

Удаления — через tombstone'ы (мягкое удаление с tombstonedAt), реплицируются, хранятся 30 дней.

Установка

Плагин устанавливается через панель управления CaviCodeVPN Core:

Плагины → Установить → Git URL этого репозитория → Тип: Replication

Настройка peer'ов

Список peer-нод задаётся через переменную окружения CaviCodeVPN_SYNC_PEERS (JSON):

[
  { "host": "vpn-b.example.com", "port": 9100, "sharedSecret": "секрет" },
  { "host": "vpn-c.example.com", "port": 9100, "sharedSecret": "секрет" }
]

Порт 9100 должен быть доступен между нодами.

Входящие /sync/v1/* endpoint'ы проверяют заголовок:

X-Shared-Secret: секрет

Дополнительные переменные:

Переменная Описание
CaviCodeVPN_SYNC_SHARED_SECRET Общий входящий секрет, если он не задан в CaviCodeVPN_SYNC_PEERS.
CaviCodeVPN_SYNC_ALLOW_EMPTY_SECRET true/1 разрешает пустой секрет только для локальной разработки. По умолчанию пустой секрет запрещён.
CaviCodeVPN_SYNC_ANTI_ENTROPY_SECONDS Интервал anti-entropy, по умолчанию 60 секунд.

Стек

  • C# .NET 8
  • HTTP/TLS :9100 для peer-to-peer
  • Lamport clock + LWW + Merkle anti-entropy
  • WebSocket stream из Core для hot push локальных изменений
  • Без внешних зависимостей кроме Core Plugin API

Связанные репозитории