feat: настройка деплоя для работы с внешним PostgreSQL
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Удален зависимость от встроенного PostgreSQL контейнера в docker-compose.yml - Добавлена полная документация по настройке внешней БД (EXTERNAL_DB_SETUP.md) - Обновлен .env.prod с комментариями для внешнего сервера - Добавлены Makefile команды для проверки и настройки внешней БД - Обновлен README.md с инструкциями по деплою Теперь бот использует внешний PostgreSQL сервер: - Убран depends_on для db сервиса - DATABASE_URL настраивается через .env.prod - Поддержка локальных и удаленных БД серверов - Гибкая конфигурация через переменные окружения
This commit is contained in:
@@ -4,12 +4,17 @@
|
|||||||
# Telegram Bot Token
|
# Telegram Bot Token
|
||||||
BOT_TOKEN=8300330445:AAFyxAqtmWsgtSPa_nb-lH3Q4ovmn9Ei6rA
|
BOT_TOKEN=8300330445:AAFyxAqtmWsgtSPa_nb-lH3Q4ovmn9Ei6rA
|
||||||
|
|
||||||
# PostgreSQL настройки
|
# PostgreSQL настройки для внешней БД
|
||||||
|
# Замените на данные вашего внешнего PostgreSQL сервера
|
||||||
|
POSTGRES_HOST=localhost
|
||||||
|
POSTGRES_PORT=5432
|
||||||
POSTGRES_DB=bot_db
|
POSTGRES_DB=bot_db
|
||||||
POSTGRES_USER=trevor
|
POSTGRES_USER=trevor
|
||||||
POSTGRES_PASSWORD=Cl0ud_1985!
|
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
|
DATABASE_URL=postgresql+asyncpg://trevor:Cl0ud_1985!@localhost:5432/bot_db
|
||||||
|
|
||||||
# ID администраторов (через запятую)
|
# ID администраторов (через запятую)
|
||||||
|
|||||||
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'));
|
||||||
|
```
|
||||||
32
Makefile
32
Makefile
@@ -348,10 +348,13 @@ docker-rebuild:
|
|||||||
|
|
||||||
# Быстрое развертывание с нуля
|
# Быстрое развертывание с нуля
|
||||||
docker-deploy:
|
docker-deploy:
|
||||||
@echo "🚀 Полное развертывание в продакшн..."
|
@echo "🚀 Полное развертывание в продакшн с внешней БД..."
|
||||||
@make docker-setup
|
@make docker-setup
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "⚠️ Перед продолжением убедитесь, что отредактировали .env.prod!"
|
@echo "⚠️ Перед продолжением:"
|
||||||
|
@echo " 1. Настройте внешний PostgreSQL (см. EXTERNAL_DB_SETUP.md)"
|
||||||
|
@echo " 2. Отредактируйте .env.prod с параметрами внешней БД"
|
||||||
|
@echo ""
|
||||||
@read -p "Продолжить развертывание? [y/N] " confirm; \
|
@read -p "Продолжить развертывание? [y/N] " confirm; \
|
||||||
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
||||||
make docker-build; \
|
make docker-build; \
|
||||||
@@ -365,3 +368,28 @@ docker-deploy:
|
|||||||
else \
|
else \
|
||||||
echo "❌ Отменено"; \
|
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
|
```dockerfile
|
||||||
FROM python:3.11-slim
|
FROM python:3.11-slim
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ services:
|
|||||||
- bot_data:/app/data
|
- bot_data:/app/data
|
||||||
networks:
|
networks:
|
||||||
- lottery_network
|
- lottery_network
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
@@ -31,32 +28,7 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
start_period: 10s
|
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:
|
volumes:
|
||||||
postgres_data:
|
|
||||||
driver: local
|
|
||||||
bot_data:
|
bot_data:
|
||||||
driver: local
|
driver: local
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user