Django Rest Framework, Docker, nginx - базовый url для медиафайлов
Я пытаюсь настроить свое приложение Django Rest Framework. К сожалению, я все еще не могу получить правильный url медиафайлов.
Я попробовал добавить строки из этого ответа в конфигурацию nginx, в результате чего получаю "Bad Request (400)": Django Rest framework swagger base url
Приложение запущено на my-domain.com.
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": "512e0f9f-f08a-4a2d-8e1d-b933a16c0a1f",
"date_joined": "2021-10-10T11:41:05.077828Z",
"name": "Maxine Mustermann",
"user_picture": "**http://127.0.0.1:8337**/mediafiles/images/usr1.jpeg"
}
]
}
Ожидается: https://my-domain.com/mediafiles/images/usr1.jpeg (Хотя изображение может быть доступно по этому url) Returned: **http://127.0.0.1:8337**/mediafiles/images/usr1.jpeg
docker-compose file:
version: "3.8"
services:
db:
image: postgres:13-alpine
volumes:
- postgres_data_staging:/var/lib/postgresql/data/
env_file:
- ./.env.staging.db
expose:
- 5432
web:
build:
context: ./api
dockerfile: Dockerfile.staging
command: gunicorn config.wsgi:application --workers 3 --bind 0.0.0.0:8000
volumes:
- static_volume_staging:/home/api/web/staticfiles
- media_volume_staging:/home/api/web/mediafiles
expose:
- 8000
env_file:
- ./.env.staging
depends_on:
- db
nginx:
build: ./nginx
volumes:
- static_volume_staging:/home/api/web/staticfiles
- media_volume_staging:/home/api/web/mediafiles
ports:
- 8337:80
depends_on:
- web
volumes:
postgres_data_staging:
static_volume_staging:
media_volume_staging:
nginx.conf:
upstream ae_backend {
server web:8000;
}
server {
listen 80;
client_max_body_size 75M;
server_name $DOMAIN www.$DOMAIN;
location / {
proxy_pass http://ae_backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
location /staticfiles/ {
alias /home/api/web/staticfiles/;
}
location /mediafiles/ {
alias /home/api/web/mediafiles/;
}
}
Конфигурация сервера nginx/sites-enabled/my-api:
server {
server_name my-domain.com;
location = /favicon.ico { access_log off; log_not_found off; }
# add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization';
location / {
proxy_pass http://127.0.0.1:8337;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/my-domain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/my-domain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = my-domain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name my-domain.com;
return 404; # managed by Certbot
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization';
}
Любая помощь и рекомендации будут приняты с благодарностью.
Спасибо!!!
Приветствую,
Флориан
Я отредактировал эту часть в конфигурации моего сервера nginx:
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:8337;
}
и убедились, что my-domain.com указан в списке "ALLOWED_HOSTS" (settings.py).