Files
TG_autoposter/docs/DEPLOYMENT.md
2025-12-18 05:55:32 +09:00

410 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Развертывание 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
- [ ] Логирование работает
- [ ] Бэкапы настроены
- [ ] Мониторинг на месте
- [ ] Обновления могут быть применены
- [ ] Есть план восстановления после сбоя
- [ ] Документация актуальна
---
**Успешного развертывания!** 🚀