No description
- C# 98.6%
- Dockerfile 1.4%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| Config | ||
| Core | ||
| Peer | ||
| Security | ||
| tests/CaviCodeVPN.Plugin.UserSync.Tests | ||
| Workers | ||
| .dockerignore | ||
| .gitignore | ||
| CaviCodeVPN.Plugin.UserSync.csproj | ||
| Dockerfile | ||
| Program.cs | ||
| README.md | ||
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
Связанные репозитории
- CaviCodeVPN-Core — ядро платформы
- CaviCodeVPN-Plugin-TT — маскировка TrustTunnel