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

Установка

Ретранслятор — это один исполняемый файл, rchat-server. Выпущенные файлы для Linux, FreeBSD и macOS публикуются по адресу https://assets.r-chat.net/<версия>/, каждый с контрольной суммой SHA-256. Текущий выпуск указан на странице Выпуски и на странице загрузок.

В Linux (от root или через sudo):

Окно терминала
curl -fsSL https://assets.r-chat.net/install.sh | sudo sh

Во FreeBSD запускайте от root (sudo может быть не установлен). curl не входит в базовую систему, поэтому сначала установите его; install.sh использует curl, потому что он удерживает все перенаправления на https:

Окно терминала
pkg install -y curl
curl -fsSL https://assets.r-chat.net/install.sh | sh

Скрипт:

  1. определяет операционную систему и процессор и выбирает подходящий файл (в Linux — статическую сборку, если не указан --gnu);
  2. читает текущую версию из https://assets.r-chat.net/VERSION, если вы не закрепили версию через --version;
  3. скачивает файл и его .sha256 по HTTPS, проверяет хеш и останавливается при несовпадении;
  4. устанавливает файл в /usr/local/bin/rchat-server, заменяя старый за один шаг;
  5. настраивает пользователя службы, каталоги и файл службы для платформы (ниже);
  6. выводит следующие шаги.

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

ПараметрДействие
--version VУстановить версию V вместо текущей.
--gnuВ Linux x86_64 или ARM64 установить сборку для glibc вместо статической.
--dry-runПоказать, что будет скачано и установлено, ничего не меняя.
--prefix DIRУстановить в DIR вместо / (для образов и тестов; пользователь службы не создаётся, вместо этого выводятся команды для его создания).
--base-url URLСкачивать с другого зеркала. Принимается только https://, если только URL не указан явно как http://.

Чтобы сначала посмотреть, что он сделает:

Окно терминала
curl -fsSL https://assets.r-chat.net/install.sh | sudo sh -s -- --version 1.1.0 --dry-run

Весь скрипт — одна функция, вызываемая в последней строке, поэтому оборванная на середине загрузка ничего не выполняет.

КодЗначение
0Установлено (или пробный запуск завершён).
1Неподдерживаемая операционная система или процессор либо неверный параметр.
2Ошибка загрузки: не удалось получить версию, файл или его контрольную сумму, либо не найдены curl/fetch или инструмент SHA-256.
3Несовпадение контрольной суммы. Ничего не установлено.
4Сбой шага установки (создание каталога, установка файла или создание пользователя).
130Прервано.
СистемаПроцессорФайл
Linuxx86_64, ARM64rchat-server-<arch>-linux-static (по умолчанию) или rchat-server-<arch>-linux-gnu (--gnu)
LinuxARMv7rchat-server-armv7-linux
LinuxRISC-V 64rchat-server-riscv64gc-linux-gnu
FreeBSDx86_64rchat-server-x86_64-freebsd
macOSApple silicon и Intelrchat-server-macos-universal

rchat-server --config <path> --render-decoy <dir> [--host <hostname>] записывает небольшой статический сайт в <dir> и завершает работу. Сайт — это страница входа вымышленного продукта (веб-почта, страница администрирования NAS, фотобиблиотека, облачный диск или хостинг кода). Продукт, название бренда, акцентный цвет и логотип выбираются по имени хоста, поэтому один и тот же хост всегда получает один и тот же сайт, а два ретранслятора не отдают одинаковые страницы. Повторное развёртывание ретранслятора воспроизводит его сайт.

Окно терминала
sudo -u rchat rchat-server --config /etc/rchat/server.toml --render-decoy /var/lib/rchat/decoy --host chat.example.com

Затем укажите его ретранслятору:

[server.decoy]
root = "/var/lib/rchat/decoy"
  • Имя хоста. Перед использованием имя хоста приводится к нижнему регистру, а точка в конце отбрасывается, поэтому Chat.Example.com. и chat.example.com дают один и тот же сайт. Без --host команда берёт [server.decoy] host, иначе первый домен [server.acme] из файла конфигурации, иначе начальное значение, выведенное из ключа идентичности ретранслятора (тогда --config должен указывать на ретранслятор, у которого ключ идентичности уже есть).
  • Каталог. <dir> должен быть пустым или отсутствовать либо быть каталогом, который эта команда уже создавала. Всё остальное отклоняется и не трогается. Символические ссылки за пределы <dir> не разыменовываются, а каждый файл записывается через временный файл и переименование.
  • Самодостаточность. Все стили, скрипты и логотипы лежат в собственных файлах сайта, внешних загрузок нет. Форма входа никогда не отправляется; она показывает сообщение «неверное имя пользователя или пароль».
  • Отсутствующие страницы. Неизвестные пути получают собственную страницу сайта 404.html со статусом 404.
  • Ничего опознающего. Сайт никогда не содержит путь WebSocket, пин ретранслятора, номер версии или название проекта.
  • Без root. Ретранслятор отдаёт встроенный сайт того же рода, выбранный по [server.decoy] host, иначе по первому домену [server.acme], иначе по ключу идентичности. Если не задано ни то, ни другое, начальное значение выводится из секретного ключа идентичности ретранслятора, поэтому страница всё равно уникальна для ретранслятора и не вычисляется по его открытому пину. Команда --rotate-relay-identity меняет эту встроенную страницу, потому что меняется ключ. Сайт, уже записанный на диск, остаётся прежним: он зависит только от имени хоста или начального значения, с которым был создан.

