Если что-то не работает
Куда положить SQLite при публикации, чтобы база не терялась
Коротко
База SQLite теряется при публикации потому, что проект каждый раз собирается заново из тех файлов, которые вы загрузили: всё, что приложение дописало рядом с кодом, возвращается к исходному виду. Чтобы база сохранялась, её файл должен лежать в постоянном хранилище — в Netrun это папка /data, а путь к файлу задаётся переменной окружения, а не строкой в коде. Тогда база переживает и обновление кода, и перезапуск, а посмотреть и скачать её можно на вкладке «Данные». У проектов со своим docker-compose папки /data нет: там постоянное хранилище — именованные тома из вашего файла.
Обычно это выглядит так: вы поправили пару строк, загрузили новую версию — и в приложении пусто. Зарегистрированные пользователи, сохранённые заказы, накопленная статистика: всё, что лежало в файле SQLite, исчезло. Кажется, что сломался хостинг, но дело в другом: SQLite пропадает при публикации потому, что проект собирается заново из тех файлов, которые вы загрузили, и всё, что приложение записало рядом с кодом, возвращается к исходному виду.
Так ведёт себя любая площадка, которая собирает проект из загруженного кода: постоянно живёт только то место, которое специально сделано постоянным. В Netrun это папка /data — всё, что приложение туда записало, переживает и обновление кода, и перезапуск, а файлы видны на вкладке «Данные», их можно скачать или загрузить обратно. Дальше разберём, как перевести туда базу SQLite и когда её вообще пора менять на полноценную базу.
Убедитесь, что база пропадает именно при публикации#
Симптом узнаётся по времени: данные исчезают ровно в момент выхода новой версии или перезапуска, а между этими событиями всё держится. Посмотрите, где создаётся файл базы: если путь к нему — просто имя файла вроде app.db или db.sqlite3, файл лежит рядом с кодом и живёт до следующей сборки. Если приложение само создаёт базу и накатывает миграции при старте, подмены вы даже не заметите — база каждый раз будет новой и пустой.
Вынесите путь к базе в переменную окружения#
Не прописывайте путь строкой в коде: тогда одно и то же приложение сможет работать и у вас на компьютере, и на сервере. Заведите переменную вроде DATABASE_PATH или DATABASE_URL, читайте её при старте, а если переменной нет — подставляйте локальный файл по умолчанию. При настройке проекта Netrun спросит значения таких переменных и подставит их сам, поэтому переписывать код перед каждой публикацией не придётся.
Положите файл базы в постоянную папку /data#
Укажите в переменной путь внутри постоянной папки — например /data/app.db. Заранее ничего создавать не нужно: папка уже есть, а сам файл базы приложение создаст при первом запуске. С этого момента данные переживают и обновление кода, и перезапуск проекта, а ссылка остаётся прежней.
Опишите именованный том, если у проекта свой docker-compose#
У проектов, где сервисы описаны вашим файлом docker-compose, папки /data нет — постоянное хранилище там задаёте вы сами именованными томами. Смонтируйте том в ту папку, где лежит база, и укажите путь к файлу внутри неё. Если в базу пишут сразу несколько сервисов из вашего файла, это как раз повод поднять базу отдельным сервисом рядом, а не держать общий файл.
Скачайте копию базы перед крупным обновлением#
Постоянное хранилище защищает от пересборки, но не от ошибки в вашем коде: неудачная миграция или лишний запрос на удаление испортят данные одинаково и в /data, и на своём сервере. Перед сменой схемы или крупным обновлением откройте вкладку «Данные», скачайте файл базы и сохраните его у себя. Если что-то пойдёт не так, тот же файл можно загрузить обратно.
Оцените, не пора ли переехать на отдельную базу#
SQLite хорошо держит один процесс, который пишет нечасто: личный сайт, бот, дашборд, внутренний сервис на несколько человек. Менять его на полноценную базу пора, когда писать начинают несколько процессов сразу, запись идёт постоянно или данных становится действительно много — тогда появляются блокировки и ожидания. В этом случае поднимите базу отдельным сервисом рядом с приложением через docker-compose или подключите внешнюю, а строку подключения передайте той же переменной окружения.
Итог короткий: файлы рядом с кодом — часть кода, и при каждой публикации они возвращаются к загруженному виду. Постоянно живёт только то, что лежит в постоянном хранилище. Перенесите файл SQLite в /data, задайте путь переменной окружения — и обновлять код можно спокойно, данные останутся на месте. Попробовать Netrun.
Частые вопросы
Где находится папка /data и как обратиться к ней из кода?
Это обычная папка внутри проекта по пути /data, и работать с ней можно как с любой другой: файл базы будет, например, /data/app.db. Её содержимое видно на вкладке «Данные» в кабинете — оттуда файлы можно скачать, загрузить или удалить. Отдельно создавать папку не нужно, она есть с первого запуска.
Как перенести на сервер базу, которая уже наполнена у меня на компьютере?
Опубликуйте проект хотя бы один раз, чтобы путь к базе точно совпадал, затем откройте вкладку «Данные» и загрузите файл под тем же именем, которое ждёт приложение. На время загрузки проект лучше остановить, чтобы приложение не писало в базу одновременно с заменой файла. После запуска приложение увидит уже наполненную базу.
Нужно ли класть файл базы в архив вместе с кодом?
Нет. Файл, загруженный вместе с кодом, попадёт не в постоянное хранилище, а рядом с кодом, и при следующей публикации вернётся ровно к тому виду, в каком вы его залили. Держите базу в /data, а начальные данные, если они нужны, создавайте кодом при первом запуске.
Что означает ошибка «database is locked»?
SQLite разрешает писать в базу только одному процессу за раз, поэтому ошибка появляется, когда за запись берутся сразу несколько: несколько рабочих процессов веб-сервера или фоновая задача параллельно с обработкой запроса. Уменьшите число пишущих процессов или разнесите запись по времени. Если так работать неудобно, это прямой сигнал переходить на отдельную базу.
Как быть с Django, где база по умолчанию лежит в папке проекта?
В настройках Django путь к файлу базы задаётся явно — возьмите его из переменной окружения и укажите путь внутри постоянной папки, например /data/db.sqlite3. Миграции при этом накатываются как обычно, просто применяются к файлу, который никуда не пропадает. Так же поступают и другие фреймворки, которые по умолчанию кладут базу рядом с кодом.
SQLite или Postgres — что выбрать для небольшого проекта?
Для личного сайта, бота, дашборда или сервиса на несколько человек SQLite обычно достаточно: он не требует отдельного сервиса и весь помещается в один файл. Полноценная база нужна, когда писать в неё будут несколько процессов сразу, нагрузка постоянная или данных становится много. Перейти можно позже — подняв базу отдельным сервисом рядом с приложением или подключив внешнюю.
Сохранятся ли данные при обновлении кода?
Да, если данные лежат в постоянном хранилище. У обычного проекта это папка /data: всё, что приложение туда сохранило, остаётся при обновлении кода и перезапуске, а посмотреть и скачать файлы можно на вкладке «Данные». Если вы описали сервисы сами в docker-compose, постоянное хранилище — это именованные тома из вашего файла, и папки /data у такого проекта нет. Файлы, записанные мимо хранилища, при следующей публикации создаются заново. Ссылка проекта в любом случае остаётся прежней.
Как обновить код уже опубликованного проекта?
Откройте проект и загрузите новую версию или обновите его из GitHub. Ссылка останется прежней, а данные сохранятся, если лежат в постоянном хранилище — папке /data или томе вашего compose-файла.
Можно ли запустить несколько сервисов сразу?
Да. Через docker-compose можно поднять до пяти связанных сервисов в одном проекте — например, приложение вместе с базой данных.