Обновлены файлы .dockerignore и .gitignore для добавления исключения salvagebot*.dockerimg. Изменен скрипт сборки в build.cmd для сохранения образа с тегом в формате salvagebot%TAG%.dockerimg. Эти изменения улучшают управление игнорируемыми файлами и обеспечивают корректное сохранение образов Docker.

This commit is contained in:
Vlad 2025-06-07 10:19:55 +03:00
parent 3b35191ec2
commit b57b33c7f6
12 changed files with 990 additions and 1 deletions

View File

@ -90,3 +90,4 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
salvagebot
salvagebot*.dockerimg

1
.gitignore vendored
View File

@ -11,3 +11,4 @@ wheels/
logs/
images/
salvagebot
salvagebot*.dockerimg

View File

@ -4,7 +4,7 @@ echo Building with tag: %TAG%
del salvagebot
docker rmi vladsimachkov/salvagebot:%TAG% 2>nul
docker buildx build --no-cache --progress=plain -t vladsimachkov/salvagebot:%TAG% .
docker save vladsimachkov/salvagebot:%TAG% >salvagebot
docker save vladsimachkov/salvagebot:%TAG% >salvagebot%TAG%.dockerimg
#docker tag vladsimachkov/salvagebot:%TAG% reg.ddl.su/salvagedb/salvagenas_filecheker:%TAG%
#docker push reg.ddl.su/salvagedb/salvagenas_filecheker:%TAG%

26
create-wiki.cmd Normal file
View File

@ -0,0 +1,26 @@
@echo off
echo Добавление Wiki файлов в репозиторий...
git add wiki/
git add *.md
git commit -m "Добавлены файлы Wiki для Gitea
- Создана структура wiki с 8 страницами
- Home: главная страница проекта
- Docker-Setup: инструкции по развертыванию
- Gitea-Actions: настройка CI/CD
- Harbor-Registry: конфигурация Docker registry
- Development: руководство для разработчиков
- User-Tracking: система аналитики пользователей
- _Sidebar: навигационное меню
- README: инструкция по переносу в Gitea Wiki
Все MD файлы преобразованы в формат Gitea Wiki с перекрестными ссылками"
echo.
echo ✅ Коммит создан! Теперь выполните:
echo git push origin main
echo.
echo Затем перенесите wiki файлы в Gitea Wiki согласно wiki/README.md
pause

312
wiki/Development.md Normal file
View File

