Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора. Обновление затрагивает только шлюз: почтовый контейнер не перезапускается, а прежний образ заранее сохраняется для отката.
ОпубликовалИзображения созданы с помощью GPT Image 2
Ответ на исследование
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
Для автоматического обновления сервиса на двух удалённых VPS предлагается связка: таймер systemd на хосте, установка образа по неизменяемому digest, сохранение состояния операции и локальный откат. Отдельный контейнер-обновлятор не нужен.
Схема условно реализуема, но у неё есть принципиальные ограничения. Проверка нового digest через публичную сеть не может гарантированно укладываться в доли секунды. А пересоздание единственного экземпляра шлюза не гарантирует ни нулевого простоя, ни завершения уже идущих запросов.
Важно: описанное ниже — проект требований и план реализации. Файлы не записывались, тесты не запускались, две VPS не проверялись и не изменялись. Автоматический откат — цель для штатных отказов обновления при работающих хосте и Docker, а не гарантия восстановления после отключения питания, неисправности Docker или неработоспособности самого прежнего образа.
v3.12 и публикует latest, 3.12, v3.12 и короткий SHA коммита. Автоматического тега-серии v3.x в workflow нет. В нём перечислены четыре архитектуры, но одно лишь наличие конфигурации не подтверждает успешную сборку конкретного релиза (.github/workflows/build_docker.yml:19).docker-compose.yml:1).Dockerfile:13, main.go:21). Значит, на удалённой машине нужны и образ, и конфигурационные файлы.internal/api/models.go:23, internal/api/chat.go:2078). Нельзя подменять эту проверку правилами другой реализации обработчика.main.go:233).За рамками этой задачи остаются изменение почты, синхронизация состояния работающих аккаунтов, обновление зависимостей, получение исходников на VPS и изменение локальной сборки для разработки. Нельзя также обещать строго одновременное переключение двух машин. Для переключения без потери запросов понадобились бы как минимум два экземпляра, переключение входящего трафика и отдельное управление соединениями.
Планируемый скрипт — scripts/auto-update.sh; сейчас его нет. Предполагаются Bash, Docker Engine, Compose plugin, curl, jq, flock и Skopeo для чтения манифеста образа. Дистрибутивы Linux и версии инструментов на обеих машинах нужно проверить до реализации.
Скрипт запускается с хоста от защищённой учётной записи и обращается к локальному Docker напрямую. Docker socket и учётные данные реестра не передаются контейнерам. Однако пользователь с доступом к Docker фактически обладает значительными полномочиями на хосте: отсутствие socket внутри контейнера не отменяет этот риск.
Тег, например latest, нужен, чтобы обнаружить возможный новый релиз. Запускать сервис следует по адресу образа с digest, а не по изменяемому тегу: Compose поддерживает указание образа в формате с digest 1.
В состоянии обновлятора нужно раздельно хранить:
Эти значения нельзя сравнивать как однотипные. Кроме того, перед обновлением требуется сохранить прежний реально работающий образ под отдельным локальным тегом и убедиться, что прежний сервис исправен. Тогда откат не будет зависеть от доступности сети или реестра.
Состояние должно содержать принятый текущий образ, предыдущий рабочий образ, сведения о незавершённой транзакции и список digest, обновление на которые уже завершилось неудачей. Запись транзакции включает старую и новую ссылки, локальные ID образов, ID старого контейнера, отпечаток конфигурации и текущий этап операции. Данные нужно строго разбирать, не исполнять как команды, а записывать во временный файл с последующей атомарной заменой. Для устойчивости к внезапному отключению питания одного переименования файла недостаточно: важные записи нужно сбрасывать на диск.
--no-deps, --no-build и --pull never предназначены для того, чтобы не запускать зависимости, не собирать образ и не выполнять дополнительную загрузку в ходе переключения Команда переключения в качестве основы может выглядеть так:
APP_IMAGE="$NEW_REF" timeout --kill-after=5s 60s \
docker compose --project-name "$PROJECT" \
--project-directory "$DEPLOY_DIR" -f "$COMPOSE_FILE" \
up -d --no-deps --no-build --pull never app </dev/null
Ветка отката использует тот же вызов, но вместо $NEW_REF подставляет заранее сохранённый локальный тег старого образа. Это пример ключевой операции, а не готовый скрипт: до внедрения нужны проверка входных параметров, управление транзакцией, восстановление после сбоев и контроль идентичности контейнеров.
Важно, что тайм-аут команды не доказывает, будто фоновая операция Docker уже остановилась. После тайм-аута необходимо сначала проверить фактическое состояние контейнеров. Нельзя немедленно запускать конкурирующее переключение. Внезапное завершение процесса и отключение питания не всегда позволяют выполнить обработчик выхода; восстановление должно опираться на сохранённую транзакцию и происходить в начале следующего запуска.
В качестве стартовых настроек можно рассмотреть окно проверки в 60 секунд, тайм-аут соединения 1 секунду, ограничение запроса 3 секунды, опрос раз в 2 секунды и три успешных ответа подряд. Это предварительные параметры, а не результаты измерений.
Проверка должна обращаться к локальному каталогу моделей и требовать HTTP 200 без перехода по редиректам. Ответ необходимо разбирать как JSON ожидаемой структуры, чтобы HTML-страница входа или ошибка прокси не считались успехом. Также нужно убедиться, что текущий контейнер действительно использует кандидатный образ и не входит в цикл перезапусков: иначе ответ может прийти от старого процесса.
Требование к ненулевому числу моделей следует задавать только если оно предусмотрено актуальным контрактом реестра. Нельзя без проверки зашивать в скрипт историческое ожидание, что моделей должно быть ровно восемнадцать. Отдельную проверку здоровья можно добавить, но автоматически запускать настоящий чат-запрос, который может расходовать квоту, не следует. Фактическая доступность бизнес-функций требует отдельной проверки.
На удалённых VPS нужно изменить только источник образа в их копиях конфигурации, не затрагивая локальную конфигурацию для разработки. В Compose шлюз должен ссылаться на обязательную переменную образа, а не собираться из исходников:
services:
app:
image: "${APP_IMAGE:?необходимо указать закреплённый образ}"
pull_policy: never
Это только фрагмент: на сервере должна остаться полная исходная конфигурация сервисов, а у шлюза нужно удалить секцию сборки. Сохранённое значение APP_IMAGE должно указывать на принятый digest или локальный тег отката — не на latest, который при ручном перезапуске может незаметно сменить версию.
Перед настройкой нужно проверить фактическое имя Compose-проекта: ошибочное имя может создать новую сеть и нарушить связь с почтовым сервисом. Следует сохранить реальные переменные окружения и не путать параметры интерполяции Compose с переменными, переданными внутрь контейнера. В текущей конфигурации явно включены две экспериментальные функции, тогда как базовый контекст проекта предполагает для них выключенное состояние. Не следует менять эти значения автоматически: сначала нужно сравнить конфигурацию VPS с docker-compose.yml:38 и _bmad-output/project-context.md:246.
Удалённым машинам достаточно конфигурации развёртывания и готового образа — исходники и права на запись в репозиторий для обновления не нужны. Если релиз требует несовместимой миграции конфигурации, автоматическое обновление следует остановить, пока не появится обратимый план миграции.
Для закрытого пакета GHCR предлагается отдельный Personal Access Token (classic) с правом read:packages. Нужно проверить, что учётная запись действительно имеет доступ к нужному пакету, а при необходимости организации — пройти требуемую SSO-авторизацию. Выдавать VPS токен CI с правами записи или удаления не следует 9. Для каждой машины лучше использовать отдельные отзываемые учётные данные. Авторизацию нужно выполнять через стандартный ввод, не помещая токен в аргументы командной строки или журналы; конфигурацию Docker хранить в каталоге, доступном только администраторам и обновлятору. Токен не должен передаваться шлюзу или почтовому контейнеру. При ошибке авторизации обновление прекращается, а старая версия продолжает работать.
Для расписания предлагается systemd — штатный менеджер служб и таймеров Linux. Ниже приведены проектные примеры unit-файлов, а не уже установленные настройки.
Служба должна запускать скрипт от защищённой учётной записи, работать из каталога развёртывания и передавать путь к Docker-конфигурации. Таймер можно настроить на первый запуск через минуту после загрузки и повторную проверку через пять минут после завершения предыдущего запуска, добавив случайную задержку до 30 секунд:
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
Перед включением таймера требуется установить зависимости, проверить конфигурацию, сохранить здоровую исходную версию и провести пробный запуск. Две VPS следует обновлять со сдвигом по времени: это снижает вероятность одновременной нагрузки на реестр и одновременного сбоя. Периодическая проверка обеспечивает постепенное совпадение версий, а не атомарное переключение. Если на одной машине сработал откат, безопаснее временно оставить её на прежней версии, чем повторно принуждать к установке проблемного образа.
Понижение приоритета скрипта не гарантирует, что пиковую нагрузку на CPU при распаковке образа удастся ограничить: Docker daemon работает отдельно. Поведение нужно измерить на целевых VPS. Под «тихим» режимом здесь подразумевается отсутствие прикладного вывода и записей об обновлении, если digest не изменился; systemd всё равно может регистрировать события запуска службы.
Журнал обновлятора должен содержать время UTC, идентификатор узла и транзакции, старый и новый digest, этап операции, длительность, результат проверки здоровья и результат отката. В него нельзя писать токены, полное окружение контейнера, данные почтовых аккаунтов или тела ответов.
В качестве предварительной политики можно рассмотреть отдельный журнал с ротацией раз в неделю, досрочным переносом при размере свыше 1 МБ, сжатием и хранением 26 архивов. Это нужно согласовать отдельно: менять общую политику логов хоста в рамках задачи не следует.
Очистка не должна запускать глобальные команды удаления образов или томов. Она касается только образов, которые обновлятор сам пометил как принадлежащие ему, и выполняется под тем же lock. Нельзя удалять текущую версию, предыдущую рабочую версию, образ незавершённой транзакции, образ, используемый существующим контейнером, или теги, относящиеся к другим задачам. Для собственных исторических образов старше предполагаемого срока хранения в 14 дней можно сначала снять свой тег, а затем попробовать удалить образ без принудительного режима. При отказе удаление прекращается и записывается в журнал. Образ без тега не обязательно является мусором: он может быть подготовлен для ручного отката. Если перед загрузкой нового образа не хватает места, нужно отменить обновление, а не удалять единственную сохранённую версию для восстановления.
Работу разумно разделить на четыре этапа:
Обязательные проверки перед эксплуатацией:
Итог: схема с нативным таймером, закреплением образа по digest и локальным откатом выглядит подходящей, если допустим короткий перерыв при переключении, субсекундное сетевое обнаружение считать целью измерений, а не гарантией, и сначала проверить реальные условия на обеих VPS. Пока такой проверки нет, нельзя утверждать, что совместимость, скорость или полный цикл отката уже подтверждены.
Studio Global AI
На этой странице есть ответ, подтвержденный источником, который вы можете продолжить внутри Studio Global.
Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора.
Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора. Обновление затрагивает только шлюз: почтовый контейнер не перезапускается, а прежний образ заранее сохраняется для отката.
Проверка digest через интернет не гарантирует субсекундное выполнение; пересоздание единственного экземпляра шлюза не обеспечивает нулевой простой или сохранность активных запросов.
Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора. Обновление затрагивает только шлюз: почтовый контейнер не перезапускается, а прежний образ заранее сохраняется для отката.
ОпубликовалИзображения созданы с помощью GPT Image 2
Ответ на исследование
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
Для автоматического обновления сервиса на двух удалённых VPS предлагается связка: таймер systemd на хосте, установка образа по неизменяемому digest, сохранение состояния операции и локальный откат. Отдельный контейнер-обновлятор не нужен.
Схема условно реализуема, но у неё есть принципиальные ограничения. Проверка нового digest через публичную сеть не может гарантированно укладываться в доли секунды. А пересоздание единственного экземпляра шлюза не гарантирует ни нулевого простоя, ни завершения уже идущих запросов.
Важно: описанное ниже — проект требований и план реализации. Файлы не записывались, тесты не запускались, две VPS не проверялись и не изменялись. Автоматический откат — цель для штатных отказов обновления при работающих хосте и Docker, а не гарантия восстановления после отключения питания, неисправности Docker или неработоспособности самого прежнего образа.
v3.12 и публикует latest, 3.12, v3.12 и короткий SHA коммита. Автоматического тега-серии v3.x в workflow нет. В нём перечислены четыре архитектуры, но одно лишь наличие конфигурации не подтверждает успешную сборку конкретного релиза (.github/workflows/build_docker.yml:19).docker-compose.yml:1).Dockerfile:13, main.go:21). Значит, на удалённой машине нужны и образ, и конфигурационные файлы.internal/api/models.go:23, internal/api/chat.go:2078). Нельзя подменять эту проверку правилами другой реализации обработчика.main.go:233).За рамками этой задачи остаются изменение почты, синхронизация состояния работающих аккаунтов, обновление зависимостей, получение исходников на VPS и изменение локальной сборки для разработки. Нельзя также обещать строго одновременное переключение двух машин. Для переключения без потери запросов понадобились бы как минимум два экземпляра, переключение входящего трафика и отдельное управление соединениями.
Планируемый скрипт — scripts/auto-update.sh; сейчас его нет. Предполагаются Bash, Docker Engine, Compose plugin, curl, jq, flock и Skopeo для чтения манифеста образа. Дистрибутивы Linux и версии инструментов на обеих машинах нужно проверить до реализации.
Скрипт запускается с хоста от защищённой учётной записи и обращается к локальному Docker напрямую. Docker socket и учётные данные реестра не передаются контейнерам. Однако пользователь с доступом к Docker фактически обладает значительными полномочиями на хосте: отсутствие socket внутри контейнера не отменяет этот риск.
Тег, например latest, нужен, чтобы обнаружить возможный новый релиз. Запускать сервис следует по адресу образа с digest, а не по изменяемому тегу: Compose поддерживает указание образа в формате с digest 1.
В состоянии обновлятора нужно раздельно хранить:
Эти значения нельзя сравнивать как однотипные. Кроме того, перед обновлением требуется сохранить прежний реально работающий образ под отдельным локальным тегом и убедиться, что прежний сервис исправен. Тогда откат не будет зависеть от доступности сети или реестра.
Состояние должно содержать принятый текущий образ, предыдущий рабочий образ, сведения о незавершённой транзакции и список digest, обновление на которые уже завершилось неудачей. Запись транзакции включает старую и новую ссылки, локальные ID образов, ID старого контейнера, отпечаток конфигурации и текущий этап операции. Данные нужно строго разбирать, не исполнять как команды, а записывать во временный файл с последующей атомарной заменой. Для устойчивости к внезапному отключению питания одного переименования файла недостаточно: важные записи нужно сбрасывать на диск.
--no-deps, --no-build и --pull never предназначены для того, чтобы не запускать зависимости, не собирать образ и не выполнять дополнительную загрузку в ходе переключения Команда переключения в качестве основы может выглядеть так:
APP_IMAGE="$NEW_REF" timeout --kill-after=5s 60s \
docker compose --project-name "$PROJECT" \
--project-directory "$DEPLOY_DIR" -f "$COMPOSE_FILE" \
up -d --no-deps --no-build --pull never app </dev/null
Ветка отката использует тот же вызов, но вместо $NEW_REF подставляет заранее сохранённый локальный тег старого образа. Это пример ключевой операции, а не готовый скрипт: до внедрения нужны проверка входных параметров, управление транзакцией, восстановление после сбоев и контроль идентичности контейнеров.
Важно, что тайм-аут команды не доказывает, будто фоновая операция Docker уже остановилась. После тайм-аута необходимо сначала проверить фактическое состояние контейнеров. Нельзя немедленно запускать конкурирующее переключение. Внезапное завершение процесса и отключение питания не всегда позволяют выполнить обработчик выхода; восстановление должно опираться на сохранённую транзакцию и происходить в начале следующего запуска.
В качестве стартовых настроек можно рассмотреть окно проверки в 60 секунд, тайм-аут соединения 1 секунду, ограничение запроса 3 секунды, опрос раз в 2 секунды и три успешных ответа подряд. Это предварительные параметры, а не результаты измерений.
Проверка должна обращаться к локальному каталогу моделей и требовать HTTP 200 без перехода по редиректам. Ответ необходимо разбирать как JSON ожидаемой структуры, чтобы HTML-страница входа или ошибка прокси не считались успехом. Также нужно убедиться, что текущий контейнер действительно использует кандидатный образ и не входит в цикл перезапусков: иначе ответ может прийти от старого процесса.
Требование к ненулевому числу моделей следует задавать только если оно предусмотрено актуальным контрактом реестра. Нельзя без проверки зашивать в скрипт историческое ожидание, что моделей должно быть ровно восемнадцать. Отдельную проверку здоровья можно добавить, но автоматически запускать настоящий чат-запрос, который может расходовать квоту, не следует. Фактическая доступность бизнес-функций требует отдельной проверки.
На удалённых VPS нужно изменить только источник образа в их копиях конфигурации, не затрагивая локальную конфигурацию для разработки. В Compose шлюз должен ссылаться на обязательную переменную образа, а не собираться из исходников:
services:
app:
image: "${APP_IMAGE:?необходимо указать закреплённый образ}"
pull_policy: never
Это только фрагмент: на сервере должна остаться полная исходная конфигурация сервисов, а у шлюза нужно удалить секцию сборки. Сохранённое значение APP_IMAGE должно указывать на принятый digest или локальный тег отката — не на latest, который при ручном перезапуске может незаметно сменить версию.
Перед настройкой нужно проверить фактическое имя Compose-проекта: ошибочное имя может создать новую сеть и нарушить связь с почтовым сервисом. Следует сохранить реальные переменные окружения и не путать параметры интерполяции Compose с переменными, переданными внутрь контейнера. В текущей конфигурации явно включены две экспериментальные функции, тогда как базовый контекст проекта предполагает для них выключенное состояние. Не следует менять эти значения автоматически: сначала нужно сравнить конфигурацию VPS с docker-compose.yml:38 и _bmad-output/project-context.md:246.
Удалённым машинам достаточно конфигурации развёртывания и готового образа — исходники и права на запись в репозиторий для обновления не нужны. Если релиз требует несовместимой миграции конфигурации, автоматическое обновление следует остановить, пока не появится обратимый план миграции.
Для закрытого пакета GHCR предлагается отдельный Personal Access Token (classic) с правом read:packages. Нужно проверить, что учётная запись действительно имеет доступ к нужному пакету, а при необходимости организации — пройти требуемую SSO-авторизацию. Выдавать VPS токен CI с правами записи или удаления не следует 9. Для каждой машины лучше использовать отдельные отзываемые учётные данные. Авторизацию нужно выполнять через стандартный ввод, не помещая токен в аргументы командной строки или журналы; конфигурацию Docker хранить в каталоге, доступном только администраторам и обновлятору. Токен не должен передаваться шлюзу или почтовому контейнеру. При ошибке авторизации обновление прекращается, а старая версия продолжает работать.
Для расписания предлагается systemd — штатный менеджер служб и таймеров Linux. Ниже приведены проектные примеры unit-файлов, а не уже установленные настройки.
Служба должна запускать скрипт от защищённой учётной записи, работать из каталога развёртывания и передавать путь к Docker-конфигурации. Таймер можно настроить на первый запуск через минуту после загрузки и повторную проверку через пять минут после завершения предыдущего запуска, добавив случайную задержку до 30 секунд:
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
Перед включением таймера требуется установить зависимости, проверить конфигурацию, сохранить здоровую исходную версию и провести пробный запуск. Две VPS следует обновлять со сдвигом по времени: это снижает вероятность одновременной нагрузки на реестр и одновременного сбоя. Периодическая проверка обеспечивает постепенное совпадение версий, а не атомарное переключение. Если на одной машине сработал откат, безопаснее временно оставить её на прежней версии, чем повторно принуждать к установке проблемного образа.
Понижение приоритета скрипта не гарантирует, что пиковую нагрузку на CPU при распаковке образа удастся ограничить: Docker daemon работает отдельно. Поведение нужно измерить на целевых VPS. Под «тихим» режимом здесь подразумевается отсутствие прикладного вывода и записей об обновлении, если digest не изменился; systemd всё равно может регистрировать события запуска службы.
Журнал обновлятора должен содержать время UTC, идентификатор узла и транзакции, старый и новый digest, этап операции, длительность, результат проверки здоровья и результат отката. В него нельзя писать токены, полное окружение контейнера, данные почтовых аккаунтов или тела ответов.
В качестве предварительной политики можно рассмотреть отдельный журнал с ротацией раз в неделю, досрочным переносом при размере свыше 1 МБ, сжатием и хранением 26 архивов. Это нужно согласовать отдельно: менять общую политику логов хоста в рамках задачи не следует.
Очистка не должна запускать глобальные команды удаления образов или томов. Она касается только образов, которые обновлятор сам пометил как принадлежащие ему, и выполняется под тем же lock. Нельзя удалять текущую версию, предыдущую рабочую версию, образ незавершённой транзакции, образ, используемый существующим контейнером, или теги, относящиеся к другим задачам. Для собственных исторических образов старше предполагаемого срока хранения в 14 дней можно сначала снять свой тег, а затем попробовать удалить образ без принудительного режима. При отказе удаление прекращается и записывается в журнал. Образ без тега не обязательно является мусором: он может быть подготовлен для ручного отката. Если перед загрузкой нового образа не хватает места, нужно отменить обновление, а не удалять единственную сохранённую версию для восстановления.
Работу разумно разделить на четыре этапа:
Обязательные проверки перед эксплуатацией:
Итог: схема с нативным таймером, закреплением образа по digest и локальным откатом выглядит подходящей, если допустим короткий перерыв при переключении, субсекундное сетевое обнаружение считать целью измерений, а не гарантией, и сначала проверить реальные условия на обеих VPS. Пока такой проверки нет, нельзя утверждать, что совместимость, скорость или полный цикл отката уже подтверждены.
Studio Global AI
На этой странице есть ответ, подтвержденный источником, который вы можете продолжить внутри Studio Global.
Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора.
Предлагаемая схема использует таймер systemd на хосте, фиксирует образ по digest и не требует отдельного контейнера обновлятора. Обновление затрагивает только шлюз: почтовый контейнер не перезапускается, а прежний образ заранее сохраняется для отката.
Проверка digest через интернет не гарантирует субсекундное выполнение; пересоздание единственного экземпляра шлюза не обеспечивает нулевой простой или сохранность активных запросов.