diff --git a/.dockerignore b/.dockerignore index 74fded6..cbde136 100644 --- a/.dockerignore +++ b/.dockerignore @@ -90,3 +90,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* salvagebot +salvagebot*.dockerimg \ No newline at end of file diff --git a/.gitignore b/.gitignore index 410367e..2c4ef30 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ wheels/ logs/ images/ salvagebot +salvagebot*.dockerimg \ No newline at end of file diff --git a/build.cmd b/build.cmd index 28106a9..8d82650 100644 --- a/build.cmd +++ b/build.cmd @@ -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% \ No newline at end of file diff --git a/create-wiki.cmd b/create-wiki.cmd new file mode 100644 index 0000000..ad8323b --- /dev/null +++ b/create-wiki.cmd @@ -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 \ No newline at end of file diff --git a/wiki/Development.md b/wiki/Development.md new file mode 100644 index 0000000..9abf9e3 --- /dev/null +++ b/wiki/Development.md @@ -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 конфигурация \ No newline at end of file diff --git a/wiki/Docker-Setup.md b/wiki/Docker-Setup.md new file mode 100644 index 0000000..1239791 --- /dev/null +++ b/wiki/Docker-Setup.md @@ -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]] - разработка и отладка \ No newline at end of file diff --git a/wiki/Gitea-Actions.md b/wiki/Gitea-Actions.md new file mode 100644 index 0000000..c7858f2 --- /dev/null +++ b/wiki/Gitea-Actions.md @@ -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]]. \ No newline at end of file diff --git a/wiki/Harbor-Registry.md b/wiki/Harbor-Registry.md new file mode 100644 index 0000000..e831e5f --- /dev/null +++ b/wiki/Harbor-Registry.md @@ -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 \ No newline at end of file diff --git a/wiki/Home.md b/wiki/Home.md new file mode 100644 index 0000000..7a8abaf --- /dev/null +++ b/wiki/Home.md @@ -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 \ No newline at end of file diff --git a/wiki/README.md b/wiki/README.md new file mode 100644 index 0000000..01e18f4 --- /dev/null +++ b/wiki/README.md @@ -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 с: +- 📖 Структурированной документацией +- 🔍 Удобной навигацией +- 🔗 Перекрестными ссылками +- 📱 Адаптивным интерфейсом \ No newline at end of file diff --git a/wiki/User-Tracking.md b/wiki/User-Tracking.md new file mode 100644 index 0000000..93a3fbe --- /dev/null +++ b/wiki/User-Tracking.md @@ -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]] - разработка и отладка \ No newline at end of file diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md new file mode 100644 index 0000000..4f6cc08 --- /dev/null +++ b/wiki/_Sidebar.md @@ -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) \ No newline at end of file