You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Django应用到Railway时如何排除media文件夹

解决Railway部署Django时Media文件丢失的问题

核心原因

Railway每次部署都会基于GitHub代码重新构建全新的容器,容器内的存储是临时的,之前上传的media文件会随着旧容器销毁而消失。.gitignore只是阻止本地media文件提交到GitHub,但根本问题是容器的无状态特性导致持久化数据丢失。另外,Whitenoise更适合处理静态文件(比如CSS、JS),用户上传的动态media文件用它存生产环境本来就不合适。

两种可行解决方案

方案一:改用云存储托管Media文件(推荐生产环境用)

把用户上传的图片放到专门的云存储服务,比如Cloudinary、AWS S3、阿里云OSS这些,彻底摆脱容器存储的限制。以Cloudinary为例:

  • 安装依赖:pip install django-cloudinary-storage
  • 在settings.py里添加配置:
    INSTALLED_APPS = [
        # 其他应用
        'cloudinary_storage',
        'cloudinary',
    ]
    
    # 替换默认的文件存储后端
    DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
    
    # 配置Cloudinary参数,从Railway的环境变量里取(别硬编码)
    CLOUDINARY_URL = os.environ.get('CLOUDINARY_URL')
    
  • 部署时在Railway控制台添加CLOUDINARY_URL环境变量(从Cloudinary控制台获取)
  • 之后用户上传的图片会直接存在Cloudinary,不管怎么重新部署都不会丢

方案二:使用Railway的Volumes做本地持久化

如果不想用云存储,可以用Railway提供的Volumes功能把media目录挂载到持久化存储上:

  • 打开Railway控制台,找到你的Django项目,点击「Add Volume」创建一个新的存储卷
  • 配置卷的挂载路径,比如你的Django项目里media目录的绝对路径,假设项目根目录是/app,那挂载路径设为/app/media
  • 修改settings.py里的MEDIA_ROOT指向这个路径:
    MEDIA_ROOT = '/app/media'
    
  • 之后media目录里的文件会存在Railway的Volumes里,重新部署容器也不会被覆盖

额外注意

  • 别再用Whitenoise处理media文件,把它的配置只保留静态文件相关的部分,比如STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
  • 之前已经丢失的图片,只能重新上传或者从备份恢复

内容的提问来源于stack exchange,提问作者Hakim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:25:11