Все статьи

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, который принимает путь к файлу.

Если база уже существует

  1. Не удаляйте проект и не запускайте его с новым пустым путём. Сначала установите, где находится текущая база.
  2. Подготовьте согласованную резервную копию средствами SQLite. Копирование одного файла работающей WAL-базы может пропустить незаписанные изменения.
  3. Перенос существующей базы в volume выполняйте отдельно от смены ENV. Если доступа к файлу нет, обратитесь в поддержку из текущего проекта до redeploy.
  4. Проверьте несколько известных записей после переноса и только потом обновляйте код.

Смена SQLITE_PATH не переносит данные автоматически. Preview исправления пути также не является подтверждением переноса базы.

Проверка после обновления

В Logs проверьте путь и отсутствие unable to open database file. В самом боте проверьте ранее сохранённую запись, выполните restart и убедитесь, что она осталась. Не выводите BOT_TOKEN или содержимое пользовательской базы в публичные логи.

Если запуск не удался

Проверьте наличие папки, права записи и точное имя файла. Ошибка database is locked требует проверки одновременных записей и длительных транзакций, а не автоматической покупки большего тарифа.

Как заменить ZIP существующего проекта · Шаблон Telegram-бота с SQLite · Поддержка

О согласованных копиях: SQLite Backup API.