← duga.pw наверх

Duga Остров: свой сервер связи

Самостоятельная редакция мессенджера Duga. Ставится на свой сервер одной командой, и дальше связь работает независимо от кого бы то ни было — в том числе от автора Duga.

свой сервер работает без общего интернета docker, одна команда TLS обязателен версия 2.4.0

Что это такое и зачем

Duga Остров — это тот же мессенджер Duga, но без сервера автора. Пакет разворачивает на вашей машине четыре службы (шлюз связи, приём вложений, TLS-обёртку и узел радиосети), и с этого момента переписка ходит между вашими людьми напрямую — через ваш сервер, а не через duga.pw.

Если сервер выключить общий интернет — переписка внутри вашей сети продолжает работать: клиенты соединяются с вашим шлюзом напрямую, ему для этого чужие серверы не нужны. Это и есть «островок»: у сети радиосвязи внутри пакета (Reticulum) нет ни одного чужого адреса — ни узлов автора, ни публичных точек входа. Автообнаружение выключено. Кто захочет соединить свой островок с чужим — сделает это сам, зная, что делает.

Код мессенджера — из той же ветки, что в основном сервисе: правки безопасности не проходят мимо самостоятельной редакции. А вот исключённые разделы вырезаны физически — их файлов в пакете нет, поэтому включить их настройкой нельзя.

Честно: чего в этой редакции нет

Не входят: Магазин, Игры и мини-приложения, Кошелёк, Duga Premium и звёзды, подарки, платные каналы, ассистент с языковой моделью и песочница ботов. Это редакция «только связь» — и без извинений: платное и лишнее осталось в основном сервисе.

Звонки (голос и видео) — есть, но по умолчанию выключены и включаются отдельным вопросом при установке. У звонков своя цена: нужен пятый сервис (медиасервер) и два открытых порта наружу (7881/tcp и 7882/udp) — если у собеседника наружу открыт только 443 (строгий фаервол, часть мобильных операторов), звонок не соединится; переписка и вложения при этом работают как обычно.

Это решение автора: платные возможности остаются в основном сервисе duga.pw, а свободная редакция даёт связь — и даёт её целиком, без урезаний в переписке, группах, каналах, вложениях и уведомлениях.

Почему выключено двумя способами сразу, а не одним. Сервер в приветствии перечисляет разделы, которые у него есть, и приложение прячет остальные — без этого остались бы кнопки в никуда. Но одной этой меры мало: команду можно отправить в обход интерфейса. Поэтому вторая мера — файлов игр, кошелька и магазина в пакете попросту нет. Обе меры разом: спрятанной кнопки нет, и команда в обход не сработает — шлюз ответит понятной ошибкой «раздел не входит в эту сборку», а не притворится, что сломался.

Установка в пять шагов

Что нужно: сервер с Linux, docker и docker compose, 2 ГБ памяти, 5 ГБ на диске плюс место под вложения, доступ снаружи на порты 80 и 443.

  1. Распаковать

    tar xzf duga-ostrov-2.4.0.tar.gz
    cd duga-ostrov-2.4.0
  2. Запустить установщик

    sudo ./ustanovit.sh

    Он спросит три вещи и дальше всё сделает сам: соберёт образ, создаст ключи, поднимет четыре службы.

    ВопросЧто отвечать
    Как открывают мессенджер1 — свой домен · 2 — белый IP без домена · 3 — сеть без интернета
    Порты наружу80 и 443, если они свободны
    Кого пускатьopen — всех · invite — по коду · closed — никого
  3. Записать код владельца

    В конце установщик напечатает одноразовый код владельца установки:

    KF9W-_WbiUmavFNc

    Пример вида кода — настоящий будет другим и появится только один раз. Если потерялся — он лежит в dannye/gateway/kod_vladeltsa.txt, пока не использован.

  4. Стать владельцем

    Откройте адрес в браузере, нажмите «Создать аккаунт», введите имя и этот код в поле «Код приглашения». Учётная запись станет владельцем установки, а код погаснет — второй раз им воспользоваться нельзя.

    Сохраните ключ входа, который покажет приложение. Восстановить его невозможно: он не хранится в открытом виде ни у вас, ни на сервере.
  5. Позвать своих

    В режиме invite:

    ./priglasit.sh 5        # выдать пять кодов
    ./priglasit.sh spisok   # посмотреть невыданные

    Каждый код одноразовый. Человек вводит его при создании учётной записи.

TLS: три способа и почему без него нельзя

СпособКогда выбиратьЧто происходит
Свой домену вас есть домен, указывающий на сервер сертификат получает и продлевает сам Let's Encrypt
Белый IP без доменаесть внешний IP, домена нет и покупать не хочется адрес вида 1-2-3-4.sslip.io — тоже настоящий сертификат Let's Encrypt, бесплатно
Полностью офлайнсети без интернета вообще нет сервер выпускает сертификат себе сам; установщик печатает его отпечаток SHA-256

