Установка
Ретранслятор — это один исполняемый файл, rchat-server. Выпущенные файлы для Linux, FreeBSD и macOS публикуются по адресу https://assets.r-chat.net/<версия>/, каждый с контрольной суммой SHA-256. Текущий выпуск указан на странице Выпуски и на странице загрузок.
Установка с помощью install.sh
Заголовок раздела «Установка с помощью install.sh»В 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 curlcurl -fsSL https://assets.r-chat.net/install.sh | shСкрипт:
- определяет операционную систему и процессор и выбирает подходящий файл (в Linux — статическую сборку, если не указан
--gnu); - читает текущую версию из
https://assets.r-chat.net/VERSION, если вы не закрепили версию через--version; - скачивает файл и его
.sha256по HTTPS, проверяет хеш и останавливается при несовпадении; - устанавливает файл в
/usr/local/bin/rchat-server, заменяя старый за один шаг; - настраивает пользователя службы, каталоги и файл службы для платформы (ниже);
- выводит следующие шаги.
Он никогда не перезаписывает существующие конфигурацию, ключ идентичности ретранслятора или файл службы и никогда не пишет конфигурацию или ключ. Повторный запуск обновляет исполняемый файл и не трогает всё остальное.
| Параметр | Действие |
|---|---|
--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 | Прервано. |
Поддерживаемые платформы
Заголовок раздела «Поддерживаемые платформы»| Система | Процессор | Файл |
|---|---|---|
| Linux | x86_64, ARM64 | rchat-server-<arch>-linux-static (по умолчанию) или rchat-server-<arch>-linux-gnu (--gnu) |
| Linux | ARMv7 | rchat-server-armv7-linux |
| Linux | RISC-V 64 | rchat-server-riscv64gc-linux-gnu |
| FreeBSD | x86_64 | rchat-server-x86_64-freebsd |
| macOS | Apple silicon и Intel | rchat-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-staticcurl -LO https://assets.r-chat.net/1.1.0/rchat-server-x86_64-linux-static.sha256echo "$(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-serverLinux (systemd)
Заголовок раздела «Linux (systemd)»Что настраивает 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). См. Запуск как службы.
Затем:
-
Напишите конфигурацию в
/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" -
Создайте идентичность ретранслятора один раз, от имени пользователя службы. Команда отказывается перезаписывать существующий ключ:
Окно терминала sudo -u rchat /usr/local/bin/rchat-server --config /etc/rchat/server.toml --init-relay-identityОна выводит пин ретранслятора (
rk:1:…), который вы передаёте пользователям. См. Идентичность ретранслятора. -
Запустите:
Окно терминала sudo systemctl daemon-reload && sudo systemctl enable --now rchat-server
FreeBSD (rc.d)
Заголовок раздела «FreeBSD (rc.d)»Что настраивает 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_enable | NO | Запуск при загрузке. |
rchat_runas | rchat | Пользователь, от имени которого работает ретранслятор. Это 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_level | warn | Уровень журнала. |
Затем:
-
Напишите конфигурацию в
/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, где оба параметра уже заданы. -
Создайте идентичность ретранслятора один раз, от имени пользователя службы:
Окно терминала su -m rchat -c '/usr/local/bin/rchat-server --config /usr/local/etc/rchat/server.toml --init-relay-identity' -
Запустите:
Окно терминала sysrc rchat_enable=YES && service rchat start
По умолчанию во FreeBSD непривилегированный пользователь не может привязать порт 443. На странице FreeBSD описаны оба способа обслуживать 443: проброс через pf на высокий порт внутри jail или mac_portacl на выделенном хосте.
macOS (launchd)
Заголовок раздела «macOS (launchd)»На 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.gitcd rchat-core/rchatcargo build --release --locked --bin rchat-serversudo 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 rchatsudo install -d -o rchat -g rchat -m 0700 /var/lib/rchatsudo install -d -o root -g rchat -m 0750 /etc/rchatcurl -fsSL -o rchat-server.service https://assets.r-chat.net/1.1.0/rchat-server.servicesudo 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 noinstall -d -o rchat -g rchat -m 0700 /var/db/rchatinstall -d -o rchat -g rchat -m 0750 /var/log/rchatinstall -d -o root -g rchat -m 0750 /usr/local/etc/rchatfetch -o rchat.rc https://assets.r-chat.net/1.1.0/rchat.rcinstall -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 # Linuxservice rchat restart # FreeBSDinstall.sh выводит команду перезапуска, если он заменил старый файл. Кеш ACME и ключ идентичности ретранслятора переживают перезапуски, поэтому ретранслятор повторно использует свой сертификат и сохраняет идентичность.
Сообщения в офлайн-очереди по умолчанию хранятся в памяти, поэтому перезапуск ретранслятора их теряет. Чтобы сохранять их между перезапусками, включите зашифрованное сохранение (см. Офлайн-очередь).
Переход на протокол v2
Заголовок раздела «Переход на протокол v2»Протокол 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.