Skip to content
VantageEXPublic

About

Свой Discord на своём железе: серверы, голос, видео, сквозное шифрование. Self-hosted Discord alternative.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Берлога — свой Discord на своём железе

Лицензия: MIT TypeScript React 19 Node.js 24 Tauri 2 LiveKit Статус: завершён

Возможности · Запуск · Свой сервер · Windows · Телефон · Документация

Свой Discord на своём железе. Серверы с ролями и правами, текстовые и голосовые каналы, форумы и трибуны, личные сообщения и звонки, видео и демонстрация экрана, сквозное шифрование. Всё, что в Discord продаётся как Nitro, здесь бесплатно для всех. Есть веб-версия, приложение для Windows и версия для телефона (ставится на экран «Домой», как приложение).

English. Berloga is a self-hosted Discord alternative: servers, roles and permissions, text, voice, forum and stage channels, DMs and calls, video and screen sharing with sound, end-to-end encryption, bots and webhooks. Web client, Windows desktop app (Tauri) and an installable mobile web app (PWA). TypeScript monorepo: Node.js + Socket.IO + SQLite on the server, React on the client, LiveKit for media. The interface is in Russian. The project is finished and no longer maintained; it is published as is, under the MIT license — fork it and use it however you like.

Скриншоты

Карточка профиля: во что играет человек, роли, общие серверы Берлога на телефоне
Светлая тема
Настройки внешнего вида: четыре темы, цветовые темы и акцентный цвет

Профиль с игрой · Берлога на телефоне · светлая тема · настройки внешнего вида. Данные на снимках — демонстрационные.

Статус

Проект завершён и больше не развивается. Код выложен как есть: бери, разворачивай, переделывай под себя. Что и как сделано, по этапам, — в ROADMAP.md.

Возможности

💬 Общение

  • серверы, категории, текстовые каналы, форумы с тегами, ветки, голосовые каналы и трибуны;
  • личные сообщения и группы, друзья, заявки, блокировка;
  • ответы, упоминания, реакции, закрепы, редактирование, markdown, превью ссылок, вложения до 500 МБ;
  • свои эмодзи, стикеры и звуковая панель сервера;
  • поиск по сообщениям, входящие с упоминаниями, непрочитанное, уведомления на ПК и push на телефон.

🛡️ Сервер и модерация

  • роли с цветами и правами, права на категории и каналы, приглашения со сроком и лимитом;
  • баны, кики, таймауты, журнал аудита, профили на сервере (свой ник и аватар).

🎙️ Голос и видео (через медиасервер LiveKit)

  • голосовые каналы и звонки в личке, камера, демонстрация экрана до 1080p 60 кадров со звуком;
  • ИИ-шумоподавление DeepFilterNet3 прямо в клиенте, громкость каждого участника, рация (push-to-talk);
  • в десктопе своё окно выбора демонстрации, как в Discord: показываешь окно — в эфир идёт звук только этой программы.

🔒 Сквозное шифрование

  • личные сообщения, группы и звонки шифруются на устройствах, сервер видит только шифротекст;
  • несколько устройств, привязка нового устройства с подтверждением, фраза восстановления из 24 слов, код звонка для сверки. Подробно — docs/E2EE.md.

✨ Как Nitro, но бесплатно

  • анимированные аватары и баннеры, цвета профиля, темы (тёмная, светлая, пепельная, оникс), цветовые темы и акцентный цвет, большие файлы, видео в высоком качестве.

💻 Платформы

  • веб-версия: открывается в любом современном браузере;
  • приложение для Windows (Tauri 2): трей, автозапуск, подписанные автообновления, «Играет в …» из игр с Discord Rich Presence и по папке игровой библиотеки;
  • телефон: устанавливается из Safari или Chrome на экран «Домой», с push-уведомлениями.

🤖 Для разработчиков

  • приложения с ботами, слеш-команды, вебхуки. Как этим пользоваться — docs/BOTS.md, пример бота — examples/bot.mjs.

Как устроено

