SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor

Как развернуть свой сервер SimpleX chat на VPS

Пошаговое руководство по установке SimpleX SMP relay на VPS. Вы узнаете, как настроить порты, TLS, права доступа для пользователя и резервное копирование данных сервера.

Что делает self-hosted сервер SimpleX chat

Для самостоятельного размещения сервера SimpleX chat вы запускаете на VPS один демон: smp-server, ретранслятор для SMP (simplex messaging protocol). Он хранит очереди сообщений, в которые записывают и из которых считывают данные ваши контакты. Второй, опциональный демон под названием xftp-server, пересылает передаваемые файлы. Оба компонента поставляются в рамках одного проекта, simplexmq, и каждый из них представляет собой единый бинарный файл, файл конфигурации и лог, работающий только на добавление.

Данное руководство предназначено для администратора, а не для пользователя приложения. Ретранслятор не хранит учетные записи, списки контактов и историю чатов. Он содержит очереди, некоторое количество недоставленных зашифрованных данных и сертификат, идентифицирующий сервер. Вы берете на себя обеспечение времени безотказной работы (uptime), выделение небольшого объема дискового пространства и обработку метаданных, проходящих через ваш сервер.

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

Почему сети без идентификаторов пользователей все равно нужны реле

В SimpleX нет имен пользователей, номеров телефонов и идентификаторов аккаунтов. Контакт представляет собой однонаправленную очередь: адрес на определенном реле, в которую одна сторона записывает данные, а другая их считывает. Два ваших контакта не имеют общего идентификатора, по которому сервер мог бы их связать.

Эти очереди все равно должны где-то находиться по простой причине. Два телефона редко бывают онлайн в одну и ту же секунду. Кто-то должен принять сообщение сейчас и удерживать его до тех пор, пока другое устройство не запросит данные. Это и есть основная задача реле SMP. Это также означает, что два устройства никогда не подключаются напрямую друг к другу, поэтому ни одно из них не узнает IP (internet protocol) адрес другого. Реле берет эту нагрузку на себя.

Имя хоста реле является частью адреса очереди, поэтому оно содержится в каждой ссылке-приглашении, которую вы распространяете. Учитывайте это при изучении модели угроз в конце документа.

Что реле может и чего не может видеть

Проект описывает это как модель угроз в protocol/security.md, и с ней стоит ознакомиться до установки чего-либо, так как после прохождения этого руководства реле станет вашим. Реле, включая то, которое полностью контролируется злоумышленником, не может узнать содержимое или тип сообщений, не может незаметно добавлять, дублировать или повреждать отдельные сообщения, а также не может взломать сквозное шифрование с помощью активной атаки.

На той же странице перечислены действия, которые реле может выполнять. Оно может узнать, когда получатель очереди находится в сети. Оно может подсчитать, сколько сообщений проходит через очередь. Оно может узнать IP-адрес получателя. Оно может отбрасывать все будущие сообщения в очереди или предоставлять ложную информацию о состоянии этой очереди.

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

Что нужно подготовить перед началом

  • VPS с установленной Ubuntu 22.04 или 24.04. Проект выпускает релизы бинарных файлов, собранных именно под эти две версии для архитектур x86-64 и aarch64.
  • Доменное имя с A-записью, указывающей на ваш VPS, и AAAA-записью, если у вас есть IPv6. В документации в качестве примера используется smp1.example.com.
  • Доступ root или sudo, а также открытая вторая SSH-сессия на случай настройки межсетевого экрана.
  • Внешнее хранилище для резервных копий, так как каталог конфигурации определяет идентичность сервера.

На ARM-инстансе используйте ассет aarch64 вместо x86-64. Остальная часть руководства не меняется, а выбор между ARM и x86 VPS зависит только от цены и производительности на ядро, а не от совместимости с данным ПО.

Установка конкретной версии вместо "latest"

Проект предоставляет скрипт установки, который загружает текущий релиз и регистрирует команду simplex-servers-update. Это работает. Тем не менее, фиксируйте версию: если бинарный файл релея меняется без вашего ведома, вы не сможете проанализировать причины сбоя при возникновении проблем.

По состоянию на август 2026 года текущим релизом simplexmq является v6.5.0, опубликованный 29 апреля 2026 года. Проверьте страницу релизов, чтобы выбрать нужный тег, и используйте его во всех инструкциях ниже.

sudo useradd -m smp
sudo install -d -o smp -g smp -m 755 /etc/opt/simplex /var/opt/simplex

