Подключение к базе данных postgres за nginx реверс-прокси с использованием контейнеров docker.

Вопрос или проблема

Я настроил контейнер базы данных Postgres и могу подключаться и выполнять запросы непосредственно, используя его опубликованный порт 5434.

Цель – развернуть тестовую базу данных позже и получить к ней доступ через обратный прокси nginx.
Я не знаю, какой лучший способ подключиться к развернутой тестовой базе данных. Пожалуйста, посоветуйте.

Я пытался подключиться к базе данных Postgres через обратный прокси nginx, используя локальные контейнеры.

Используя команду:

psql -h localhost -p 5435 -U postgres имя_базы_данных_контейнера_тест

Nginx показывает ошибку:

reverse-proxy | 2021/10/29 20:06:57 [info] 32#32: *17 клиент 172.25.0.1:56630 подключился к 0.0.0.0:5435
reverse-proxy | 2021/10/29 20:06:57 [error] 32#32: *17 connect() не удалось (111: Подключение отклонено) при подключении к upstream, клиент: 172.25.0.1, сервер: 
0.0.0.0:5435, upstream: "172.25.0.3:5434", байты от/к клиенту:0/0, байты от/к upstream:0/0

nginx.conf:

stream {    
    upstream database_test {
        server postgres_test:5434;
    }
    server {
        listen 5435 so_keepalive=on;
        proxy_pass database_test;

    }
}

docker-compose для test_db:

services:
  postgres_test:
    container_name: postgres_test
    image: postgis/postgis
    restart: always
    expose:
      - 5432
    ports:
      - 5434:5432
    volumes:
      - ./backup:/backup
      - ./postgres-init-db.sh:/docker-entrypoint-initdb.d/postgres-init-db.sh
      - postgres_test_data:/var/lib/postgresql/data
    env_file:
      - ./.env.postgres
    networks:
      - common-network

volumes:
  postgres_test_data:

networks:
  common-network:
    external:
      name: common-network

docker-compose для reverse-proxy:

networks:
  common-network: #имя в этом файле docker-compose
    name: common-network # фактическое имя сети

services:

  nginx:
    image: nginx:1.20.1
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - 80:80
      - 443:443
      - 5435:5435
    container_name: reverse-proxy
    networks:
      - common-network

Кроме того, я проверил файлы конфигурации postgres, они выглядят правильно:

cat postgresql.conf | grep listen_addresses
listen_addresses="*"


cat pg_hba.conf | grep host
host all all all md5

При подключении к контейнеру Docker по имени следует использовать открытый порт сервиса, т.е. 5432, так как вы подключаетесь непосредственно к гостю:

        server postgres_test:5432;

С другой стороны, опубликованный порт 5434 становится доступен на хосте, поэтому вы также должны иметь возможность получить доступ к сервисам таким образом:

        server localhost:5434;

Чего я не рекомендую, так как вам нужно учитывать сопоставление портов для будущего администрирования (вместо того, чтобы просто знать имя контейнера и стандартный открытый порт).

Ответ или решение

Подключение к базе данных PostgreSQL за обратным прокси-сервером Nginx с использованием контейнеров Docker

В нашей задаче нам необходимо настроить соединение с контейнером PostgreSQL через обратный прокси-сервер Nginx, используя Docker. Этот процесс может показаться сложным в первый момент, но, следуя этим шагам, вы сможете организовать стабильное и безопасное подключение.

1. Настройка Docker Compose

Давайте начнем с конфигурации docker-compose. Убедитесь, что у вас есть два сервиса: один для PostgreSQL и другой для Nginx, как показано ниже.

docker-compose.yml для PostgreSQL
version: '3.8'

services:
  postgres_test:
    container_name: postgres_test
    image: postgis/postgis
    restart: always
    expose:
      - 5432
    ports:
      - 5434:5432
    volumes:
      - ./backup:/backup
      - ./postgres-init-db.sh:/docker-entrypoint-initdb.d/postgres-init-db.sh
      - postgres_test_data:/var/lib/postgresql/data
    env_file:
      - ./.env.postgres
    networks:
      - common-network

volumes:
  postgres_test_data:

networks:
  common-network:
    external:
      name: common-network
docker-compose.yml для Nginx
version: '3.8'

services:
  nginx:
    image: nginx:1.20.1
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - 80:80
      - 443:443
      - 5435:5435
    container_name: reverse-proxy
    networks:
      - common-network

networks:
  common-network: 
    external:
      name: common-network

2. Конфигурация Nginx

Конфигурация Nginx в файле nginx.conf должна быть правильной для обработки соединений с PostgreSQL. Вот как она может выглядеть:

stream {    
    upstream database_test {
        server postgres_test:5432;  # используем внутренний порт
    }
    server {
        listen 5435 so_keepalive=on; 
        proxy_pass database_test;
    }
}

Обратите внимание, что в определении upstream мы используем postgres_test:5432, что указывает на порт, на котором PostgreSQL слушает внутри контейнера.

3. Настройка сети

Обязательно проверьте, что оба контейнера находятся в одной и той же сети (в данном случае common-network). Это обеспечит корректное разрешение имен между сервисами.

4. Проверка конфигурации PostgreSQL

Вам нужно убедиться, что ваш PostgreSQL настроен для прослушивания всех адресов. Проверьте следующий параметр в файле postgresql.conf:

listen_addresses = '*'

И в pg_hba.conf должны быть записи для разрешения подключения:

host all all all md5

5. Подключение к базе данных

После того как все настройки выполнены, вы можете подключиться к вашей базе данных, используя следующую команду:

psql -h localhost -p 5435 -U postgres database_name_container_test

Здесь вы указываете localhost и порт 5435, что указывает на Nginx, который в свою очередь будет проксировать запросы в контейнер PostgreSQL.

Заключение

В итоге, настройка подключения к базе данных PostgreSQL через Nginx в Docker требует тщательной конфигурации. Обеспечение правильного маршрутизации, настроек сети и конфигурации PostgreSQL – ключ к успешному подключению. Следуя представленным шагам, вы сможете безопасно подключаться к вашей тестовой базе данных, даже когда она развернута на удаленном сервере.

Оцените материал
Добавить комментарий

Капча загружается...