Skip to content

network-user/DotWorkBot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

.работа

Python 3.12 Platform Category 11k+ lines of code

DotWorkBot

security audit passed - medium, leaks + code audit date

Telegram-бот для подбора разовой рабочей силы: работодатели публикуют заказы, работники их берут, администраторы модерируют платформу. Заказ проходит полный цикл - открыт, в работе, подтверждение выхода, завершён и оценка работника, - а напоминания, авто-закрытие просроченных заказов и резервные копии вынесены в отдельный taskiq-воркер с лидер-блокировкой через Redis. Разворачивается одним docker compose up: бот, воркер, PostgreSQL, Redis и MinIO для фото заказов.

Что внутри

  • Три роли. Работник (регистрация через бота), работодатель (создаётся админом), администратор (по ADMIN_IDS). Роль определяется при первом /start.
  • Жизненный цикл заказа. Четыре статуса - open, in_progress, completed, cancelled; мультислот-назначения (один работник может занять несколько слотов / привести команду); оценка работника 1-5 после завершения.
  • Подтверждение выхода. За PRE_START_CONFIRM_HOURS часов до старта воркер шлёт напоминание неподтвердившимся работникам; просроченные заказы закрываются автоматически.
  • Фото заказов в MinIO. S3-совместимое хранилище с публичными ссылками; алиасы S3_* позволяют переключиться на AWS S3 без правок кода.
  • Админ-панель. Управление пользователями (бан/разбан), просмотр всех заказов, массовые рассылки с историей в БД, агрегированная статистика.
  • Резервное копирование. Ежедневные зашифрованные (AES-Zip) дампы Postgres, еженедельная доставка архива в Telegram, ретенция и дедуп через Redis-маркеры.
  • 67 тестов pytest, порог покрытия 90% на ядре; 11 миграций Alembic применяются автоматически при старте.

Запуск

cp .env.example .env
# заполни .env своими значениями

docker compose up -d

Бот, taskiq-воркер, PostgreSQL, Redis и MinIO поднимаются вместе; миграции применяются автоматически при старте контейнера bot (docker-entrypoint.sh). Консоль MinIO - 127.0.0.1:9011, Portainer - :9000.

Локально (без Docker)

python -m venv .venv
.venv\Scripts\activate        # Windows; Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt

cp .env.example .env          # укажи POSTGRES_HOST=localhost
alembic upgrade head
python main.py

Команды

Команда Назначение
docker compose up -d Поднять стек: bot, taskiq, postgres, redis, minio
docker compose exec bot alembic upgrade head Применить миграции
docker compose exec bot alembic revision --autogenerate -m "..." Создать миграцию по изменённым моделям
python main.py Локальный запуск polling
taskiq worker app.core.tkq:broker Фоновый воркер (напоминания, авто-закрытие, бэкапы)
pytest -q Тесты с покрытием (порог 90% на ядре)
pytest -q --no-cov Тесты без проверки покрытия
bash scripts/deploy.sh main Деплой на сервере из ветки
bash scripts/backup_now.sh Ручной бэкап
bash scripts/restore_backup.sh Восстановление из архива

Стек

Python aiogram SQLAlchemy PostgreSQL Alembic Redis MinIO taskiq Pydantic Docker pytest GitHub Actions

Тесты

pytest -q            # 67 тестов, порог покрытия 90% на ядре
pytest -q --no-cov   # быстро, без проверки покрытия

CI (.github/workflows/ci.yml) на каждый PR в main гоняет pytest и сборку Docker-образа. Деплой - .github/workflows/deploy.yml (SSH + scripts/deploy.sh).

Архитектура

aiogram-роутеры разнесены по ролям (worker / employer / admin); входящие апдейты проходят через outer-middleware БД-сессии, throttling и проверку бана. Доступ к данным - только через репозитории app/database/storage, бизнес-правила по времени и статусам - в app/services/operational_control. Главный процесс (main.py) держит лишь polling; всё фоновое (напоминания, авто-закрытие, бэкапы) живёт в taskiq-воркере, где единственность исполнения гарантирует Redis-лок лидера.

DotWorkBot/
├── main.py                  # polling, graceful shutdown
├── app/
│   ├── bot.py               # Dispatcher, middleware, FSM (Redis | Memory)
│   ├── config.py            # pydantic-settings, env
│   ├── core/
│   │   ├── logging.py       # structlog
│   │   └── tkq.py           # taskiq broker, фоновые циклы + лидер-лок
│   ├── alembic/             # 11 миграций
│   ├── database/
│   │   ├── models/          # user, order, order_assignment, worker_rating, broadcast
│   │   └── storage/         # репозитории (user, order, rating, broadcast)
│   ├── filters/             # IsAdmin / IsWorker / IsEmployer
│   ├── middlewares/         # db-сессия, throttling, бан
│   ├── handlers/
│   │   ├── worker/          # меню, заказы, профиль
│   │   ├── employer/        # меню, создание заказов
│   │   └── admin/           # пользователи, заказы, рассылки, статистика, бэкапы
│   ├── keyboards/           # reply + inline
│   ├── services/            # уведомления, MinIO, бэкапы, operational_control
│   └── states/              # FSM StatesGroup
├── scripts/                 # deploy, backup_now, restore_backup, setup_server
├── docker-compose.yml       # bot, taskiq, postgres, redis, minio, portainer
└── Dockerfile
  • main.py - только polling. Фоновая работа вынесена в taskiq-воркер, иначе она дублировалась бы на каждой реплике.
  • Лидер-лок в Redis (PERIODIC_LOCK_KEY, backup-маркеры) - один исполнитель периодических задач на весь кластер.
  • БД - через репозитории app/database/storage, хендлеры не обращаются к сессии напрямую.
  • Хранилище фото абстрагировано свойствами storage_* в config: MinIO или любой S3 по алиасам S3_*.
  • Миграции запускает только контейнер bot (entrypoint); воркер их не применяет.
  • Бэкапы шифруются (AES-Zip, pyzipper); пароль архива - в BACKUP_ARCHIVE_PASSWORD, не в коде.

Подробнее: деплой - DEPLOY.md, резервное копирование - BACKUP.md.

Лицензия

© 2026 DotCore. Все права защищены.

Проприетарный код. Использование, копирование, изменение и распространение запрещены без письменного разрешения автора. Исходный код открыт только для ознакомления. См. LICENSE.

About

No description or website provided.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages