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

9.3 KiB
Raw Blame History

Развертывание 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

  1. Используйте PostgreSQL вместо SQLite

    • Лучше для concurrency
    • Лучше для бэкапов
    • Быстрее с большими данными
  2. Настройте logging

    • Отправлять в централизованное хранилище
    • Настроить rotation
    • Мониторить ошибки
  3. Добавьте мониторинг

    • Prometheus/Grafana
    • ELK Stack для логов
    • Alerts на критические ошибки
  4. Оптимизируйте БД

    • Индексы на часто используемые поля
    • Connection pooling
    • Regular vacuum (PostgreSQL)
  5. Безопасность

    • Используйте переменные окружения
    • Не коммитьте .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
  • Логирование работает
  • Бэкапы настроены
  • Мониторинг на месте
  • Обновления могут быть применены
  • Есть план восстановления после сбоя
  • Документация актуальна

Успешного развертывания! 🚀