es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django + Nginx + Docker no tiene datos estáticos en el panel de administración.

Estoy tratando de ejecutar una aplicación Django en Docker (nginx, gunicorn…) en mi máquina local. Todo está bien, pero no veo los datos estáticos. En los registros de Docker veo el siguiente error:

nginx_1   | 2022/01/06 00:52:32 

28#28: *5 open() "/var/www/html/static/admin/css/responsive.css" failed (2: No such file or directory), client: 172.24.0.1, server: localhost, request: "GET /static/admin/css/responsive.css HTTP/1.1", host: "0.0.0.0", referrer: "http://0.0.0.0/admin/login/?next=/admin/"

¿Cómo puedo resolver el problema?

Mi código:

settings.py (Utilizo herramientas estándar para trabajar con datos estáticos)

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

nginx-conf.conf

upstream app {
    server django:8000;
}

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://django:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /var/www/html/static/;
    }
}

docker-compose.yml

version: '3.9'

services:
  django:
    build: . # Ruta al Dockerfile
    command: sh -c "gunicorn --bind 0.0.0.0:8000 potok.wsgi:application"
    volumes:
      - .:/project
      - static:/project/static
    expose:
      - 8000
    environment: 
      - DATABASE_URL=XXXX
      - DEBUG=1

  db:
    ...

  nginx:
    image: nginx:1.19.8-alpine
    depends_on: 
      - django
    ports: 
      - "80:80"
    volumes:
      - static:/var/www/html/static
      - ./nginx-conf.d/:/etc/nginx/conf.d

volumes:
    pg_data:
    static:
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que nginx no puede encontrar los archivos estáticos. En el archivo nginx-conf.conf, el bloque location /static/ especifica un alias a /var/www/html/static/. Sin embargo, en el archivo docker-compose.yml, el volumen para el servicio nginx monta static en /var/www/html/static. El alias en nginx-conf.conf debería actualizarse a alias /static/; para que coincida con el valor de STATIC_URL en settings.py.

    Aquí está el archivo nginx-conf.conf actualizado:

    upstream app {
        server django:8000;
    }
    
    server {
        listen 80;
        server_name localhost;
    
        location / {
            proxy_pass http://django:8000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
        }
    
        location /static/ {
            alias /static/;
        }
    }
    

    Después de actualizar este archivo, deberás reconstruir y reiniciar el contenedor nginx utilizando el comando docker-compose:

    $ docker-compose build
    $ docker-compose up -d
    

    Esto debería resolver el problema y permitirte ver los datos estáticos en tu aplicación Django que se ejecuta en Docker.

Comments are closed.