Обновлены файлы .dockerignore и .gitignore для добавления исключения salvagebot*.dockerimg. Изменен скрипт сборки в build.cmd для сохранения образа с тегом в формате salvagebot%TAG%.dockerimg. Эти изменения улучшают управление игнорируемыми файлами и обеспечивают корректное сохранение образов Docker.
This commit is contained in:
parent
3b35191ec2
commit
b57b33c7f6
@ -90,3 +90,4 @@ npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
salvagebot
|
||||
salvagebot*.dockerimg
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ wheels/
|
||||
logs/
|
||||
images/
|
||||
salvagebot
|
||||
salvagebot*.dockerimg
|
||||
@ -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
26
create-wiki.cmd
Normal 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
312
wiki/Development.md
Normal 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
167
wiki/Docker-Setup.md
Normal 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
102
wiki/Gitea-Actions.md
Normal 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
86
wiki/Harbor-Registry.md
Normal 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
41
wiki/Home.md
Normal 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
63
wiki/README.md
Normal 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
164
wiki/User-Tracking.md
Normal 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
26
wiki/_Sidebar.md
Normal 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)
|
||||
Loading…
x
Reference in New Issue
Block a user