<!-- Bothost docs | HTML: https://bothost.ru/docs/database-storage | Markdown: https://bothost.ru/docs/database-storage.md | Index: https://bothost.ru/llms.txt -->

# Хранение базы данных бота

При сборке и развертывании бота автоматически создается папка хранилища `data`. Эта папка предназначена для хранения данных, которые должны сохраняться между обновлениями бота из Git репозитория.

## 📁 Зачем хранить базу в папке data?

Основная причина — **защита данных при обновлении из Git**. При обновлении бота из репозитория происходит:

1. Клонирование/обновление кода из Git
2. Пересборка Docker образа
3. Перезапуск контейнера

Если база данных хранится в корне проекта или в других директориях, которые синхронизируются с Git, она может быть перезаписана или потеряна при обновлении.

Папка `data` специально исключена из синхронизации с Git и предназначена для персистентного хранения данных.

## 🗄️ Способы размещения базы данных

### Способ 1: Загрузка через файловый менеджер (первый запуск)

Если у вас уже есть готовая база данных, которую нужно использовать:

1. **Подготовьте файл базы данных** (например, `bot.db` для SQLite)
2. **Загрузите файл в папку data через файловый менеджер** в панели управления ботом
3. **Укажите путь к базе в переменных окружения**:
   ```
   DATABASE_PATH=/app/data/bot.db
   ```
   или
   ```
   DB_PATH=/app/data/scheduler.db
   ```
   (в зависимости от того, какую переменную использует ваш бот)

4. **После первого запуска удалите файл базы из Git репозитория** (если он там был), чтобы избежать конфликтов при обновлениях

### Способ 2: Программное создание базы (рекомендуется)

Лучший подход — создавать базу данных программно при первом запуске, если она еще не существует:

#### Пример для Python (SQLite):

```python
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):

```javascript
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`)
- ✅ Изолированное хранение данных от кода приложения

## 🔄 Миграция существующей базы

Если у вас уже есть база данных в другом месте:

1. Остановите бота
2. Скопируйте файл базы данных в папку `data` через файловый менеджер
3. Обновите переменные окружения, указав новый путь (`/app/data/имя_базы.db`)
4. Запустите бота

## ⚠️ Важные замечания

1. **Не добавляйте папку `data` в Git** — она должна быть в `.gitignore`
2. **Делайте резервные копии** папки `data` регулярно
3. **Проверяйте права доступа** — контейнер должен иметь права на запись в папку `/app/data`
4. **Для MySQL/PostgreSQL** используйте внешние серверы БД или Docker volumes, а не файловую систему контейнера

## 📚 См. также

- [Переменные окружения](environment-variables.md)
- [Быстрый старт](getting-started.md)
- [FAQ](faq.md)

---

**Вопросы?** Обратитесь в поддержку: [@bothostru](https://t.me/bothostru)