useradd -m smp не устанавливает пароль, поэтому никто не входит в систему напрямую как smp. Создайте эти два каталога самостоятельно перед выполнением любых других действий, так как /etc/opt принадлежит пользователю root и имеет права 755, что не позволяет пользователю smp создать собственный каталог конфигурации.

VER=v6.5.0
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/smp-server-ubuntu-24_04-x86-64" -o /tmp/smp-server
sha256sum /tmp/smp-server

Сравните этот хеш с контрольными суммами SHA2-256, опубликованными в примечаниях к релизу для того же тега. Проект также подписывает контрольные суммы релизов ключом SimpleX Chat FB44AF81A45BDE327319797C85107E357D4A17FC, что задокументировано на странице сервера, поэтому вы можете проверить подпись, вместо того чтобы доверять странице, с которой вы скопировали хеш.

sudo install -m 755 -o root -g root /tmp/smp-server /usr/local/bin/smp-server

Установите его намеренно от имени root. Сервис работает под пользователем smp, поэтому в случае компрометации сервиса злоумышленник не сможет перезаписать бинарный файл, из которого он был запущен.

Инициализация сервера и двух секретных ключей, которые он выводит

sudo su smp -c "smp-server init --yes --store-log --daily-stats --no-password --fqdn=smp1.example.com"
  • --store-log (-l) ведет лог очередей в режиме append-only в /var/opt/simplex/smp-server-store.log, что позволяет реле пережить перезапуск. Без этого параметра перезапуск удаляет все очереди, из-за чего перестает работать любой контакт, маршрутизируемый через ваш узел.
  • --daily-stats (-s) записывает счетчики в формате CSV в /var/opt/simplex/smp-server-stats.daily.log.
  • --fqdn добавляет ваш домен в создаваемый сертификат. Если домена нет, используйте --ip.
  • --no-password позволяет любому пользователю создавать очередь на вашем реле. Чтобы ограничить доступ, установите create_password в секции [AUTH] файла /etc/opt/simplex/smp-server.ini после инициализации, вместо передачи --password на этапе запуска. Командная строка видна в истории оболочки и в списке процессов во время выполнения.

Команда init создает сертификат и выводит два значения, которые необходимо сохранить. Первое — это отпечаток (fingerprint), строка в формате base64, которая также записывается в /etc/opt/simplex/fingerprint. Второе — полный адрес сервера, состоящий из отпечатка и вашего имени хоста. Скопируйте оба значения сейчас.

Команда init также создает /etc/opt/simplex/ca.key. Документация рекомендует переместить этот файл в автономное хранилище. Причина важна: клиенты фиксируют (pin) отпечаток этого центра сертификации, поэтому любой, у кого есть ca.key, может выпустить новый сертификат сервера, который клиенты примут как ваш. Файл потребуется только для последующей ротации сертификата сервера с помощью smp-server cert.

Рассматривайте init как разовую операцию. Отпечаток в вашем адресе зависит от созданного центра сертификации, поэтому повторная генерация приведет к смене адреса и сделает нерабочими все ранее распространенные контакты.

Запуск под systemd от имени непривилегированного пользователя

Запишите /etc/systemd/system/smp-server.service в точности так, как указано в документации:

[Unit]
Description=SMP server systemd service

[Service]
User=smp
Group=smp
Type=simple
ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
LimitNOFILE=65535
KillSignal=SIGINT
TimeoutStopSec=infinity

[Install]
WantedBy=multi-user.target

Апстрим-юнит также содержит AmbientCapabilities=CAP_NET_BIND_SERVICE. Эта строка необходима, так как процесс выполняется от имени smp, а порты ниже 1024 закрыты для процессов без прав root, поэтому без этой директивы демон не сможет занять порты 80 или 443. Добавьте её, если вы используете эти порты. LimitNOFILE=65535 важен, так как каждый подписанный клиент удерживает открытое TCP-соединение, а лимит по умолчанию значительно ниже того, что требуется для активного реле. ExecStopPost копирует лог хранилища в файл .bak при каждой остановке, что даёт вам одну точку для отката.

sudo systemctl daemon-reload
sudo systemctl enable --now smp-server
sudo systemctl status smp-server
sudo journalctl -fu smp-server

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

sudo ss -tlnp | grep -E ':(443|5223)'

