Forráskód Böngészése

Add support for custom public S3 URLs. Closes #505.

Kailash Nadh 3 éve
szülő
commit
64d2c5aeb9

+ 1 - 0
cmd/settings.go

@@ -45,6 +45,7 @@ type settings struct {
 	UploadFilesystemUploadPath string `json:"upload.filesystem.upload_path"`
 	UploadFilesystemUploadURI  string `json:"upload.filesystem.upload_uri"`
 	UploadS3URL                string `json:"upload.s3.url"`
+	UploadS3PublicURL          string `json:"upload.s3.public_url"`
 	UploadS3AwsAccessKeyID     string `json:"upload.s3.aws_access_key_id"`
 	UploadS3AwsDefaultRegion   string `json:"upload.s3.aws_default_region"`
 	UploadS3AwsSecretAccessKey string `json:"upload.s3.aws_secret_access_key,omitempty"`

+ 10 - 4
frontend/src/views/settings/media.vue

@@ -81,6 +81,7 @@
           </b-field>
         </div>
       </div>
+
       <div class="columns">
         <div class="column is-3">
           <b-field :label="$t('settings.media.s3.uploadExpiry')"
@@ -91,13 +92,18 @@
               placeholder="14d" :pattern="regDuration" :maxlength="10" />
           </b-field>
         </div>
-        <div class="column">
-          <b-field :label="$t('settings.media.s3.url')"
-            label-position="on-border"
+        <div class="column is-9">
+          <b-field :label="$t('settings.media.s3.url')" label-position="on-border"
             :message="$t('settings.media.s3.urlHelp')" expanded>
             <b-input v-model="data['upload.s3.url']"
               name="upload.s3.url" :disabled="!data['upload.s3.bucket']" required
-              placeholder="https://s3.region.amazonaws.com" :maxlength="200" />
+              placeholder="https://s3.$region.amazonaws.com" :maxlength="200" />
+          </b-field>
+          <b-field :label="$t('settings.media.s3.publicURL')" label-position="on-border" expanded>
+            <b-input v-model="data['upload.s3.public_url']"
+              :message="$t('settings.media.s3.publicURLHelp')"
+              name="upload.s3.public_url" :disabled="!data['upload.s3.bucket']"
+              placeholder="https://files.yourdomain.com" :maxlength="200" />
           </b-field>
         </div>
       </div>

+ 2 - 0
i18n/cs-cz.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Soukromý",
     "settings.media.s3.bucketTypePublic": "Veřejný",
     "settings.media.s3.key": "Přístupový klíč AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Oblast",
     "settings.media.s3.secret": "Přístupový tajný údaj AWS",
     "settings.media.s3.uploadExpiry": "Uplynulá platnost odeslání",

+ 2 - 0
i18n/de.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privat",
     "settings.media.s3.bucketTypePublic": "Öffentlich",
     "settings.media.s3.key": "AWS Access Key (Zugriffsschlüssel)",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Region",
     "settings.media.s3.secret": "AWS Access Secret",
     "settings.media.s3.uploadExpiry": "Upload Ablaufdatum",

+ 2 - 0
i18n/en.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Private",
     "settings.media.s3.bucketTypePublic": "Public",
     "settings.media.s3.key": "AWS access key",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Region",
     "settings.media.s3.secret": "AWS access secret",
     "settings.media.s3.uploadExpiry": "Upload expiry",

+ 2 - 0
i18n/es.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privado",
     "settings.media.s3.bucketTypePublic": "Público",
     "settings.media.s3.key": "Llave de acceso a AWS (key)",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Región",
     "settings.media.s3.secret": "Secreto de acceso a AWS (secret)",
     "settings.media.s3.uploadExpiry": "Expiración de carga",

+ 2 - 0
i18n/fr.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privé",
     "settings.media.s3.bucketTypePublic": "Public",
     "settings.media.s3.key": "Clé d'accès AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Région",
     "settings.media.s3.secret": "Mot de passe d'accès AWS",
     "settings.media.s3.uploadExpiry": "Durée de validité",

+ 2 - 0
i18n/hu.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privát",
     "settings.media.s3.bucketTypePublic": "Nyilvános",
     "settings.media.s3.key": "AWS access key",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Régió",
     "settings.media.s3.secret": "AWS access secret",
     "settings.media.s3.uploadExpiry": "Feltöltés lejárata",

+ 2 - 0
i18n/it.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privato",
     "settings.media.s3.bucketTypePublic": "Pubblico",
     "settings.media.s3.key": "Chiave d'accesso AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Regione",
     "settings.media.s3.secret": "Accesso segreto AWS",
     "settings.media.s3.uploadExpiry": "Caricamento scaduto",

+ 2 - 0
i18n/ml.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "സ്വകാര്യമായ",
     "settings.media.s3.bucketTypePublic": "പൊതുവായ",
     "settings.media.s3.key": "AWS പ്രവേശന വാക്യം",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "മേഖല",
     "settings.media.s3.secret": "AWS പ്രവേശന രഹസ്യം",
     "settings.media.s3.uploadExpiry": "അപ്ലോഡിന്റെ കാലാവധി",

+ 2 - 0
i18n/nl.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privé",
     "settings.media.s3.bucketTypePublic": "Publiek",
     "settings.media.s3.key": "AWS access key",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Regio",
     "settings.media.s3.secret": "AWS access secret",
     "settings.media.s3.uploadExpiry": "Upload vervaldatum",

+ 2 - 0
i18n/pl.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Prywatny",
     "settings.media.s3.bucketTypePublic": "Publiczny",
     "settings.media.s3.key": "Klucz dostępu AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Region",
     "settings.media.s3.secret": "Sekret dostępu AWS",
     "settings.media.s3.uploadExpiry": "Wygaśnięcie przesyłania",

+ 2 - 0
i18n/pt-BR.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privado",
     "settings.media.s3.bucketTypePublic": "Público",
     "settings.media.s3.key": "Chave de acesso AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Região",
     "settings.media.s3.secret": "Segredo de acesso AWS",
     "settings.media.s3.uploadExpiry": "Expiração do arquivo enviado",

+ 2 - 0
i18n/pt.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privado",
     "settings.media.s3.bucketTypePublic": "Público",
     "settings.media.s3.key": "Chave de acesso AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Região",
     "settings.media.s3.secret": "Segredo de acesso AWS",
     "settings.media.s3.uploadExpiry": "Validade do upload",

+ 2 - 0
i18n/ro.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Privat",
     "settings.media.s3.bucketTypePublic": "Public",
     "settings.media.s3.key": "Cheia de acces AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Regiune",
     "settings.media.s3.secret": "Secret de acces AWS",
     "settings.media.s3.uploadExpiry": "Expirarea încărcării",

+ 2 - 0
i18n/ru.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Приватный",
     "settings.media.s3.bucketTypePublic": "Публичный",
     "settings.media.s3.key": "Ключ доступа AWS",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Регион",
     "settings.media.s3.secret": "Секретаня фраза AWS",
     "settings.media.s3.uploadExpiry": "Срок жизни выгрузки",

+ 2 - 0
i18n/tr.json

@@ -377,6 +377,8 @@
     "settings.media.s3.bucketTypePrivate": "Özel",
     "settings.media.s3.bucketTypePublic": "Erişime açık",
     "settings.media.s3.key": "AWS erişim anahtarı",
+    "settings.media.s3.publicURL": "Custom public URL (optional)",
+    "settings.media.s3.publicURLHelp": "Custom S3 domain to use for image links instead of the default S3 backend URL.",
     "settings.media.s3.region": "Bölge",
     "settings.media.s3.secret": "AWS erişim şifresi(secret)",
     "settings.media.s3.uploadExpiry": "Yükleme sona erme",

+ 5 - 0
internal/media/providers/s3/s3.go

@@ -13,6 +13,7 @@ import (
 // Opt represents AWS S3 specific params
 type Opt struct {
 	URL        string        `koanf:"url"`
+	PublicURL  string        `koanf:"public_url"`
 	AccessKey  string        `koanf:"aws_access_key_id"`
 	SecretKey  string        `koanf:"aws_secret_access_key"`
 	Region     string        `koanf:"aws_default_region"`
@@ -119,5 +120,9 @@ func (c *Client) makeBucketPath(name string) string {
 }
 
 func (c *Client) makeFileURL(name string) string {
+	if c.opts.PublicURL != "" {
+		return c.opts.PublicURL + "/" + c.makeBucketPath(name)
+	}
+
 	return c.opts.URL + "/" + c.opts.Bucket + "/" + c.makeBucketPath(name)
 }

+ 2 - 1
internal/migrations/v2.1.0.go

@@ -14,7 +14,8 @@ func V2_1_0(db *sqlx.DB, fs stuffbin.FileSystem, ko *koanf.Koanf) error {
  			('appearance.admin.custom_css', '""'),
  			('appearance.admin.custom_js', '""'),
  			('appearance.public.custom_css', '""'),
- 			('appearance.public.custom_js', '""')
+ 			('appearance.public.custom_js', '""'),
+ 			('upload.s3.public_url', '""')
  			ON CONFLICT DO NOTHING;
 	`); err != nil {
 		return err

+ 1 - 0
schema.sql

@@ -199,6 +199,7 @@ INSERT INTO settings (key, value) VALUES
     ('upload.filesystem.upload_path', '"uploads"'),
     ('upload.filesystem.upload_uri', '"/uploads"'),
     ('upload.s3.url', '"https://ap-south-1.s3.amazonaws.com"'),
+    ('upload.s3.public_url', '""'),
     ('upload.s3.aws_access_key_id', '""'),
     ('upload.s3.aws_secret_access_key', '""'),
     ('upload.s3.aws_default_region', '"ap-south-1"'),