fix: force HTTPS S3 endpoint to avoid Coolify 307 on uploads

http://s3 hosts redirect to https; AWS SDK cannot follow PUT redirects, which caused XML parse errors.
This commit is contained in:
2026-08-15 03:04:53 +03:30
parent aa2132f02c
commit e1772a2559
3 changed files with 42 additions and 11 deletions
+30 -9
View File
@@ -31,11 +31,25 @@ const config = {
// S3-compatible storage (MinIO locally, SeaweedFS in production)
// Accepts S3_* directly, or SeaweedFS/AWS service env aliases from the host platform.
S3_ENDPOINT:
process.env.S3_ENDPOINT
|| process.env.SERVICE_URL_S3
|| process.env.SERVICE_URL_S3_8333
|| 'http://localhost:9000',
// IMPORTANT: use https:// for public SeaweedFS — http:// gets a 307 that AWS SDK cannot follow on PUT.
S3_ENDPOINT: (() => {
const raw = (
process.env.S3_ENDPOINT
|| process.env.SERVICE_URL_S3
|| process.env.SERVICE_URL_S3_8333
|| 'http://localhost:9000'
).trim().replace(/\/$/, '');
// Upgrade plain http → https for non-local endpoints (Coolify/proxy 307 breaks PutObject)
const isLocal = /^(http:\/\/)?(localhost|127\.0\.0\.1|minio)(:|\/|$)/i.test(raw)
|| raw.startsWith('http://localhost')
|| raw.startsWith('http://127.0.0.1')
|| raw.startsWith('http://minio');
if (raw.startsWith('http://') && !isLocal) {
return `https://${raw.slice('http://'.length)}`;
}
return raw;
})(),
S3_REGION: process.env.S3_REGION || process.env.AWS_REGION || 'us-east-1',
S3_ACCESS_KEY:
process.env.S3_ACCESS_KEY
@@ -59,10 +73,17 @@ const config = {
),
SIGNED_URL_EXPIRES_IN: parseInt(process.env.SIGNED_URL_EXPIRES_IN, 10) || 900, // 15 minutes default
// Public base URL for public buckets only (private buckets leave fileUrl empty)
S3_PUBLIC_BASE_URL:
process.env.S3_PUBLIC_BASE_URL
|| process.env.SERVICE_URL_S3
|| '',
S3_PUBLIC_BASE_URL: (() => {
const raw = (
process.env.S3_PUBLIC_BASE_URL
|| process.env.SERVICE_URL_S3
|| ''
).trim().replace(/\/$/, '');
if (raw.startsWith('http://') && !/localhost|127\.0\.0\.1/i.test(raw)) {
return `https://${raw.slice('http://'.length)}`;
}
return raw;
})(),
S3_CERTIFICATES_PUBLIC: parseBool(process.env.S3_CERTIFICATES_PUBLIC, false),
S3_DOCUMENTS_PUBLIC: parseBool(process.env.S3_DOCUMENTS_PUBLIC, false),
// SeaweedFS admin console (optional; not used by the S3 SDK client)