From 27065b0b03b7e87884ef4410637ee30b0218daef Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 15:14:29 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=B4=D0=B5=D0=BF=D0=BB=D0=BE=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=BC=20PostgreSQ?= =?UTF-8?q?L?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удален зависимость от встроенного PostgreSQL контейнера в docker-compose.yml - Добавлена полная документация по настройке внешней БД (EXTERNAL_DB_SETUP.md) - Обновлен .env.prod с комментариями для внешнего сервера - Добавлены Makefile команды для проверки и настройки внешней БД - Обновлен README.md с инструкциями по деплою Теперь бот использует внешний PostgreSQL сервер: - Убран depends_on для db сервиса - DATABASE_URL настраивается через .env.prod - Поддержка локальных и удаленных БД серверов - Гибкая конфигурация через переменные окружения --- .env.prod | 9 ++- EXTERNAL_DB_SETUP.md | 162 +++++++++++++++++++++++++++++++++++++++++++ Makefile | 34 ++++++++- README.md | 29 +++++++- docker-compose.yml | 28 -------- 5 files changed, 228 insertions(+), 34 deletions(-) create mode 100644 EXTERNAL_DB_SETUP.md diff --git a/.env.prod b/.env.prod index df007ad..5a61e40 100644 --- a/.env.prod +++ b/.env.prod @@ -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 администраторов (через запятую) diff --git a/EXTERNAL_DB_SETUP.md b/EXTERNAL_DB_SETUP.md new file mode 100644 index 0000000..61a3f09 --- /dev/null +++ b/EXTERNAL_DB_SETUP.md @@ -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')); +``` diff --git a/Makefile b/Makefile index 94469f3..7089811 100644 --- a/Makefile +++ b/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 \ No newline at end of file + 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" \ No newline at end of file diff --git a/README.md b/README.md index 93a8acf..255c79f 100644 --- a/README.md +++ b/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 diff --git a/docker-compose.yml b/docker-compose.yml index 2f172b1..f6224a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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