Хранение базы данных бота

При сборке и развертывании бота автоматически создается папка хранилища data. Эта папка предназначена для хранения данных, которые должны сохраняться между обновлениями бота из Git репозитория.

📁 Зачем хранить базу в папке data?

Основная причина — защита данных при обновлении из Git. При обновлении бота из репозитория происходит:
    • Клонирование/обновление кода из Git
    • Пересборка Docker образа
    • Перезапуск контейнера
Если база данных хранится в корне проекта или в других директориях, которые синхронизируются с Git, она может быть перезаписана или потеряна при обновлении. Папка 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