@ -0,0 +1,312 @@
Подробное руководство для разработчиков SalvageDB Telegram Bot.
## Архитектура бота
Бот построен на `aiogram 3.x` с Oracle Database для хранения данных о транспорте.
### Основные компоненты
- **main.py** - основная логика бота (1700+ строк)
- **db.py** - класс для работы с Oracle DB (470+ строк)
- **middlewares/db.py** - middleware для БД подключения
### Схема работы
```
User Input → FSM States → Database Query → Response → Telegram API
```
## Переменные окружения
### Обязательные
```env
BOT_TOKEN=токен_от_BotFather
BOT_NAME=имя_бота
db_user=пользователь_oracle
db_password=пароль_oracle
db_dsn=строка_подключения_oracle
ADMIN_USER_ID=id_администратора
```
### Опциональные
```env
DEBUG=1 # Детальное логирование
DECODE_PRICE=1 # Цена декодирования (звезды)
CHECK_PRICE=10 # Цена проверки salvage (звезды)
IMG_PRICE=100 # Цена фотографий (звезды)
```
## FSM Состояния
```python
class VinStates(StatesGroup):
waiting_for_vin = State() # Ожидание VIN для декодирования
waiting_for_check_vin = State() # Ожидание VIN для проверки salvage
waiting_for_photo_vin = State() # Ожидание VIN для поиска фото
```
### Переходы состояний
- **Start**`waiting_for_vin` (кнопка "Decode VIN")
- **Start**`waiting_for_check_vin` (кнопка "Check VIN")
- **Start**`waiting_for_photo_vin` (кнопка "Car photo")
- **Any State****Start** (кнопка "Back to Main Menu")
## Основные функции
### Системные утилиты
```python
def get_operating_system() -> str:
"""Возвращает: Windows, Linux, macOS или Unknown"""
def is_windows() -> bool:
def is_linux() -> bool:
def is_macos() -> bool:
"""Быстрые проверки ОС"""
def log_system_info():
"""Логирует информацию о системе при запуске"""
```
### Обработка данных
```python
def get_us_state_name(state_code: str) -> str:
"""TX → Texas"""
def format_sale_date(date_str: str) -> str:
"""3/2023 → March 2023"""
def parse_location(location_str: str) -> str:
"""TX/DALLAS → Dallas, Texas"""
def escape_markdown(text: str) -> str:
"""Экранирует Markdown символы"""
```
### Работа с фотографиями
```python
def convert_photo_path(db_path: str) -> str:
"""
Конвертирует путь БД в полный путь с учетом ОС:
Windows: D:\SALVAGEDB\salvagedb_bot\images\20250530\vin\photo.jpg
Linux: /images/20250530/vin/photo.jpg
"""
async def send_vehicle_photos(message, vin, photo_paths, make, model, year):
"""
Отправляет фото группами по 10 штук
- Пауза 0.5 сек между группами
- Обработка ошибок для каждого фото
- Итоговое сообщение с количеством
"""
```
## Callback Handlers
### Навигация
```python
@dp.callback_query(lambda c: c.data == "decode_vin")
async def decode_vin_callback():
"""Переход в состояние waiting_for_vin"""
@dp.callback_query(lambda c: c.data == "check_vin")
async def check_vin_callback():
"""Переход в состояние waiting_for_check_vin"""
@dp.callback_query(lambda c: c.data == "search_car_photo")
async def search_car_photo_callback():
"""Переход в состояние waiting_for_photo_vin"""
@dp.callback_query(lambda c: c.data == "main_menu")
async def main_menu_callback():
"""Возврат в главное меню, очистка состояния"""
```
### Платежи (Telegram Stars)
```python
@dp.callback_query(lambda c: c.data.startswith("pay_detailed_info:"))
async def pay_detailed_info_callback():
"""Payload: detailed_vin_info:{vin}, Цена: DECODE_PRICE"""
@dp.callback_query(lambda c: c.data.startswith("pay_check_detailed:"))
async def pay_check_detailed_callback():
"""Payload: detailed_salvage_check:{vin}, Цена: CHECK_PRICE"""
@dp.callback_query(lambda c: c.data.startswith("pay_photos:"))
async def pay_photos_callback():
"""Payload: vehicle_photos:{vin}, Цена: IMG_PRICE"""
```
## Message Handlers
### Команды
```python
@dp.message(Command("start"))
async def command_start_handler():
"""Главное меню с кнопками:
- Decode VIN
- Check VIN
- Car photo
- Help
"""
@dp.message(Command("admin_stats"))
async def admin_stats_handler():
"""Статистика для администратора (только ADMIN_USER_ID)"""
```
### Обработка VIN
```python
@dp.message(VinStates.waiting_for_vin)
async def process_vin_input():
"""
Декодирование VIN:
1. Валидация VIN (17 символов)
2. Поиск в БД по VIN
3. Базовая информация бесплатно
4. Детальная информация за плату
"""
@dp.message(VinStates.waiting_for_check_vin)
async def process_check_vin_input():
"""
Проверка salvage:
1. Поиск записей о повреждениях
2. Краткая сводка бесплатно
3. Детальная информация за плату
"""
@dp.message(VinStates.waiting_for_photo_vin)
async def process_photo_vin_input():
"""
Поиск фотографий:
1. Поиск фото по VIN в БД
2. Превью количества бесплатно
3. Доступ к фото за плату
"""
```
## База данных (db.py)
### Основные методы
```python
class Database:
async def get_vehicle_info_by_vin(self, vin: str):
"""Базовая информация о транспорте"""
async def get_detailed_vehicle_info(self, vin: str):
"""Детальная информация за плату"""
async def check_salvage_records(self, vin: str):
"""Проверка записей о повреждениях"""
async def get_vehicle_photos(self, vin: str):
"""Получение путей к фотографиям"""
async def save_user(self, user: User, interaction_source: str):
"""Сохранение пользователя для аналитики"""
async def update_user_payment(self, user_id: int, amount: float):
"""Обновление платежных данных"""
```
## Система платежей
### Telegram Stars Integration
```python
# Создание платежа
invoice = LabeledPrice(label=description, amount=price)
await message.answer_invoice(
title=f"Pay {price} ⭐️",
description=description,
payload=payload,
provider_token="", # Telegram Stars
currency="XTR",
prices=[invoice]
)
# Обработка успешного платежа
@dp.pre_checkout_query()
async def pre_checkout_handler(query: PreCheckoutQuery):
await query.answer(ok=True)
@dp.message(ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment_handler(message: Message):
# Обработка по payload
```
## Автоматические пути
Система автоматически определяет пути к изображениям:
```python
# Windows
image_path = "D:\\SALVAGEDB\\salvagedb_bot\\images"
# Linux/Docker
image_path = "/images/"
```
## Развертывание для разработки
### 1. Настройка окружения
```bash
# Установка зависимостей
uv install
# Копирование конфигурации
cp env.example .env
# Отредактируйте .env с вашими данными
```
### 2. Запуск с автоперезагрузкой
```bash
uv run -m watchfiles --filter python 'uv run main.py'
```
### 3. Отладка
```bash
# Включение DEBUG режима
export DEBUG=1
# Проверка подключения к БД
python -c "from db import Database; import asyncio; asyncio.run(Database().test_connection())"
```
## Middleware
### DatabaseMiddleware
```python
# middlewares/db.py
class DatabaseMiddleware:
"""Передает подключение к БД в handlers"""
async def __call__(self, handler, event, data):
data["db"] = Database()
return await handler(event, data)
```
## Структура проекта
```
salvagedb_bot/
├── main.py # Основная логика (1714 строк)
├── db.py # База данных (475 строк)
├── middlewares/
│ └── db.py # Database middleware
├── .gitea/workflows/ # CI/CD конфигурация
├── logs/ # Логи приложения
├── images/ # Фотографии автомобилей
└── requirements.txt # Python зависимости
```
## Связанные страницы
- [[Docker-Setup]] - развертывание в Docker
- [[User-Tracking]] - система аналитики пользователей
- [[Gitea-Actions]] - CI/CD конфигурация

