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
|
||||
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 администраторов (через запятую)
|
||||
|
||||
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'));
|
||||
```
|
||||
34
Makefile
34
Makefile
@@ -348,10 +348,13 @@ docker-rebuild:
|
||||
|
||||
# Быстрое развертывание с нуля
|
||||
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