Полный перенос XMPP-сервера с Debian 12 на Debian 12
с сохранением пользователей, настроек, кастомных модулей и сертификатов
При миграции 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/. Если их потерять — звонки снова начнут отваливаться по таймауту.
Останавливаем 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.
Используйте 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
Ключевой момент: на 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
Чтобы после каждого продления 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/. Сервер продолжит работать без ручного вмешательства.
После перезапуска убедитесь, что всё функционирует корректно:
journalctl -u prosody -n 30 --no-pagerprosodyctl check configSASL2 и Bind 2Для наблюдения за подключением в реальном времени:
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 passwd user@jimm.top
Команда запросит новый пароль дважды.
Требуется модуль mod_email_pass. Пользователь получает ссылку на почту. Уточните, включена ли эта опция на вашем сервере.