# Настройка внешнего 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')); ```