В рамках нового релиза сборка deb-пакетов Webitel перенесена с Bamboo на GitHub Actions. Вместе с этим изменён процесс формирования версий: package revision теперь привязан к GitHub Actions workflow run, а пакеты публикуются в новый закрытый S3 APT-репозиторий с новым GPG-ключом подписи.
Миграция также добавляет поддержку Debian 13 наряду с Debian 12 и переводит сборку части пакетов в мультиархитектурный режим:
-
backend-сервисы теперь собираются для
amd64иarm64; -
frontend-пакеты публикуются как architecture-independent (all);
-
PostgreSQL-расширение и модули FreeSWITCH пока остаются amd64-only.
Для Debian 13 поддерживаемой комбинацией является PostgreSQL 18 и пакет webitel-postgresql-18; для Debian 12 остаётся PostgreSQL 15 и webitel-postgresql-15. Обновление Debian 12 → Debian 13 для инсталляций с Webitel PostgreSQL-расширением необходимо планировать совместно с мажорным обновлением PostgreSQL 15 → 18.
В составе пакетов есть ряд практических изменений: часть frontend-пакетов получила суффикс -app, backend-бинарники и часть systemd-юнитов получили префикс webitel-, systemd-юниты больше не поставляются через webitel-common, а сервисные backend-пакеты теперь содержат maintainer-скрипты.
Алгоритм
Перед обновлением выполните резервное копирование базы данных
Остановка сервисов Webitel
systemctl stop webitel-api webitel-app webitel-uac messages-bot messages-srv \
engine call_center storage flow_manager rabbitmq-server webitel-logger \
webitel-cases webitel-media-exporter consul freeswitch ngcp-rtpengine-daemon \
opensips grafana-server nginx
Удаление устаревшего репозитория Webitel
rm -f /etc/apt/sources.list.d/webitel.list
rm -f /etc/apt/auth.conf.d/webitel.conf
rm -f /usr/share/keyrings/webitel-repo.gpg
Dist-upgrade Debian 12 → 13
Выполняется только при переходе на Debian 13.
Если инсталляция остаётся на Debian 12, пропустите этот шаг.
Временно отключите кастомные APT-репозитории, переключите Debian sources на trixie, выполните обновление и перезагрузите сервер:
find /etc/apt/sources.list.d -type f \( -name '*.list' -o -name '*.sources' \) \
-exec mv {} {}.disabled \;
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
apt update
apt upgrade --without-new-pkgs
apt full-upgrade
reboot
После перезагрузки верните кастомные репозитории и обновите codename там, где репозиторий поддерживает Debian 13:
find /etc/apt/sources.list.d -type f -name '*.disabled' \
-exec sh -c 'for f do mv "$f" "${f%.disabled}"; done' sh {} +
find /etc/apt/sources.list.d -type f \( -name '*.list' -o -name '*.sources' \) \
-exec sed -i 's/bookworm/trixie/g' {} +
apt update
Подключение S3 APT-репозитория Webitel
Необходимо получить актуальные AccessKeyId и SecretAccessKey.
PostgreSQL 15 → 18
Выполняется только после миграции на Debian 13.
Проверьте диск перед установкой/запуском upgrade.
du -sh /var/lib/postgresql/15/main
df -h /var/lib/postgresql/15/main
По умолчанию, чтобы снизить риски, для обновления требуется свободное место приблизительно на уровне текущего PostgreSQL data directory + tablespaces, с запасом под WAL, служебные файлы и временные операции (чаще всего это x2 размера OLD_DATA_DIR).
Однако для баз данных большого размера (или в случае недостаточного свободного места на диске), если риски и восстановление — либо из бекапа, либо благодаря реплике — приемлемы, доступен режим обновления через hard links, который не копирует файлы и, соответственно, не требует дополнительного свободного места. После успешного обновления через hard links старый кластер PostgreSQL 15 становится непригодным для запуска.
Подробнее в следующих шагах.
Установка пакетов
Версия timescaledb в новом кластере должна совпадать с версией в старом на момент обновления:
su postgres -c "psql webitel -tAc 'ALTER EXTENSION timescaledb UPDATE;'"
apt update
apt install timescaledb-2-postgresql-15='2.28.3*' timescaledb-2-loader-postgresql-15='2.28.3*'
su postgres -c "psql webitel -tAc 'ALTER EXTENSION timescaledb UPDATE;'"
apt install postgresql-18 postgresql-client-18 timescaledb-2-postgresql-18='2.28.3*' \
timescaledb-2-loader-postgresql-18='2.28.3*' webitel-postgresql-18 webitel-postgresql-migrations-18
Подготовка кластеров
Проверьте имеющиеся кластеры БД:
pg_lsclusters
Проверка pg_upgradecluster
Чтобы использовать hard links при обновлении, добавьте флаг --method=link:
su postgres -c "pg_upgradecluster --method=link 15 main --check"
su postgres -c "pg_upgradecluster 15 main --check"
Если --check завершился с ошибкой, не запускайте pg_upgradecluster до устранения причины.
Запуск pg_upgradecluster
Чтобы использовать hard links при обновлении, добавьте флаг --method=link:
su postgres -c "pg_upgradecluster --method=link 15 main"
su postgres -c "pg_upgradecluster 15 main"
Обновление конфигурации PostgreSQL 18
pg_upgradecluster самостоятельно не мигрирует конфигурационные файлы, поэтому необходимо сделать это вручную для:
-
/etc/postgresql/18/main/postgresql.conf -
/etc/postgresql/18/main/pg_hba.conf
timescaledb-tune \
--quiet --yes \
--pg-version=18 \
--conf-path=/etc/postgresql/18/main/postgresql.conf
Старт PostgreSQL 18 и обновление TimescaleDB
systemctl disable postgresql@15-main
systemctl enable postgresql@18-main
systemctl start postgresql@18-main
pg_lsclusters
su postgres -c "psql webitel -c 'ALTER EXTENSION timescaledb UPDATE;'"
Обновление статистики PostgreSQL 18
Перед стартом сервисов:
su postgres -c "vacuumdb --all --analyze-in-stages --missing-stats-only --jobs=$(nproc)"
Обновление Webitel-пакетов
apt update
apt upgrade
apt install webitel-supervisor-workspace-app webitel-web-widget-app \
webitel-flow-diagram-app webitel-agent-workspace-app
apt reinstall webitel-admin-app webitel-audit-app webitel-auth-app \
webitel-crm-app webitel-history-app webitel-meetings-app
Если не обновляли PostgreSQL до 18:
apt install webitel-postgresql-15 webitel-postgresql-migrations-15
Переименование systemd unit-файлов и путей к бинарникам
Скрипт сохраняет enabled state старых unit-файлов, делает backup, переименовывает unit-файлы, обновляет ExecStart binary path и добавляет Alias со старым названием:
После проверки сервисов backup unit-файлов можно удалить:
find /etc/systemd/system -type f -name '*.service.pre-26.4.bak' -delete
Миграция схемы БД
Миграция берётся из webitel-postgresql-migrations. PostgreSQL major определяется автоматически. timescaledb.restoring сбрасывается через trap даже при ошибке миграции.
touch /tmp/migrate-webitel-schema.sh
chmod +x /tmp/migrate-webitel-schema.sh
tee /tmp/migrate-webitel-schema.sh <<'EOF'
#!/bin/bash
set -euo pipefail
DB="webitel"
PG_MAJOR=$(su postgres -c "psql -tAc 'SHOW server_version_num'" | awk '{print int($1/10000)}')
MIGRATION="/usr/share/postgresql/${PG_MAJOR}/webitel/migration/26.02-26.4.sql"
chmod -R 755 "/usr/share/postgresql/${PG_MAJOR}/webitel"
if [ ! -f "$MIGRATION" ]; then
echo "Migration file not found: $MIGRATION" >&2
exit 1
fi
cleanup() {
su postgres -c "psql ${DB} -qxc \"SELECT timescaledb_post_restore();\"" || true
}
trap cleanup EXIT
su postgres -c "psql ${DB} -qxc \"SELECT timescaledb_pre_restore();\""
su postgres -c "psql -v ON_ERROR_STOP=1 -1 -f ${MIGRATION} ${DB}"
EOF
/tmp/migrate-webitel-schema.sh
Сведение конфигурации
Проверьте и обновите в соответствии с актуальными файлами конфигурации:
-
OpenSIPs
-
FreeSWITCH
Очистка и перезапуск сервисов
Перезапускайте сервисы группами в порядке зависимостей:
apt --purge autoremove
systemctl restart consul
systemctl restart postgresql
systemctl restart rabbitmq-server
systemctl restart freeswitch ngcp-rtpengine-daemon opensips
systemctl restart webitel-engine webitel-call-center webitel-flow-manager \
webitel-storage webitel-messages-srv webitel-messages-bot webitel-api \
webitel-uac webitel-app webitel-cases webitel-logger webitel-media-exporter \
grafana-server nginx
Удаление старого PostgreSQL 15
Только после обновления PostgreSQL 15 → 18 и после проверки стабильности работы PostgreSQL 18 и Webitel.
pg_dropcluster --stop 15 main
apt --purge remove postgresql-15 postgresql-client-15 \
timescaledb-2-postgresql-15 webitel-postgresql-15
apt --purge autoremove
Обновление статистики PostgreSQL 18
После обновления сервисов (может выполняться параллельно):
su postgres -c "PGOPTIONS='-c vacuum_cost_delay=0' vacuumdb --all --analyze-only --jobs=$(nproc)"