🔄 Миграция сервера Prosody 13

Полный перенос XMPP-сервера с Debian 12 на Debian 12
с сохранением пользователей, настроек, кастомных модулей и сертификатов

Prosody 13.0.1 Debian 12 SASL2 / Bind 2 Let's Encrypt

📌 Что переносим и почему

При миграции XMPP-сервера недостаточно скопировать только конфиг. Нужно забрать три ключевые директории — иначе потеряются пользователи, история переписки или кастомные модули, установленные через prosodyctl install.

Папка Что хранит Владелец после распаковки
/etc/prosody/ Конфигурация, скопированные сертификаты prosody:prosody
/etc/letsencrypt/ Живые сертификаты, ключи, настройки renewal root:root
/var/lib/prosody/ Аккаунты, ростеры, MAM, PubSub, кастомные модули prosody:prosody
ℹ️ Про кастомные модули

Модули mod_sasl2 и mod_sasl2_bind2, установленные через prosodyctl install, лежат в /var/lib/prosody/custom_plugins/. Они не входят в стандартный пакет Prosody и переносятся только вместе с папкой /var/lib/prosody/. Если их потерять — звонки снова начнут отваливаться по таймауту.

1 На старом сервере — создаём полный архив

Останавливаем Prosody, чтобы гарантировать целостность данных, и архивируем три папки.

# Остановить сервер
systemctl stop prosody

# Создать архив со всеми необходимыми данными
tar -czf /tmp/prosody-full-backup.tar.gz \
    /etc/prosody \
    /etc/letsencrypt \
    /var/lib/prosody

# Запустить Prosody обратно
systemctl start prosody

# Проверить размер архива
ls -lh /tmp/prosody-full-backup.tar.gz
⚠️ Не копируйте файлы по одному

Копирование «живых» файлов через WinSCP или scp без архива может привести к потере прав, симлинков и повреждению данных. Всегда используйте tar.

2 Копируем архив на новый сервер

Используйте scp, rsync или WinSCP. Просто переместите файл /tmp/prosody-full-backup.tar.gz на новый сервер.

# Пример через scp (выполняется с локальной машины)
scp user@старый_сервер:/tmp/prosody-full-backup.tar.gz /tmp/
scp /tmp/prosody-full-backup.tar.gz user@новый_сервер:/tmp/

Убедитесь, что архив скопирован без повреждений — сравните размер и, при желании, контрольную сумму:

# На старом сервере
sha256sum /tmp/prosody-full-backup.tar.gz

# На новом сервере
sha256sum /tmp/prosody-full-backup.tar.gz

3 На новом сервере — установка и восстановление

Ключевой момент: на Debian 12 в основных репозиториях лежит Prosody 0.12, а нам нужна 13.x для поддержки SASL2 и Bind 2. Поэтому ставим из bookworm-backports.

# 1. Подключить бэкпорты Debian 12
echo "deb http://deb.debian.org/debian bookworm-backports main" \
    > /etc/apt/sources.list.d/backports.list

# 2. Обновить списки пакетов
apt update

# 3. Установить Prosody 13 из бэкпортов + зависимости
apt install -t bookworm-backports prosody lua-unbound certbot

# 4. Остановить Prosody перед распаковкой
systemctl stop prosody

# 5. Распаковать архив в корень (поверх установленного)
tar -xzf /tmp/prosody-full-backup.tar.gz -C /

# 6. Назначить правильных владельцев
chown -R prosody:prosody /etc/prosody /var/lib/prosody
chown -R root:root /etc/letsencrypt

# 7. Проверить, что кастомные модули на месте
ls -la /var/lib/prosody/custom_plugins/ | grep sasl

# 8. Проверить конфиг
prosodyctl check config

# 9. Запустить Prosody
systemctl start prosody

# 10. Проверить статус
systemctl status prosody
🚫 Частая ошибка

Если после шага 7 команда ls не показывает mod_sasl2 и mod_sasl2_bind2 — архив распаковался не полностью, либо вы копировали папки выборочно. Проверьте содержимое /var/lib/prosody/custom_plugins/. Если модулей нет — установите их заново:

prosodyctl install --server=https://modules.prosody.im/rocks/ mod_sasl2
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_sasl2_bind2

4 Настраиваем автоматическое обновление сертификатов

Чтобы после каждого продления Let's Encrypt сертификаты автоматически импортировались в Prosody, создадим хук в renewal-hooks/deploy/.

# Создать файл хука
nano /etc/letsencrypt/renewal-hooks/deploy/prosody.sh

Вставить содержимое:

#!/bin/sh
/usr/bin/prosodyctl --root cert import /etc/letsencrypt/live
# Сделать скрипт исполняемым
chmod +x /etc/letsencrypt/renewal-hooks/deploy/prosody.sh

# Протестировать обновление (сухая проверка)
certbot renew --dry-run
✅ Что это даёт

Теперь каждые 60–90 дней certbot будет продлевать сертификаты, а хук автоматически скопирует их в /etc/prosody/certs/. Сервер продолжит работать без ручного вмешательства.

5 Финальная проверка

После перезапуска убедитесь, что всё функционирует корректно:

Для наблюдения за подключением в реальном времени:

tail -f /var/log/prosody/prosody.log

При подключении Conversations к вашему домену в логе должны появиться строки вида:

c2s...: Authenticated with SASL2
c2s...: Bind 2 resource bound

Если они есть — миграция прошла успешно, и мгновенное подключение при пробуждении от FCM работает.

📋 Шпаргалка: структура бекапа

Папка в архиве Что хранит Владелец
/etc/prosody/ Конфиг, скопированные сертификаты prosody:prosody
/etc/letsencrypt/ Живые сертификаты, renewal root:root
/var/lib/prosody/ Аккаунты, MAM, PubSub, кастомные модули prosody:prosody

⚠️ Частые ошибки и их решение

Симптом Причина Решение
«certificate file not found» Забыли импортировать сертификаты или хук не сработал prosodyctl --root cert import /etc/letsencrypt/live, затем перезапустить Prosody
Пользователи не могут войти Сбились права на /var/lib/prosody chown -R prosody:prosody /var/lib/prosody
Certbot не обновляет сертификаты Домены не прописаны в renewal или порт 80/443 недоступен Проверить /etc/letsencrypt/renewal/, запустить certbot renew --dry-run
Prosody не стартует Синтаксическая ошибка в конфиге prosodyctl check config покажет строку ошибки
Звонки снова отваливаются по таймауту Потеряны модули mod_sasl2 / mod_sasl2_bind2 Проверить /var/lib/prosody/custom_plugins/, при необходимости установить заново
В логах ошибка muc_mam should be loaded only on MUC component muc_mam включён в глобальной секции Убрать muc_mam из глобальных модулей, оставить только внутри Component "...muc"
В логах ошибка ambiguous period '0' archive_expires_after = "0" Заменить на "1 day" или удалить параметр

🔑 Как сменить пароль пользователю

После миграции старые пароли остаются прежними — они хранятся в /var/lib/prosody.

Администратор (через prosodyctl)

prosodyctl passwd user@jimm.top

Команда запросит новый пароль дважды.

Самостоятельный сброс

Требуется модуль mod_email_pass. Пользователь получает ссылку на почту. Уточните, включена ли эта опция на вашем сервере.