Монорепозиторий на npm workspaces, всё на TypeScript.

packages/protocol/        общие типы: модели, события сокета, HTTP, лимиты
packages/e2ee/            сквозное шифрование: ключи устройств, шифрование сообщений и звонков
apps/server/              сервер: Node 24 запускает .ts напрямую, без сборки
  src/config.ts           настройки из переменных окружения
  src/db/                 SQLite (встроенный node:sqlite), миграции и репозитории по сущностям
  src/http/               Express: регистрация и вход, файлы, заголовки безопасности, раздача клиента
  src/realtime/           Socket.IO: присутствие, права, обработчики по областям (handlers/)
  src/tools/              служебные команды: сброс пароля, значки
apps/client/              клиент: React 19 + Vite, состояние в zustand
  src/features/           фичи: чат, серверы, голос, шифрование, настройки, телефон…
  src/ui/, src/styles/    базовые компоненты и дизайн («Стеклянный графит», docs/DESIGN-GLASS.md)
  public/                 service worker, иконки, шрифт Geologica, модель шумоподавления
  src-tauri/              десктопное приложение (Rust, Tauri 2)
docker-compose.yml        развёртывание: приложение, LiveKit, coturn, Caddy с HTTPS

Клиент и сервер общаются событиями, описанными в packages/protocol/src/events.ts. Поменяешь там сигнатуру — TypeScript подсветит все места на обеих сторонах.

Запуск у себя (разработка)

Нужен Node.js 22.18 или новее (лучше 24).

npm install
npm run dev

Откроется клиент на http://localhost:5173, сервер поднимется на :3000, медиасервер LiveKit — на :7880. Запросы к API клиент проксирует сам. Первый аккаунт регистрируется прямо на экране входа.

LiveKit для разработки — бинарник в tools/livekit/, в репозиторий он не входит. Скачай архив под свою систему с https://github.com/livekit/livekit/releases, проверь SHA256 по checksums.txt и распакуй в tools/livekit/. Без него работает всё, кроме голоса и видео.

Проверки:

npm run typecheck
npm test -w @berloga/server
npm test -w @berloga/e2ee

Развёртывание на своём сервере

Подойдёт любой VPS с Docker (1–2 ГБ памяти хватит на небольшую компанию).

  1. Направь домен (A-запись) на IP сервера.

  2. Скопируй проект на сервер, например в /opt/berloga. Для свежего Ubuntu 24.04 есть scripts/vps/prepare.sh (запускать от root): ставит Docker, оставляет вход по SSH только по ключу, открывает в файрволе только нужные порты и добавляет swap.

  3. cp .env.example .env и заполни:

    • DOMAIN и PUBLIC_IP;
    • TURN_SECRET — openssl rand -hex 32;
    • LIVEKIT_API_KEY — openssl rand -hex 16, LIVEKIT_API_SECRET — openssl rand -hex 32;
    • REGISTRATION_KEY — если задать, зарегистрироваться можно только с этим ключом (чтобы пускать своих).
  4. Открой порты: 80/tcp, 443/tcp+udp, 7881/tcp, 7882/udp (LiveKit), 3478/tcp+udp и 49160-49200/udp (coturn).

  5. Запусти:

    docker compose up -d --build

Caddy сам получит HTTPS-сертификат и проксирует wss://DOMAIN/livekit на медиасервер. Ключи для push-уведомлений сервер создаёт сам при первом запуске.

Данные лежат в томе Docker appdata (база SQLite и файлы). Резервная копия:

docker compose cp app:/data ./backup

Служебные команды (запускаются в контейнере):

# новый пароль для пользователя, который забыл свой (почты для сброса нет); все его устройства выйдут из аккаунта
docker compose exec app node --disable-warning=ExperimentalWarning src/tools/reset-password.ts <имя>
# значок «Верифицированный разработчик» в профиле (с минусом — забрать)
docker compose exec app node --disable-warning=ExperimentalWarning src/tools/badge.ts <имя> developer

