config.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // config.go is just a shortcut for common.Config which helps to
  2. // avoid importing of the `common` package directly.
  3. package transport
  4. import (
  5. "errors"
  6. "os"
  7. "github.com/imgproxy/imgproxy/v3/ensure"
  8. "github.com/imgproxy/imgproxy/v3/env"
  9. "github.com/imgproxy/imgproxy/v3/fetcher/transport/generichttp"
  10. azure "github.com/imgproxy/imgproxy/v3/storage/abs"
  11. "github.com/imgproxy/imgproxy/v3/storage/fs"
  12. "github.com/imgproxy/imgproxy/v3/storage/gcs"
  13. "github.com/imgproxy/imgproxy/v3/storage/s3"
  14. "github.com/imgproxy/imgproxy/v3/storage/swift"
  15. )
  16. var (
  17. IMGPROXY_USE_ABS = env.Describe("IMGPROXY_USE_ABS", "boolean")
  18. IMGPROXY_USE_GCS = env.Describe("IMGPROXY_USE_GCS", "boolean")
  19. IMGPROXY_USE_S3 = env.Describe("IMGPROXY_USE_S3", "boolean")
  20. IMGPROXY_USE_SWIFT = env.Describe("IMGPROXY_USE_SWIFT", "boolean")
  21. IMGPROXY_SOURCE_URL_QUERY_SEPARATOR = env.Describe("IMGPROXY_SOURCE_URL_QUERY_SEPARATOR", "string")
  22. fsDesc = fs.ConfigDesc{
  23. Root: env.Describe("IMGPROXY_LOCAL_FILESYSTEM_ROOT", "path"),
  24. }
  25. absConfigDesc = azure.ConfigDesc{
  26. Name: env.Describe("IMGPROXY_ABS_NAME", "string"),
  27. Endpoint: env.Describe("IMGPROXY_ABS_ENDPOINT", "string"),
  28. Key: env.Describe("IMGPROXY_ABS_KEY", "string"),
  29. AllowedBuckets: env.Describe("IMGPROXY_ABS_ALLOWED_BUCKETS", "comma-separated list"),
  30. DeniedBuckets: env.Describe("IMGPROXY_ABS_DENIED_BUCKETS", "comma-separated list"),
  31. }
  32. gcsConfigDesc = gcs.ConfigDesc{
  33. Key: env.Describe("IMGPROXY_GCS_KEY", "string"),
  34. Endpoint: env.Describe("IMGPROXY_GCS_ENDPOINT", "string"),
  35. AllowedBuckets: env.Describe("IMGPROXY_GCS_ALLOWED_BUCKETS", "comma-separated list"),
  36. DeniedBuckets: env.Describe("IMGPROXY_GCS_DENIED_BUCKETS", "comma-separated list"),
  37. }
  38. s3ConfigDesc = s3.ConfigDesc{
  39. Region: env.Describe("IMGPROXY_S3_REGION", "string"),
  40. Endpoint: env.Describe("IMGPROXY_S3_ENDPOINT", "string"),
  41. EndpointUsePathStyle: env.Describe("IMGPROXY_S3_ENDPOINT_USE_PATH_STYLE", "boolean"),
  42. AssumeRoleArn: env.Describe("IMGPROXY_S3_ASSUME_ROLE_ARN", "string"),
  43. AssumeRoleExternalID: env.Describe("IMGPROXY_S3_ASSUME_ROLE_EXTERNAL_ID", "string"),
  44. DecryptionClientEnabled: env.Describe("IMGPROXY_S3_DECRYPTION_CLIENT_ENABLED", "boolean"),
  45. AllowedBuckets: env.Describe("IMGPROXY_S3_ALLOWED_BUCKETS", "comma-separated list"),
  46. DeniedBuckets: env.Describe("IMGPROXY_S3_DENIED_BUCKETS", "comma-separated list"),
  47. }
  48. swiftConfigDesc = swift.ConfigDesc{
  49. Username: env.Describe("IMGPROXY_SWIFT_USERNAME", "string"),
  50. APIKey: env.Describe("IMGPROXY_SWIFT_API_KEY", "string"),
  51. AuthURL: env.Describe("IMGPROXY_SWIFT_AUTH_URL", "string"),
  52. Domain: env.Describe("IMGPROXY_SWIFT_DOMAIN", "string"),
  53. Tenant: env.Describe("IMGPROXY_SWIFT_TENANT", "string"),
  54. AuthVersion: env.Describe("IMGPROXY_SWIFT_AUTH_VERSION", "number"),
  55. ConnectTimeout: env.Describe("IMGPROXY_SWIFT_CONNECT_TIMEOUT_SECONDS", "number"),
  56. Timeout: env.Describe("IMGPROXY_SWIFT_TIMEOUT_SECONDS", "number"),
  57. AllowedBuckets: env.Describe("IMGPROXY_SWIFT_ALLOWED_BUCKETS", "comma-separated list"),
  58. DeniedBuckets: env.Describe("IMGPROXY_SWIFT_DENIED_BUCKETS", "comma-separated list"),
  59. }
  60. )
  61. // Config represents configuration of the transport package
  62. type Config struct {
  63. HTTP generichttp.Config
  64. Local fs.Config
  65. ABSEnabled bool
  66. ABS azure.Config
  67. GCSEnabled bool
  68. GCS gcs.Config
  69. S3Enabled bool
  70. S3 s3.Config
  71. SwiftEnabled bool
  72. Swift swift.Config
  73. // query string separator (see docs). Unfortunately, we'll have to pass this
  74. // to each transport which needs it as the consturctor parameter. Otherwise,
  75. // we would have to add it to each transport config struct.
  76. SourceURLQuerySeparator string
  77. }
  78. // NewDefaultConfig returns a new default transport configuration
  79. func NewDefaultConfig() Config {
  80. return Config{
  81. HTTP: generichttp.NewDefaultConfig(),
  82. Local: fs.NewDefaultConfig(),
  83. ABSEnabled: false,
  84. ABS: azure.NewDefaultConfig(),
  85. GCSEnabled: false,
  86. GCS: gcs.NewDefaultConfig(),
  87. S3Enabled: false,
  88. S3: s3.NewDefaultConfig(),
  89. SwiftEnabled: false,
  90. Swift: swift.NewDefaultConfig(),
  91. SourceURLQuerySeparator: "?", // default is ?, but can be overriden with empty
  92. }
  93. }
  94. // LoadConfigFromEnv loads transport configuration from environment variables
  95. func LoadConfigFromEnv(c *Config) (*Config, error) {
  96. c = ensure.Ensure(c, NewDefaultConfig)
  97. _, genericErr := generichttp.LoadConfigFromEnv(&c.HTTP)
  98. _, localErr := fs.LoadConfigFromEnv(fsDesc, &c.Local)
  99. _, absErr := azure.LoadConfigFromEnv(absConfigDesc, &c.ABS)
  100. _, gcsErr := gcs.LoadConfigFromEnv(gcsConfigDesc, &c.GCS)
  101. _, s3Err := s3.LoadConfigFromEnv(s3ConfigDesc, &c.S3)
  102. _, swiftErr := swift.LoadConfigFromEnv(swiftConfigDesc, &c.Swift)
  103. err := errors.Join(
  104. env.Bool(&c.ABSEnabled, IMGPROXY_USE_ABS),
  105. env.Bool(&c.GCSEnabled, IMGPROXY_USE_GCS),
  106. env.Bool(&c.S3Enabled, IMGPROXY_USE_S3),
  107. env.Bool(&c.SwiftEnabled, IMGPROXY_USE_SWIFT),
  108. genericErr,
  109. localErr,
  110. absErr,
  111. gcsErr,
  112. s3Err,
  113. swiftErr,
  114. )
  115. // empty value is a valid value for this separator, we can't rely on env.String,
  116. // which skips empty values
  117. if s, ok := os.LookupEnv(IMGPROXY_SOURCE_URL_QUERY_SEPARATOR.Name); ok {
  118. c.SourceURLQuerySeparator = s
  119. }
  120. return c, err
  121. }
  122. func (c *Config) Validate() error {
  123. return nil
  124. }