Приманка делает ретранслятор похожим на обычный сайт для поверхностных проверок. Она не гарантирует защиту от настойчивого исследователя.

Выберите файл для своей платформы на странице загрузок или на странице Выпуски, затем проверьте его. В Linux:

Окно терминала
curl -LO https://assets.r-chat.net/1.1.0/rchat-server-x86_64-linux-static
curl -LO https://assets.r-chat.net/1.1.0/rchat-server-x86_64-linux-static.sha256
echo "$(cat rchat-server-x86_64-linux-static.sha256) rchat-server-x86_64-linux-static" | sha256sum -c

На macOS используйте shasum -a 256 rchat-server-macos-universal; во FreeBSD — sha256 -q rchat-server-x86_64-freebsd и сравните результат с файлом .sha256 на глаз. Каждый файл .sha256 содержит только хеш.

Затем установите его:

Окно терминала
sudo install -m 0755 rchat-server-x86_64-linux-static /usr/local/bin/rchat-server

Что настраивает install.sh:

  • системного пользователя и группу rchat без оболочки входа;
  • /var/lib/rchat (режим 0700, владелец rchat) для ключа идентичности ретранслятора и кеша ACME;
  • /etc/rchat (режим 0750, владелец root, группа rchat) для конфигурации;
  • юнит systemd /etc/systemd/system/rchat-server.service, если юнит с таким именем ещё не существует там или в /lib/systemd/system либо /usr/lib/systemd/system. Он запускает ретранслятор от rchat с --config /etc/rchat/server.toml и разрешает ему привязать порт 443 (CAP_NET_BIND_SERVICE). См. Запуск как службы.

Затем:

  1. Напишите конфигурацию в /etc/rchat/server.toml, режим 0640, группа rchat. В быстром старте есть полный файл для ретранслятора на порту 443 с автоматическими сертификатами; шаблон с комментариями — rchat/config/server.toml в репозитории rchat-core. Храните ключ и кеш ACME в /var/lib/rchat:

    [server]
    relay_identity_path = "/var/lib/rchat/relay_identity.key"
    [server.acme]
    cache_dir = "/var/lib/rchat/acme"
  2. Создайте идентичность ретранслятора один раз, от имени пользователя службы. Команда отказывается перезаписывать существующий ключ:

    Окно терминала
    sudo -u rchat /usr/local/bin/rchat-server --config /etc/rchat/server.toml --init-relay-identity

    Она выводит пин ретранслятора (rk:1:…), который вы передаёте пользователям. См. Идентичность ретранслятора.

  3. Запустите:

    Окно терминала
    sudo systemctl daemon-reload && sudo systemctl enable --now rchat-server

Что настраивает install.sh:

  • пользователя rchat, создаваемого через pw useradd, если его нет;
  • /var/db/rchat (режим 0700) и /var/log/rchat (режим 0750), владелец rchat;
  • /usr/local/etc/rchat (режим 0750, владелец root, группа rchat) для конфигурации;
  • rc-скрипт /usr/local/etc/rc.d/rchat (режим 0555), если его ещё нет.

rc-скрипт запускает ретранслятор под daemon(8), который перезапускает его через 5 секунд после выхода и заново открывает журнал по SIGHUP для newsyslog. Его настройки, все необязательные, в /etc/rc.conf:

ПеременнаяПо умолчаниюЗначение
rchat_enableNOЗапуск при загрузке.
rchat_runasrchatПользователь, от имени которого работает ретранслятор. Это rchat_runas, а не rchat_user, потому что rc.subr запустил бы от rchat_user сам daemon.
rchat_config/usr/local/etc/rchat/server.tomlФайл конфигурации.
rchat_log/var/log/rchat/server.logФайл журнала.
rchat_log_levelwarnУровень журнала.

Затем:

  1. Напишите конфигурацию в /usr/local/etc/rchat/server.toml, режим 0640, группа rchat. Ключ идентичности ретранслятора указывается в разделе [server], а при встроенном ACME — кеш сертификатов в разделе [server.acme], оба в /var/db/rchat. Укажите cache_dir явно: путь по умолчанию, /var/lib/rchat/acme, во FreeBSD не существует, и ретранслятор откажется запускаться.

    [server]
    relay_identity_path = "/var/db/rchat/relay_identity.key"
    [server.acme]
    cache_dir = "/var/db/rchat/acme"

    server-2gb.toml — полная конфигурация для FreeBSD, где оба параметра уже заданы.

  2. Создайте идентичность ретранслятора один раз, от имени пользователя службы:

    Окно терминала
    su -m rchat -c '/usr/local/bin/rchat-server --config /usr/local/etc/rchat/server.toml --init-relay-identity'
  3. Запустите:

    Окно терминала
    sysrc rchat_enable=YES && service rchat start

