Caddy配置疑问:如何让Caddy正确提供Django静态文件服务
解决Caddy静态文件404问题
核心原因
你的Caddy容器无法访问宿主机的/home/myusername/static目录——Docker容器默认是隔离环境,没有挂载该目录到Caddy内部,导致Caddy找不到静态文件,返回404。
分步修复
1. 修改docker-compose.yml,给Caddy挂载静态/媒体目录
在caddy服务的volumes部分,添加宿主机静态目录的挂载配置,让Caddy容器能读取到宿主机的静态文件:
caddy: image: caddy:latest ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile # 新增挂载:把宿主机的静态/媒体目录映射到Caddy容器内 - /home/myusername/static:/usr/share/caddy/static - /home/myusername/media:/usr/share/caddy/media networks: stats-trade-network: aliases: - caddyForStatsTrade depends_on: webserver: condition: service_started database: condition: service_healthy restart: unless-stopped
2. 修正Caddyfile配置
调整handle_path的root路径,对应Caddy容器内的挂载目录:
mydomain.com { encode gzip handle_path /static/* { root * /usr/share/caddy/static file_server } handle_path /media/* { root * /usr/share/caddy/media file_server } reverse_proxy stats-trade-web-server:8000 }
注意:
reverse_proxy的目标要写docker-compose里web服务的容器名stats-trade-web-server,否则Caddy找不到后端服务。
3. 优化Django静态文件收集(避免手动复制)
你的web服务已经挂载了~/static:/static,在Django的settings.py里配置以下参数,让collectstatic自动把文件放到挂载目录,不用手动复制:
STATIC_ROOT = '/static' MEDIA_ROOT = '/media' STATIC_URL = '/static/' MEDIA_URL = '/media/'
4. 重启服务生效
执行命令重启所有容器:
docker-compose down docker-compose up -d
验证
访问你的域名检查CSS/JS是否加载正常,或直接访问https://mydomain.com/static/[具体静态文件名],确认能正常返回文件。
内容的提问来源于stack exchange,提问作者AntonioR
相关产品推荐
相关产品推荐

