Caddy:如何从Django提供静态文件

jpfvwuh4  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(112)

这是我第一次使用Caddy,我在配置静态文件时遇到了困难。
我正在使用Ubuntu服务器,并将Caddy和Django+Gunicorn作为Docker容器运行。
它工作得很好,除了它给了一个404静态文件,如CSS和JS文件。
我已经将所有静态文件收集到/home/myusername/static中的相应目录中,并具有以下Caddyfile:

mydomain.com {
  encode gzip
  
  handle_path /static/* {
        root * "/home/myusername/static/"
        file_server
    }

  handle_path /media/* {
        root * "/home/myusername/media/"
        file_server
    }

  reverse_proxy django-gunicorn-container-name:8000
}

字符串
我应该怎么做才能让Caddy正确地服务静态文件?
任何建议将不胜感激!谢谢!
编辑:我使用下面的Dockerfile和Docker-compose.yml
Dockerfile:

FROM python:latest
EXPOSE 8000
WORKDIR /pairs_trade_front_end_docker 
COPY . .
RUN apt-get update
RUN pip install --upgrade pip
RUN pip3 install -r requirements.txt

CMD ["/bin/bash", "-c", "nohup python3 manage.py collectstatic --noinput & nohup python3 manage.py migrate & gunicorn -b 0.0.0.0:8000 setup.wsgi:application"]


docker-compose.yml:

version: '3.9'
services:
  database:
    image: 'postgres:latest'
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - ~/postgres-data/:/var/lib/postgresql/data/
      - ./logs:/logs
      - ./postgresql.conf:/etc/postgresql.conf
    env_file:
      - .env
    networks:
       stats-trade-network:
         aliases:
           - postgresForStatsTrade
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5 
    restart: unless-stopped
           
  webserver:
    image: 'antoniorcampos/pairs-trade:0.9'
    container_name: stats-trade-web-server
    ports:
      - 8000:8000
    volumes:
      - ~/static:/static
    env_file:
      - .env
    networks:
       stats-trade-network:
         aliases:
           - webserverForStatsTrade
    depends_on:
      database:
        condition: service_healthy
    restart: unless-stopped

  caddy:
    image: caddy:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
    networks:
       stats-trade-network:
         aliases:
           - caddyForStatsTrade
    depends_on:
      webserver:
        condition: service_started
      database:
        condition: service_healthy
    restart: unless-stopped

networks:
  stats-trade-network:
    driver: bridge


然后我用一个基本的Linux命令行cp -r ...把静态文件复制到/home/myusername/static。

8wtpewkr

8wtpewkr1#

问题:将static文件夹作为卷挂载到stats-trade-container中,以便应用程序可以访问static。但是,您没有将static文件夹挂载到Caddy容器中。将docker-compose.yml的Caddy部分更改为如下(注意卷部分的第二行):

caddy:
    image: caddy:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ~/static:/www/html
    networks:
       stats-trade-network:
         aliases:
           - caddyForStatsTrade
    depends_on:
      webserver:
        condition: service_started
      database:
        condition: service_healthy
    restart: unless-stopped

字符串
现在Caddy可以访问静态文件,并在文件夹/www/html中看到它们。接下来,更改Caddyfile以将Caddy指向该文件夹而不是/home/username..

handle_path /static/* {
    root * /www/html
    file_server
}


这些变化应该使它工作。
附言:从Caddyfile中,看起来你想对“media”文件夹做一些类似的事情。你可以用类似的方法来做,只是把它指向一个不同于/www/html的位置(例如/media)。

相关问题