# TG Poster Bot Бот для конструирования сообщений (текст + фото/видео/анимация) и отправки в выбранные группы/каналы. Привязка чатов — вручную: пользователь добавляет бота в чат, затем в ЛС выполняет `/add_group` и вставляет chat_id или пересылает сообщение из чата. ## Стек - Python 3.12 - python-telegram-bot v21 - SQLAlchemy 2.x - Alembic - Docker & Compose - Drone CI pipeline ## Быстрый старт (локально с Docker) 1. Скопируйте `.env.example` в `.env` и заполните `BOT_TOKEN` (получите у @BotFather). 2. Запустите: ```bash docker compose up --build ``` 3. Бот сам применит миграции и запустится. ## Команды бота - `/add_group` — привязать группу/канал (вставьте chat_id `-100...` или перешлите сообщение из чата) - `/groups` — список привязанных чатов и признак права публикации - `/new` — создать черновик, затем отправить его в выбранный чат - `/help` — краткая справка ## Миграции Alembic уже настроен. Первичная ревизия `0001_init` добавлена. В контейнере миграции запускаются автоматически в `entrypoint.sh`. Локально: ```bash # создать новую ревизию alembic revision -m "feature: add something" # применить миграции alembic upgrade head # откатиться alembic downgrade -1 ``` ## Настройка Drone CI - В секретах репозитория создайте: - `docker_username` - `docker_password` - `docker_repo` (например, `registry.example.com/namespace/tg-poster-bot`) - (Опционально для деплоя) `ssh_host`, `ssh_user`, `ssh_key`, `ssh_port`, и переменная окружения `DEPLOY_DIR` в настройках репозитория. ## Структура проекта ``` app/ bot/ handlers/ # команды и коллбэки keyboards/ # inline-клавиатуры messages.py # текстовые константы db/ base.py # Base = declarative_base() session.py # движок и SessionLocal models.py # модели migrations/ # alembic (env.py, versions/...) main.py # точка входа alembic.ini docker-compose.yml Dockerfile entrypoint.sh requirements.txt ``` ## Заметки - Для каналов бот должен быть администратором с правом «Публиковать сообщения». - `DATABASE_URL` имеет приоритет перед параметрами `DB_*`. - В проде используйте внешнюю БД (RDS и т.п.) и секреты.