Данные не сохраняются в контейнере
Частая причина неожиданной потери данных: файловая система контейнера эфемерна — записанное на диск во время работы не переживает пересоздание контейнера.
Суть
Сервис работает внутри контейнера с эфемерной файловой системой. «Эфемерная» значит недолговечная: она существует только пока живёт текущий контейнер. Как только контейнер пересоздаётся, всё, что приложение записало на диск во время работы, исчезает — контейнер поднимается заново из собранного образа, без ваших рантайм-файлов.
Когда файловая система обнуляется
Не только при вашем действии. Контейнер пересоздаётся во всех случаях:
- деплой — вы задеплоили новую версию;
- откат (rollback) к предыдущему деплою;
- перезапуск или связка «стоп → старт»;
- автоматический перезапуск — контейнер упал, превысил лимит памяти или не прошёл health-check.
Последний пункт важен: данные могут пропасть без каких-либо действий с вашей стороны — достаточно перезапуска после сбоя.
Что из-за этого теряется
Всё, что приложение пишет в локальные файлы во время работы:
- файл базы данных SQLite;
- загруженные пользователями файлы (аватары, документы, изображения), сохранённые на локальный диск;
- файлы сессий на диске;
- сгенерированные или закэшированные на диск файлы;
- записанные в файлы логи (к тому же долгосрочного хранения логов на платформе нет — только их хвост в реальном времени).
Где хранить постоянные данные
Постоянные данные держите не в контейнере, а во внешнем по отношению к нему хранилище. Внутри проекта для этого есть базы данных:
| Что храните | Куда |
|---|---|
| Структурированные данные приложения | PostgreSQL, MySQL, MariaDB, MongoDB |
| Кэш, сессии, счётчики, очереди | Redis, Dragonfly, KeyDB |
| Аналитика, события, метрики | ClickHouse |
| Файлы пользователей (загрузки, картинки) | внешнее объектное хранилище (S3-совместимое) |
Для файлов пользователей на платформе пока нет собственного объектного хранилища — используйте внешний S3-совместимый сервис. Хранить крупные файлы в реляционной базе данных не рекомендуется.
Базы данных — это постоянное хранилище
В отличие от файловой системы сервиса, база данных проекта данные сохраняет: это отдельный контейнер со своим постоянным хранилищем, который переживает деплои и перезапуски ваших сервисов. Для части типов (PostgreSQL, MySQL, MariaDB, MongoDB) платформа делает автоматические резервные копии.
Типичный переход для новичка: заменить локальный файл SQLite на базу данных PostgreSQL проекта — приложение подключается к ней по внутреннему адресу (см. «Связь сервисов и подключение к базе данных»), и данные больше не теряются при деплое.
Самопроверка
Задайте один вопрос: пишет ли приложение что-нибудь на диск во время работы? Если да — эти данные нужно перенести в базу данных или внешнее хранилище. Чтение файлов из репозитория (шаблоны, статика, конфигурация) безопасно — они часть образа и на месте всегда.