Обслуживание докеризованного react и статических файлов django с помощью nginx в качестве веб-сервера и обратного прокси
У меня есть простое докеризованное приложение react и django, которое я хотел бы обслуживать, используя nginx как веб-сервер для обслуживания статических файлов react и django и как обратный прокси для передачи запросов пользователей к бэкенду django, обслуживаемому gunicorn. Но у меня возникли проблемы с nginx для обслуживания статических файлов react и django.
Здесь находится докерфайл nginx:
FROM node:18.16-alpine as build
WORKDIR /app/frontend/
COPY ../frontend/package*.json ./
COPY ../frontend ./
RUN npm install
RUN npm run build
# production environment
FROM nginx
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/frontend/build /usr/share/nginx/html
Здесь находится файл docker-compose:
version: '3.9'
services:
db:
image: mysql:8.0
ports:
- '3307:3306'
restart: unless-stopped
env_file:
- ./backend/.env
volumes:
- mysql-data:/var/lib/mysql
backend:
image: vinmartech-backend:latest
restart: always
build:
context: ./backend
dockerfile: ./Dockerfile
ports:
- "8000:8000"
volumes:
- static:/app/backend/static/
env_file:
- ./backend/.env
depends_on:
- db
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
ports:
- "80:80"
volumes:
- static:/app/backend/static/
restart: always
depends_on:
- backend
# - frontend
volumes:
mysql-data:
static:
Здесь находится файл конфигурации nginx:
upstream mybackend {
server backend:8000;
}
server {
listen 80;
location /letter/s {
proxy_pass http://backend;
}
location /contact/ {
proxy_pass http://backend;
}
location /admin/ {
alias /static/;
}
location /static/ {
alias /static/;
}
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}
вот настройки django для конфигурации статических файлов:
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Прошло почти 4 месяца попыток найти решение, но я все еще застрял. Может ли кто-нибудь прийти мне на помощь? Пожалуйста, посмотрите на это и помогите.