167
wiki/Docker-Setup.md Normal file
View File

@ -0,0 +1,167 @@
Полная инструкция по развертыванию SalvageDB Bot в Docker контейнере.
## Требования
- Docker Engine 20.10+
- Docker Compose 2.0+
- Минимум 512 MB RAM
- Доступ к Oracle Database
## 🚀 Быстрый старт
### 1. Настройка конфигурации
Отредактируйте `docker-compose.yml`, заменив placeholder значения:
```yaml
environment:
# Telegram Bot (обязательно)
- BOT_TOKEN=your_actual_bot_token_here
- ADMIN_USER_ID=your_telegram_user_id
# Oracle Database (обязательно)
- db_user=your_actual_db_user
- db_password=your_actual_db_password
- db_dsn=your_db_host:1521/service_name
```
### 2. Создание директорий
```bash
mkdir -p logs images data
chmod 755 logs images data # Linux/macOS
```
### 3. Запуск
```bash
# Сборка и запуск
docker-compose up --build -d
# Проверка статуса
docker-compose ps
# Просмотр логов
docker-compose logs -f salvagedb-bot
```
## Структура проекта
```
salvagedb_bot/
├── Dockerfile # Docker образ
├── docker-compose.yml # Конфигурация
├── docker-entrypoint.sh # Инициализация
├── main.py # Основной код
├── db.py # Работа с БД
├── logs/ # Логи (volume)
├── images/ # Изображения (volume)
└── data/ # Доп. данные (volume)
```
## Конфигурация переменных
| Переменная | Описание | По умолчанию |
|-----------|----------|--------------|
| `BOT_TOKEN` | Токен от @BotFather | ⚠️ Обязательно |
| `ADMIN_USER_ID` | ID администратора | ⚠️ Обязательно |
| `db_user` | Пользователь Oracle | ⚠️ Обязательно |
| `db_password` | Пароль Oracle | ⚠️ Обязательно |
| `db_dsn` | DSN Oracle | ⚠️ Обязательно |
| `DECODE_PRICE` | Цена декодирования | `1` |
| `CHECK_PRICE` | Цена проверки | `10` |
| `IMG_PRICE` | Цена фото | `100` |
| `DEBUG` | Режим отладки | `0` |
## Управление контейнером
### Основные команды
```bash
# Запуск/остановка
docker-compose up -d
docker-compose down
docker-compose restart
# Логи и мониторинг
docker-compose logs -f salvagedb-bot
docker stats salvagedb-telegram-bot
# Подключение к контейнеру
docker-compose exec salvagedb-bot bash
```
### Обновление
```bash
# Обновить код и пересобрать
git pull
docker-compose down
docker-compose up --build -d
```
## 📊 Логирование
- **Расположение:** `./logs/salvagedb_bot.log`
- **Ротация:** ежедневно
- **Хранение:** 30 дней
- **Формат:** `YYYY-MM-DD HH:MM:SS - module - LEVEL - message`
## Устранение проблем
### Проверка Oracle подключения
```bash
docker-compose exec salvagedb-bot python -c "
import oracledb
import os
try:
conn = oracledb.connect(
user=os.getenv('db_user'),
password=os.getenv('db_password'),
dsn=os.getenv('db_dsn')
)
print('✅ Oracle connection successful!')
conn.close()
except Exception as e:
print(f'❌ Oracle error: {e}')
"
```
### Проверка Telegram бота
```bash
docker-compose exec salvagedb-bot python -c "
import os
import requests
token = os.getenv('BOT_TOKEN')
if token and token != 'your_bot_token_here':
r = requests.get(f'https://api.telegram.org/bot{token}/getMe')
if r.status_code == 200:
print('✅ Bot token valid!')
else:
print('❌ Invalid bot token')
else:
print('❌ Bot token not configured')
"
```
### Часто встречающиеся проблемы
1. **"cx_Oracle не найден"** → переустановите контейнер
2. **"Не удается подключиться к БД"** → проверьте db_dsn формат
3. **"Bot token invalid"** → получите новый токен от @BotFather
4. **"Permission denied"** → проверьте права на logs/data директории
## Безопасность
- ✅ Непривилегированный пользователь в контейнере
- ✅ Изолированная сеть Docker
- ✅ Нет открытых портов
- ✅ Read-only доступ к images
## Связанные страницы
- [[Gitea-Actions]] - автоматическая сборка образов
- [[Harbor-Registry]] - публикация образов
- [[Development]] - разработка и отладка

