Compare commits
5 Commits
feature/ch
...
87b6b4480c
| Author | SHA1 | Date | |
|---|---|---|---|
| 87b6b4480c | |||
| 53dd982e38 | |||
| 27065b0b03 | |||
| 8ec8d942ea | |||
| 438a5b5b05 |
@@ -4,12 +4,17 @@
|
||||
# Telegram Bot Token
|
||||
BOT_TOKEN=8300330445:AAFyxAqtmWsgtSPa_nb-lH3Q4ovmn9Ei6rA
|
||||
|
||||
# PostgreSQL настройки
|
||||
# PostgreSQL настройки для внешней БД
|
||||
# Замените на данные вашего внешнего PostgreSQL сервера
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_DB=bot_db
|
||||
POSTGRES_USER=trevor
|
||||
POSTGRES_PASSWORD=Cl0ud_1985!
|
||||
|
||||
# Database URL для бота (используется внутри контейнера)
|
||||
# Database URL для бота
|
||||
# Формат: postgresql+asyncpg://user:password@host:port/database
|
||||
# Для внешнего сервера укажите его IP или домен вместо localhost
|
||||
DATABASE_URL=postgresql+asyncpg://trevor:Cl0ud_1985!@localhost:5432/bot_db
|
||||
|
||||
# ID администраторов (через запятую)
|
||||
|
||||
100
DEPLOY_QUICKSTART.md
Normal file
100
DEPLOY_QUICKSTART.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# 🚀 Быстрый деплой бота с внешним PostgreSQL
|
||||
|
||||
## Шаг 1: Подготовка PostgreSQL
|
||||
|
||||
```bash
|
||||
# Подключитесь к PostgreSQL
|
||||
psql -U postgres
|
||||
|
||||
# Создайте пользователя и БД
|
||||
CREATE USER bot_user WITH PASSWORD 'secure_password_here';
|
||||
CREATE DATABASE lottery_bot OWNER bot_user;
|
||||
GRANT ALL PRIVILEGES ON DATABASE lottery_bot TO bot_user;
|
||||
|
||||
# Выход
|
||||
\q
|
||||
```
|
||||
|
||||
## Шаг 2: Настройка .env.prod
|
||||
|
||||
```bash
|
||||
# Скопируйте пример
|
||||
cp .env.prod.example .env.prod
|
||||
|
||||
# Отредактируйте .env.prod
|
||||
nano .env.prod
|
||||
```
|
||||
|
||||
**Заполните:**
|
||||
```env
|
||||
# Telegram
|
||||
BOT_TOKEN=your_bot_token_from_botfather
|
||||
ADMIN_IDS=123456789,987654321
|
||||
|
||||
# PostgreSQL (замените на свои данные)
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:secure_password@localhost:5432/lottery_bot
|
||||
```
|
||||
|
||||
## Шаг 3: Деплой
|
||||
|
||||
### Вариант A: Docker (рекомендуется)
|
||||
|
||||
```bash
|
||||
# Билд и запуск
|
||||
make docker-deploy
|
||||
|
||||
# Или вручную:
|
||||
docker-compose build
|
||||
docker-compose up -d
|
||||
docker exec -it lottery_bot alembic upgrade head
|
||||
```
|
||||
|
||||
### Вариант B: Локально
|
||||
|
||||
```bash
|
||||
# Установка
|
||||
make install
|
||||
|
||||
# Миграции
|
||||
source .venv/bin/activate
|
||||
alembic upgrade head
|
||||
|
||||
# Запуск
|
||||
make bot-start
|
||||
```
|
||||
|
||||
## Шаг 4: Проверка
|
||||
|
||||
```bash
|
||||
# Проверить подключение к БД
|
||||
make docker-test-db
|
||||
|
||||
# Логи
|
||||
make docker-logs
|
||||
|
||||
# Статус
|
||||
make docker-status
|
||||
```
|
||||
|
||||
## 📋 Полезные команды
|
||||
|
||||
```bash
|
||||
# Остановка
|
||||
docker-compose down
|
||||
|
||||
# Перезапуск
|
||||
docker-compose restart
|
||||
|
||||
# Логи в реальном времени
|
||||
docker-compose logs -f bot
|
||||
|
||||
# Бэкап БД
|
||||
pg_dump -U bot_user lottery_bot > backup.sql
|
||||
|
||||
# Восстановление БД
|
||||
psql -U bot_user lottery_bot < backup.sql
|
||||
```
|
||||
|
||||
## 🔥 Проблемы?
|
||||
|
||||
См. [EXTERNAL_DB_SETUP.md](./EXTERNAL_DB_SETUP.md) раздел "Troubleshooting"
|
||||
162
EXTERNAL_DB_SETUP.md
Normal file
162
EXTERNAL_DB_SETUP.md
Normal file
@@ -0,0 +1,162 @@
|
||||
# Настройка внешнего PostgreSQL
|
||||
|
||||
Этот гайд описывает как настроить бота для работы с внешним PostgreSQL сервером.
|
||||
|
||||
## Предварительные требования
|
||||
|
||||
1. Запущенный PostgreSQL сервер (версия 13+)
|
||||
2. Доступ к серверу по сети (если сервер на другой машине)
|
||||
3. Созданная база данных для бота
|
||||
|
||||
## Шаг 1: Подготовка PostgreSQL
|
||||
|
||||
### Создание базы данных и пользователя
|
||||
|
||||
```sql
|
||||
-- Подключитесь к PostgreSQL
|
||||
psql -U postgres
|
||||
|
||||
-- Создайте пользователя
|
||||
CREATE USER bot_user WITH PASSWORD 'your_secure_password';
|
||||
|
||||
-- Создайте базу данных
|
||||
CREATE DATABASE lottery_bot OWNER bot_user;
|
||||
|
||||
-- Выдайте права
|
||||
GRANT ALL PRIVILEGES ON DATABASE lottery_bot TO bot_user;
|
||||
```
|
||||
|
||||
### Настройка доступа (если PostgreSQL на другом сервере)
|
||||
|
||||
Отредактируйте `postgresql.conf`:
|
||||
```conf
|
||||
listen_addresses = '*' # или конкретный IP
|
||||
```
|
||||
|
||||
Отредактируйте `pg_hba.conf`:
|
||||
```conf
|
||||
# Разрешить подключение с определенного IP
|
||||
host lottery_bot bot_user 192.168.1.0/24 md5
|
||||
```
|
||||
|
||||
Перезапустите PostgreSQL:
|
||||
```bash
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
## Шаг 2: Настройка .env.prod
|
||||
|
||||
Отредактируйте `.env.prod`:
|
||||
|
||||
```env
|
||||
# PostgreSQL настройки
|
||||
POSTGRES_HOST=your_db_server_ip_or_domain
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_DB=lottery_bot
|
||||
POSTGRES_USER=bot_user
|
||||
POSTGRES_PASSWORD=your_secure_password
|
||||
|
||||
# Database URL
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:your_secure_password@your_db_server_ip_or_domain:5432/lottery_bot
|
||||
```
|
||||
|
||||
### Примеры DATABASE_URL
|
||||
|
||||
**Локальная БД:**
|
||||
```
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:password@localhost:5432/lottery_bot
|
||||
```
|
||||
|
||||
**Удаленная БД:**
|
||||
```
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:password@192.168.1.100:5432/lottery_bot
|
||||
```
|
||||
|
||||
**С доменом:**
|
||||
```
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:password@db.example.com:5432/lottery_bot
|
||||
```
|
||||
|
||||
**Через Docker network (если БД в другом контейнере):**
|
||||
```
|
||||
DATABASE_URL=postgresql+asyncpg://bot_user:password@postgres_container:5432/lottery_bot
|
||||
```
|
||||
|
||||
## Шаг 3: Применение миграций
|
||||
|
||||
После настройки подключения примените миграции:
|
||||
|
||||
```bash
|
||||
# Активируйте виртуальное окружение
|
||||
source .venv/bin/activate
|
||||
|
||||
# Примените миграции
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
## Шаг 4: Запуск бота
|
||||
|
||||
### С Docker Compose:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Локально:
|
||||
```bash
|
||||
make bot-start
|
||||
```
|
||||
|
||||
## Проверка подключения
|
||||
|
||||
Проверьте подключение к БД:
|
||||
|
||||
```bash
|
||||
# Из контейнера
|
||||
docker exec -it lottery_bot python -c "from src.core.database import engine; import asyncio; asyncio.run(engine.dispose())"
|
||||
|
||||
# Локально
|
||||
python -c "from src.core.database import engine; import asyncio; asyncio.run(engine.dispose())"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Ошибка: "FATAL: password authentication failed"
|
||||
- Проверьте правильность пароля в DATABASE_URL
|
||||
- Убедитесь что пользователь создан в PostgreSQL
|
||||
- Проверьте настройки pg_hba.conf
|
||||
|
||||
### Ошибка: "could not connect to server"
|
||||
- Проверьте что PostgreSQL запущен
|
||||
- Убедитесь что порт 5432 открыт (firewall)
|
||||
- Проверьте listen_addresses в postgresql.conf
|
||||
|
||||
### Ошибка: "database does not exist"
|
||||
- Создайте базу данных (см. Шаг 1)
|
||||
- Проверьте имя БД в DATABASE_URL
|
||||
|
||||
### Ошибка: "SSL connection has been closed unexpectedly"
|
||||
- Добавьте `?ssl=require` или `?ssl=prefer` в конец DATABASE_URL
|
||||
- Или отключите SSL: `?ssl=false`
|
||||
|
||||
## Рекомендации по безопасности
|
||||
|
||||
1. **Используйте сильные пароли** для пользователя БД
|
||||
2. **Ограничьте доступ** только с нужных IP (pg_hba.conf)
|
||||
3. **Используйте SSL** для подключения к удаленной БД
|
||||
4. **Регулярно делайте бэкапы**:
|
||||
```bash
|
||||
pg_dump -U bot_user lottery_bot > backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
5. **Не коммитьте .env.prod** в git (добавлен в .gitignore)
|
||||
|
||||
## Мониторинг
|
||||
|
||||
Проверка состояния подключений:
|
||||
```sql
|
||||
SELECT * FROM pg_stat_activity WHERE datname = 'lottery_bot';
|
||||
```
|
||||
|
||||
Размер базы данных:
|
||||
```sql
|
||||
SELECT pg_size_pretty(pg_database_size('lottery_bot'));
|
||||
```
|
||||
72
Makefile
72
Makefile
@@ -216,7 +216,7 @@ docker-setup:
|
||||
# Сборка Docker образа
|
||||
docker-build:
|
||||
@echo "🔨 Сборка Docker образа..."
|
||||
docker-compose build --no-cache
|
||||
docker compose build --no-cache
|
||||
|
||||
# Запуск контейнеров в фоновом режиме
|
||||
docker-up:
|
||||
@@ -225,7 +225,7 @@ docker-up:
|
||||
echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \
|
||||
exit 1; \
|
||||
fi
|
||||
docker-compose --env-file .env.prod up -d
|
||||
docker compose --env-file .env.prod up -d
|
||||
@echo "✅ Контейнеры запущены!"
|
||||
@echo "📊 Проверьте статус: make docker-status"
|
||||
@echo "📋 Просмотр логов: make docker-logs"
|
||||
@@ -237,39 +237,39 @@ docker-up-fg:
|
||||
echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \
|
||||
exit 1; \
|
||||
fi
|
||||
docker-compose --env-file .env.prod up
|
||||
docker compose --env-file .env.prod up
|
||||
|
||||
# Остановка контейнеров
|
||||
docker-down:
|
||||
@echo "🛑 Остановка контейнеров..."
|
||||
docker-compose down
|
||||
docker compose down
|
||||
@echo "✅ Контейнеры остановлены!"
|
||||
|
||||
# Перезапуск контейнеров
|
||||
docker-restart:
|
||||
@echo "🔄 Перезапуск контейнеров..."
|
||||
docker-compose restart
|
||||
docker compose restart
|
||||
@echo "✅ Контейнеры перезапущены!"
|
||||
|
||||
# Просмотр логов бота
|
||||
docker-logs:
|
||||
@echo "📋 Логи бота..."
|
||||
docker-compose logs -f bot
|
||||
docker compose logs -f bot
|
||||
|
||||
# Просмотр логов базы данных
|
||||
docker-logs-db:
|
||||
@echo "📋 Логи базы данных..."
|
||||
docker-compose logs -f db
|
||||
docker compose logs -f db
|
||||
|
||||
# Просмотр всех логов
|
||||
docker-logs-all:
|
||||
@echo "📋 Все логи..."
|
||||
docker-compose logs -f
|
||||
docker compose logs -f
|
||||
|
||||
# Статус контейнеров
|
||||
docker-status:
|
||||
@echo "📊 Статус контейнеров..."
|
||||
@docker-compose ps
|
||||
@docker compose ps
|
||||
@echo ""
|
||||
@echo "💾 Использование volumes:"
|
||||
@docker volume ls | grep lottery || echo "Нет volumes"
|
||||
@@ -281,20 +281,20 @@ docker-ps:
|
||||
# Применение миграций в контейнере
|
||||
docker-db-migrate:
|
||||
@echo "⬆️ Применение миграций в контейнере..."
|
||||
docker-compose exec bot alembic upgrade head
|
||||
docker compose exec bot alembic upgrade head
|
||||
@echo "✅ Миграции применены!"
|
||||
|
||||
# Подключение к PostgreSQL в контейнере
|
||||
docker-db-shell:
|
||||
@echo "🐘 Подключение к PostgreSQL..."
|
||||
@docker-compose exec db psql -U $${POSTGRES_USER:-lottery_user} -d $${POSTGRES_DB:-lottery_bot_db}
|
||||
@docker compose exec db psql -U $${POSTGRES_USER:-lottery_user} -d $${POSTGRES_DB:-lottery_bot_db}
|
||||
|
||||
# Создание бэкапа базы данных
|
||||
docker-db-backup:
|
||||
@echo "💾 Создание бэкапа базы данных..."
|
||||
@mkdir -p backups
|
||||
@BACKUP_FILE=backups/backup_$$(date +%Y%m%d_%H%M%S).sql; \
|
||||
docker-compose exec -T db pg_dump -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db} > $$BACKUP_FILE && \
|
||||
docker compose exec -T db pg_dump -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db} > $$BACKUP_FILE && \
|
||||
echo "✅ Бэкап создан: $$BACKUP_FILE"
|
||||
|
||||
# Восстановление из бэкапа
|
||||
@@ -307,7 +307,7 @@ docker-db-restore:
|
||||
@echo "Восстановление из: $(BACKUP)"
|
||||
@read -p "Это удалит текущие данные! Продолжить? [y/N] " confirm; \
|
||||
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
||||
cat $(BACKUP) | docker-compose exec -T db psql -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db}; \
|
||||
cat $(BACKUP) | docker compose exec -T db psql -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db}; \
|
||||
echo "✅ База данных восстановлена!"; \
|
||||
else \
|
||||
echo "❌ Отменено"; \
|
||||
@@ -316,12 +316,12 @@ docker-db-restore:
|
||||
# Открыть shell в контейнере бота
|
||||
docker-shell:
|
||||
@echo "🐚 Открытие shell в контейнере бота..."
|
||||
docker-compose exec bot /bin/bash
|
||||
docker compose exec bot /bin/bash
|
||||
|
||||
# Остановка и удаление контейнеров
|
||||
docker-clean:
|
||||
@echo "🧹 Очистка контейнеров..."
|
||||
docker-compose down --remove-orphans
|
||||
docker compose down --remove-orphans
|
||||
@echo "✅ Контейнеры удалены!"
|
||||
|
||||
# Полная очистка (включая volumes)
|
||||
@@ -330,7 +330,7 @@ docker-prune:
|
||||
@read -p "Продолжить? [y/N] " confirm; \
|
||||
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
||||
echo "🗑️ Полная очистка..."; \
|
||||
docker-compose down -v --remove-orphans; \
|
||||
docker compose down -v --remove-orphans; \
|
||||
docker system prune -f; \
|
||||
echo "✅ Очистка завершена!"; \
|
||||
else \
|
||||
@@ -340,18 +340,21 @@ docker-prune:
|
||||
# Пересборка и перезапуск
|
||||
docker-rebuild:
|
||||
@echo "🔄 Пересборка и перезапуск..."
|
||||
docker-compose down
|
||||
docker-compose build --no-cache
|
||||
docker-compose --env-file .env.prod up -d
|
||||
docker compose down
|
||||
docker compose build --no-cache
|
||||
docker compose --env-file .env.prod up -d
|
||||
@echo "✅ Готово!"
|
||||
@make docker-logs
|
||||
|
||||
# Быстрое развертывание с нуля
|
||||
docker-deploy:
|
||||
@echo "🚀 Полное развертывание в продакшн..."
|
||||
@echo "🚀 Полное развертывание в продакшн с внешней БД..."
|
||||
@make docker-setup
|
||||
@echo ""
|
||||
@echo "⚠️ Перед продолжением убедитесь, что отредактировали .env.prod!"
|
||||
@echo "⚠️ Перед продолжением:"
|
||||
@echo " 1. Настройте внешний PostgreSQL (см. EXTERNAL_DB_SETUP.md)"
|
||||
@echo " 2. Отредактируйте .env.prod с параметрами внешней БД"
|
||||
@echo ""
|
||||
@read -p "Продолжить развертывание? [y/N] " confirm; \
|
||||
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
||||
make docker-build; \
|
||||
@@ -364,4 +367,29 @@ docker-deploy:
|
||||
make docker-status; \
|
||||
else \
|
||||
echo "❌ Отменено"; \
|
||||
fi
|
||||
fi
|
||||
|
||||
# Проверка подключения к внешней БД
|
||||
docker-test-db:
|
||||
@echo "🔍 Проверка подключения к БД..."
|
||||
@docker exec -it lottery_bot python -c "\
|
||||
from src.core.database import engine; \
|
||||
import asyncio; \
|
||||
print('✅ Подключение успешно!'); \
|
||||
asyncio.run(engine.dispose())" || echo "❌ Ошибка подключения!"
|
||||
|
||||
# Информация о настройке внешней БД
|
||||
docker-external-db-help:
|
||||
@echo "📖 Настройка внешнего PostgreSQL"
|
||||
@echo "=================================="
|
||||
@echo ""
|
||||
@echo "Полная документация: EXTERNAL_DB_SETUP.md"
|
||||
@echo ""
|
||||
@echo "Быстрый старт:"
|
||||
@echo " 1. Создайте БД на внешнем сервере"
|
||||
@echo " 2. Отредактируйте .env.prod:"
|
||||
@echo " DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/db"
|
||||
@echo " 3. make docker-deploy"
|
||||
@echo ""
|
||||
@echo "Проверить подключение:"
|
||||
@echo " make docker-test-db"
|
||||
29
README.md
29
README.md
@@ -283,7 +283,34 @@ alembic downgrade -1
|
||||
### Локальное развертывание
|
||||
Следуйте инструкциям по установке выше.
|
||||
|
||||
### Docker (опционально)
|
||||
### Docker с внешним PostgreSQL
|
||||
|
||||
Бот настроен для работы с внешним PostgreSQL сервером.
|
||||
|
||||
**Быстрый старт:**
|
||||
|
||||
1. Настройте внешнюю PostgreSQL БД (см. [EXTERNAL_DB_SETUP.md](./EXTERNAL_DB_SETUP.md))
|
||||
|
||||
2. Отредактируйте `.env.prod`:
|
||||
```env
|
||||
DATABASE_URL=postgresql+asyncpg://user:password@your_db_host:5432/lottery_bot
|
||||
BOT_TOKEN=your_bot_token
|
||||
ADMIN_IDS=123456789,987654321
|
||||
```
|
||||
|
||||
3. Запустите бота:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
4. Примените миграции:
|
||||
```bash
|
||||
docker exec -it lottery_bot alembic upgrade head
|
||||
```
|
||||
|
||||
**Подробная документация:** [EXTERNAL_DB_SETUP.md](./EXTERNAL_DB_SETUP.md)
|
||||
|
||||
### Docker (старая версия с локальной БД)
|
||||
```dockerfile
|
||||
FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
|
||||
@@ -21,9 +21,6 @@ services:
|
||||
- bot_data:/app/data
|
||||
networks:
|
||||
- lottery_network
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
||||
interval: 30s
|
||||
@@ -31,32 +28,7 @@ services:
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
|
||||
# PostgreSQL Database
|
||||
db:
|
||||
image: postgres:15-alpine
|
||||
container_name: lottery_db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: ${POSTGRES_DB:-lottery_bot_db}
|
||||
POSTGRES_USER: ${POSTGRES_USER:-lottery_user}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
PGDATA: /var/lib/postgresql/data/pgdata
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- "5432:5432"
|
||||
networks:
|
||||
- lottery_network
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-lottery_user} -d ${POSTGRES_DB:-lottery_bot_db}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
driver: local
|
||||
bot_data:
|
||||
driver: local
|
||||
|
||||
|
||||
Reference in New Issue
Block a user