Как подключиться к существующей базе данных через NGINX?

У меня есть проект, который мне нужно начать с Docker. Я успешно создал images и containers из Django, NGINX и postgreSQL, так что проект стартует правильно. Я заметил, что когда я пытаюсь войти в панель администратора, Django поднимает OperationalError at /admin/login/ connection to server at "database" (192.168.144.2), port 5432 failed: fe_sendauth: no password supplied. Без nginx все работало нормально, но теперь я не могу получить доступ к базе данных. Как я понимаю проблему, мне нужно изменить nginx.config, но я перепробовал почти все и так и не смог разобраться. Похоже, что postgreSQL не видит моего пользователя. Мой фрагмент кода ниже.

uwsgi.ini

[uwsgi]

wsgi-file = config/wsgi.py

strict = true  
 
socket = :8000  

protocol = http

master = true  

no-orphans = true   

die-on-term = true  

lazy-apps = true

processes = 4  

threads = 8   

enable-threads = true  

max-requests = 500

reload-on-rss = 1024
 
worker-reload-mercy = 60

harakiri = 60

harakiri-verbose = true

vacuum = true

post-buffering = 1048576

buffer-size = 65535

nginx.conf

worker_processes 1;

events {

    worker_connections 1024;

}

http {

    include mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;
    include /etc/nginx/uwsgi_params;

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://django:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

    }
}

Dockerfile

FROM python:3.10.0-alpine

RUN apk add postgresql-client build-base postgresql-dev linux-headers pcre-dev

WORKDIR /movies_admin

COPY requirements.txt .

RUN pip install -r requirements.txt --no-cache-dir

EXPOSE 8000

COPY movies_admin .

docker-compose.yml

version: '3.8' 

services:
  django:
    build:
      context: .
    
    volumes:
      - "./movies_admin:/movies_admin"
    
    environment:
      - DB_HOST=database
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe
      - SECRET_KEY='django-insecure-8h%wg+drqmqjkw$8wm7#)#%*fb3b%(-e!-kbdth^#9u)23u!48'
    
    command:
      sh -c "uwsgi --ini /movies_admin/uwsgi.ini"
    
    depends_on:
      - database

  database:

    image: postgres:16

    environment:
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe
    
    volumes:
      - $HOME/postgresql/data:/var/lib/postgresql/data
  
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - django

components/database.py

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST', 'database'), # name of docker container with postgresql
        'PORT': os.environ.get('DB_PORT', 5432),
        'OPTIONS': {
            'options': '-c search_path=public,content'
        }
    }
} 

P.S. Я также думаю, что эта идея может быть в ports использовании в docker-compose.yml, но, как я читал dos, лучшей практикой является скрытие django и postgresql портов и подключение только через nginx.

Ваша проблема, похоже, не имеет отношения к Docker или NGINX. Прочитайте ошибку еще раз: no password supplied - это означает, что вы подключаетесь нормально, но база данных не получает пароль

components/database.py вызывает os.environ.get('DB_PASSWORD'), но где установить эту переменную окружения?

В docker-compose.yml посмотрите на переменные окружения службы django. Вы устанавливаете переменную с именем POSTGRES_PASSWORD, не DB_PASSWORD, что и ищет ваше django приложение.

Решение

Заставьте django службу components/database.py читать в POSTGRES_PASSWORD, а не в текущем DB_PASSWORD.

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