SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-26

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

Пошаговая настройка SMP ретранслятора на Linux. Инструкция охватывает установку бинарных файлов, запуск от непривилегированного пользователя, настройку TLS, портов и резервных копий.

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

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

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

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

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

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

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

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

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

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

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

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

Что необходимо перед началом работы

  • 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) записывает лог очередей в /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 в командной строке, так как она видна в истории оболочки и в списке процессов во время выполнения.

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

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

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

Запуск под 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, с собственным отпечатком в /etc/opt/simplex-xftp/fingerprint.

Необходимо учесть возможный конфликт портов. Документированный порт для сервера XFTP — 443, и в конфигурации SMP также указан 443. Два процесса не могут использовать один и тот же порт на одном адресе, поэтому на одном 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 не использует публичный центр сертификации. Процесс инициализации создает закрытый центр сертификации и серверный сертификат, а отпечаток этого центра передается внутри адреса сервера. Клиент проверяет предоставленные сервером данные на соответствие этому закрепленному отпечатку, что, согласно описанию проекта, защищает соединение между клиентом и сервером от атак типа «человек посередине». На этом порту не работает клиент 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-адреса и хранит ваши платежные данные. Вы перенесли доверие с оператора обмена сообщениями на хостинг-провайдера. Вы не избавились от него.
  • Ваш релей — это небольшая группа. Если он обслуживает одно домохозяйство, то подключение к нему идентифицирует это домохозяйство, а его имя хоста содержится в каждой ссылке-приглашении, которую вы отправляете. Загруженный публичный релей в этом отношении скрывает вас лучше, и это реальный компромисс. Частный поисковый сервер имеет ту же специфику, поэтому что на самом деле скрывает SearXNG на вашем VPS сводится к тому, сколько людей пользуются этим экземпляром вместе с вами.
  • Доступность теперь зависит от вас. Переполненный диск или неисправный сервер означают, что доставка сообщений прекратится, и у ваших контактов не будет возможности обойти вас.

Та же логика применима к любому частному сервису, который вы размещаете на собственном сервере, будь то этот релей или 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 между устройствами, поэтому ретранслятор (relay) не имеет ключей доступа, независимо от того, кто им управляет. Самостоятельный хостинг меняет лишь то, кто наблюдает за метаданными этих сообщений: какие очереди существуют, когда они считываются и какие IP-адреса подключаются. Это вопрос управления метаданными. Если ваша цель при переходе на собственный сервер — усиление шифрования, то оно уже было обеспечено ранее.

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

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

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

Для полноценной настройки домен необходим, но smp-server init допускает использование --ip, если у вас его действительно нет. Вам не нужен сертификат от публичного центра сертификации для порта обмена сообщениями: процесс инициализации генерирует собственный центр сертификации, а клиент фиксирует (pins) отпечаток, который отображается в вашем адресе 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