Обе строки должны указывать на smp-server. Запуск демона от имени собственной учётной записи без прав sudo — это та же практика, что описана в учётные записи для отдельных сервисов на VPS, и именно она предотвращает превращение ошибки в сетевом демоне в получение root-оболочки.

Какие порты открыть, а какой оставить закрытым

В документации указаны три порта: 5223/tcp, 443/tcp и 80/tcp. Порт 5223 используется для транспорта SMP. В поставляемой конфигурации задан параметр port: 5223,443 в секции [TRANSPORT], поэтому тот же протокол отвечает и на порту 443. Это важно, так как многие сети с ограничениями разрешают исходящий трафик только через 443 порт. Порт 80 требуется только для опциональной информационной страницы и перенаправления на HTTPS.

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5223/tcp
sudo ufw enable

Не открывайте порт 5224. Это порт управления, и документация предполагает доступ к нему с самого сервера через nc 127.0.0.1 5224. Он выводит состояние сервера и удаляет очереди, поэтому его следует оставить на loopback-интерфейсе, установив пароли администратора и пользователя в [AUTH]. Если вы новичок в работе с этим инструментом, основы использования ufw на VPS помогут разобраться с порядком правил и избежать блокировки доступа к серверу.

Есть еще один нюанс управления, о котором часто забывают. Большинство провайдеров используют сетевой межсетевой экран в панели управления, который работает независимо от ufw на самом сервере. Порт может быть открыт в ufw, но пакеты будут отброшены еще до того, как достигнут системы.

Адрес сервера для ваших клиентов

smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]

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

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

Добавление реле файлов XFTP

XFTP (SimpleX file transfer protocol) — это файловая часть сети, представляющая собой отдельный демон с собственным адресом. Согласно анонсу XFTP, реле не хранят метаданные файлов: они видят только отдельные фрагменты размером 256kb, 1mb или 4mb, доступ к которым авторизуется анонимными учетными данными. Отправитель может распределять фрагменты одного файла между несколькими реле, поэтому на вашем сервере хранятся части данных, а не целые файлы.

sudo useradd -m xftp
sudo install -d -o xftp -g xftp -m 755 /etc/opt/simplex-xftp /var/opt/simplex-xftp /srv/xftp
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/xftp-server-ubuntu-24_04-x86-64" -o /tmp/xftp-server
sudo install -m 755 -o root -g root /tmp/xftp-server /usr/local/bin/xftp-server
sudo su xftp -c "xftp-server init -l --fqdn=xftp1.example.com -q '20gb' -p /srv/xftp/"

Конфигурация демона находится в /etc/opt/simplex-xftp/, состояние — в /var/opt/simplex-xftp/, а файловые фрагменты — в директории, указанной в -p. Юнит systemd имеет стандартный вид с использованием User=xftp и ExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS. При инициализации выводится адрес xftp:// в том же формате, что и для SMP, с собственным отпечатком (fingerprint) в /etc/opt/simplex-xftp/fingerprint.

Необходимо учесть возможный конфликт портов. Документированный порт для сервера XFTP — 443, этот же порт указан в конфигурации SMP. Два процесса не могут использовать один и тот же порт на одном адресе, поэтому на одном VPS придется изменить настройки. Самое простое решение — установить port: 5223 в секции [TRANSPORT] для SMP, оставив порт 443 для реле файлов. Это приведет к потере возможности использования порта 443 в качестве резервного для клиентов в сетях с ограничениями. Альтернативные варианты — использование второго IP-адреса на том же VPS или развертывание второго VPS.

Указывайте квоту исходя из реальных возможностей. Параметр -q '20gb' — это обязательство по объему дискового пространства, которое вы предоставляете. Реле файлов является компонентом, потребляющим дисковое пространство и пропускную способность сети. Реле сообщений практически не использует эти ресурсы.

Что хранится на диске и что восстанавливает резервная копия

Важны два каталога. /etc/opt/simplex/ определяет идентификацию: smp-server.ini, сертификат сервера и ключ, ca.key, а также fingerprint. /var/opt/simplex/ содержит состояние: в smp-server-store.log находятся очереди и, если restore_messages: on, недоставленные сообщения, а также файл ежедневной статистики.

sudo systemctl stop smp-server
sudo tar czf /root/simplex-backup.tgz -C / etc/opt/simplex var/opt/simplex
sudo chmod 600 /root/simplex-backup.tgz
sudo systemctl start smp-server

