Руководства по развёртыванию, секретам, доменам и управлению контейнерами.

Обновление приложения после правок

Как развернуть новую версию после push, что происходит со старой версией и что действительно растёт на машине. · обновлено 2026-10-13

Вы поменяли код на GitHub, GitLab или другом git-хостинге — как развернуть новую версию в контейнере и что при этом происходит со старой.

1. Короткий ответ

Четыре действия в панели: «Клонировать репозиторий» → «Пересобрать» → «Обновить список» → «Health-check».

Старая версия при этом не копится: рабочий каталог обновляется на месте, контейнер пересоздаётся, тег образа заменяется. Растёт только кэш сборки Docker, и он чистится одной командой (раздел 6).

2. Пошагово

  1. Внесите правки и отправьте их в ту же ветку, которая указана в манифесте (поле branch, по умолчанию main). Правки, оставшиеся только на вашем компьютере, машина не увидит:
git push origin main     # или master — та ветка, что указана в манифесте
  1. Откройте «Контейнеры» и выберите свою машину, а в списке приложений — имя приложения из манифеста.
  2. Нажмите «Клонировать репозиторий»: проект на машине подтянет новый коммит. В выводе последней строкой будет короткий хеш коммита — сверьте его с тем, что показывает ваш хостинг:
Cloning into '/opt/apppilot/apps/webapp'...   ← только при первом клонировании
HEAD is now at d4e5f6a
  1. Нажмите «Пересобрать»: это сборка образа заново (без кэша слоёв) и запуск с пересозданием контейнера. Первая сборка может занять минуты — панель ждёт ответа около минуты, затем сообщает, что операция продолжается в фоне: дождитесь и нажмите «Статус приложения» или «Обновить список». Если правки небольшие и вы уверены в кэше, хватит пары «Собрать образ» → «Запустить всё».
  2. Проверьте результат: «Обновить список» — контейнер должен быть running (идентификатор при этом будет другим: контейнер пересоздан); «Health-check» — приложение отвечает; «Логи» — в журнале нет ошибок. Затем откройте приложение по своему адресу.

Итого типовой цикл: git push → «Клонировать репозиторий» → «Пересобрать» → «Health-check». Одна-две минуты.

3. Как убедиться, что развернулась нужная версия

Способ Где смотреть
Хеш коммита вывод «Клонировать репозиторий», строка с коротким хешем (HEAD is now at d4e5f6a) — сравните с последним коммитом ветки на хостинге
Видимое изменение заголовок или номер версии в ответе приложения, номер сборки в футере страницы
Health-check "healthy": true и результат HTTP-запроса к приложению
Дата создания контейнера в таблице контейнеров: после обновления время свежее

4. Разные виды обновлений

Что изменилось Что делать
код в репозитории «Клонировать репозиторий» → «Пересобрать»
переменные окружения (env) или параметры запуска (run_args) в манифесте сохранить манифест → «Запустить всё» (контейнер пересоздастся с новыми значениями)
docker-compose.yml в репозитории (новый сервис, порт, том) «Клонировать репозиторий» → «Запустить всё» → при необходимости «Пересобрать»
имя приложения (app) или подпапка (subdir) это другое приложение: сохраните новый манифест, соберите и запустите его как новое, а старое удалите кнопкой «Удалить приложение», иначе на машине будут работать оба

5. Что происходит со старой версией (не копится ли она на машине)

Код — не копится. Рабочий каталог приложения на машине — всегда один и тот же git-репозиторий. При повторном клонировании агент не удаляет каталог и не делает новую копию, а обновляет ту же: подтягивает изменения ветки (git fetch --prune), принудительно переключается на неё (git checkout -f) и приводит файлы к состоянию ветки (git reset --hard). Проверено:

  • файлы, которые вы удалили из репозитория, исчезают и в рабочем каталоге;
  • история коммитов и локальные настройки остаются — каталог не пересоздаётся;
  • папок вида «app-2», «app-old», «app.bak» не появляется.

Контейнер — пересоздаётся. Старый контейнер приложения удаляется, вместо него поднимается новый (другой идентификатор, то же имя). Несколько копий контейнера одного приложения не остаётся.

Образ — тег заменяется. Собранный образ помечается тем же тегом, новая сборка вытесняет прежнюю: лишних тегов не появляется.

Данные в томах сохраняются — именно затем, чтобы обновление не стирало содержимое. Обновление «с нуля», с чистыми данными, делается удалением приложения с очисткой — и это уже осознанное действие.

6. Что действительно растёт на машине и как это чистить

Чистка через SSH ниже — для заказанной ВМ. На плане приложений root-доступа к машине нет: напишите в поддержку, и нужные команды выполнят на платформенной машине.

Что растёт Почему Как чистить
Кэш сборки Docker каждая сборка оставляет промежуточные слои; при частых обновлениях набегают десятки мегабайт по SSH на машине: docker builder prune -f (удаляет только кэш сборки)
Журналы контейнеров Docker по умолчанию не ограничивает размер файла журнала: если приложение пишет много, журнал растёт настроить ограничение в compose (logging: driver: json-file, options: max-size) или чистить по SSH
Старые образы если приложение берёт готовый образ и вы меняете тег (nginx:1.27 → nginx:1.29), прежний образ остаётся по SSH: docker image prune -f (удаляет неиспользуемые образы)
Тома, каталоги внутри контейнера, базы, загрузки это ваши данные чистить осознанно; место видно по df -h

Посмотреть занятое место: df -h / и docker system df (показывает отдельно образы, контейнеры, тома и кэш сборки). Удаление неиспользуемого через панель не предусмотрено — панель удаляет только контейнеры приложений.

7. Как откатиться на прежнюю версию

  1. Верните прежний код в ветке: git revert или обратной правкой и push.
  2. В панели: «Клонировать репозиторий» → «Пересобрать» → «Health-check».

После отката приложение снова отвечает прежней версией, а файлы, удалённые в откатываемом коммите, пропадают и из рабочего каталога.

8. Частые проблемы при обновлении

Что видно Причина и что делать
клонирование не видит изменений правки не отправлены в ветку из манифеста (остались локально или ушли в другую ветку): сделайте push в нужную ветку
клонирование подтянуло новый коммит, а приложение работает по-старому контейнер работает на прежнем образе: не выполнялась сборка либо сборка взяла кэш слоёв — нажмите «Пересобрать»
после пересборки приложение не поднялось откройте «Логи» контейнера: там видна причина; при необходимости верните прежнюю версию (раздел 7)
удалённый из репозитория файл остался на машине файл не был под контролем версий (untracked) либо исключён через .gitignore: добавьте его в репозиторий или удалите на машине по SSH
на машине заканчивается место docker builder prune -f, ограничение журналов, docker image prune -f

9. Чего делать не стоит

  • Собирать и запускать приложение вручную по SSH одновременно с панелью: контейнеры, поднятые вне панели, видны в списке, но операции уровня приложения к ним могут не применяться.
  • Менять имя приложения (app) «по ходу»: это создаёт новое приложение, а старое остаётся работать.
  • Хранить данные только внутри контейнера: при пересборке контейнер пересоздаётся, и всё, что не лежит в томе, теряется.
  • Коммитить секреты в репозиторий: токены и пароли держите в env манифеста или в настройках машины.