9.3 KiB
9.3 KiB
Развертывание TG Autoposter
Локальное развертывание (Development)
1. Установка
# Клонировать
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. Конфигурация
cp .env.example .env
# Отредактировать .env с вашим токеном
3. Запуск
python main.py
Развертывание на Linux сервер (Production)
1. Подготовка сервера
# Обновить систему
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. Установка приложения
# Клонировать репозиторий
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)
# Создать БД
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:
[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
Запустить сервис:
sudo systemctl daemon-reload
sudo systemctl enable tg-autoposter
sudo systemctl start tg-autoposter
sudo systemctl status tg-autoposter
5. Логирование
Логи сохраняются в logs/ директорию. Для просмотра:
# Последние 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
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
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
docker-compose up -d
docker-compose logs -f bot
Мониторинг
Health Check
Добавить в systemd сервис или cron:
#!/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 метрики (опционально)
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()
Бэкапы
Бэкап БД
#!/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:
crontab -e
# Ежедневный бэкап в 02:00
0 2 * * * /home/tg_bot/backup.sh
Обновление
# Получить обновления
git pull origin main
# Установить новые зависимости
source venv/bin/activate
pip install -r requirements.txt
# Перезагрузить сервис
sudo systemctl restart tg-autoposter
Проблемы и решения
Бот падает при запуске
# Проверить ошибки
python main.py
# Проверить логи
tail -100 logs/bot_*.log
# Проверить токен
grep TELEGRAM_BOT_TOKEN .env
Много ошибок в логах
# Увеличить уровень логирования
# В .env: LOG_LEVEL=DEBUG
# Перезапустить
sudo systemctl restart tg-autoposter
sudo journalctl -u tg-autoposter -f
БД заполняется
# Проверить размер
ls -lh autoposter.db
# Очистить старые данные
python cli.py db reset
# Или вручную в PostgreSQL
Бот не отправляет сообщения
# Проверить что бот работает
systemctl status tg-autoposter
# Проверить группы
python cli.py group list
# Проверить сообщения
python cli.py message list
# Проверить права (может токен протух?)
# Получить новый от @BotFather
Оптимизация для Production
-
Используйте PostgreSQL вместо SQLite
- Лучше для concurrency
- Лучше для бэкапов
- Быстрее с большими данными
-
Настройте logging
- Отправлять в централизованное хранилище
- Настроить rotation
- Мониторить ошибки
-
Добавьте мониторинг
- Prometheus/Grafana
- ELK Stack для логов
- Alerts на критические ошибки
-
Оптимизируйте БД
- Индексы на часто используемые поля
- Connection pooling
- Regular vacuum (PostgreSQL)
-
Безопасность
- Используйте переменные окружения
- Не коммитьте .env
- Обновляйте зависимости
- Используйте firewall
Масштабирование
Для больших рассылок
Используйте Queue (Celery):
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
- Логирование работает
- Бэкапы настроены
- Мониторинг на месте
- Обновления могут быть применены
- Есть план восстановления после сбоя
- Документация актуальна
Успешного развертывания! 🚀