102
wiki/Gitea-Actions.md Normal file
View File

@ -0,0 +1,102 @@
Система автоматической сборки Docker образов через Gitea Actions.
## Обзор workflow
В проекте настроены четыре workflow для автоматической сборки:
| Workflow | Назначение | Registry |
|----------|------------|----------|
| `docker-build.yml` | Публикация в Docker Hub | docker.io |
| `docker-build-local.yml` | Публикация в Harbor/локальный registry | Настраиваемый |
| `docker-build-test.yml` | Только тестирование сборки | Без registry |
| `pull-request-check.yml` | Проверка Pull Request | Без registry |
## Быстрая настройка
### 1. Включить Actions в Gitea
```ini
# app.ini
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://gitea.com
```
### 2. Настроить Secrets
#### Docker Hub
- `DOCKER_USERNAME` - логин Docker Hub
- `DOCKER_PASSWORD` - токен доступа
#### Harbor/Локальный Registry
- `DOCKER_REGISTRY_URL` - адрес registry (reg.ddl.su)
- `DOCKER_REGISTRY_PROJECT` - проект Harbor (salvage_bot)
- `DOCKER_REGISTRY_USERNAME` - логин (robot account)
- `DOCKER_REGISTRY_PASSWORD` - токен
## Триггеры сборки
### Автоматические
- **Push в main/develop** → создает образы `latest`, `main`, `develop`
- **Теги v*** → создает семантические версии (`1.0.0`, `1.0`, `1`, `latest`)
- **Pull Request** → тестирует сборку, создает тег `pr-XXX`
### Ручной запуск
- Через веб-интерфейс Gitea Actions
- Возможность указать произвольный тег
## Результат сборки
### Docker Hub
```bash
docker.io/YOUR_USERNAME/salvagedb-bot:latest
```
### Harbor Registry
```bash
reg.ddl.su/salvage_bot/salvagedb-bot:latest
```
## Использование образов
### Docker Run
```bash
docker run -d --name salvagedb-bot \
--env-file .env \
reg.ddl.su/salvage_bot/salvagedb-bot:latest
```
### Docker Compose
```yaml
services:
bot:
image: reg.ddl.su/salvage_bot/salvagedb-bot:latest
env_file: .env
restart: unless-stopped
```
## Решение проблем
### "Username and password required"
1. Проверьте настройку всех необходимых secrets
2. Убедитесь в правильности имен secrets
3. Используйте robot account для Harbor
### Ошибки авторизации Harbor
1. Создайте robot account в Harbor UI
2. Используйте формат `robot$username`
3. Проверьте права на Push Artifact
### Проблемы сборки
1. Используйте `docker-build-test.yml` для локального тестирования
2. Проверьте валидность Dockerfile
3. При необходимости обратитесь к [[Harbor-Registry]]
## Дополнительные возможности
- ✅ **Кэширование Docker слоев**
- ✅ **Мультиплатформенная сборка** (Docker Hub)
- ✅ **Валидация безопасности**
- ✅ **Автоматическое тестирование**
Подробная конфигурация описана в [[Harbor-Registry]].

