Repository navigation
fix(panel): Update закрепляет образ панели по digest, а не по плавающему тегу - #128
Merged
Merged
Conversation
agentHits
force-pushed
the
fix/update-pin-image-digest
branch
from
October 29, 2026 15:05
2ef600e to
3f4c94f
Compare
…ему тегу Команда Update записывала в сервис dokploy плавающий тег ghcr.io/agenthits/dokploy:agenthits-dev без digest. Swarm заново скачивает образ по тегу при каждом старте задачи, поэтому падение контейнера, healthcheck, перезагрузка сервера или рестарт Docker могли молча поднять более новую сборку. Теперь после docker pull скрипт читает RepoDigests скачанного образа, берёт digest того же репозитория и запускает docker service update --no-resolve-image --image <репозиторий>:<тег>@sha256:…. Swarm не скачивает образ по digest, если он уже есть на сервере, а если его нет, скачивает ровно эту сборку. Без digest этого репозитория в сервис пишется ID образа, как в Reload. Если после pull не нашёлся и сам образ, скрипт завершается с ошибкой и сервис не трогает. Официальный канал работает так же: в ту же команду попадают canary и feature, а это плавающие теги. Для тегов версий закрепление ничего не меняет. Маркер после pull, DOKPLOY_PREVIOUS_IMAGE, RELEASE_TAG, DOKPLOY_OFFICIAL_VERSION, DOKPLOY_FORK_VERSION, DOKPLOY_KEEP_OLD_IMAGES, stop-first и rollback остались прежними. Проверка обновлений уже брала digest из <образ>@sha256:…, и тест подтверждает, что после обновления панель не предлагает ту же сборку снова. Продолжает #127: там то же закрепление сделано для Server → Reload. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agentHits
force-pushed
the
fix/update-pin-image-digest
branch
from
October 29, 2026 15:05
3f4c94f to
4715972
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Зачем
Панель сама переходила на свежую невыпущенную сборку
agenthits-dev. Последний раз это случилось 2026-10-29 в 12:19 UTC: панель перешла сagenthits-v1.0.9наagenthits-dev. Первую причину чинит #127: Server → Reload запускал команду обновления. Этот PR убирает вторую причину.Команда Update записывала в сервис
dokployплавающий тегghcr.io/agenthits/dokploy:agenthits-devбез digest. Swarm заново скачивает образ по тегу при каждом старте задачи. Поэтому любой перезапуск задачи панели мог молча поднять более новую сборку: падение контейнера, healthcheck, перезагрузка сервера, рестарт Docker.Что изменилось
docker pullскрипт обновления читаетRepoDigestsскачанного образа. Он берёт digest того же репозитория и запускаетdocker service update --no-resolve-image --image <репозиторий>:<тег>@sha256:…. Если образ уже есть на сервере, swarm его не скачивает. Если образа нет, swarm скачивает ровно эту сборку, а не то, на что тег указывает сейчас.getOfficialUpdateCommand) работает так же. Причина: теги версийv0.x.yна Docker Hub не меняются, но в эту же команду попадаютcanaryиfeature, а это плавающие теги. Проверка обновлений дляcanary/featureсравнивает digest из spec сервиса с digest тега на Docker Hub. Для версии закрепление ничего не меняет: digest указывает на ту же сборку, что и тег.[dokploy-update] image pulledсразу после pull;DOKPLOY_PREVIOUS_IMAGE;RELEASE_TAG,DOKPLOY_OFFICIAL_VERSION,DOKPLOY_FORK_VERSION,DOKPLOY_KEEP_OLD_IMAGES;--update-order stop-firstи--update-failure-action rollback.getServiceImageDigestи раньше брал digest из<образ>@sha256:…, аgetAgentHitsUpdateDataсравнивает его с digest тега в GHCR. Сборкаagenthitsпубликуется одним манифестом amd64 без index. Поэтому digest вRepoDigestsсовпадает с digest тега, и после обновления панель не предлагает ту же сборку снова. Это проверяет тест. После fallback на ID образа digest-проверка молчит, и обновление определяется по версиям из метаданных образа, как раньше при spec без digest.Связь с #127
Продолжение #127 (уже влит): там то же закрепление по digest сделано для Server → Reload. Ветка перенесена на
AgentHits-Devпосле его мержа, в diff только изменения этого PR.Проверки
bunx vitest run --config __test__/vitest.config.tsвapps/dokploy: 4343 теста прошли. 5 тестов вvector-validate.test.tsпадают локально и без этого PR (на ветке fix(panel): hang up container terminal shells on close, keep Reload on the running build #127 до мержа): они запускают настоящийdocker runс образом Vector, и на macOS он не проходит.tsc --noEmitвapps/dokployиpackages/server: без ошибок.biome checkпо изменённым файлам: без замечаний.dokploy-image-cleanup.test.tsпрогоняют сгенерированный скрипт вshс фейковымdockerв PATH:ghcr.io/agenthits/dokploy:agenthits-dev@sha256:…со всеми прежними флагами и переменными; официальныйcanaryпишетdokploy/dokploy:canary@sha256:…. Digest другого репозитория, если он тоже есть у образа, пропускается;docker service updateне вызывается;getAgentHitsUpdateDataне предлагает ту же сборку, а более новую предлагает.RepoDigestsвыглядят как<репозиторий>@sha256:…и что ссылка<репозиторий>:<тег>@sha256:…находит образ, уже лежащий на машине.Что проверить вручную на dev
docker service inspect dokploy --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'. Сейчас там тег без@sha256.ghcr.io/agenthits/dokploy:agenthits-dev@sha256:…, и этот digest должен совпадать сdocker image inspect --format '{{index .RepoDigests 0}}'образа работающего контейнера.agenthits-devперезапустить задачу панели (docker killконтейнера панели илиdocker service update --force dokploy). Панель должна подняться на прежней сборке:docker inspect --format '{{.Image}}'нового контейнера не меняется. При этом проверка обновлений должна показать новую сборку.Риск: старые сборки
agenthits-devбез тега еженедельно удаляются из GHCR. Пока образ лежит на сервере, swarm реестр не нужен, а очистка образов никогда не удаляет работающую и предыдущую сборки. Если такой образ удалить с сервера вручную, задача панели не поднимется, пока не сделать Update.🤖 Generated with Claude Code