Остальные настройки сервера — переменные окружения в apps/server/src/config.ts: лимит и квота загрузок (UPLOAD_LIMIT_MB, UPLOAD_QUOTA_MB), через сколько дней без использования вход на устройстве истекает (SESSION_TTL_DAYS, по умолчанию 90), название (APP_NAME), разрешённые источники CORS (ALLOWED_ORIGINS) и другие.

Приложение для Windows

Нужны Rust и Visual Studio Build Tools с компонентом «Разработка классических приложений на C++». WebView2 в Windows 10/11 уже есть.

npm run desktop:dev      # запуск с горячей перезагрузкой
npm run desktop:build    # установщик в apps/client/src-tauri/target/release/bundle/nsis/

При первом запуске приложение спрашивает адрес сервера. Чтобы там сразу стоял твой сервер, впиши его в apps/client/.env.production (VITE_DEFAULT_SERVER=https://chat.example.com) перед сборкой.

Свой ключ для обновлений — обязательно

Приложение ставит обновления только с подписью, которую сервер подделать не может: это часть защиты сквозного шифрования. В apps/client/src-tauri/tauri.conf.json (plugins.updater.pubkey) сейчас вшит открытый ключ автора проекта — замени его на свой, иначе твои сборки не смогут обновляться.

npx tauri signer generate -w ~/.berloga/updater.key

Команда создаст закрытый ключ (защищённый паролем) и выведет открытый — его и вставь в pubkey. Закрытый ключ никогда не клади на сервер и сохрани копию офлайн: потеряешь ключ — каждому пользователю придётся переустанавливать приложение вручную.

Как выпустить обновление

  1. Подними версию во всех package.json, в apps/client/src-tauri/tauri.conf.json и Cargo.toml.

  2. Собери, подпиши и залей на сервер одной командой:

    npm run desktop:release -- --notes "Что нового" --base-url https://DOMAIN --upload user@server:/opt/berloga/data/updates

Скрипт спросит пароль ключа, соберёт и подпишет установщик и скопирует на сервер установщик, подпись и latest.json. Приложения проверяют обновления раз в час, тихо скачивают их и предлагают перезапуститься. Ссылка на установщик для новых людей — https://DOMAIN/updates/<имя установщика>.exe.

Папку data/updates на сервере один раз подготовь, чтобы в неё мог писать твой пользователь SSH:

sudo mkdir -p /opt/berloga/data/updates && sudo chown "$USER" /opt/berloga/data/updates

Без --upload файлы кладутся в apps/server/data/updates/ — так удобно проверять обновления на локальном сервере.

Телефон

Отдельного приложения из магазина нет: Берлога ставится как веб-приложение. На iPhone — Safari → «Поделиться» → «На экран „Домой“», на Android — кнопка «Установить» в Chrome. Работают push-уведомления, весь экран, жесты и тот же интерфейс, что на ПК, подогнанный под палец. Нужен HTTPS (на своём домене он будет сам).

Документация

  • ROADMAP.md — всё, что сделано, по этапам;
  • docs/E2EE.md — как устроено сквозное шифрование;
  • docs/E2EE-REVIEW.md — разбор угроз и проверка схемы шифрования;
  • docs/BOTS.md — боты, слеш-команды и вебхуки;
  • docs/DESIGN-GLASS.md — правила дизайна.

Лицензия

Автор — VantageEX. Код — MIT: используй, меняй, продавай, ничего не спрашивая.

Чужое, что лежит в репозитории, идёт под своими лицензиями:

  • модель и код шумоподавления DeepFilterNet3 — MIT или Apache-2.0 (apps/client/public/models/dfn3/);
  • шрифт Geologica — SIL Open Font License 1.1 (apps/client/public/fonts/LICENSE).

LiveKit, coturn и Caddy в репозиторий не входят: Docker скачивает их сам, у каждого своя лицензия. Берлога не связана с Discord; Discord — товарный знак Discord Inc.

About

Свой Discord на своём железе: серверы, голос, видео, сквозное шифрование. Self-hosted Discord alternative.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages