В рамках нового релізу збірку 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-18 \
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
Перейменування 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)"