86
wiki/Harbor-Registry.md Normal file
View File

@ -0,0 +1,86 @@
Настройка Harbor Docker Registry для Gitea Actions.
## Быстрая настройка
### 1. Создание Robot Account
1. Откройте Harbor UI: `https://reg.ddl.su`
2. Войдите в проект `salvage_bot`
3. Перейдите **Robot Accounts** → **New Robot Account**
4. Настройте:
- **Name**: `gitea-ci`
- **Expiration**: выберите срок
- **Permissions**: `Push Artifact` + `Pull Artifact`
5. Скопируйте:
- **Username**: `robot$gitea-ci`
- **Token**: сгенерированный токен
### 2. Настройка Secrets в Gitea
```
DOCKER_REGISTRY_URL = reg.ddl.su
DOCKER_REGISTRY_PROJECT = salvage_bot
DOCKER_REGISTRY_USERNAME = robot$gitea-ci
DOCKER_REGISTRY_PASSWORD = <токен robot account>
```
### 3. Результат
После настройки образы будут доступны:
```bash
reg.ddl.su/salvage_bot/salvagedb-bot:latest
```
## Формат тегов Harbor
Harbor использует трёхуровневую структуру:
```
registry_url/project/repository:tag
```
### Примеры:
- `reg.ddl.su/salvage_bot/salvagedb-bot:latest`
- `reg.ddl.su/salvage_bot/salvagedb-bot:v1.0.0`
- `reg.ddl.su/salvage_bot/salvagedb-bot:main`
## Устранение проблем
### Ошибка 400 Bad Request при OAuth
**Причины:**
- Неправильный формат username (должен начинаться с `robot$`)
- Некорректный токен robot account
- Отсутствие PROJECT_NAME в пути тега
- Отсутствие прав на проект
**Решение:**
1. Убедитесь что username в формате `robot$name`
2. Проверьте корректность токена
3. Убедитесь что настроен `DOCKER_REGISTRY_PROJECT`
4. Проверьте права robot account в Harbor
### Ошибка 403 Forbidden
- Robot account не имеет прав Push Artifact
- Проект недоступен для robot account
### Проверка доступности
```bash
# Локальный тест
docker login reg.ddl.su -u robot$gitea-ci
# Pull тест
docker pull reg.ddl.su/salvage_bot/salvagedb-bot:latest
```
## Преимущества Robot Account
- ✅ **Безопасность** - ограниченные права только на CI/CD
- ✅ **Изоляция** - можно отозвать без влияния на основной аккаунт
- ✅ **Аудит** - чёткое разграничение доступа
- ✅ **Автоматизация** - создан специально для CI/CD
## Связанные страницы
- [[Gitea-Actions]] - настройка CI/CD workflow
- [[Docker-Setup]] - развертывание с Docker

41
wiki/Home.md Normal file
View File