Чётко понимайте, что представляет собой этот архив. Это не архив сообщений: элементы в очереди — это зашифрованный текст, предназначенный для ключей, которыми ретранслятор никогда не владел, а поставляемая конфигурация [STORE_LOG] в любом случае удаляет сообщения через 21 день. Это копия идентификационных данных сервера, включая ca.key, поэтому любой, кто получит этот файл, сможет выдать себя за ваш ретранслятор перед вашими контактами. Зашифруйте его и храните вне сервера.

Результат — восстановление. Разместите /etc/opt/simplex на новом VPS, укажите на него то же DNS-имя, и отпечаток останется прежним, поэтому все адреса, которые вы раздали, продолжат работать. Потеря этого каталога означает невозможность восстановления: новая установка означает новый отпечаток, что означает новый адрес, а это значит, что все контакты, маршрутизируемые через ваш ретранслятор, будут потеряны.

TLS: использование двух сертификатов для разных задач

Транспорт SMP не использует публичный центр сертификации. Процесс инициализации создает закрытый центр сертификации и сертификат сервера, а отпечаток этого центра передается внутри адреса сервера. Клиент сверяет представленный сервером сертификат с этим закрепленным отпечатком (pinned fingerprint), что, согласно описанию проекта, защищает соединение между клиентом и сервером от атак типа «человек посередине» (machine-in-the-middle). На этом порту не работает клиент ACME (automatic certificate management environment), поэтому ротация выполняется вручную через запуск smp-server cert с установленным флагом SMP_SERVER_CFG_PATH.

Второй сертификат используется для опциональной информационной страницы. В разделе [WEB] указываются static_path, https: 443, cert: /etc/opt/simplex/web.crt и key: /etc/opt/simplex/web.key. Браузеру неизвестен ваш закрытый центр сертификации, поэтому здесь следует использовать сертификат, подписанный публично доверенным центром. В руководстве по быстрому запуску Docker для этих целей перед сервером устанавливается Caddy, который автоматически выпускает сертификат.

Доступ к релею через Tor

В документации есть раздел о Tor, который устанавливает Tor из репозитория Tor Project и добавляет скрытый сервис в /etc/tor/torrc:

SOCKSPort 0
HiddenServiceNonAnonymousMode 1
HiddenServiceSingleHopMode 1
HiddenServiceDir /var/lib/tor/simplex-smp/
HiddenServicePort 5223 localhost:5223
HiddenServicePort 443 localhost:443

Внимательно изучите две строки режима. Одношаговый (single hop) и неанонимный (non-anonymous) режимы означают, что местоположение самого релея не скрывается. Onion-адрес работает быстро и предоставляет клиентам способ подключения, при котором их IP-адрес не раскрывается, однако сам сервер остается доступным по своему публичному IP-адресу. Onion-имя хоста из /var/lib/tor/simplex-smp/hostname добавляется в конец адреса сервера после запятой. Если вы хотите скрыть и местоположение сервера, потребуется иная конфигурация; в статье запуск полноценного onion-сервиса на VPS описаны связанные с этим компромиссы. Разница в том, что именно скрывает каждый из инструментов, является темой статьи сравнение Tor и VPN, и она напрямую применима в данном случае.

Модель угроз: что меняет self-hosting

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

Что вы не получаете, если говорить прямо:

  • Шифрование остается прежним. Сообщения были защищены сквозным шифрованием до того, как вы развернули этот сервис, и остаются защищенными после. Self-hosting — это решение в области метаданных, а не криптографии.
  • Ваш провайдер VPS видит трафик до вашего IP-адреса и хранит ваши платежные данные. Вы перенесли доверие с оператора обмена сообщениями на хостинг-провайдера. Вы не избавились от него.
  • Ваш релей — это небольшая группа. Если он обслуживает одно домохозяйство, то подключение к нему идентифицирует это домохозяйство, а его имя хоста содержится в каждой ссылке-приглашении, которую вы отправляете. Загруженный публичный релей в этом отношении скрывает вас лучше, и это реальный компромисс.
  • Доступность теперь зависит от вас. Переполненный диск или неисправный сервер означают, что сообщения перестанут доставляться, и у ваших контактов не будет способа обойти вас.

Те же рассуждения применимы к любому частному сервису, который вы размещаете на собственном сервере, будь то этот релей или WireGuard VPN на вашем собственном VPS. Вы выбираете, какая сторона видит метаданные. Вы не заставляете их исчезнуть.

Когда ничего не работает

