diff --git a/server/config.js b/server/config.js index 830c452e..77c01c8d 100644 --- a/server/config.js +++ b/server/config.js @@ -9,6 +9,16 @@ const conf = convict({ default: '', env: 'S3_BUCKET' }, + s3_endpoint: { + format: String, + default: '', + env: 'S3_ENDPOINT' + }, + s3_use_path_style_endpoint: { + format: Boolean, + default: false, + env: 'S3_USE_PATH_STYLE_ENDPOINT' + }, gcs_bucket: { format: String, default: '', diff --git a/server/storage/s3.js b/server/storage/s3.js index bb2b0100..e3553889 100644 --- a/server/storage/s3.js +++ b/server/storage/s3.js @@ -1,25 +1,31 @@ const AWS = require('aws-sdk'); -const s3 = new AWS.S3(); class S3Storage { constructor(config, log) { this.bucket = config.s3_bucket; this.log = log; + const cfg = {}; + if (config.s3_endpoint != '') { + cfg['endpoint'] = config.s3_endpoint; + } + cfg['s3ForcePathStyle'] = config.s3_use_path_style_endpoint + AWS.config.update(cfg); + this.s3 = new AWS.S3(); } async length(id) { - const result = await s3 + const result = await this.s3 .headObject({ Bucket: this.bucket, Key: id }) .promise(); return result.ContentLength; } getStream(id) { - return s3.getObject({ Bucket: this.bucket, Key: id }).createReadStream(); + return this.s3.getObject({ Bucket: this.bucket, Key: id }).createReadStream(); } set(id, file) { - const upload = s3.upload({ + const upload = this.s3.upload({ Bucket: this.bucket, Key: id, Body: file @@ -29,11 +35,11 @@ class S3Storage { } del(id) { - return s3.deleteObject({ Bucket: this.bucket, Key: id }).promise(); + return this.s3.deleteObject({ Bucket: this.bucket, Key: id }).promise(); } ping() { - return s3.headBucket({ Bucket: this.bucket }).promise(); + return this.s3.headBucket({ Bucket: this.bucket }).promise(); } } diff --git a/test/backend/s3-tests.js b/test/backend/s3-tests.js index 997b7c34..9e6642fd 100644 --- a/test/backend/s3-tests.js +++ b/test/backend/s3-tests.js @@ -22,6 +22,9 @@ const s3Stub = { }; const awsStub = { + config: { + update: sinon.stub() + }, S3: function() { return s3Stub; }