SQLite для Telegram-бота: сохранить данные при redeploy
Как использовать /data в Deployka, проверить путь SQLite и обновить бота без создания пустой базы вместо существующей.
Почему после обновления бот видит пустую базу
Относительный путь bot.db зависит от рабочей папки процесса. Если база лежит в файловой системе контейнера рядом с кодом, замена контейнера может её потерять. Для постоянных данных контейнерного проекта Deployka используйте /data. Сохранение volume при restart и redeploy не заменяет независимый backup и не обещает бессрочное хранение после удаления проекта.
Пример для Python
В коде задайте постоянный путь через ENV. Значение SQLITE_PATH=/data/bot.db имеет смысл только если ваш код действительно читает эту переменную.
import os
import sqlite3
from pathlib import Path
db_path = Path(os.getenv("SQLITE_PATH", "/data/bot.db"))
db_path.parent.mkdir(parents=True, exist_ok=True)
connection = sqlite3.connect(db_path)
connection.execute(
"CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)"
)
connection.commit()
connection.close()
Для SQLAlchemy формат URL отличается: абсолютный путь обычно записывается как sqlite:////data/bot.db. Не передавайте этот URL напрямую в sqlite3.connect, который принимает путь к файлу.
Если база уже существует
- Не удаляйте проект и не запускайте его с новым пустым путём. Сначала установите, где находится текущая база.
- Подготовьте согласованную резервную копию средствами SQLite. Копирование одного файла работающей WAL-базы может пропустить незаписанные изменения.
- Перенос существующей базы в volume выполняйте отдельно от смены ENV. Если доступа к файлу нет, обратитесь в поддержку из текущего проекта до redeploy.
- Проверьте несколько известных записей после переноса и только потом обновляйте код.
Смена SQLITE_PATH не переносит данные автоматически. Preview исправления пути также не является подтверждением переноса базы.
Проверка после обновления
В Logs проверьте путь и отсутствие unable to open database file. В самом боте проверьте ранее сохранённую запись, выполните restart и убедитесь, что она осталась. Не выводите BOT_TOKEN или содержимое пользовательской базы в публичные логи.
Если запуск не удался
Проверьте наличие папки, права записи и точное имя файла. Ошибка database is locked требует проверки одновременных записей и длительных транзакций, а не автоматической покупки большего тарифа.
Как заменить ZIP существующего проекта · Шаблон Telegram-бота с SQLite · Поддержка
О согласованных копиях: SQLite Backup API.