diff --git a/.config/example.yml b/.config/example.yml
index e787274fdc..05dc43c44b 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -68,6 +68,29 @@ drive:
   #   accessKey:
   #   secretKey:
 
+  # S3 example
+  # storage: 'minio'
+  # bucket: bucket-name
+  # prefix: files
+  # config:
+  #   endPoint: s3-us-west-2.amazonaws.com
+  #   region: us-west-2
+  #   secure: true
+  #   accessKey: XXX
+  #   secretKey: YYY
+
+  # S3 example (with CDN, custom domain)
+  # storage: 'minio'
+  # bucket: drive.example.com
+  # prefix: files
+  # baseUrl: https://drive.example.com
+  # config:
+  #   endPoint: s3-us-west-2.amazonaws.com
+  #   region: us-west-2
+  #   secure: true
+  #   accessKey: XXX
+  #   secretKey: YYY
+
 #
 # Below settings are optional
 #
diff --git a/src/config/types.ts b/src/config/types.ts
index b554650820..a3d55e2843 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -53,6 +53,7 @@ export type Source = {
 		storage: string;
 		bucket?: string;
 		prefix?: string;
+		baseUrl?: string;
 		config?: any;
 	};
 
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index dd871625ed..d2e7dbd862 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -25,6 +25,8 @@ async function save(readable: stream.Readable, name: string, type: string, hash:
 		const minio = new Minio.Client(config.drive.config);
 		const id = uuid.v4();
 		const obj = `${config.drive.prefix}/${id}`;
+		const baseUrl = config.drive.baseUrl
+			|| `${ config.drive.config.secure ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }`;
 		await minio.putObject(config.drive.bucket, obj, readable, size, { 'Content-Type': type, 'Cache-Control': 'max-age=31536000, immutable' });
 
 		Object.assign(metadata, {
@@ -33,7 +35,7 @@ async function save(readable: stream.Readable, name: string, type: string, hash:
 			storageProps: {
 				id: id
 			},
-			url: `${ config.drive.config.secure ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }/${ obj }`
+			url: `${ baseUrl }/${ obj }`
 		});
 
 		const file = await DriveFile.insert({