init commit
This commit is contained in:
409
docs/DEPLOYMENT.md
Normal file
409
docs/DEPLOYMENT.md
Normal 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
|
||||
- [ ] Логирование работает
|
||||
- [ ] Бэкапы настроены
|
||||
- [ ] Мониторинг на месте
|
||||
- [ ] Обновления могут быть применены
|
||||
- [ ] Есть план восстановления после сбоя
|
||||
- [ ] Документация актуальна
|
||||
|
||||
---
|
||||
|
||||
**Успешного развертывания!** 🚀
|
||||
Reference in New Issue
Block a user