По умолчанию во FreeBSD непривилегированный пользователь не может привязать порт 443. На странице FreeBSD описаны оба способа обслуживать 443: проброс через pf на высокий порт внутри jail или mac_portacl на выделенном хосте.

На macOS install.sh устанавливает только исполняемый файл и каталог /usr/local/etc/rchat для конфигурации. Он не устанавливает файл службы и не создаёт пользователя. Запускайте ретранслятор под launchd с собственным списком свойств, который выполняет:

/usr/local/bin/rchat-server --config /usr/local/etc/rchat/server.toml

Например, /Library/LaunchDaemons/net.r-chat.relay.plist, где UserName — учётная запись, созданная вами для ретранслятора:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>net.r-chat.relay</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/rchat-server</string>
<string>--config</string>
<string>/usr/local/etc/rchat/server.toml</string>
</array>
<key>UserName</key><string>REPLACE-with-the-relay-account</string>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict>
</plist>

В конфигурации укажите relay_identity_path (в разделе [server]) и, при встроенном ACME, cache_dir (в разделе [server.acme]) в каталоге, принадлежащем этой учётной записи. Кеш ACME по умолчанию, /var/lib/rchat/acme, на macOS не существует, и ретранслятор откажется запускаться. Один раз создайте идентичность от её имени с --init-relay-identity, затем загрузите задание: sudo launchctl bootstrap system /Library/LaunchDaemons/net.r-chat.relay.plist. Файлы для macOS подписаны и нотариально заверены Apple (см. Выпуски).

Исходный код ретранслятора находится в публичном репозитории rchat-core. Нужны набор инструментов Rust (rustup), а также компилятор C и CMake, потому что ретранслятор зависит от общей клиентской библиотеки, которая компилирует BoringSSL через крейт boring.

Окно терминала
git clone https://github.com/PDG-Global/rchat-core.git
cd rchat-core/rchat
cargo build --release --locked --bin rchat-server
sudo install -m 0755 target/release/rchat-server /usr/local/bin/

Затем создайте пользователя, каталоги и службу вручную. Это те же команды, что выполняет install.sh.

В Linux:

Окно терминала
sudo useradd --system --user-group --home-dir /var/lib/rchat --no-create-home --shell /usr/sbin/nologin rchat
sudo install -d -o rchat -g rchat -m 0700 /var/lib/rchat
sudo install -d -o root -g rchat -m 0750 /etc/rchat
curl -fsSL -o rchat-server.service https://assets.r-chat.net/1.1.0/rchat-server.service
sudo install -m 0644 rchat-server.service /etc/systemd/system/rchat-server.service

Во FreeBSD (от root):

Окно терминала
pw useradd rchat -d /var/db/rchat -s /usr/sbin/nologin -c "rChat relay" -w no
install -d -o rchat -g rchat -m 0700 /var/db/rchat
install -d -o rchat -g rchat -m 0750 /var/log/rchat
install -d -o root -g rchat -m 0750 /usr/local/etc/rchat
fetch -o rchat.rc https://assets.r-chat.net/1.1.0/rchat.rc
install -m 0555 rchat.rc /usr/local/etc/rc.d/rchat

Затем выполните шаги 1–3 для своей платформы выше. Юнит и rc-скрипт публикуются для каждого выпуска по адресу https://assets.r-chat.net/<версия>/.

Окно терминала
rchat-server --help

Показывает параметры командной строки. Что делает каждый из них, см. в справочнике по командной строке.

Снова запустите install.sh (или замените файл вручную), затем перезапустите:

Окно терминала
sudo systemctl restart rchat-server # Linux
service rchat restart # FreeBSD

install.sh выводит команду перезапуска, если он заменил старый файл. Кеш ACME и ключ идентичности ретранслятора переживают перезапуски, поэтому ретранслятор повторно использует свой сертификат и сохраняет идентичность.

Сообщения в офлайн-очереди по умолчанию хранятся в памяти, поэтому перезапуск ретранслятора их теряет. Чтобы сохранять их между перезапусками, включите зашифрованное сохранение (см. Офлайн-очередь).

Протокол v2 — жёсткий переход: обновляйте ретранслятор и приложение для iOS вместе. Старые приложения получают отказ «client too old; update rChat».

  • Создайте идентичность ретранслятора до первого запуска: --init-relay-identity (см. Идентичность ретранслятора).
  • Удалите message_queue_persist_path и trusted_proxy из файла конфигурации. Ретранслятор не запускается, пока задан любой из них. При первом запуске он перезаписывает старый незашифрованный файл очереди нулями и удаляет его. Сообщения, поставленные в очередь до обновления, теряются.
  • Если ретранслятор стоял за прокси, завершающим TLS, перейдите на TCP-фронтенд или отдайте ретранслятору порт 443.
  • connection_timeout_secs теперь должен быть от 60 до 86400, а для метрик на не-loopback адресе нужен [metrics] allow_public = true.