Сервис запускается и сразу останавливается. Прочитайте sudo journalctl -u smp-server -n 50. Ошибка привязки (bind failure) указывает на порт, который не удалось занять. Затем выполните sudo ss -tlnp | grep :443, чтобы увидеть, какой процесс уже использует этот порт; на свежеустановленной системе это обычно nginx, Caddy или XFTP-сервер, который вы установили час назад.

Init не может записать конфигурацию. Запуск smp-server init от имени пользователя smp до того, как создан /etc/opt/simplex, приводит к ошибке доступа, так как владельцем /etc/opt является root. Сначала создайте каталог с правильным владельцем, затем повторно запустите init.

Клиенты не могут подключиться к реле. Проверьте, что имя разрешается в правильный адрес с помощью dig +short smp1.example.com. Затем протестируйте порт со своего ноутбука, а не с сервера: nc -vz smp1.example.com 5223. Если соединение извне не проходит, в то время как ss показывает, что сокет на сервере открыт, значит, проблема в сетевом файрволе провайдера, который настраивается отдельно от ufw.

Контакт не может подключиться через ваше реле. Отпечаток в адресе, которым вы поделились, должен совпадать с текущим содержимым /etc/opt/simplex/fingerprint. Если вы установили create_password в секции [AUTH], адрес также должен содержать этот пароль, иначе клиенту будет запрещено создавать очередь.

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

FAQ

Делает ли самостоятельный хостинг сервера SimpleX мои сообщения более защищенными?

Нет, и это заложено в архитектуру. SimpleX шифрует сообщения методом end-to-end между устройствами, поэтому ретранслятор никогда не владеет ключами, независимо от того, кто им управляет. Самостоятельный хостинг меняет лишь того, кто наблюдает за метаданными этих сообщений: какие очереди существуют, когда их читают и какие IP-адреса подключаются. Это вопрос управления метаданными. Если ваша цель при переходе на собственный сервер — усиление шифрования, то оно уже было обеспечено ранее.

Что на самом деле может видеть оператор ретранслятора SimpleX?

Это описано в protocol/security.md проекта. Ретранслятор не может читать содержимое или определять типы сообщений, не может незаметно изменять отдельные сообщения и не может взломать end-to-end шифрование с помощью активной атаки. Он может видеть, когда получатель очереди находится в сети, подсчитывать количество сообщений, проходящих через очередь, узнавать IP-адрес получателя, удалять будущие сообщения в очереди или предоставлять ложные сведения о состоянии этой очереди. Этими полномочиями вы будете обладать, как только ретранслятор станет вашим.

Нужны ли мне доменное имя и TLS-сертификат?

Для полноценной настройки вам потребуется домен, хотя smp-server init допускает использование --ip, если у вас его действительно нет. Вам не нужен сертификат от публичного центра сертификации для порта обмена сообщениями: процесс инициализации создает собственный центр сертификации, а клиент фиксирует (pin) отпечаток, который появляется в вашем адресе smp://. Публично доверенный сертификат требуется только для опциональной веб-страницы с информацией, которая настраивается через cert и key в разделе [WEB] файла smp-server.ini.

Что произойдет, если я потеряю /etc/opt/simplex?

Все адреса, которые вы распространили, перестанут работать. В этом каталоге хранится центр сертификации, отпечаток которого встроен в адрес вашего сервера, поэтому пересборка создаст другой отпечаток и, следовательно, другой сервер. Контакты, чьи очереди находятся на этом ретрансляторе, не могут быть восстановлены со стороны клиента. Создавайте зашифрованные резервные копии каталога вне сервера и храните ca.key в офлайне, как указано в документации, поскольку любой, кто завладеет им, сможет выдать себя за ваш ретранслятор.

Могу ли я запустить ретранслятор SMP и ретранслятор файлов XFTP на одном VPS?

Да, но нужно разрешить один конфликт. Документированный порт сервера XFTP — 443, а конфигурация SMP по умолчанию указывает port: 5223,443, поэтому оба сервиса претендуют на один и тот же сокет. Отдайте порт 443 одному из них: установите port: 5223 для сервера SMP или перенесите ретранслятор файлов на второй IP-адрес или другой VPS. Также соизмеряйте квоту хранилища с реальным объемом диска, так как именно ретранслятор файлов является компонентом, потребляющим дисковое пространство и пропускную способность сети.

#simplex#privacy#messaging#self-hosting#vps