fsconfig.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. {{define "fshtml"}}
  2. <div class="card bg-light mb-3">
  3. <div class="card-body pb-1">
  4. <div class="form-group row">
  5. <label for="idFilesystem" class="col-sm-2 col-form-label">Storage</label>
  6. <div class="col-sm-10">
  7. <select class="form-control" id="idFilesystem" name="fs_provider"
  8. onchange="onFilesystemChanged(this.value)">
  9. {{ range ListFSProviders }}
  10. <option value="{{.}}" {{if eq . $.Provider }}selected{{end}}>{{.ShortInfo}}</option>
  11. {{end}}
  12. </select>
  13. </div>
  14. </div>
  15. <div class="form-group row s3">
  16. <label for="idS3Bucket" class="col-sm-2 col-form-label">Bucket</label>
  17. <div class="col-sm-3">
  18. <input type="text" class="form-control" id="idS3Bucket" name="s3_bucket" placeholder=""
  19. value="{{.S3Config.Bucket}}" maxlength="255">
  20. </div>
  21. <div class="col-sm-2"></div>
  22. <label for="idS3Region" class="col-sm-2 col-form-label">Region</label>
  23. <div class="col-sm-3">
  24. <input type="text" class="form-control" id="idS3Region" name="s3_region" placeholder=""
  25. value="{{.S3Config.Region}}" maxlength="255">
  26. </div>
  27. </div>
  28. <div class="form-group row s3">
  29. <label for="idS3AccessKey" class="col-sm-2 col-form-label">Access Key</label>
  30. <div class="col-sm-3">
  31. <input type="text" class="form-control" id="idS3AccessKey" name="s3_access_key" placeholder=""
  32. value="{{.S3Config.AccessKey}}" maxlength="255">
  33. </div>
  34. <div class="col-sm-2"></div>
  35. <label for="idS3AccessSecret" class="col-sm-2 col-form-label">Access Secret</label>
  36. <div class="col-sm-3">
  37. <input type="password" class="form-control" id="idS3AccessSecret" name="s3_access_secret" placeholder=""
  38. value="{{if .S3Config.AccessSecret.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.S3Config.AccessSecret.GetPayload}}{{end}}"
  39. maxlength="1000">
  40. </div>
  41. </div>
  42. <div class="form-group row s3">
  43. <label for="idS3StorageClass" class="col-sm-2 col-form-label">Storage Class</label>
  44. <div class="col-sm-3">
  45. <input type="text" class="form-control" id="idS3StorageClass" name="s3_storage_class" placeholder=""
  46. value="{{.S3Config.StorageClass}}" maxlength="255">
  47. </div>
  48. <div class="col-sm-2"></div>
  49. <label for="idS3Endpoint" class="col-sm-2 col-form-label">Endpoint</label>
  50. <div class="col-sm-3">
  51. <input type="text" class="form-control" id="idS3Endpoint" name="s3_endpoint" placeholder=""
  52. value="{{.S3Config.Endpoint}}" maxlength="255">
  53. </div>
  54. </div>
  55. <div class="form-group row s3">
  56. <label for="idS3PartSize" class="col-sm-2 col-form-label">UL Part Size (MB)</label>
  57. <div class="col-sm-3">
  58. <input type="number" class="form-control" id="idS3PartSize" name="s3_upload_part_size" placeholder=""
  59. value="{{.S3Config.UploadPartSize}}" aria-describedby="S3PartSizeHelpBlock">
  60. <small id="S3PartSizeHelpBlock" class="form-text text-muted">
  61. The buffer size for multipart uploads. Zero means the default (5 MB). Minimum is 5
  62. </small>
  63. </div>
  64. <div class="col-sm-2"></div>
  65. <label for="idS3UploadConcurrency" class="col-sm-2 col-form-label">UL Concurrency</label>
  66. <div class="col-sm-3">
  67. <input type="number" class="form-control" id="idS3UploadConcurrency" name="s3_upload_concurrency"
  68. placeholder="" value="{{.S3Config.UploadConcurrency}}" min="0"
  69. aria-describedby="S3ConcurrencyHelpBlock">
  70. <small id="S3ConcurrencyHelpBlock" class="form-text text-muted">
  71. How many parts are uploaded in parallel. Zero means the default (2)
  72. </small>
  73. </div>
  74. </div>
  75. <div class="form-group row s3">
  76. <label for="idS3KeyPrefix" class="col-sm-2 col-form-label">Key Prefix</label>
  77. <div class="col-sm-10">
  78. <input type="text" class="form-control" id="idS3KeyPrefix" name="s3_key_prefix" placeholder=""
  79. value="{{.S3Config.KeyPrefix}}" maxlength="255" aria-describedby="S3KeyPrefixHelpBlock">
  80. <small id="S3KeyPrefixHelpBlock" class="form-text text-muted">
  81. Similar to a chroot for local filesystem. Cannot start with "/". Example: "somedir/subdir/".
  82. </small>
  83. </div>
  84. </div>
  85. <div class="form-group row gcs">
  86. <label for="idGCSBucket" class="col-sm-2 col-form-label">Bucket</label>
  87. <div class="col-sm-10">
  88. <input type="text" class="form-control" id="idGCSBucket" name="gcs_bucket" placeholder=""
  89. value="{{.GCSConfig.Bucket}}" maxlength="255">
  90. </div>
  91. </div>
  92. <div class="form-group row gcs">
  93. <label for="idGCSCredentialFile" class="col-sm-2 col-form-label">Credentials file</label>
  94. <div class="col-sm-4">
  95. <input type="file" class="form-control-file" id="idGCSCredentialFile" name="gcs_credential_file"
  96. aria-describedby="GCSCredentialsHelpBlock">
  97. <small id="GCSCredentialsHelpBlock" class="form-text text-muted">
  98. Add or update credentials from a JSON file
  99. </small>
  100. </div>
  101. <div class="col-sm-1"></div>
  102. <label for="idGCSStorageClass" class="col-sm-2 col-form-label">Storage Class</label>
  103. <div class="col-sm-3">
  104. <input type="text" class="form-control" id="idGCSStorageClass" name="gcs_storage_class" placeholder=""
  105. value="{{.GCSConfig.StorageClass}}" maxlength="255">
  106. </div>
  107. </div>
  108. <div class="form-group gcs">
  109. <div class="form-check">
  110. <input type="checkbox" class="form-check-input" id="idGCSAutoCredentials" name="gcs_auto_credentials"
  111. {{if gt .GCSConfig.AutomaticCredentials 0}}checked{{end}}>
  112. <label for="idGCSAutoCredentials" class="form-check-label">Automatic credentials</label>
  113. </div>
  114. </div>
  115. <div class="form-group row gcs">
  116. <label for="idGCSKeyPrefix" class="col-sm-2 col-form-label">Key Prefix</label>
  117. <div class="col-sm-10">
  118. <input type="text" class="form-control" id="idGCSKeyPrefix" name="gcs_key_prefix" placeholder=""
  119. value="{{.GCSConfig.KeyPrefix}}" maxlength="255" aria-describedby="GCSKeyPrefixHelpBlock">
  120. <small id="GCSKeyPrefixHelpBlock" class="form-text text-muted">
  121. Similar to a chroot for local filesystem. Cannot start with "/". Example: "somedir/subdir/".
  122. </small>
  123. </div>
  124. </div>
  125. <div class="form-group row azblob">
  126. <label for="idAzContainer" class="col-sm-2 col-form-label">Container</label>
  127. <div class="col-sm-3">
  128. <input type="text" class="form-control" id="idAzContainer" name="az_container" placeholder=""
  129. value="{{.AzBlobConfig.Container}}" maxlength="255">
  130. </div>
  131. <div class="col-sm-2"></div>
  132. <label for="idAzAccountName" class="col-sm-2 col-form-label">Account Name</label>
  133. <div class="col-sm-3">
  134. <input type="text" class="form-control" id="idAzAccountName" name="az_account_name" placeholder=""
  135. value="{{.AzBlobConfig.AccountName}}" maxlength="255">
  136. </div>
  137. </div>
  138. <div class="form-group row azblob">
  139. <label for="idAzAccountKey" class="col-sm-2 col-form-label">Account Key</label>
  140. <div class="col-sm-10">
  141. <input type="password" class="form-control" id="idAzAccountKey" name="az_account_key" placeholder=""
  142. value="{{if .AzBlobConfig.AccountKey.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.AzBlobConfig.AccountKey.GetPayload}}{{end}}"
  143. maxlength="1000">
  144. </div>
  145. </div>
  146. <div class="form-group row azblob">
  147. <label for="idAzSASURL" class="col-sm-2 col-form-label">SAS URL</label>
  148. <div class="col-sm-10">
  149. <input type="password" class="form-control" id="idAzSASURL" name="az_sas_url" placeholder=""
  150. value="{{if .AzBlobConfig.SASURL.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.AzBlobConfig.SASURL.GetPayload}}{{end}}" maxlength="1000">
  151. </div>
  152. </div>
  153. <div class="form-group row azblob">
  154. <label for="idAzEndpoint" class="col-sm-2 col-form-label">Endpoint</label>
  155. <div class="col-sm-10">
  156. <input type="text" class="form-control" id="idAzEndpoint" name="az_endpoint" placeholder=""
  157. value="{{.AzBlobConfig.Endpoint}}" maxlength="255">
  158. </div>
  159. </div>
  160. <div class="form-group row azblob">
  161. <label for="idAzAccessTier" class="col-sm-2 col-form-label">Access Tier</label>
  162. <div class="col-sm-10">
  163. <select class="form-control" id="idAzAccessTier" name="az_access_tier">
  164. <option value="" {{if eq .AzBlobConfig.AccessTier "" }}selected{{end}}>Default</option>
  165. <option value="Hot" {{if eq .AzBlobConfig.AccessTier "Hot" }}selected{{end}}>Hot</option>
  166. <option value="Cool" {{if eq .AzBlobConfig.AccessTier "Cool" }}selected{{end}}>Cool</option>
  167. <option value="Archive" {{if eq .AzBlobConfig.AccessTier "Archive" }}selected{{end}}>Archive
  168. </option>
  169. </select>
  170. </div>
  171. </div>
  172. <div class="form-group row azblob">
  173. <label for="idAzPartSize" class="col-sm-2 col-form-label">UL Part Size (MB)</label>
  174. <div class="col-sm-3">
  175. <input type="number" class="form-control" id="idAzPartSize" name="az_upload_part_size" placeholder=""
  176. value="{{.AzBlobConfig.UploadPartSize}}" aria-describedby="AzPartSizeHelpBlock">
  177. <small id="AzPartSizeHelpBlock" class="form-text text-muted">
  178. The buffer size for multipart uploads. Zero means the default (4 MB)
  179. </small>
  180. </div>
  181. <div class="col-sm-2"></div>
  182. <label for="idAzUploadConcurrency" class="col-sm-2 col-form-label">UL Concurrency</label>
  183. <div class="col-sm-3">
  184. <input type="number" class="form-control" id="idAzUploadConcurrency" name="az_upload_concurrency"
  185. placeholder="" value="{{.AzBlobConfig.UploadConcurrency}}" min="0"
  186. aria-describedby="AzConcurrencyHelpBlock">
  187. <small id="AzConcurrencyHelpBlock" class="form-text text-muted">
  188. How many parts are uploaded in parallel. Zero means the default (2)
  189. </small>
  190. </div>
  191. </div>
  192. <div class="form-group row azblob">
  193. <label for="idAzKeyPrefix" class="col-sm-2 col-form-label">Key Prefix</label>
  194. <div class="col-sm-10">
  195. <input type="text" class="form-control" id="idAzKeyPrefix" name="az_key_prefix" placeholder=""
  196. value="{{.AzBlobConfig.KeyPrefix}}" maxlength="255" aria-describedby="AzKeyPrefixHelpBlock">
  197. <small id="AzKeyPrefixHelpBlock" class="form-text text-muted">
  198. Similar to a chroot for local filesystem. Cannot start with "/". Example: "somedir/subdir/".
  199. </small>
  200. </div>
  201. </div>
  202. <div class="form-group azblob">
  203. <div class="form-check">
  204. <input type="checkbox" class="form-check-input" id="idUseEmulator" name="az_use_emulator" {{if
  205. .AzBlobConfig.UseEmulator}}checked{{end}}>
  206. <label for="idUseEmulator" class="form-check-label">Use Azure Blob emulator</label>
  207. </div>
  208. </div>
  209. <div class="form-group row crypt">
  210. <label for="idCryptPassphrase" class="col-sm-2 col-form-label">Passphrase</label>
  211. <div class="col-sm-10">
  212. <input type="password" class="form-control" id="idCryptPassphrase" name="crypt_passphrase"
  213. placeholder=""
  214. value="{{if .CryptConfig.Passphrase.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.CryptConfig.Passphrase.GetPayload}}{{end}}"
  215. maxlength="1000">
  216. </div>
  217. </div>
  218. <div class="form-group row sftp">
  219. <label for="idSFTPEndpoint" class="col-sm-2 col-form-label">Endpoint</label>
  220. <div class="col-sm-3">
  221. <input type="text" class="form-control" id="idSFTPEndpoint" name="sftp_endpoint" placeholder=""
  222. value="{{.SFTPConfig.Endpoint}}" maxlength="255" aria-describedby="SFTPEndpointHelpBlock">
  223. <small id="SFTPEndpointHelpBlock" class="form-text text-muted">
  224. Endpoint as host:port, port is always required
  225. </small>
  226. </div>
  227. <div class="col-sm-2"></div>
  228. <label for="idSFTPUploadBufferSize" class="col-sm-2 col-form-label">Buffer size (MB)</label>
  229. <div class="col-sm-3">
  230. <input type="number" class="form-control" id="idSFTPBufferSize" name="sftp_buffer_size" placeholder=""
  231. value="{{.SFTPConfig.BufferSize}}" min="0" max="16" aria-describedby="SFTPBufferHelpBlock">
  232. <small id="SFTPBufferHelpBlock" class="form-text text-muted">
  233. A buffer size > 0 enables concurrent transfers
  234. </small>
  235. </div>
  236. </div>
  237. <div class="form-group row sftp">
  238. <label for="idSFTPUsername" class="col-sm-2 col-form-label">Username</label>
  239. <div class="col-sm-3">
  240. <input type="text" class="form-control" id="idSFTPUsername" name="sftp_username" placeholder=""
  241. value="{{.SFTPConfig.Username}}" maxlength="255">
  242. </div>
  243. <div class="col-sm-2"></div>
  244. <label for="idSFTPPassword" class="col-sm-2 col-form-label">Password</label>
  245. <div class="col-sm-3">
  246. <input type="password" class="form-control" id="idSFTPPassword" name="sftp_password" placeholder=""
  247. value="{{if .SFTPConfig.Password.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.SFTPConfig.Password.GetPayload}}{{end}}"
  248. maxlength="1000">
  249. </div>
  250. </div>
  251. <div class="form-group row sftp">
  252. <label for="idSFTPPrivateKey" class="col-sm-2 col-form-label">Private key</label>
  253. <div class="col-sm-10">
  254. <textarea type="password" class="form-control" id="idSFTPPrivateKey" name="sftp_private_key"
  255. rows="3">{{if .SFTPConfig.PrivateKey.IsEncrypted}}{{.RedactedSecret}}{{else}}{{.SFTPConfig.PrivateKey.GetPayload}}{{end}}</textarea>
  256. </div>
  257. </div>
  258. <div class="form-group row sftp">
  259. <label for="idSFTPFingerprints" class="col-sm-2 col-form-label">Fingerprints</label>
  260. <div class="col-sm-10">
  261. <textarea class="form-control" id="idSFTPFingerprints" name="sftp_fingerprints" rows="3"
  262. aria-describedby="SFTPFingerprintsHelpBlock">{{range .SFTPConfig.Fingerprints}}{{.}}&#10;{{end}}</textarea>
  263. <small id="SFTPFingerprintsHelpBlock" class="form-text text-muted">
  264. SHA256 fingerprints to validate when connecting to the external SFTP server, one per line. If
  265. empty any host key will be accepted: this is a security risk!
  266. </small>
  267. </div>
  268. </div>
  269. <div class="form-group row sftp">
  270. <label for="idSFTPPrefix" class="col-sm-2 col-form-label">Prefix</label>
  271. <div class="col-sm-10">
  272. <input type="text" class="form-control" id="idSFTPPrefix" name="sftp_prefix" placeholder=""
  273. value="{{.SFTPConfig.Prefix}}" maxlength="255" aria-describedby="SFTPPrefixHelpBlock">
  274. <small id="SFTPPrefixHelpBlock" class="form-text text-muted">
  275. Similar to a chroot for local filesystem. Example: "/somedir/subdir".
  276. </small>
  277. </div>
  278. </div>
  279. <div class="form-group sftp">
  280. <div class="form-check">
  281. <input type="checkbox" class="form-check-input" id="idDisableConcurrentReads"
  282. name="sftp_disable_concurrent_reads" {{if .SFTPConfig.DisableCouncurrentReads}}checked{{end}}>
  283. <label for="idDisableConcurrentReads" class="form-check-label">Disable concurrent reads</label>
  284. </div>
  285. </div>
  286. </div>
  287. </div>
  288. {{end}}
  289. {{define "fsjs"}}
  290. function onFilesystemChanged(val){
  291. // first hide all fsconfig sections
  292. $('.form-group.row.gcs').hide();
  293. $('.form-group.gcs').hide();
  294. $('.form-group.row.s3').hide();
  295. $('.form-group.row.azblob').hide();
  296. $('.form-group.azblob').hide();
  297. $('.form-group.crypt').hide();
  298. $('.form-group.sftp').hide();
  299. // enable the ones matching the selected vfs provider
  300. if (val == '1'){
  301. $('.form-group.row.s3').show();
  302. } else if (val == '2'){
  303. $('.form-group.row.gcs').show();
  304. $('.form-group.gcs').show();
  305. } else if (val == '3'){
  306. $('.form-group.row.azblob').show();
  307. $('.form-group.azblob').show();
  308. } else if (val == '4'){
  309. $('.form-group.crypt').show();
  310. } else if (val == '5'){
  311. $('.form-group.sftp').show();
  312. }
  313. }
  314. {{end}}