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