部署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
相关产品推荐
相关产品推荐

