Невозможно подключиться к внешней базе данных 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.

Вернуться на верх