В рамках нового релиза сборка 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.
export OLD_PG_MAJOR=15
export NEW_PG_MAJOR=18
export OLD_BIN_DIR="/usr/lib/postgresql/${OLD_PG_MAJOR}/bin"
export NEW_BIN_DIR="/usr/lib/postgresql/${NEW_PG_MAJOR}/bin"
export OLD_DATA_DIR="/var/lib/postgresql/${OLD_PG_MAJOR}/main"
export NEW_DATA_DIR="/var/lib/postgresql/${NEW_PG_MAJOR}/main"
du -sh "${OLD_DATA_DIR}"
df -h "${OLD_DATA_DIR}"
По умолчанию, чтобы снизить риски, для обновления требуется свободное место приблизительно на уровне текущего PostgreSQL data directory + tablespaces, с запасом под WAL, служебные файлы и временные операции (чаще всего это x2 размера OLD_DATA_DIR).
Однако для баз данных большого размера (или в случае недостаточного свободного места на диске), если риски и восстановление — либо из бекапа, либо благодаря реплике — приемлемы, доступен режим обновления через hard links, который не копирует файлы и, соответственно, не требует дополнительного свободного места. После успешного обновления через hard links старый кластер PostgreSQL 15 становится непригодным для запуска.
Подробнее в следующих шагах.
Установка пакетов
Версия timescaledb в новом кластере должна совпадать с версией в старом на момент обновления:
apt update
apt install postgresql-18 postgresql-client-18
TIMESCALEDB_VERSION=$(dpkg-query -W -f='${Version}' timescaledb-2-postgresql-${OLD_PG_MAJOR})
apt install "timescaledb-2-postgresql-${NEW_PG_MAJOR}=${TIMESCALEDB_VERSION}"
Подготовка кластеров
Проверьте имеющиеся кластеры БД. Если 18/main не создался автоматически, создайте его вручную.
Перед pg_upgrade оба кластера должны быть остановлены:
pg_lsclusters
OLD_LOCALE=$(su postgres -c "psql -tAc 'SHOW lc_collate' postgres" | tr -d ' ')
OLD_ENCODING=$(su postgres -c "psql -tAc 'SHOW server_encoding' postgres" | tr -d ' ')
if ! pg_lsclusters | awk '{print $1 "/" $2}' | grep -qx "${NEW_PG_MAJOR}/main"; then
pg_createcluster "${NEW_PG_MAJOR}" main -- \
--locale="${OLD_LOCALE}" \
--encoding="${OLD_ENCODING}"
fi
systemctl stop postgresql
Проверка pg_upgrade
Чтобы использовать hard links при обновлении, добавьте флаг --link.
su postgres -c "${NEW_BIN_DIR}/pg_upgrade \
--old-bindir=${OLD_BIN_DIR} \
--new-bindir=${NEW_BIN_DIR} \
--old-datadir=${OLD_DATA_DIR} \
--new-datadir=${NEW_DATA_DIR} \
--check"
Если --check завершился с ошибкой, не запускайте pg_upgrade до устранения причины.
Запуск pg_upgrade
Чтобы использовать hard links при обновлении, добавьте флаг --link.
su postgres -c "${NEW_BIN_DIR}/pg_upgrade \
--old-bindir=${OLD_BIN_DIR} \
--new-bindir=${NEW_BIN_DIR} \
--old-datadir=${OLD_DATA_DIR} \
--new-datadir=${NEW_DATA_DIR}"
Обновление конфигурации PostgreSQL 18
pg_upgrade самостоятельно не мигрирует конфигурационные файлы, поэтому необходимо сделать это вручную для:
-
/etc/postgresql/18/main/postgresql.conf -
/etc/postgresql/18/main/pg_hba.conf
timescaledb-tune \
--quiet --yes \
--pg-version=${NEW_PG_MAJOR} \
--conf-path=/etc/postgresql/${NEW_PG_MAJOR}/main/postgresql.conf
Старт PostgreSQL 18 и обновление TimescaleDB
systemctl disable postgresql@${OLD_PG_MAJOR}-main
systemctl enable postgresql@${NEW_PG_MAJOR}-main
systemctl start postgresql@${NEW_PG_MAJOR}-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-postgresql-18 webitel-postgresql-migrations \
webitel-supervisor-workspace-app webitel-web-widget-app \
webitel-flow-diagram-app webitel-agent-workspace-app
Переименование 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"
if [ ! -f "$MIGRATION" ]; then
echo "Migration file not found: $MIGRATION" >&2
exit 1
fi
cleanup() {
su postgres -c "psql ${DB} -qxc \"ALTER DATABASE ${DB} RESET timescaledb.restoring;\"" || true
}
trap cleanup EXIT
su postgres -c "psql ${DB} -qxc \"ALTER DATABASE ${DB} SET timescaledb.restoring='on';\""
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)"