Версии перечислены сверху вниз, от новой к старой. Обновляясь, читайте разделы «Важно при обновлении» у всех версий новее вашей — свою и более старые пропускайте, их шаги вы уже прошли. Перешагнуть версию можно, её ручной шаг — нет: он остаётся обязательным, даже если этой версии у вас не стояло.
Valkey — обязательная часть платформы: при его недоступности ядро больше не ведёт звонки по копии в памяти, а дожидается хранилища. Исходы набора оператора доказываются, а не угадываются. Одна миграция БД (165), её катит сервис migrator сам. Меняется только образ corenode.
1. Обновлять целиком и в тихое время: Core, CU и Asterisk останавливаются и поднимаются вместе, идущие звонки обрываются. Совместной работы со звонками 0.75.0 нет. 2. Дождаться нуля активных звонков, затем ./omniflow-ctl upgrade 0.76.0 → ./omniflow-ctl doctor (шаг «Valkey» обязан быть зелёным) → ./omniflow-ctl up. 3. Стратегии обновлять не обязательно — они работают как раньше. Защита исходов набора со стороны стратегии (ответивший оператор не выдаётся как недозвон, быстрый исход отбоя) появится с их новыми версиями на SDK 0.25.6+. 4. Переменная CHAIN_MAX_CHECKPOINT_BACKLOG больше не читается — если задана в .env, её можно удалить, старту она не мешает.
/ready не готов, в здоровье видна аномалия VALKEY-DOWN, старт записи отказывает с причиной storage_unavailable. Звонящий, ожидавший в очереди во время сбоя, подхватывается после возврата хранилища.evt.dial.group.finished — итог группового обзвона целиком, с учётом переадресаций.omniflow_core_outbox_undeliverable_total: событие, которое шина не может принять (нет потока под subject), больше не копится вечно, а отбрасывается с ошибкой в логе.Новых версий нет; работают стратегии 0.75.0.
Журнал администратора тенанта, напоминания — отдельной стратегией, назначение id SIP-точек ядром, устойчивость шины к RELOAD без auth callout. Включает исправление 0.74.1 (сама 0.74.1 в реестр не выпущена). Три миграции БД (159-core-journal, 163, 164), их катит сервис migrator сам.
ctl upgrade): ядро и все sbc-agent вместе с миграциями. id SIP-точек теперь назначает ядро и раскладывает по контурам; агент прежней версии этого не умеет — ядро повторяет назначение, ничего не записав, пока агенты не обновлены. Существующие id сохраняются, привязки операторов не меняются.bootstrap completed { count: N } с N > 0 для SIP-точек: стратегия, поднявшаяся одновременно с ядром, может получить пустой список и отвечать на входящие без соединения.strategy-vq — они переехали в отдельную стратегию strategy-reminder-dialer 0.1.0, а strategy-vq 0.6.0 их больше не делает. Ключи env VQ_REMINDER_*, VQ_SPOKEN_NUMBERS_*, VQ_QUEUE_CODE vq больше не читает — значения перенести вручную в REMINDER_* новой стратегии (таблица переименований — в её CHANGELOG). Стратегии обновляются своими тегами (ctl strategies upgrade), не вместе с платформой.docker-compose.override.yml в папке юнита теперь подключается во всех командах ctl (up/restart/down/ps/logs/upgrade/doctor). Раньше ctl его не видел. Если в установке лежит override, который не должен применяться, — убрать его до обновления.strategy-reminder-dialer. Абонент, оставшийся на линии после напоминания, передаётся в очередь strategy-vq (acceptCall); vq не приняла — обращение уходит на перезвон, абонент слышит «перезвоним позже».* — по расписанию очереди**: выходные, праздники и перерыв отсекаются сами. Сценарии TTS берут шаблоны сообщений тенанта по коду или маске.cmd.admin.tenant.deactivate отвечает вызывающему таймаутом (30 с), хотя деактивация проходит; в логе ядра при этом 7 строк consume loop crashed … CONNECTION_DRAINING — шум, не сбой.strategy-vq 0.6.0, strategy-reminder-dialer 0.1.0, strategy-mibs-main 0.2.12, strategy-transcribe-batch 0.1.1; панель оператора — 0.7.6.
⚠ В реестр не выпущена — номер пропущен, исправление вошло в 0.75.0.
Исправление поверх 0.74.0. Миграций нет, руками ничего делать не нужно — меняется только образ corenode; обновление при живых звонках допустимо (пересоздаётся только core-node).
Надёжная обработка звонка в ядре и починенный перевод звонков. Четыре миграции БД (159–162), их катит сервис migrator сам. Обновлять только целиком и в тихое время: Core, CU и Asterisk останавливаются и поднимаются вместе, идущие звонки обрываются. Совместной работы старого и нового поколения нет.
CHAIN_EXECUTION_WINDOW; откат на прежний режим — CHAIN_EXECUTION_WINDOW=1 и CHAIN_GROUPING=tenant в .env).1. Дождаться нуля активных звонков. 2. ./omniflow-ctl upgrade 0.74.0 → ./omniflow-ctl doctor → ./omniflow-ctl up. Миграции 159–162 прокатятся до старта Core. 3. Только после поднятия Core — стратегии: им нужна платформа 0.74.0 (ai-reception 0.0.7, chat-queue 0.1.2, dial-by-code 0.5.2, mibs-main 0.2.10, pay-select 0.2.5, reminder-dialer 0.0.6, simple-main 0.4.2, tcardio-main 0.1.4, vq 0.5.1) — ./omniflow-ctl strategies upgrade. 4. Откат ниже 0.74.0 не поддерживается: миграции 160–161 переводят времена обращений на миллисекунды, прежний Core снова пишет их с большей точностью.
Исправление поверх 0.73.0. Миграций нет, руками ничего делать не нужно — меняется только образ corenode.
Транскрибация записей по расписанию, проверки и JSON-значения env стратегий, IP-транки разных тенантов на одном адресе провайдера, починка фризов шины под нагрузкой подключений. Одна миграция БД (158-core-sbc-desired-trunks-ip-port) — меняет уникальный индекс транков, существующие данные ей не мешают; катится сервисом migrator сама. Меняется образ Kamailio — ./omniflow-ctl upgrade пересоздаст SBC-юниты, это короткий перерыв регистраций и звонков: обновлять при нуле активных звонков.
Версии 0.72.1 в реестре нет: её исправление (скачивание файлов с русскими буквами в имени) входит сюда.
openai-audio для транскрибации — собственный ASR-сервер или любой OpenAI-совместимый. Стратегия strategy-transcribe-batch разбирает ещё не распознанные записи в часы, заданные расписанием площадки, с фильтрами по направлению, очередям, маршрутам и длительности. Стратегия ставится отдельно, своим тегом (./omniflow-ctl strategies upgrade). У провайдера транскрибации появилась кнопка «Проверить»: один пробный запрос показывает, на каком шаге отказ — адрес, соединение, ключ или распознавание. В карточке транскрипта — плеер записи.TRUNK_PORT_PEERS в unit.env SBC-юнита принимает и форму IP:порт_провайдера=наш_порт; прежняя IP=наш_порт работает как раньше..env нет.Синтез речи на своих серверах (Piper и vosk) и прогрев TTS-кэша без звонка, справочник сценариев, глобальная коммуникационная панель, NAT-пинг SIP-телефонов. Две миграции БД (153-core-users-panel-flags, 155-core-tts-cache-sample-rate) — только добавляют колонки, катятся сервисом migrator сами, руками ничего делать не нужно.
piper и vosk: синтез на собственном сервисе вместо облачного. Адрес и токен сервиса задаются в .env установки (PIPER_TTS_URL/PIPER_TTS_TOKEN, VOSK_TTS_URL/VOSK_TTS_TOKEN), а не в профиле провайдера — профиль правит администратор тенанта, адрес сервиса — нет. Не задано — провайдеры этих типов недоступны, остальное работает как раньше. Разметка say-as (даты, время, порядковые числа) читается словами.TTS_WARM_QUEUE_MAX (по умолчанию 500).Патч линии 0.71: перевод звонка больше не обрывает разговор. Миграций БД нет. При обновлении с 0.71.2 и раньше вместе с этой версией приходит миграция 0.71.3 (153-core-trunk-caller-numbers) — её катит сервис migrator сам.
Патч линии 0.71: номер звонящего провайдеру по белому списку транка, дополнительные транковые порты SIP-контура, исправления звонков, чатов MAX и Авито. Одна миграция БД (153-core-trunk-caller-numbers) — катится сервисом migrator сама, руками ничего делать не нужно. Изменения версий 0.66–0.71.2 в этом файле пока не описаны.
modFrom) или командой набора до провайдера не доходила. Теперь в карточке транка задаётся список разрешённых номеров: если номер звонка в нём есть — он уходит в From, иначе остаётся прежний From транка. Домен и учётка digest не меняются. Список пуст — поведение прежнее.unit.env SIP-контура TRUNK_PORTS_ALT=15080,25080 (порты пробрасываются наружу), а TRUNK_PORT_PEERS=<IP>=<порт> — с какого из них слать исходящие этому провайдеру (иначе он молча игнорирует запросы с 5080). Не задано — всё как раньше, только 5080.?start= привязывает контакт, как в Telegram. Авито: контакт получает имя собеседника и данные объявления (ссылка, название, город).Замена платформенного объектного хранилища: вместо MinIO (лицензия AGPL-3.0, разработка community-редакции остановлена в феврале 2026) в поставку входит SeaweedFS 4.47 (Apache-2.0) под нейтральным именем сервиса s3store. Код платформы работал с хранилищем по протоколу S3 и не менялся — меняются compose, .env и то, где лежат данные. Схема БД и API не менялись, миграций нет.
ctl:0.65.5 переиздан 21.09.2026. Номер версии и тег прежние, содержимое новое — исправлена раскладка прав каталога установки (см. ниже). Если вы тянули omniflow/ctl:0.65.5 до этой даты, повторите docker pull; команда из INSTALL.md идёт с --pull always и сделает это сама. Тогда же, 21.09.2026, опубликованы образы, которых в 0.65.5 не хватало: rtpengine и девять strategy-*. Без них docker compose up -d с профилем strategies вставал на manifest unknown, а медиа-прокси было нечем поднять. Остальные образы платформы (corenode, asterisk, kamailio, ui, rtpe-agent) не менялись — обновлять инсталляцию целиком не нужно.sudo mkdir без chown, и осознанная схема «владелец root, группа docker, бит setgid» — всё созданное оставалось root'а, а .env записывался режимом 0600. Члену группы docker это давало open /app/omniflow/.env: permission denied на первой же команде docker compose, причём установка до того завершалась без единой жалобы. Теперь различаются три случая: каталог принадлежит человеку — владелец и группа достаются ему; каталог root со своей группой — передаётся группа, а права файлов зеркалят права самого каталога (2775 — группе чтение и запись, .env 0660; 2755 — только чтение, .env 0640); root:root — не меняется ничего, это выбор «вся работа под sudo». Посторонним (other) файл не открывается ни в одном случае, а doctor перестал требовать chmod 600 .env на исправной групповой инсталляции.doctor проверяет образы до скачивания. Сверку «все ли образы придут из нашего реестра» раньше приходилось делать руками — отдельным шагом инструкции (docker compose config --images | grep -v …), а omniflow-ctl verify отвечал на тот же вопрос уже после запуска стека. Теперь шаг «образы из реестра» есть и в omniflow-ctl doctor, причём он смотрит объявленное в compose — то есть то, что будет скачано при следующем docker compose pull, — и называет поимённо каждый образ, который уехал бы на Docker Hub (оттуда из России загрузка нестабильна, и up -d останавливается, не создав ни одного контейнера). Ручную команду из инструкции убрали.s3store вместо minio и minio-init. Хранилище живёт в собственной docker-сети omniflow-s3store (подсеть 172.30.0.0/24), к ней подключены только узлы платформы; фиксированного IP и web-консоли у него нет. Данные — в apps/s3store/data.recordings, strategy-files, entity-files, tts-cache). Отдельного init-контейнера больше нет; в docker compose ps одноразовыми остаются только migrator и shared-tls.S3_ACCESS_KEY и S3_SECRET_KEY. Переменные MINIO_ROOT_USER, MINIO_ROOT_PASSWORD, IMAGE_MINIO, IMAGE_MC не читаются. Значения ключей — только символы A–Z a–z 0–9 _ . -: с другими символами контейнер s3store откажется стартовать и назовёт виновную переменную (ключи, сгенерированные установщиком, этому правилу удовлетворяют).x86-64-v2 желателен, но платформу больше не держит. Готовые бинарники обработки изображений внутри образа corenode требуют этого уровня инструкций (SSE4.2, POPCNT и соседи). Любой серверный процессор с 2009 года их имеет, но гипервизоры по умолчанию отдают гостю урезанную модель (kvm64, qemu64, Common KVM processor), где флаги замаскированы.Раньше это валило узел ядра целиком: установка проходила, контейнеры поднимались, а платформа молча крутилась в перезапусках. Теперь библиотека грузится только в момент, когда действительно нужна, и её отказ остаётся локальным: платформа работает, у вложений в чате просто не будет миниатюр (в логе — warning, у сообщения показывается иконка файла вместо картинки). Телефония, запись, маршрутизация не затронуты.
Если чат с вложениями нужен, проверьте процессор — вывод должен быть непустым:
lscpu | grep -o -E 'sse4_2|popcnt' | sort -u
Пусто — смените модель CPU виртуальной машины на host. ⚠ Нужен полный останов и старт машины, а не reboot: на работающей модель процессора не меняется.
recording.mix_failed, в логах узла RECORDING DEAD-LETTER), при этом контейнер s3store остаётся healthy — его проверка здоровья отвечает за живость, не за свободное место. Смотрите df -h тома apps/s3store/data.Автоматического переноса нет: платформа поставлена в считанных инсталляциях, и перенос делается вручную на остановленной платформе.
1. Остановить узлы платформы (docker compose stop core-node и остальные узлы corenode). 2. В .env: S3_ENDPOINT=http://s3store:9000; S3_ACCESS_KEY/S3_SECRET_KEY — литералы (если раньше ссылались на ${MINIO_ROOT_USER} — подставить значения; при символах вне алфавита — задать новый секрет); удалить MINIO_ROOT_USER, MINIO_ROOT_PASSWORD, IMAGE_MINIO, IMAGE_MC; добавить IMAGE_S3STORE=<реестр>/omniflow/seaweedfs:4.47. 3. Обновить docker-compose.yml до версии 0.65.5, создать apps/s3store/data и положить рядом apps/s3store/entrypoint.sh из поставки (установщик кладёт его сам). 4. docker compose up -d s3store, дождаться healthy. 5. Перенести данные любым S3-клиентом (например rclone copy) из старого хранилища (http://minio:9000, прежние ключи) в новое (http://s3store:9000) — четыре бакета, ключи объектов не меняются. Сверить количество и размеры объектов. 6. Поднять узлы платформы новым образом; в логах узла — четыре строки s3store: bucket ready. 7. Снять прежние контейнеры по именам: docker rm -f omniflow-minio omniflow-minio-init (не --remove-orphans — он снесёт и другие контейнеры, поднятые вне текущего набора compose-файлов). Каталог apps/minio/data оставить холодным бэкапом и удалить, когда убедитесь, что записи открываются.
Зеркала образов minio и mc из реестра registry.omniflow.ru удалены 18.09.2026. На уже поставленные инсталляции это не влияет — образ у них скачан локально. Но установка версии 0.64–0.65.4 с нуля на новом сервере теперь пройдёт только если IMAGE_MINIO и IMAGE_MC в .env не заданы (тогда образы тянутся с Docker Hub); если они указывают на registry.omniflow.ru — установка встанет на скачивании. Ставьте 0.65.5.
Патч к 0.65.3: гибче адресация входящих правил маршрутизации к контурам SIP-фронта, факт «маршрут не найден» виден в журнале звонка на всех путях, сборка поставки ускорена в разы (для администратора это означает быстрее выходящие патчи).
ingressSbcUnitId) принимает не только точный идентификатор, но и * (любой контур), префикс sbc-msk-* (все контуры с таким префиксом) и список через запятую. Существующие правила с точным идентификатором работают как раньше.route.no_match теперь пишется на всех пяти путях резолва (входящий, исходящий, набор абонента, слепой перевод, платформенный хвост connect), а не только на части из них; по нему же считается метрика route_no_match_total.unit retire) — блокер по входящим правилам считает только правила, называющие контур точным идентификатором (в том числе внутри списка sbc-1,sbc-2). Правила с * или префиксом sbc-msk-* узел не удерживают — иначе одно правило «на все контуры» навсегда запретило бы снять любой SIP-фронт.SPEECHGATE_WS_HOST больше не нужна и не читается. Направление WS-медиа речевого шлюза развёрнуто: раньше медиа-движок сам подключался к шлюзу по адресу из этой переменной, теперь шлюз подключается к медиа-движку, и адрес ему сообщается вместе с каналом. Переменная убрана из docker-compose.yml — если вы задавали её в .env, строка стала безвредной, удалить можно при случае. Шаблон apps/asterisk/conf/websocket_client.conf на диске при обновлении не заменяется (он класса «конфиг»), поэтому в нём может остаться прежняя секция — она не используется. Напоминание: самого речевого шлюза в поставке нет, озвучка и распознавание в стандартной установке не работают.138 — добавляет проверку синтаксиса поля контура у входящих правил. Накатывается сервисом migrator автоматически при docker compose up -d; вручную ничего делать не нужно. Как и все миграции — forward-only: откат версии образа схему не откатывает. Правила с ранее заведёнными точными идентификаторами проверку проходят.INSTALL.md.Патч к 0.65.2: платформа на чистой установке поднимается без ручных обходов, а звонок со сценарием больше не уходит в тишину.
asterisk не передавался адрес шлюза синтеза и распознавания речи, и он пытался достучаться до узла со старым именем. Теперь адрес резолвится сам, указывать в .env ничего не нужно.⚠ *Уточнение от 17.09.2026: сам речевой шлюз в поставку не входит — его образа в реестре нет. Этот пункт снимал препятствие на стороне медиа-движка, но озвучки и распознавания в стандартной установке нет ни до, ни после него. В 0.65.4 механизм подключения изменён целиком (см. ниже), и эта настройка больше не применяется.*
ANSWERED, в карточке — «подсказка проиграна». Теперь права выставляются так, что файл читается.mkdirat /etc/kamailio/tls: read-only file system..env набор компонентов без профиля split, а всё ядро платформы живёт именно под ним — стек стартовал без единого узла ядра. Обходом было дописать split в COMPOSE_PROFILES руками.INSTALL.md.split в COMPOSE_PROFILES руками — строку можно оставить как есть, она не мешает.Первая версия, которая ставится на чистую машину до конца. Сменилась топология по умолчанию.
corenode-1 из поставки убран — он никогда не был производственной конфигурацией, а в разделённой раскладке поднимался лишним рядом с рабочими узлами. Побочный эффект прежнего дефолта: SBC-контур не объявлял себя, и всё, что через него работает, отвечало пусто — список SIP-точек приходил пустым при заведённых точках.ui не стартовал: Docker создавал на месте отсутствующих файлов каталоги, и nginx падал с exec: "/entrypoint.sh": is a directory.nginx в реестре и ключ IMAGE_NGINX в .env.example — публичный фронт перестал тянуться с Docker Hub.INSTALL.md есть подраздел «Обновление с версии до SBCSYNC» с разовым bootstrap по шине.IMAGE_* в .env со списком зеркал на витрине: в 0.65.0 добавился IMAGE_NGINX, без него docker compose pull уйдёт на Docker Hub.Промежуточная публикация: три блокирующих дефекта, из-за которых стек не поднимается без ручных обходов. Перечислены ниже — все закрыты в 0.65.2.
ui не стартует — в поставке нет файлов публичного прокси;Растекание конфигурации SBC по контурам (SBCSYNC) и реестр узлов (UNITREG): транки и SIP-точки заводятся один раз в ядре и сами доезжают до всех SIP-контуров.
IMAGE_NGINX — публичный фронт стал отдельным сторонним образом.INSTALL.md.Первая поставка, опубликованная в реестр в нынешнем виде: одна версия в реестре, стек наблюдаемости выведен из поставки отдельным проектом.
Версия остаётся в списке, потому что часть инсталляций обновляется именно с неё, а путь 0.63.1 → 0.65.x проходит через заметки выше.