Files
new_lottery_bot/docs/EXTERNAL_DB_SETUP.md
Andrew K. Choi 1551b8b29f
Some checks reported errors
continuous-integration/drone/push Build encountered an error
fix: обработка ошибки 'message is not modified' в conduct_lottery_draw_confirm
2025-11-17 15:46:34 +09:00

4.8 KiB
Raw Permalink Blame History

Настройка внешнего PostgreSQL

Этот гайд описывает как настроить бота для работы с внешним PostgreSQL сервером.

Предварительные требования

  1. Запущенный PostgreSQL сервер (версия 13+)
  2. Доступ к серверу по сети (если сервер на другой машине)
  3. Созданная база данных для бота

Шаг 1: Подготовка PostgreSQL

Создание базы данных и пользователя

-- Подключитесь к 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:

listen_addresses = '*'  # или конкретный IP

Отредактируйте pg_hba.conf:

# Разрешить подключение с определенного IP
host    lottery_bot    bot_user    192.168.1.0/24    md5

Перезапустите PostgreSQL:

sudo systemctl restart postgresql

Шаг 2: Настройка .env.prod

Отредактируйте .env.prod:

# 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: Применение миграций

После настройки подключения примените миграции:

# Активируйте виртуальное окружение
source .venv/bin/activate

# Примените миграции
alembic upgrade head

Шаг 4: Запуск бота

С Docker Compose:

docker-compose up -d

Локально:

make bot-start

Проверка подключения

Проверьте подключение к БД:

# Из контейнера
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. Регулярно делайте бэкапы:
    pg_dump -U bot_user lottery_bot > backup_$(date +%Y%m%d).sql
    
  5. Не коммитьте .env.prod в git (добавлен в .gitignore)

Мониторинг

Проверка состояния подключений:

SELECT * FROM pg_stat_activity WHERE datname = 'lottery_bot';

Размер базы данных:

SELECT pg_size_pretty(pg_database_size('lottery_bot'));