Хранение базы данных бота
При сборке и развертывании бота автоматически создается папка хранилищаdata. Эта папка предназначена для хранения данных, которые должны сохраняться между обновлениями бота из Git репозитория.
📁 Зачем хранить базу в папке data?
Основная причина — защита данных при обновлении из Git. При обновлении бота из репозитория происходит:- Клонирование/обновление кода из Git
- Пересборка Docker образа
- Перезапуск контейнера
data специально исключена из синхронизации с Git и предназначена для персистентного хранения данных.
🗄️ Способы размещения базы данных
Способ 1: Загрузка через файловый менеджер (первый запуск)
Если у вас уже есть готовая база данных, которую нужно использовать:- Подготовьте файл базы данных (например,
bot.dbдля SQLite) - Загрузите файл в папку data через файловый менеджер в панели управления ботом
- Укажите путь к базе в переменных окружения:
DATABASE_PATH=/app/data/bot.db
DB_PATH=/app/data/scheduler.db- После первого запуска удалите файл базы из Git репозитория (если он там был), чтобы избежать конфликтов при обновлениях
Способ 2: Программное создание базы (рекомендуется)
Лучший подход — создавать базу данных программно при первом запуске, если она еще не существует:Пример для Python (SQLite):
import os
import sqlite3
from pathlib import Path
# Путь к папке data
DATA_DIR = Path("/app/data")
DATA_DIR.mkdir(parents=True, exist_ok=True)
# Путь к базе данных
DB_PATH = DATA_DIR / "bot.db"
# Создаем базу, если её нет
if not DB_PATH.exists():
conn = sqlite3.connect(str(DB_PATH))
# Создаем необходимые таблицы
conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
username TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
print(f"База данных создана: {DB_PATH}")
else:
print(f"База данных уже существует: {DB_PATH}")Пример для Node.js (SQLite):
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');
// Путь к папке data
const dataDir = '/app/data';
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
// Путь к базе данных
const dbPath = path.join(dataDir, 'bot.db');
// Создаем базу и таблицы при первом запуске
const db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error('Ошибка открытия базы данных:', err);
return;
}
console.log(База данных подключена: ${dbPath});
// Создаем таблицы, если их нет
db.run(
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
username TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
, (err) => {
if (err) {
console.error('Ошибка создания таблицы:', err);
} else {
console.log('Таблицы созданы или уже существуют');
}
});
});📝 Настройка переменных окружения
В панели управления ботом добавьте переменную окружения с путем к базе данных:DATABASE_PATH=/app/data/bot.db(для SQLite)DB_PATH=/app/data/scheduler.db(альтернативное имя)DATABASE_NAME=tgbot_okz_db.db(если ваш код использует такое имя)
/app/data, а не на корень проекта.
✅ Преимущества хранения в папке data
- ✅ База данных не перезаписывается при обновлении из Git
- ✅ Данные сохраняются между перезапусками контейнера
- ✅ Удобно делать резервные копии (вся папка
data) - ✅ Изолированное хранение данных от кода приложения
🔄 Миграция существующей базы
Если у вас уже есть база данных в другом месте:- Остановите бота
- Скопируйте файл базы данных в папку
dataчерез файловый менеджер - Обновите переменные окружения, указав новый путь (
/app/data/имя_базы.db) - Запустите бота
⚠️ Важные замечания
- Не добавляйте папку
dataв Git — она должна быть в.gitignore - Делайте резервные копии папки
dataрегулярно - Проверяйте права доступа — контейнер должен иметь права на запись в папку
/app/data - Для MySQL/PostgreSQL используйте внешние серверы БД или Docker volumes, а не файловую систему контейнера
📚 См. также
Вопросы? Обратитесь в поддержку: @bothostru