feat: add S3-compatible storage provider (MinIO, Ceph, R2, etc.)
Adds a new 'S3-Compatible Storage' provider that works with any
S3-API-compatible object storage service, including MinIO, Ceph,
Cloudflare R2, Backblaze B2, and others.
Changes:
- New provider class: classes/providers/storage/s3-compatible-provider.php
- Provider key: s3compatible
- Reads user-configured endpoint URL from settings
- Uses path-style URL access (required by most S3-compatible services)
- Supports credentials via AS3CF_S3COMPAT_ACCESS_KEY_ID /
AS3CF_S3COMPAT_SECRET_ACCESS_KEY wp-config.php constants
- Disables AWS-specific features (Block Public Access, Object Ownership)
- New provider SVG icons (s3compatible.svg, -link.svg, -round.svg)
- Registered provider in main plugin class with endpoint setting support
- Updated StorageProviderSubPage to show endpoint URL input for S3-compatible
- Built pro settings bundle with rollup (Svelte 4.2.19)
- Added package.json and updated rollup.config.mjs for pro-only builds
3
assets/img/icon/provider/storage/aws-link.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path fill="#0073AA" d="M13.95,2.68421053 L17.55,1.34210526 L13.95,0 L10.35,1.34210526 L13.95,2.68421053 Z M14.4,3.57894737 L14.4,8.05263158 L18,6.71052632 L18,2.23684211 L14.4,3.57894737 Z M13.5,3.57894737 L9.9,2.23684211 L9.9,6.71052632 L13.5,8.05263158 L13.5,3.57894737 Z M4.05,2.68421053 L7.65,1.34210526 L4.05,0 L0.45,1.34210526 L4.05,2.68421053 Z M4.5,3.57894737 L4.5,8.05263158 L8.1,6.71052632 L8.1,2.23684211 L4.5,3.57894737 Z M3.6,3.57894737 L0,2.23684211 L0,6.71052632 L3.6,8.05263158 L3.6,3.57894737 Z M9,11.6315789 L12.6,10.2894737 L9,8.94736842 L5.4,10.2894737 L9,11.6315789 Z M9.45,12.5263158 L9.45,17 L13.05,15.6578947 L13.05,11.1842105 L9.45,12.5263158 Z M8.55,12.5263158 L4.95,11.1842105 L4.95,15.6578947 L8.55,17 L8.55,12.5263158 Z" transform="translate(3 4)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 873 B |
7
assets/img/icon/provider/storage/aws-round.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="42" height="42" viewBox="0 0 42 42">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<circle cx="21" cy="21" r="21" fill="#FFD6C5"/>
|
||||
<path fill="#FA7460" fill-rule="nonzero" d="M12.5,3 L16,1.5 L12.5,0 L9,1.5 L12.5,3 Z M13,3.5 L13,7.5 L16,6.458125 L16,2.5 L13,3.5 Z M12,3.5 L9,2.5 L9,6.458125 L12,7.5 L12,3.5 Z M3.5,3 L7,1.5 L3.5,0 L0,1.5 L3.5,3 Z M4,3.541875 L4,7.5 L7,6.458125 L7,2.5 L4,3.541875 Z M3,3.541875 L9.09494702e-13,2.5 L9.09494702e-13,6.458125 L3,7.5 L3,3.541875 Z M8,10 L11.5,8.5 L8,7 L4.5,8.5 L8,10 Z M8.5,10.541875 L8.5,14.5 L11.5,13.458125 L11.5,9.5 L8.5,10.541875 Z M7.5,10.541875 L4.5,9.5 L4.5,13.458125 L7.5,14.5 L7.5,10.541875 Z" transform="translate(13 14)"/>
|
||||
<polygon points="20.5 40.542 17.5 39.5 17.5 43.458 20.5 44.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 808 B |
3
assets/img/icon/provider/storage/aws.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path fill="#FA7460" d="M17.5,6 L21.5,4.5 L17.5,3 L13.5,4.5 L17.5,6 Z M18,7 L18,12 L22,10.5 L22,5.5 L18,7 Z M17,7 L13,5.5 L13,10.5 L17,12 L17,7 Z M6.5,6 L10.5,4.5 L6.5,3 L2.5,4.5 L6.5,6 Z M7,7 L7,12 L11,10.5 L11,5.5 L7,7 Z M6,7 L2,5.5 L2,10.5 L6,12 L6,7 Z M12,16 L16,14.5 L12,13 L8,14.5 L12,16 Z M12.5,17 L12.5,22 L16.5,20.5 L16.5,15.5 L12.5,17 Z M11.5,17 L7.5,15.5 L7.5,20.5 L11.5,22 L11.5,17 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 492 B |
8
assets/img/icon/provider/storage/do-link.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#0073AA" d="M12.5,18 C16.6001068,18 19.2724918,14.0555992 17.6979642,9.73757151 C17.1126434,8.13185074 15.8484684,6.86676389 14.2437866,6.28090265 C9.92837002,4.71705687 5.86234391,7.8900831 5.86234391,11.9926708 L2,11.9926708 C2,5.45404627 8.32016267,0.354095641 15.172385,2.49565767 C18.1626643,3.43685371 20.5523217,5.8163225 21.4813211,8.80881241 C23.621989,15.6760131 19.046699,22 12.5,22 L12.5,18 Z"/>
|
||||
<polygon fill="#0073AA" points="8.5 18 12.5 18 12.5 14 8.5 14"/>
|
||||
<polygon fill="#0073AA" points="5.5 21 8.5 21 8.5 18 5.5 18"/>
|
||||
<polygon fill="#0073AA" points="3 18 5.5 18 5.5 15.5 3 15.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 763 B |
7
assets/img/icon/provider/storage/do-round.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="42" height="42" viewBox="0 0 42 42">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<circle cx="21" cy="21" r="21" fill="#CDE6FF"/>
|
||||
<path fill="#0080FF" d="M20.991018,25.5 C24.1686008,25.5 26.3861811,22.3430894 25.1659222,18.9966179 C24.7122987,17.7521843 23.732563,16.771742 22.4889346,16.3176996 C19.1444868,15.1057191 15.9933165,17.5648144 15.9933165,20.7443199 L13,20.7443199 C13,15.6768859 17.8981261,11.7244241 23.2085984,13.3841347 C25.5260648,14.1135616 27.3780493,15.9576499 28.0980238,18.2768296 C29.7570415,23.5989101 26.0647097,28.5 20.991018,28.5 L20.991018,25.5 Z"/>
|
||||
<path fill="#0080FF" d="M18.5,26 L21.5,26 L21.5,23 L18.5003124,23 L18.5,26 Z M16,28.5 L18.5,28.5 L18.5,26 L16,26 L16,28.5 Z M14,26 L16,26 L16,24 L14,24 L14,26 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 809 B |
8
assets/img/icon/provider/storage/do.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#0080FF" d="M12.5,18 C16.6001068,18 19.2724918,14.0555992 17.6979642,9.73757151 C17.1126434,8.13185074 15.8484684,6.86676389 14.2437866,6.28090265 C9.92837002,4.71705687 5.86234391,7.8900831 5.86234391,11.9926708 L2,11.9926708 C2,5.45404627 8.32016267,0.354095641 15.172385,2.49565767 C18.1626643,3.43685371 20.5523217,5.8163225 21.4813211,8.80881241 C23.621989,15.6760131 19.046699,22 12.5,22 L12.5,18 Z"/>
|
||||
<polygon fill="#0080FF" points="8.5 18 12.5 18 12.5 14 8.5 14"/>
|
||||
<polygon fill="#0080FF" points="5.5 21 8.5 21 8.5 18 5.5 18"/>
|
||||
<polygon fill="#0080FF" points="3 18 5.5 18 5.5 15.5 3 15.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 763 B |
7
assets/img/icon/provider/storage/gcp-link.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#0073AA" fill-rule="nonzero" d="M17.4999789 5C15.5 3.50287439 14 3 11.5 3 10 3 6 4 5 10 5 10 6.33333333 10 9 10 9.5 7.00574877 12.5 5.5 15 8L17.4999789 5zM20 9C19.5417503 7.33397632 18.8073189 6.14420224 17.5 5L15 8C16.3333333 9 16.8333333 10.3333333 16.5 12 17.874749 12 19 13.1424489 19 14.5 19 15.8575511 17.874749 17 16.5 17L11.5 17 11 17.5604053 11 20.50924 11.4967812 20.9998066 16.475602 20.9998066C20.0507752 21.0269848 22.9724775 18.0304482 23 14.5 23.0165135 12.35564 21.7944672 10.1985586 20 9z"/>
|
||||
<path fill="#0073AA" fill-rule="nonzero" d="M6.9578817,20.9999272 L12,20.9999272 L12,17 L8,17 C6.5,17 5.5,16 5.5,16 L5,16.5 L3.17698978,19.0999945 L3,19.5 C4.1385878,20.3080925 5.52942087,21.0064652 6.9578817,20.9999272 Z"/>
|
||||
<path fill="#0073AA" fill-rule="nonzero" d="M7.00010877,8 C3.60719065,8.01960989 0.980526716,10.61033 1.00010877,14.0000463 C1.01185801,15.8924966 1.4975121,18.3470993 3.00010877,19.5000511 L5.50010877,16.0000463 C4.50010877,15.0000463 4.50010877,14.0000463 5.00010877,13.0000463 C5.50010877,12.0000463 6.81202174,11.4639579 8,12 C8.52349372,12.2360672 8.76251312,12.4770466 9.00010877,13.0000463 L11.5,10.5 C10.3355202,8.97664925 8.91784511,7.99222088 7.00010877,8 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
11
assets/img/icon/provider/storage/gcp-round.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="42" height="42" viewBox="0 0 42 42">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<circle cx="21" cy="21" r="20.5" fill="#FFF" stroke="#E4E4E4"/>
|
||||
<g fill-rule="nonzero" transform="translate(12 14)">
|
||||
<path fill="#FF3E3A" d="M13.8910033,2.78928954 L14.5,2.01018449 C11.5196054,-0.949010824 6.28188717,-0.586342311 3.59518837,2.73744564 C2.84889539,3.66060415 2.2952392,4.8115227 2,6 L2.58577457,5.90987508 L5.85677799,5.32089305 L6,5 C7.45502876,3.25512368 10.3199956,3.01920567 12,4.50381918 L13.8910033,2.78928954 Z"/>
|
||||
<path fill="#1B95FF" d="M14.5,2 L12,4.5 C12.984163,5.27567565 13.5864176,6.19236274 13.5623882,7.41799649 L13.5623882,7.81706347 C14.7079665,7.81706347 15.6367573,8.7128767 15.6367573,9.81786898 C15.6367573,10.9229332 14.6455783,12 13.5,12 L9.5,12 L9,12 L9,15 L9.40790378,14.9998372 L13.5623882,14.9998372 C16.5421902,15.0222236 18.9766281,12.7328431 18.9998367,9.85861067 C19.0138663,8.11643568 18.1233584,6.48316913 16.6272635,5.50709621 C16.2455533,4.15124743 15.5896091,2.93237998 14.5,2 Z"/>
|
||||
<path fill="#0FB659" d="M9,14.999959 L9,11.9999993 L6,11.9999993 C4.5,11.9999993 4,11.4999993 4,11.4999993 L3,12.4999993 L2,13.4999993 L1.5,13.9999993 C2.38642684,14.605621 3.88926844,15.00434 5,14.9999993 L9,14.999959 Z"/>
|
||||
<path fill="#FFCD3E" d="M9.11757497e-05,10.0503409 C0.00933482501,11.5986523 0.271567664,13.0561397 1.5,14 L4,11.5 C3.0276098,11.0610873 2.56068341,9.97142684 3,9 C3.43924709,8.02857316 4.5277488,7.56115671 5.5,8 C5.92847442,8.19338268 6.30643937,8.57198892 6.5,9 L9,6.96809175 C8.0463751,5.72259616 6.56461118,4.99440793 4.99506733,5.00003234 C2.21981802,5.0165584 -0.0164500913,7.27771235 9.11757497e-05,10.0503409 Z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
8
assets/img/icon/provider/storage/gcp.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#EA4335" fill-rule="nonzero" d="M17.4999789,5 C15.5,3.50287439 14,3 11.5,3 C10,3 6,4 5,10 C5,10 6.33333333,10 9,10 C9.5,7.00574877 12.5,5.5 15,8 L17.4999789,5 Z"/>
|
||||
<path fill="#4285F4" fill-rule="nonzero" d="M20,9 C19.5417503,7.33397632 18.8073189,6.14420224 17.5,5 L15,8 C16.3333333,9 16.8333333,10.3333333 16.5,12 C17.874749,12 19,13.1424489 19,14.5 C19,15.8575511 17.874749,17 16.5,17 L11.5,17 L11,17.5604053 L11,20.50924 L11.4967812,20.9998066 L16.475602,20.9998066 C20.0507752,21.0269848 22.9724775,18.0304482 23,14.5 C23.0165135,12.35564 21.7944672,10.1985586 20,9 Z"/>
|
||||
<path fill="#34A853" fill-rule="nonzero" d="M6.9578817,20.9999272 L12,20.9999272 L12,17 L8,17 C6.5,17 5.5,16 5.5,16 L5,16.5 L3.17698978,19.0999945 L3,19.5 C4.1385878,20.3080925 5.52942087,21.0064652 6.9578817,20.9999272 Z"/>
|
||||
<path fill="#FBBC05" fill-rule="nonzero" d="M7.00010877,8 C3.60719065,8.01960989 0.980526716,10.61033 1.00010877,14.0000463 C1.01185801,15.8924966 1.4975121,18.3470993 3.00010877,19.5000511 L5.50010877,16.0000463 C4.50010877,15.0000463 4.50010877,14.0000463 5.00010877,13.0000463 C5.50010877,12.0000463 6.81202174,11.4639579 8,12 C8.52349372,12.2360672 8.76251312,12.4770466 9.00010877,13.0000463 L11.5,10.5 C10.3355202,8.97664925 8.91784511,7.99222088 7.00010877,8 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
6
assets/img/icon/provider/storage/s3compatible-link.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
|
||||
<rect x="14" y="22" width="52" height="36" rx="4" stroke="#3B5BDB" stroke-width="2.5"/>
|
||||
<ellipse cx="40" cy="22" rx="26" ry="7" fill="#3B5BDB"/>
|
||||
<ellipse cx="40" cy="22" rx="26" ry="7" fill="white" opacity="0.25"/>
|
||||
<text x="40" y="50" font-family="monospace,sans-serif" font-size="13" font-weight="700" fill="#3B5BDB" text-anchor="middle">S3</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 437 B |
7
assets/img/icon/provider/storage/s3compatible-round.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
|
||||
<circle cx="40" cy="40" r="38" fill="#3B5BDB"/>
|
||||
<rect x="16" y="26" width="48" height="30" rx="3" fill="white" opacity="0.15"/>
|
||||
<rect x="16" y="26" width="48" height="30" rx="3" stroke="white" stroke-width="2"/>
|
||||
<ellipse cx="40" cy="26" rx="24" ry="6" fill="white"/>
|
||||
<text x="40" y="49" font-family="monospace,sans-serif" font-size="12" font-weight="700" fill="white" text-anchor="middle">S3</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 489 B |
8
assets/img/icon/provider/storage/s3compatible.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
|
||||
<rect width="80" height="80" rx="8" fill="#F0F4FF"/>
|
||||
<rect x="14" y="22" width="52" height="36" rx="4" fill="#3B5BDB" opacity="0.15"/>
|
||||
<rect x="14" y="22" width="52" height="36" rx="4" stroke="#3B5BDB" stroke-width="2.5"/>
|
||||
<ellipse cx="40" cy="22" rx="26" ry="7" fill="#3B5BDB"/>
|
||||
<ellipse cx="40" cy="22" rx="26" ry="7" fill="white" opacity="0.25"/>
|
||||
<text x="40" y="50" font-family="monospace,sans-serif" font-size="13" font-weight="700" fill="#3B5BDB" text-anchor="middle">S3</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 576 B |