init commit

This commit is contained in:
2025-12-18 05:55:32 +09:00
commit a6817e487e
72 changed files with 13847 additions and 0 deletions

409
docs/DEPLOYMENT.md Normal file
View File

@@ -0,0 +1,409 @@
# Развертывание TG Autoposter
## Локальное развертывание (Development)
### 1. Установка
```bash
# Клонировать
git clone <repo_url>
cd TG_autoposter
# Создать виртуальное окружение
python -m venv venv
source venv/bin/activate # Linux/macOS
# или
venv\Scripts\activate # Windows
# Установить зависимости
pip install -r requirements.txt
```
### 2. Конфигурация
```bash
cp .env.example .env
# Отредактировать .env с вашим токеном
```
### 3. Запуск
```bash
python main.py
```
## Развертывание на Linux сервер (Production)
### 1. Подготовка сервера
```bash
# Обновить систему
sudo apt update && sudo apt upgrade -y
# Установить Python 3.10+
sudo apt install python3.10 python3.10-venv python3.10-dev -y
# Установить PostgreSQL (опционально)
sudo apt install postgresql postgresql-contrib -y
# Создать пользователя для бота
sudo useradd -m -s /bin/bash tg_bot
sudo su - tg_bot
```
### 2. Установка приложения
```bash
# Клонировать репозиторий
git clone <repo_url>
cd TG_autoposter
# Создать виртуальное окружение
python3.10 -m venv venv
source venv/bin/activate
# Установить зависимости
pip install -r requirements.txt
pip install gunicorn # Если нужен HTTP сервер
```
### 3. Настройка БД (PostgreSQL)
```bash
# Создать БД
sudo -u postgres createdb autoposter_db
sudo -u postgres createuser autoposter_user
# Установить пароль
sudo -u postgres psql
postgres=# ALTER USER autoposter_user WITH PASSWORD 'strong_password';
postgres=# GRANT ALL PRIVILEGES ON DATABASE autoposter_db TO autoposter_user;
postgres=# \q
# В .env установить:
# DATABASE_URL=postgresql+asyncpg://autoposter_user:strong_password@localhost/autoposter_db
```
### 4. Systemd сервис
Создать `/etc/systemd/system/tg-autoposter.service`:
```ini
[Unit]
Description=Telegram Autoposter Bot
After=network.target
[Service]
Type=simple
User=tg_bot
WorkingDirectory=/home/tg_bot/TG_autoposter
Environment="PATH=/home/tg_bot/TG_autoposter/venv/bin"
ExecStart=/home/tg_bot/TG_autoposter/venv/bin/python main.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Запустить сервис:
```bash
sudo systemctl daemon-reload
sudo systemctl enable tg-autoposter
sudo systemctl start tg-autoposter
sudo systemctl status tg-autoposter
```
### 5. Логирование
Логи сохраняются в `logs/` директорию. Для просмотра:
```bash
# Последние 100 строк
tail -100 logs/bot_*.log
# В реальном времени
tail -f logs/bot_*.log
# Поиск ошибок
grep ERROR logs/bot_*.log
# Через journalctl
sudo journalctl -u tg-autoposter -f
```
## Развертывание с Docker
### 1. Dockerfile
```dockerfile
FROM python:3.10-slim
WORKDIR /app
# Установить зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Скопировать приложение
COPY . .
# Создать директорию для логов
RUN mkdir -p logs
# Запустить бота
CMD ["python", "main.py"]
```
### 2. docker-compose.yml
```yaml
version: '3.8'
services:
bot:
build: .
container_name: tg_autoposter
environment:
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
DATABASE_URL: postgresql+asyncpg://autoposter:password@db:5432/autoposter_db
depends_on:
- db
volumes:
- ./logs:/app/logs
restart: unless-stopped
db:
image: postgres:15
container_name: tg_autoposter_db
environment:
POSTGRES_DB: autoposter_db
POSTGRES_USER: autoposter
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
db_data:
```
### 3. Запуск с Docker
```bash
docker-compose up -d
docker-compose logs -f bot
```
## Мониторинг
### Health Check
Добавить в systemd сервис или cron:
```bash
#!/bin/bash
# check_bot.sh
# Проверить что процесс работает
if ! pgrep -f "python main.py" > /dev/null; then
echo "Bot is down! Restarting..."
sudo systemctl restart tg-autoposter
# Отправить алерт (опционально)
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Bot restarted at '$(date)'"}' \
$WEBHOOK_URL
fi
```
### Prometheus метрики (опционально)
```python
from prometheus_client import Counter, Histogram, start_http_server
# Метрики
messages_sent = Counter('messages_sent_total', 'Total messages sent')
send_duration = Histogram('message_send_duration_seconds', 'Time to send message')
# В обработчике:
with send_duration.time():
await bot.send_message(...)
messages_sent.inc()
```
## Бэкапы
### Бэкап БД
```bash
#!/bin/bash
# backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/autoposter"
mkdir -p $BACKUP_DIR
# SQLite
if [ -f "autoposter.db" ]; then
cp autoposter.db $BACKUP_DIR/autoposter_$DATE.db
fi
# PostgreSQL
pg_dump -U autoposter autoposter_db > $BACKUP_DIR/autoposter_$DATE.sql
# Удалить старые бэкапы (старше 30 дней)
find $BACKUP_DIR -name "*.db" -mtime +30 -delete
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR/autoposter_$DATE.*"
```
Добавить в crontab:
```bash
crontab -e
# Ежедневный бэкап в 02:00
0 2 * * * /home/tg_bot/backup.sh
```
## Обновление
```bash
# Получить обновления
git pull origin main
# Установить новые зависимости
source venv/bin/activate
pip install -r requirements.txt
# Перезагрузить сервис
sudo systemctl restart tg-autoposter
```
## Проблемы и решения
### Бот падает при запуске
```bash
# Проверить ошибки
python main.py
# Проверить логи
tail -100 logs/bot_*.log
# Проверить токен
grep TELEGRAM_BOT_TOKEN .env
```
### Много ошибок в логах
```bash
# Увеличить уровень логирования
# В .env: LOG_LEVEL=DEBUG
# Перезапустить
sudo systemctl restart tg-autoposter
sudo journalctl -u tg-autoposter -f
```
### БД заполняется
```bash
# Проверить размер
ls -lh autoposter.db
# Очистить старые данные
python cli.py db reset
# Или вручную в PostgreSQL
```
### Бот не отправляет сообщения
```bash
# Проверить что бот работает
systemctl status tg-autoposter
# Проверить группы
python cli.py group list
# Проверить сообщения
python cli.py message list
# Проверить права (может токен протух?)
# Получить новый от @BotFather
```
## Оптимизация для Production
1. **Используйте PostgreSQL вместо SQLite**
- Лучше для concurrency
- Лучше для бэкапов
- Быстрее с большими данными
2. **Настройте logging**
- Отправлять в централизованное хранилище
- Настроить rotation
- Мониторить ошибки
3. **Добавьте мониторинг**
- Prometheus/Grafana
- ELK Stack для логов
- Alerts на критические ошибки
4. **Оптимизируйте БД**
- Индексы на часто используемые поля
- Connection pooling
- Regular vacuum (PostgreSQL)
5. **Безопасность**
- Используйте переменные окружения
- Не коммитьте .env
- Обновляйте зависимости
- Используйте firewall
## Масштабирование
### Для больших рассылок
Используйте Queue (Celery):
```bash
pip install celery redis
# Добавить в app/__init__.py
from celery import Celery
celery_app = Celery('autoposter')
celery_app.config_from_object('celeryconfig')
# Использовать:
send_message.delay(message_id, group_ids)
```
### Для высоконагруженных систем
- Используйте Webhook вместо Polling
- Добавьте кэш (Redis)
- Горизонтальное масштабирование с Load Balancer
- Нескольких воркеров (Celery)
## Контрольный список
- [ ] Сервер подготовлен (Python, зависимости)
- [ ] БД настроена (SQLite или PostgreSQL)
- [ ] .env файл с токеном
- [ ] Сервис запущен через systemd
- [ ] Логирование работает
- [ ] Бэкапы настроены
- [ ] Мониторинг на месте
- [ ] Обновления могут быть применены
- [ ] Есть план восстановления после сбоя
- [ ] Документация актуальна
---
**Успешного развертывания!** 🚀