@ -0,0 +1,41 @@
# SalvageDB Bot - Telegram бот для проверки VIN номеров
Telegram бот для проверки и декодирования VIN номеров автомобилей с интеграцией Oracle database.
## Основные возможности
- 🔍 **Проверка VIN номеров** - валидация и декодирование
- 📊 **Статистика использования** - трекинг пользователей и запросов
- 🚗 **Поиск фотографий** - интеграция с внешними сервисами
- 👨‍💼 **Админ панель** - управление и мониторинг
- 🔐 **Авторизация** - система ролей и доступов
## Быстрый старт
### Разработка
```bash
uv run -m watchfiles --filter python 'uv run main.py'
```
Бот будет автоматически перезапускаться при изменении исходных файлов.
### Продакшн (Docker)
```bash
docker-compose up -d
```
## Структура документации
- **[[Gitea-Actions]]** - настройка CI/CD автоматизации
- **[[Harbor-Registry]]** - конфигурация Docker registry
- **[[Docker-Setup]]** - развертывание с помощью Docker
- **[[User-Tracking]]** - система отслеживания пользователей
- **[[Development]]** - руководство для разработчиков
## Технологии
- **Python 3.12+** - основной язык разработки
- **aiogram 3.x** - Telegram Bot API
- **Oracle Database** - хранение данных
- **Docker** - контейнеризация
- **Gitea Actions** - CI/CD pipeline

63
wiki/README.md Normal file
View File

@ -0,0 +1,63 @@
# Перенос в Gitea Wiki
## Инструкция по переносу
### 1. Включить Wiki в Gitea
В настройках репозитория:
1. Перейдите в **Settings** → **Features**
2. Включите **Enable Wiki**
3. Сохраните настройки
### 2. Создать страницы
В разделе **Wiki** создайте следующие страницы:
| Файл | Название страницы | Описание |
|------|-------------------|----------|
| `Home.md` | **Home** | Главная страница |
| `Docker-Setup.md` | **Docker-Setup** | Развертывание Docker |
| `Gitea-Actions.md` | **Gitea-Actions** | CI/CD настройка |
| `Harbor-Registry.md` | **Harbor-Registry** | Harbor конфигурация |
| `Development.md` | **Development** | Руководство разработчика |
| `User-Tracking.md` | **User-Tracking** | Система аналитики |
| `_Sidebar.md` | **_Sidebar** | Боковое меню |
### 3. Скопировать содержимое
Для каждой страницы:
1. Откройте соответствующий файл из папки `wiki/`
2. Скопируйте содержимое
3. Вставьте в новую страницу Wiki
4. Сохраните
### 4. Настроить навигацию
- Страница `_Sidebar` создаст боковое меню навигации
- Ссылки [[Page-Name]] автоматически ведут на соответствующие страницы
- Внешние ссылки остаются как обычные markdown ссылки
### 5. Удалить временные файлы
После переноса можно удалить папку `wiki/` и старые MD файлы:
```bash
rm -rf wiki/
rm README_*.md HARBOR_*.md TEST_*.md read_dev.md
```
## Особенности Gitea Wiki
- ✅ Поддерживает стандартный Markdown
- ✅ Автоматические ссылки между страницами
- ✅ История изменений
- ✅ Поиск по содержимому
- ✅ Права доступа как у репозитория
## Результат
После переноса получите полноценную Wiki с:
- 📖 Структурированной документацией
- 🔍 Удобной навигацией
- 🔗 Перекрестными ссылками
- 📱 Адаптивным интерфейсом

164
wiki/User-Tracking.md Normal file
View File