В офлайн-режиме проверять сертификат цепочкой доверия негде — интернета нет. Тогда браузер перестанет ругаться, если поставить в доверенные корневой сертификат установки (dannye/caddy/caddy/pki/authorities/local/root.crt); настольное приложение доверяет по отпечатку SHA-256, который печатает установщик.

Почему без TLS нельзя вообще

Это не строгость ради строгости — два независимых запрета, и оба не обходятся:

1. Шифрование живёт только в защищённом контексте. Всем, чем шифруется переписка и создаются ключи — crypto.subtle — браузер даёт странице только по https://. По простому http:// на чужом адресе этой возможности в браузере попросту нет, и приложению нечем завести ключи.
2. Android не пустит смешанное содержимое. Страница, открытая по https, не может подключиться к незашифрованному ws:// — правило WebView MIXED_CONTENT_NEVER_ALLOW. Открыть по обычному http тоже не выход: тогда сработает запрет №1.

Как подключить приложения к своему серверу

ГдеЧто делать
Браузерничего прописывать не нужно — приложение само берёт адрес того сайта, с которого открылось. Если открываете общий клиент и хотите указать чужой шлюз — на экране входа есть поле «Адрес шлюза», формат wss://ваш-адрес/ws
Настольное приложение (Windows / macOS)меню «Сервер» → «Добавить сервер…», поле принимает wss://moy-server.ru/ws или, в локальной сети, ws://192.168.1.10:8765. Кнопка «Сохранить» включится только после успешной проверки связи
Androidто же поле адреса шлюза, но обязательно wss:// — по причине из раздела о TLS выше, ws:// с телефона по обычному интернету WebView не даст

Пример адреса: wss://duga.moyaset.ru/ws. Если порт нестандартный — с портом: wss://192.168.1.10:8443/ws.

Второй способ — QR-код: в своём приложении откройте Настройки → Безопасность → серверы → показать QR, на другом телефоне отсканируйте. Список серверов подписан ключом именно вашей установки, чужой список подсунуть нельзя.

Скачать пакет

Скачать duga-ostrov-2.4.0.tar.gz 18 692 550 байт

sha256: 498f3ba12febfb3ce3f2203f8af336aef4753a1be678eb175bec0f09525227af

sha256sum duga-ostrov-2.4.0.tar.gz
# должно совпасть с 498f3ba12febfb3ce3f2203f8af336aef4753a1be678eb175bec0f09525227af

Пакет ещё и подписан — публичный ключ лежит прямо внутри архива (ostrov-podpis-public.asc), отдельно скачивать не нужно. Проверка одной командой (нужен GnuPG), сразу после скачивания .tar.gz и .sig рядом с ним:

tar xzf duga-ostrov-2.4.0.tar.gz duga-ostrov-2.4.0/ostrov-podpis-public.asc && gpg --import duga-ostrov-2.4.0/ostrov-podpis-public.asc && gpg --verify duga-ostrov-2.4.0.tar.gz.sig duga-ostrov-2.4.0.tar.gz

«Good signature» значит: архив собран владельцем этого ключа и не подменён по дороге. Ключ подписи (короткий вид) — 65F992E39EF0C398.

Требования, обновление, резервная копия

Требования к серверу

ЧтоСколько
Операционная системалюбой современный Linux
Памятьот 2 ГБ
Дискот 5 ГБ плюс место под вложения
Софтdocker и docker compose
Сетьпорты 80 и 443 открыты наружу

Обновление

cd duga-ostrov-2.4.0
tar czf ../duga-kopiya-$(date +%F).tar.gz dannye .env   # сначала копия!
docker compose down
# распакуйте новую версию поверх, каталог dannye/ и .env НЕ трогайте
docker compose build
docker compose up -d
docker compose logs -f shlyuz

Данные живут в dannye/, настройки — в .env. Обновление ни то, ни другое не переписывает. Проверить, что обновление доехало:

docker compose ps
curl -s -o /dev/null -w '%{http_code}\n' https://ваш-адрес/

Резервная копия

cd duga-ostrov-2.4.0
docker compose stop shlyuz zagruzka        # чтобы копия была целостной
tar czf ../duga-kopiya-$(date +%F).tar.gz dannye .env
docker compose start shlyuz zagruzka
КаталогЧто там
dannye/gatewayучётные записи, переписка, группы, каналы, приглашения
dannye/uploadsвложения
dannye/nastroykiключ владельца установки, ключи уведомлений
dannye/caddyсертификаты
.envадрес, режим TLS, режим приёма
Копию храните не на этом же сервере. Потеря dannye/nastroyki/keys значит, что вы больше не сможете подписать список серверов, и людям придётся вписывать адрес руками — а не то, что переписка потеряна.

Восстановление: распакуйте архив в каталог с пакетом, chown -R 10001:10001 dannye, затем docker compose up -d.