diff --git a/.env.example b/.env.example index 7805e7d459..ed19ac159d 100644 --- a/.env.example +++ b/.env.example @@ -70,6 +70,8 @@ S3_BUCKET_NAME= # Configure a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3 # e.g., https://gateway.storjshare.io S3_ENDPOINT_URL= +# Force path style for S3 compatible storage (0 for disabled, 1 for enabled) +S3_FORCE_PATH_STYLE=0 ##################### # Disable Features # diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index edbcb82066..aff5d94b90 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -84,6 +84,9 @@ x-environment: &environment # Set a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3 # S3_ENDPOINT_URL= + # Force path style for S3 compatible storage (0 for disabled, 1 for enabled) + S3_FORCE_PATH_STYLE: 0 + ############################################# OPTIONAL (OAUTH CONFIGURATION) ############################################# # Set the below from GitHub if you want to enable GitHub OAuth diff --git a/packages/lib/constants.ts b/packages/lib/constants.ts index 8f3e5d48ad..8398326986 100644 --- a/packages/lib/constants.ts +++ b/packages/lib/constants.ts @@ -88,6 +88,7 @@ export const S3_SECRET_KEY = env.S3_SECRET_KEY; export const S3_REGION = env.S3_REGION; export const S3_ENDPOINT_URL = env.S3_ENDPOINT_URL; export const S3_BUCKET_NAME = env.S3_BUCKET_NAME; +export const S3_FORCE_PATH_STYLE = env.S3_FORCE_PATH_STYLE === "1"; export const UPLOADS_DIR = env.UPLOADS_DIR || "./uploads"; export const MAX_SIZES = { standard: 1024 * 1024 * 10, // 10MB diff --git a/packages/lib/env.ts b/packages/lib/env.ts index a4f27771cf..65da94dfdf 100644 --- a/packages/lib/env.ts +++ b/packages/lib/env.ts @@ -64,6 +64,7 @@ export const env = createEnv({ S3_REGION: z.string().optional(), S3_SECRET_KEY: z.string().optional(), S3_ENDPOINT_URL: z.string().optional(), + S3_FORCE_PATH_STYLE: z.enum(["1", "0"]).optional(), SHORT_URL_BASE: z.string().url().optional().or(z.string().length(0)), SIGNUP_DISABLED: z.enum(["1", "0"]).optional(), SLACK_CLIENT_ID: z.string().optional(), @@ -167,6 +168,7 @@ export const env = createEnv({ S3_REGION: process.env.S3_REGION, S3_SECRET_KEY: process.env.S3_SECRET_KEY, S3_ENDPOINT_URL: process.env.S3_ENDPOINT_URL, + S3_FORCE_PATH_STYLE: process.env.S3_FORCE_PATH_STYLE, SHORT_URL_BASE: process.env.SHORT_URL_BASE, SIGNUP_DISABLED: process.env.SIGNUP_DISABLED, SLACK_CLIENT_ID: process.env.SLACK_CLIENT_ID, diff --git a/packages/lib/storage/service.ts b/packages/lib/storage/service.ts index 6ad5bb6c15..461efceec3 100644 --- a/packages/lib/storage/service.ts +++ b/packages/lib/storage/service.ts @@ -25,6 +25,7 @@ import { UPLOADS_DIR, WEBAPP_URL, isS3Configured, + S3_FORCE_PATH_STYLE, } from "../constants"; import { generateLocalSignedUrl } from "../crypto"; import { env } from "../env"; @@ -43,6 +44,7 @@ export const getS3Client = () => { credentials, region: S3_REGION, ...(S3_ENDPOINT_URL && { endpoint: S3_ENDPOINT_URL }), + forcePathStyle: S3_FORCE_PATH_STYLE, }); } diff --git a/turbo.json b/turbo.json index d10c18956c..1e854de355 100644 --- a/turbo.json +++ b/turbo.json @@ -114,13 +114,14 @@ "PLAYWRIGHT_CI", "PRIVACY_URL", "RATE_LIMITING_DISABLED", - "REDIS_URL", "REDIS_HTTP_URL", + "REDIS_URL", "S3_ACCESS_KEY", - "S3_SECRET_KEY", - "S3_REGION", "S3_BUCKET_NAME", "S3_ENDPOINT_URL", + "S3_FORCE_PATH_STYLE", + "S3_REGION", + "S3_SECRET_KEY", "SENTRY_DSN", "SHORT_URL_BASE", "SIGNUP_DISABLED",