@ -0,0 +1,164 @@
Система полного учета пользователей Telegram бота в соответствии с требованиями KYC.
## Обзор системы
Отслеживает взаимодействия пользователей, финансовые операции и предоставляет аналитику для администратора.
## Что отслеживается
### 👤 Данные пользователя
- **ID пользователя** (уникальный 64-bit)
- **Имя и фамилия**
- **Username** (если есть)
- **Код языка** (IETF)
- **Статус Premium** в Telegram
- **Флаг бота** (различение ботов/пользователей)
### 💬 Взаимодействия
- **Первое взаимодействие** (дата)
- **Последнее взаимодействие** (дата)
- **Количество взаимодействий**
- **Источник регистрации** (команда/кнопка)
### 💰 Финансы
- **Общая сумма платежей** (Telegram Stars)
- **Количество успешных платежей**
- **История транзакций**
## Структура БД
Таблица `bot_users` с основными полями:
| Поле | Тип | Описание |
|------|-----|----------|
| `id` | NUMBER(19) | Telegram user ID |
| `first_name` | VARCHAR2(256) | Имя пользователя |
| `username` | VARCHAR2(128) | Username |
| `total_payments` | NUMBER(10,2) | Сумма платежей |
| `interaction_count` | NUMBER(10) | Число взаимодействий |
| `last_interaction_date` | DATE | Последняя активность |
## Развертывание
### 1. Создание таблицы
```sql
sqlplus username/password@database @create_users_table.sql
```
### 2. Настройка переменных
```env
# Oracle Database
db_user=your_oracle_user
db_password=your_oracle_password
db_dsn=your_oracle_dsn
# Админ для статистики
ADMIN_USER_ID=123456789
```
### 3. Интеграция
Код уже интегрирован:
- `main.py` - обработчики событий
- `db.py` - методы работы с БД
- Автоматическое сохранение при взаимодействиях
## Команды администратора
### `/admin_stats` - Статистика пользователей
```
📊 Bot Users Statistics
👥 Users Overview:
• Total users: 1,234
• Premium users: 156
💰 Revenue:
• Total revenue: 567 ⭐️
• Total transactions: 445
📈 Activity:
• Active last 24h: 89
• Active last week: 234
```
## API методы
### Основные функции
```python
# Сохранение пользователя
await db.save_user(user: User, interaction_source: str = "bot")
# Обновление платежных данных
await db.update_user_payment(user_id: int, payment_amount: float)
# Статистика пользователя
await db.get_user_stats(user_id: int)
# Общая статистика
await db.get_users_summary()
```
## Автоматическое отслеживание
Система сохраняет данные при:
- ✅ Команде `/start`
- ✅ Нажатии кнопок меню
- ✅ Обработке VIN номеров
- ✅ Совершении платежей
- ✅ Любых взаимодействиях с ботом
## Полезные SQL запросы
### Топ пользователей по платежам
```sql
SELECT first_name, username, total_payments, successful_payments_count
FROM bot_users
WHERE total_payments > 0
ORDER BY total_payments DESC
FETCH FIRST 10 ROWS ONLY;
```
### Активные за месяц
```sql
SELECT COUNT(*) as active_users
FROM bot_users
WHERE last_interaction_date >= SYSDATE - 30
AND is_active = 1;
```
### Конверсия в платежи
```sql
SELECT
COUNT(*) as total_users,
COUNT(CASE WHEN successful_payments_count > 0 THEN 1 END) as paying_users,
ROUND(COUNT(CASE WHEN successful_payments_count > 0 THEN 1 END) * 100.0 / COUNT(*), 2) as conversion_rate
FROM bot_users
WHERE is_active = 1;
```
## Безопасность и соответствие
### GDPR/Персональные данные
- 🔒 Только данные из Telegram API
- 🔒 Использование только для сервиса
- 🔒 Возможность деактивации пользователей
### Финансовая отчетность
- 📊 Логирование всех платежей
- 📊 Связь платежей с пользователями
- 📊 Генерация отчетов
### Мониторинг
- 👁️ Отслеживание активности
- 👁️ Выявление подозрительной активности
- 👁️ Бизнес-аналитика
## Связанные страницы
- [[Home]] - общая информация о боте
- [[Development]] - разработка и отладка

26
wiki/_Sidebar.md Normal file
View File

@ -0,0 +1,26 @@
**📖 SalvageDB Bot Wiki**
---
**🏠 Общее**
- [[Home|🏠 Главная]]
---
**🚀 Развертывание**
- [[Docker-Setup|🐳 Docker Setup]]
- [[Gitea-Actions|⚙️ CI/CD Actions]]
- [[Harbor-Registry|🏗️ Harbor Registry]]
---
**👨‍💻 Разработка**
- [[Development|💻 Development]]
- [[User-Tracking|📊 User Analytics]]
---
**🔗 Внешние ссылки**
- [GitHub Repository](https://gitee.ddl.su/vlad/savagedb_bot)
- [Harbor Registry](https://reg.ddl.su)
- [Docker Hub](https://hub.docker.com)