Hostim Docs

Данные не сохраняются в контейнере

Частая причина неожиданной потери данных: файловая система контейнера эфемерна — записанное на диск во время работы не переживает пересоздание контейнера.

Суть

Сервис работает внутри контейнера с эфемерной файловой системой. «Эфемерная» значит недолговечная: она существует только пока живёт текущий контейнер. Как только контейнер пересоздаётся, всё, что приложение записало на диск во время работы, исчезает — контейнер поднимается заново из собранного образа, без ваших рантайм-файлов.

Когда файловая система обнуляется

Не только при вашем действии. Контейнер пересоздаётся во всех случаях:

  • деплой — вы задеплоили новую версию;
  • откат (rollback) к предыдущему деплою;
  • перезапуск или связка «стоп → старт»;
  • автоматический перезапуск — контейнер упал, превысил лимит памяти или не прошёл health-check.

Последний пункт важен: данные могут пропасть без каких-либо действий с вашей стороны — достаточно перезапуска после сбоя.

Что из-за этого теряется

Всё, что приложение пишет в локальные файлы во время работы:

  • файл базы данных SQLite;
  • загруженные пользователями файлы (аватары, документы, изображения), сохранённые на локальный диск;
  • файлы сессий на диске;
  • сгенерированные или закэшированные на диск файлы;
  • записанные в файлы логи (к тому же долгосрочного хранения логов на платформе нет — только их хвост в реальном времени).

Где хранить постоянные данные

Постоянные данные держите не в контейнере, а во внешнем по отношению к нему хранилище. Внутри проекта для этого есть базы данных:

Что хранитеКуда
Структурированные данные приложенияPostgreSQL, MySQL, MariaDB, MongoDB
Кэш, сессии, счётчики, очередиRedis, Dragonfly, KeyDB
Аналитика, события, метрикиClickHouse
Файлы пользователей (загрузки, картинки)внешнее объектное хранилище (S3-совместимое)

Для файлов пользователей на платформе пока нет собственного объектного хранилища — используйте внешний S3-совместимый сервис. Хранить крупные файлы в реляционной базе данных не рекомендуется.

Базы данных — это постоянное хранилище

В отличие от файловой системы сервиса, база данных проекта данные сохраняет: это отдельный контейнер со своим постоянным хранилищем, который переживает деплои и перезапуски ваших сервисов. Для части типов (PostgreSQL, MySQL, MariaDB, MongoDB) платформа делает автоматические резервные копии.

Типичный переход для новичка: заменить локальный файл SQLite на базу данных PostgreSQL проекта — приложение подключается к ней по внутреннему адресу (см. «Связь сервисов и подключение к базе данных»), и данные больше не теряются при деплое.

Самопроверка

Задайте один вопрос: пишет ли приложение что-нибудь на диск во время работы? Если да — эти данные нужно перенести в базу данных или внешнее хранилище. Чтение файлов из репозитория (шаблоны, статика, конфигурация) безопасно — они часть образа и на месте всегда.

Дальше