Обновлены файлы .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-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
salvagebot
|
salvagebot
|
||||||
|
salvagebot*.dockerimg
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ wheels/
|
|||||||
logs/
|
logs/
|
||||||
images/
|
images/
|
||||||
salvagebot
|
salvagebot
|
||||||
|
salvagebot*.dockerimg
|
||||||
@ -4,7 +4,7 @@ echo Building with tag: %TAG%
|
|||||||
del salvagebot
|
del salvagebot
|
||||||
docker rmi vladsimachkov/salvagebot:%TAG% 2>nul
|
docker rmi vladsimachkov/salvagebot:%TAG% 2>nul
|
||||||
docker buildx build --no-cache --progress=plain -t vladsimachkov/salvagebot:%TAG% .
|
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 tag vladsimachkov/salvagebot:%TAG% reg.ddl.su/salvagedb/salvagenas_filecheker:%TAG%
|
||||||
#docker push 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