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.
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 |
Восстановление из архива |
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.