用django-storage来存储Django的Media文件到S3服务

默认情况下,Django的FileField会把文件存到Media目录下,也就是本地文件系统。 然而在后端多实例情况下,这会出现明显的一致性缺陷。 因此需要把它放到独立的存储服务中,比如S3。

这里介绍如何用django-storages来转存Django的Media文件,到一个兼容S3服务的存储平台上。

安装

pip install django-storages[boto3]

其中,boto3是S3协议的官方SDK。

修改settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_DEFAULT_ACL = 'public-read'
AWS_ACCESS_KEY_ID = 'access'
AWS_SECRET_ACCESS_KEY = 'secretkey'
AWS_STORAGE_BUCKET_NAME = 'bucket'
AWS_AUTO_CREATE_BUCKET = True
AWS_S3_ENDPOINT_URL = 'http://localhost:9000'

其中:

调整docker-compose.yaml

调整docker-compose.yaml,添加minio作为s3服务。

version: "3"

services:
  server:
    build: .
    image: your-server:latest
    ports:
      - 8000:8000
    restart: unless-stopped

  minio:
    image: minio/minio:RELEASE.2018-03-30T00-38-44Z
    ports:
      - 9000:9000
    environment:
      - MINIO_ACCESS_KEY=access
      - MINIO_SECRET_KEY=secretkey
    volumes:
      - minio-data:/data
    command: server /data
    restart: unless-stopped

volumes:
  minio-data:

其中,server部分仅供参考,minio部分是开发调试时用的S3服务。 在真正对外提供服务的配置中,还会加上Nginx、PostgreSQL等更多组件。

参考

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。 它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据, 例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似NodeJS、Redis或者MySQL。


相关笔记