Обновление приложения после правок
Вы поменяли код на GitHub, GitLab или другом git-хостинге — как развернуть новую версию в контейнере и что при этом происходит со старой.
1. Короткий ответ
Четыре действия в панели: «Клонировать репозиторий» → «Пересобрать» → «Обновить список» → «Health-check».
Старая версия при этом не копится: рабочий каталог обновляется на месте, контейнер пересоздаётся, тег образа заменяется. Растёт только кэш сборки Docker, и он чистится одной командой (раздел 6).
2. Пошагово
- Внесите правки и отправьте их в ту же ветку, которая указана в манифесте (поле
branch, по умолчаниюmain). Правки, оставшиеся только на вашем компьютере, машина не увидит:
git push origin main # или master — та ветка, что указана в манифесте
- Откройте «Контейнеры» и выберите свою машину, а в списке приложений — имя приложения из манифеста.
- Нажмите «Клонировать репозиторий»: проект на машине подтянет новый коммит. В выводе последней строкой будет короткий хеш коммита — сверьте его с тем, что показывает ваш хостинг:
Cloning into '/opt/apppilot/apps/webapp'... ← только при первом клонировании
HEAD is now at d4e5f6a
- Нажмите «Пересобрать»: это сборка образа заново (без кэша слоёв) и запуск с пересозданием контейнера. Первая сборка может занять минуты — панель ждёт ответа около минуты, затем сообщает, что операция продолжается в фоне: дождитесь и нажмите «Статус приложения» или «Обновить список». Если правки небольшие и вы уверены в кэше, хватит пары «Собрать образ» → «Запустить всё».
- Проверьте результат: «Обновить список» — контейнер должен быть
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. Как откатиться на прежнюю версию
- Верните прежний код в ветке:
git revertили обратной правкой и push. - В панели: «Клонировать репозиторий» → «Пересобрать» → «Health-check».
После отката приложение снова отвечает прежней версией, а файлы, удалённые в откатываемом коммите, пропадают и из рабочего каталога.
8. Частые проблемы при обновлении
| Что видно | Причина и что делать |
|---|---|
| клонирование не видит изменений | правки не отправлены в ветку из манифеста (остались локально или ушли в другую ветку): сделайте push в нужную ветку |
| клонирование подтянуло новый коммит, а приложение работает по-старому | контейнер работает на прежнем образе: не выполнялась сборка либо сборка взяла кэш слоёв — нажмите «Пересобрать» |
| после пересборки приложение не поднялось | откройте «Логи» контейнера: там видна причина; при необходимости верните прежнюю версию (раздел 7) |
| удалённый из репозитория файл остался на машине | файл не был под контролем версий (untracked) либо исключён через .gitignore: добавьте его в репозиторий или удалите на машине по SSH |
| на машине заканчивается место | docker builder prune -f, ограничение журналов, docker image prune -f |
9. Чего делать не стоит
- Собирать и запускать приложение вручную по SSH одновременно с панелью: контейнеры, поднятые вне панели, видны в списке, но операции уровня приложения к ним могут не применяться.
- Менять имя приложения (
app) «по ходу»: это создаёт новое приложение, а старое остаётся работать. - Хранить данные только внутри контейнера: при пересборке контейнер пересоздаётся, и всё, что не лежит в томе, теряется.
- Коммитить секреты в репозиторий: токены и пароли держите в
envманифеста или в настройках машины.