Невозможно подключиться к внешней базе данных PostgreSQL из докеризованного Django
Я запускаю приложение Django в доке и пытаюсь подключиться к базе данных PostgreSQL, которая расположена на внешнем хосте с публичным IP.
При запуске контейнера команда makemigrations
падает со следующей ошибкой:
django.db.utils.OperationalError: could not connect to server: Connection refused
Is the server running on host "myhost" (89.xx.xx.102) and accepting
TCP/IP connections on port 5432?
Однако он успешно подключается, когда не докеризован.
Вот docker-compose.yml
:
services:
backend:
build: .
ports:
- 65534:65534
и соответствующие Dockerfile
:
FROM python:3.10 AS builder
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
RUN pip install gunicorn
FROM builder
COPY ./ /app/
ENTRYPOINT [ "/app/entrypoint.sh" ]
и entrypoint.sh
:
#!/bin/bash
python /app/manage.py collectstatic --no-input --clear
python /app/manage.py makemigrations
python /app/manage.py migrate --no-input
gunicorn --pythonpath /app/ -b 0.0.0.0:65534 app.wsgi:application
Как сделать так, чтобы приложение Django могло подключаться к внешней базе данных PostgresSQL?
В терминале выполните следующую команду:
vim /etc/postgresql/14/main/postgresql.conf #14 is the version of postgres.
Укомментируйте и отредактируйте атрибут listen_addresses, чтобы начать прослушивание всех доступных IP-адресов.
listen_addresses = '*'
Добавьте новую политику подключения (шаблон означает [CONNECTION_TYPE][DATABASE][USER][ADDRESS][METHOD]) в нижней части файла.
host all all 0.0.0.0/0 md5
Мы разрешаем TCP/IP соединения (host) со всеми базами данных (all) для всех пользователей (all) с любым IPv4 адресом (0.0.0.0/0), используя зашифрованный пароль MD5 для аутентификации (md5).
Теперь необходимо перезапустить службу PostgreSQL, чтобы загрузить изменения конфигурации.
systemctl restart postgresql
И убедитесь, что ваша система прослушивает порт 5432, зарезервированный для PostgreSQL.
ss -nlt | grep 5432
Подключение к базе данных PostgreSQL через удаленный хост:
Теперь ваш сервер PostgreSQL запущен и прослушивает внешние запросы. Настало время подключиться к вашей базе данных через удаленный хост.
Подключение через инструмент командной строки:
Теперь вы можете подключиться к удаленной базе данных, используя следующий шаблон команды:
psql -h [ip address] -p [port] -d [database] -U [username]
Давайте теперь подключимся к удаленной базе данных PostgreSQL, которую мы разместили на хостинге.
psql -h 5.199.162.56 -p 5432 -d test_erp -U postgres
Для двойной проверки деталей соединения используйте команду \conninfo.