config.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. package config
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "math"
  7. "os"
  8. "regexp"
  9. "runtime"
  10. log "github.com/sirupsen/logrus"
  11. "github.com/imgproxy/imgproxy/v3/config/configurators"
  12. "github.com/imgproxy/imgproxy/v3/imagetype"
  13. "github.com/imgproxy/imgproxy/v3/version"
  14. )
  15. type URLReplacement = configurators.URLReplacement
  16. var (
  17. Network string
  18. Bind string
  19. ReadTimeout int
  20. WriteTimeout int
  21. KeepAliveTimeout int
  22. ClientKeepAliveTimeout int
  23. DownloadTimeout int
  24. Workers int
  25. RequestsQueueSize int
  26. MaxClients int
  27. TTL int
  28. CacheControlPassthrough bool
  29. SetCanonicalHeader bool
  30. SoReuseport bool
  31. PathPrefix string
  32. MaxSrcResolution int
  33. MaxSrcFileSize int
  34. MaxAnimationFrames int
  35. MaxAnimationFrameResolution int
  36. MaxSvgCheckBytes int
  37. MaxRedirects int
  38. AllowSecurityOptions bool
  39. JpegProgressive bool
  40. PngInterlaced bool
  41. PngQuantize bool
  42. PngQuantizationColors int
  43. AvifSpeed int
  44. Quality int
  45. FormatQuality map[imagetype.Type]int
  46. StripMetadata bool
  47. KeepCopyright bool
  48. StripColorProfile bool
  49. AutoRotate bool
  50. EnforceThumbnail bool
  51. ReturnAttachment bool
  52. SvgFixUnsupported bool
  53. EnableWebpDetection bool
  54. EnforceWebp bool
  55. EnableAvifDetection bool
  56. EnforceAvif bool
  57. EnableClientHints bool
  58. PreferredFormats []imagetype.Type
  59. SkipProcessingFormats []imagetype.Type
  60. UseLinearColorspace bool
  61. DisableShrinkOnLoad bool
  62. Keys [][]byte
  63. Salts [][]byte
  64. SignatureSize int
  65. Secret string
  66. AllowOrigin string
  67. UserAgent string
  68. IgnoreSslVerification bool
  69. DevelopmentErrorsMode bool
  70. AllowedSources []*regexp.Regexp
  71. AllowLoopbackSourceAddresses bool
  72. AllowLinkLocalSourceAddresses bool
  73. AllowPrivateSourceAddresses bool
  74. SanitizeSvg bool
  75. CookiePassthrough bool
  76. CookieBaseURL string
  77. LocalFileSystemRoot string
  78. S3Enabled bool
  79. S3Region string
  80. S3Endpoint string
  81. S3AssumeRoleArn string
  82. S3MultiRegion bool
  83. GCSEnabled bool
  84. GCSKey string
  85. GCSEndpoint string
  86. ABSEnabled bool
  87. ABSName string
  88. ABSKey string
  89. ABSEndpoint string
  90. SwiftEnabled bool
  91. SwiftUsername string
  92. SwiftAPIKey string
  93. SwiftAuthURL string
  94. SwiftDomain string
  95. SwiftTenant string
  96. SwiftAuthVersion int
  97. SwiftConnectTimeoutSeconds int
  98. SwiftTimeoutSeconds int
  99. ETagEnabled bool
  100. ETagBuster string
  101. LastModifiedEnabled bool
  102. BaseURL string
  103. URLReplacements []URLReplacement
  104. Presets []string
  105. OnlyPresets bool
  106. WatermarkData string
  107. WatermarkPath string
  108. WatermarkURL string
  109. WatermarkOpacity float64
  110. FallbackImageData string
  111. FallbackImagePath string
  112. FallbackImageURL string
  113. FallbackImageHTTPCode int
  114. FallbackImageTTL int
  115. DataDogEnable bool
  116. DataDogEnableMetrics bool
  117. NewRelicAppName string
  118. NewRelicKey string
  119. NewRelicLabels map[string]string
  120. PrometheusBind string
  121. PrometheusNamespace string
  122. OpenTelemetryEndpoint string
  123. OpenTelemetryProtocol string
  124. OpenTelemetryServiceName string
  125. OpenTelemetryEnableMetrics bool
  126. OpenTelemetryServerCert string
  127. OpenTelemetryClientCert string
  128. OpenTelemetryClientKey string
  129. OpenTelemetryGRPCInsecure bool
  130. OpenTelemetryPropagators []string
  131. OpenTelemetryTraceIDGenerator string
  132. OpenTelemetryConnectionTimeout int
  133. CloudWatchServiceName string
  134. CloudWatchNamespace string
  135. CloudWatchRegion string
  136. BugsnagKey string
  137. BugsnagStage string
  138. HoneybadgerKey string
  139. HoneybadgerEnv string
  140. SentryDSN string
  141. SentryEnvironment string
  142. SentryRelease string
  143. AirbrakeProjecID int
  144. AirbrakeProjecKey string
  145. AirbrakeEnv string
  146. ReportDownloadingErrors bool
  147. EnableDebugHeaders bool
  148. FreeMemoryInterval int
  149. DownloadBufferSize int
  150. BufferPoolCalibrationThreshold int
  151. HealthCheckPath string
  152. )
  153. var (
  154. keyPath string
  155. saltPath string
  156. presetsPath string
  157. )
  158. func init() {
  159. Reset()
  160. flag.StringVar(&keyPath, "keypath", "", "path of the file with hex-encoded key")
  161. flag.StringVar(&saltPath, "saltpath", "", "path of the file with hex-encoded salt")
  162. flag.StringVar(&presetsPath, "presets", "", "path of the file with presets")
  163. }
  164. func Reset() {
  165. Network = "tcp"
  166. Bind = ":8080"
  167. ReadTimeout = 10
  168. WriteTimeout = 10
  169. KeepAliveTimeout = 10
  170. ClientKeepAliveTimeout = 90
  171. DownloadTimeout = 5
  172. Workers = runtime.GOMAXPROCS(0) * 2
  173. RequestsQueueSize = 0
  174. MaxClients = 2048
  175. TTL = 31536000
  176. CacheControlPassthrough = false
  177. SetCanonicalHeader = false
  178. SoReuseport = false
  179. PathPrefix = ""
  180. MaxSrcResolution = 16800000
  181. MaxSrcFileSize = 0
  182. MaxAnimationFrames = 1
  183. MaxAnimationFrameResolution = 0
  184. MaxSvgCheckBytes = 32 * 1024
  185. MaxRedirects = 10
  186. AllowSecurityOptions = false
  187. JpegProgressive = false
  188. PngInterlaced = false
  189. PngQuantize = false
  190. PngQuantizationColors = 256
  191. AvifSpeed = 9
  192. Quality = 80
  193. FormatQuality = map[imagetype.Type]int{imagetype.AVIF: 65}
  194. StripMetadata = true
  195. KeepCopyright = true
  196. StripColorProfile = true
  197. AutoRotate = true
  198. EnforceThumbnail = false
  199. ReturnAttachment = false
  200. SvgFixUnsupported = false
  201. EnableWebpDetection = false
  202. EnforceWebp = false
  203. EnableAvifDetection = false
  204. EnforceAvif = false
  205. EnableClientHints = false
  206. PreferredFormats = []imagetype.Type{
  207. imagetype.JPEG,
  208. imagetype.PNG,
  209. imagetype.GIF,
  210. }
  211. SkipProcessingFormats = make([]imagetype.Type, 0)
  212. UseLinearColorspace = false
  213. DisableShrinkOnLoad = false
  214. Keys = make([][]byte, 0)
  215. Salts = make([][]byte, 0)
  216. SignatureSize = 32
  217. Secret = ""
  218. AllowOrigin = ""
  219. UserAgent = fmt.Sprintf("imgproxy/%s", version.Version())
  220. IgnoreSslVerification = false
  221. DevelopmentErrorsMode = false
  222. AllowedSources = make([]*regexp.Regexp, 0)
  223. AllowLoopbackSourceAddresses = false
  224. AllowLinkLocalSourceAddresses = false
  225. AllowPrivateSourceAddresses = true
  226. SanitizeSvg = true
  227. CookiePassthrough = false
  228. CookieBaseURL = ""
  229. LocalFileSystemRoot = ""
  230. S3Enabled = false
  231. S3Region = ""
  232. S3Endpoint = ""
  233. S3AssumeRoleArn = ""
  234. S3MultiRegion = false
  235. GCSEnabled = false
  236. GCSKey = ""
  237. ABSEnabled = false
  238. ABSName = ""
  239. ABSKey = ""
  240. ABSEndpoint = ""
  241. SwiftEnabled = false
  242. SwiftUsername = ""
  243. SwiftAPIKey = ""
  244. SwiftAuthURL = ""
  245. SwiftAuthVersion = 0
  246. SwiftTenant = ""
  247. SwiftDomain = ""
  248. SwiftConnectTimeoutSeconds = 10
  249. SwiftTimeoutSeconds = 60
  250. ETagEnabled = false
  251. ETagBuster = ""
  252. LastModifiedEnabled = false
  253. BaseURL = ""
  254. URLReplacements = make([]URLReplacement, 0)
  255. Presets = make([]string, 0)
  256. OnlyPresets = false
  257. WatermarkData = ""
  258. WatermarkPath = ""
  259. WatermarkURL = ""
  260. WatermarkOpacity = 1
  261. FallbackImageData = ""
  262. FallbackImagePath = ""
  263. FallbackImageURL = ""
  264. FallbackImageHTTPCode = 200
  265. FallbackImageTTL = 0
  266. DataDogEnable = false
  267. NewRelicAppName = ""
  268. NewRelicKey = ""
  269. NewRelicLabels = make(map[string]string)
  270. PrometheusBind = ""
  271. PrometheusNamespace = ""
  272. OpenTelemetryEndpoint = ""
  273. OpenTelemetryProtocol = "grpc"
  274. OpenTelemetryServiceName = "imgproxy"
  275. OpenTelemetryEnableMetrics = false
  276. OpenTelemetryServerCert = ""
  277. OpenTelemetryClientCert = ""
  278. OpenTelemetryClientKey = ""
  279. OpenTelemetryGRPCInsecure = true
  280. OpenTelemetryPropagators = make([]string, 0)
  281. OpenTelemetryTraceIDGenerator = "xray"
  282. OpenTelemetryConnectionTimeout = 5
  283. CloudWatchServiceName = ""
  284. CloudWatchNamespace = "imgproxy"
  285. CloudWatchRegion = ""
  286. BugsnagKey = ""
  287. BugsnagStage = "production"
  288. HoneybadgerKey = ""
  289. HoneybadgerEnv = "production"
  290. SentryDSN = ""
  291. SentryEnvironment = "production"
  292. SentryRelease = fmt.Sprintf("imgproxy@%s", version.Version())
  293. AirbrakeProjecID = 0
  294. AirbrakeProjecKey = ""
  295. AirbrakeEnv = "production"
  296. ReportDownloadingErrors = true
  297. EnableDebugHeaders = false
  298. FreeMemoryInterval = 10
  299. DownloadBufferSize = 0
  300. BufferPoolCalibrationThreshold = 1024
  301. HealthCheckPath = ""
  302. }
  303. func Configure() error {
  304. if port := os.Getenv("PORT"); len(port) > 0 {
  305. Bind = fmt.Sprintf(":%s", port)
  306. }
  307. configurators.String(&Network, "IMGPROXY_NETWORK")
  308. configurators.String(&Bind, "IMGPROXY_BIND")
  309. configurators.Int(&ReadTimeout, "IMGPROXY_READ_TIMEOUT")
  310. configurators.Int(&WriteTimeout, "IMGPROXY_WRITE_TIMEOUT")
  311. configurators.Int(&KeepAliveTimeout, "IMGPROXY_KEEP_ALIVE_TIMEOUT")
  312. configurators.Int(&ClientKeepAliveTimeout, "IMGPROXY_CLIENT_KEEP_ALIVE_TIMEOUT")
  313. configurators.Int(&DownloadTimeout, "IMGPROXY_DOWNLOAD_TIMEOUT")
  314. configurators.Int(&Workers, "IMGPROXY_CONCURRENCY")
  315. configurators.Int(&Workers, "IMGPROXY_WORKERS")
  316. configurators.Int(&RequestsQueueSize, "IMGPROXY_REQUESTS_QUEUE_SIZE")
  317. configurators.Int(&MaxClients, "IMGPROXY_MAX_CLIENTS")
  318. configurators.Int(&TTL, "IMGPROXY_TTL")
  319. configurators.Bool(&CacheControlPassthrough, "IMGPROXY_CACHE_CONTROL_PASSTHROUGH")
  320. configurators.Bool(&SetCanonicalHeader, "IMGPROXY_SET_CANONICAL_HEADER")
  321. configurators.Bool(&SoReuseport, "IMGPROXY_SO_REUSEPORT")
  322. configurators.URLPath(&PathPrefix, "IMGPROXY_PATH_PREFIX")
  323. configurators.MegaInt(&MaxSrcResolution, "IMGPROXY_MAX_SRC_RESOLUTION")
  324. configurators.Int(&MaxSrcFileSize, "IMGPROXY_MAX_SRC_FILE_SIZE")
  325. configurators.Int(&MaxSvgCheckBytes, "IMGPROXY_MAX_SVG_CHECK_BYTES")
  326. configurators.Int(&MaxAnimationFrames, "IMGPROXY_MAX_ANIMATION_FRAMES")
  327. configurators.MegaInt(&MaxAnimationFrameResolution, "IMGPROXY_MAX_ANIMATION_FRAME_RESOLUTION")
  328. configurators.Int(&MaxRedirects, "IMGPROXY_MAX_REDIRECTS")
  329. configurators.Patterns(&AllowedSources, "IMGPROXY_ALLOWED_SOURCES")
  330. configurators.Bool(&AllowLoopbackSourceAddresses, "IMGPROXY_ALLOW_LOOPBACK_SOURCE_ADDRESSES")
  331. configurators.Bool(&AllowLinkLocalSourceAddresses, "IMGPROXY_ALLOW_LINK_LOCAL_SOURCE_ADDRESSES")
  332. configurators.Bool(&AllowPrivateSourceAddresses, "IMGPROXY_ALLOW_PRIVATE_SOURCE_ADDRESSES")
  333. configurators.Bool(&SanitizeSvg, "IMGPROXY_SANITIZE_SVG")
  334. configurators.Bool(&AllowSecurityOptions, "IMGPROXY_ALLOW_SECURITY_OPTIONS")
  335. configurators.Bool(&JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")
  336. configurators.Bool(&PngInterlaced, "IMGPROXY_PNG_INTERLACED")
  337. configurators.Bool(&PngQuantize, "IMGPROXY_PNG_QUANTIZE")
  338. configurators.Int(&PngQuantizationColors, "IMGPROXY_PNG_QUANTIZATION_COLORS")
  339. configurators.Int(&AvifSpeed, "IMGPROXY_AVIF_SPEED")
  340. configurators.Int(&Quality, "IMGPROXY_QUALITY")
  341. if err := configurators.ImageTypesQuality(FormatQuality, "IMGPROXY_FORMAT_QUALITY"); err != nil {
  342. return err
  343. }
  344. configurators.Bool(&StripMetadata, "IMGPROXY_STRIP_METADATA")
  345. configurators.Bool(&KeepCopyright, "IMGPROXY_KEEP_COPYRIGHT")
  346. configurators.Bool(&StripColorProfile, "IMGPROXY_STRIP_COLOR_PROFILE")
  347. configurators.Bool(&AutoRotate, "IMGPROXY_AUTO_ROTATE")
  348. configurators.Bool(&EnforceThumbnail, "IMGPROXY_ENFORCE_THUMBNAIL")
  349. configurators.Bool(&ReturnAttachment, "IMGPROXY_RETURN_ATTACHMENT")
  350. configurators.Bool(&SvgFixUnsupported, "IMGPROXY_SVG_FIX_UNSUPPORTED")
  351. configurators.Bool(&EnableWebpDetection, "IMGPROXY_ENABLE_WEBP_DETECTION")
  352. configurators.Bool(&EnforceWebp, "IMGPROXY_ENFORCE_WEBP")
  353. configurators.Bool(&EnableAvifDetection, "IMGPROXY_ENABLE_AVIF_DETECTION")
  354. configurators.Bool(&EnforceAvif, "IMGPROXY_ENFORCE_AVIF")
  355. configurators.Bool(&EnableClientHints, "IMGPROXY_ENABLE_CLIENT_HINTS")
  356. configurators.URLPath(&HealthCheckPath, "IMGPROXY_HEALTH_CHECK_PATH")
  357. if err := configurators.ImageTypes(&PreferredFormats, "IMGPROXY_PREFERRED_FORMATS"); err != nil {
  358. return err
  359. }
  360. if err := configurators.ImageTypes(&SkipProcessingFormats, "IMGPROXY_SKIP_PROCESSING_FORMATS"); err != nil {
  361. return err
  362. }
  363. configurators.Bool(&UseLinearColorspace, "IMGPROXY_USE_LINEAR_COLORSPACE")
  364. configurators.Bool(&DisableShrinkOnLoad, "IMGPROXY_DISABLE_SHRINK_ON_LOAD")
  365. if err := configurators.HexSlice(&Keys, "IMGPROXY_KEY"); err != nil {
  366. return err
  367. }
  368. if err := configurators.HexSlice(&Salts, "IMGPROXY_SALT"); err != nil {
  369. return err
  370. }
  371. configurators.Int(&SignatureSize, "IMGPROXY_SIGNATURE_SIZE")
  372. if err := configurators.HexSliceFile(&Keys, keyPath); err != nil {
  373. return err
  374. }
  375. if err := configurators.HexSliceFile(&Salts, saltPath); err != nil {
  376. return err
  377. }
  378. configurators.String(&Secret, "IMGPROXY_SECRET")
  379. configurators.String(&AllowOrigin, "IMGPROXY_ALLOW_ORIGIN")
  380. configurators.String(&UserAgent, "IMGPROXY_USER_AGENT")
  381. configurators.Bool(&IgnoreSslVerification, "IMGPROXY_IGNORE_SSL_VERIFICATION")
  382. configurators.Bool(&DevelopmentErrorsMode, "IMGPROXY_DEVELOPMENT_ERRORS_MODE")
  383. configurators.Bool(&CookiePassthrough, "IMGPROXY_COOKIE_PASSTHROUGH")
  384. configurators.String(&CookieBaseURL, "IMGPROXY_COOKIE_BASE_URL")
  385. configurators.String(&LocalFileSystemRoot, "IMGPROXY_LOCAL_FILESYSTEM_ROOT")
  386. configurators.Bool(&S3Enabled, "IMGPROXY_USE_S3")
  387. configurators.String(&S3Region, "IMGPROXY_S3_REGION")
  388. configurators.String(&S3Endpoint, "IMGPROXY_S3_ENDPOINT")
  389. configurators.String(&S3AssumeRoleArn, "IMGPROXY_S3_ASSUME_ROLE_ARN")
  390. configurators.Bool(&S3MultiRegion, "IMGPROXY_S3_MULTI_REGION")
  391. configurators.Bool(&GCSEnabled, "IMGPROXY_USE_GCS")
  392. configurators.String(&GCSKey, "IMGPROXY_GCS_KEY")
  393. configurators.String(&GCSEndpoint, "IMGPROXY_GCS_ENDPOINT")
  394. configurators.Bool(&ABSEnabled, "IMGPROXY_USE_ABS")
  395. configurators.String(&ABSName, "IMGPROXY_ABS_NAME")
  396. configurators.String(&ABSKey, "IMGPROXY_ABS_KEY")
  397. configurators.String(&ABSEndpoint, "IMGPROXY_ABS_ENDPOINT")
  398. configurators.Bool(&SwiftEnabled, "IMGPROXY_USE_SWIFT")
  399. configurators.String(&SwiftUsername, "IMGPROXY_SWIFT_USERNAME")
  400. configurators.String(&SwiftAPIKey, "IMGPROXY_SWIFT_API_KEY")
  401. configurators.String(&SwiftAuthURL, "IMGPROXY_SWIFT_AUTH_URL")
  402. configurators.String(&SwiftDomain, "IMGPROXY_SWIFT_DOMAIN")
  403. configurators.String(&SwiftTenant, "IMGPROXY_SWIFT_TENANT")
  404. configurators.Int(&SwiftConnectTimeoutSeconds, "IMGPROXY_SWIFT_CONNECT_TIMEOUT_SECONDS")
  405. configurators.Int(&SwiftTimeoutSeconds, "IMGPROXY_SWIFT_TIMEOUT_SECONDS")
  406. configurators.Bool(&ETagEnabled, "IMGPROXY_USE_ETAG")
  407. configurators.String(&ETagBuster, "IMGPROXY_ETAG_BUSTER")
  408. configurators.Bool(&LastModifiedEnabled, "IMGPROXY_USE_LAST_MODIFIED")
  409. configurators.String(&BaseURL, "IMGPROXY_BASE_URL")
  410. if err := configurators.Replacements(&URLReplacements, "IMGPROXY_URL_REPLACEMENTS"); err != nil {
  411. return err
  412. }
  413. configurators.StringSlice(&Presets, "IMGPROXY_PRESETS")
  414. if err := configurators.StringSliceFile(&Presets, presetsPath); err != nil {
  415. return err
  416. }
  417. configurators.Bool(&OnlyPresets, "IMGPROXY_ONLY_PRESETS")
  418. configurators.String(&WatermarkData, "IMGPROXY_WATERMARK_DATA")
  419. configurators.String(&WatermarkPath, "IMGPROXY_WATERMARK_PATH")
  420. configurators.String(&WatermarkURL, "IMGPROXY_WATERMARK_URL")
  421. configurators.Float(&WatermarkOpacity, "IMGPROXY_WATERMARK_OPACITY")
  422. configurators.String(&FallbackImageData, "IMGPROXY_FALLBACK_IMAGE_DATA")
  423. configurators.String(&FallbackImagePath, "IMGPROXY_FALLBACK_IMAGE_PATH")
  424. configurators.String(&FallbackImageURL, "IMGPROXY_FALLBACK_IMAGE_URL")
  425. configurators.Int(&FallbackImageHTTPCode, "IMGPROXY_FALLBACK_IMAGE_HTTP_CODE")
  426. configurators.Int(&FallbackImageTTL, "IMGPROXY_FALLBACK_IMAGE_TTL")
  427. configurators.Bool(&DataDogEnable, "IMGPROXY_DATADOG_ENABLE")
  428. configurators.Bool(&DataDogEnableMetrics, "IMGPROXY_DATADOG_ENABLE_ADDITIONAL_METRICS")
  429. configurators.String(&NewRelicAppName, "IMGPROXY_NEW_RELIC_APP_NAME")
  430. configurators.String(&NewRelicKey, "IMGPROXY_NEW_RELIC_KEY")
  431. configurators.StringMap(&NewRelicLabels, "IMGPROXY_NEW_RELIC_LABELS")
  432. configurators.String(&PrometheusBind, "IMGPROXY_PROMETHEUS_BIND")
  433. configurators.String(&PrometheusNamespace, "IMGPROXY_PROMETHEUS_NAMESPACE")
  434. configurators.String(&OpenTelemetryEndpoint, "IMGPROXY_OPEN_TELEMETRY_ENDPOINT")
  435. configurators.String(&OpenTelemetryProtocol, "IMGPROXY_OPEN_TELEMETRY_PROTOCOL")
  436. configurators.String(&OpenTelemetryServiceName, "IMGPROXY_OPEN_TELEMETRY_SERVICE_NAME")
  437. configurators.Bool(&OpenTelemetryEnableMetrics, "IMGPROXY_OPEN_TELEMETRY_ENABLE_METRICS")
  438. configurators.String(&OpenTelemetryServerCert, "IMGPROXY_OPEN_TELEMETRY_SERVER_CERT")
  439. configurators.String(&OpenTelemetryClientCert, "IMGPROXY_OPEN_TELEMETRY_CLIENT_CERT")
  440. configurators.String(&OpenTelemetryClientKey, "IMGPROXY_OPEN_TELEMETRY_CLIENT_KEY")
  441. configurators.Bool(&OpenTelemetryGRPCInsecure, "IMGPROXY_OPEN_TELEMETRY_GRPC_INSECURE")
  442. configurators.StringSlice(&OpenTelemetryPropagators, "IMGPROXY_OPEN_TELEMETRY_PROPAGATORS")
  443. configurators.String(&OpenTelemetryTraceIDGenerator, "IMGPROXY_OPEN_TELEMETRY_TRACE_ID_GENERATOR")
  444. configurators.Int(&OpenTelemetryConnectionTimeout, "IMGPROXY_OPEN_TELEMETRY_CONNECTION_TIMEOUT")
  445. configurators.String(&CloudWatchServiceName, "IMGPROXY_CLOUD_WATCH_SERVICE_NAME")
  446. configurators.String(&CloudWatchNamespace, "IMGPROXY_CLOUD_WATCH_NAMESPACE")
  447. configurators.String(&CloudWatchRegion, "IMGPROXY_CLOUD_WATCH_REGION")
  448. configurators.String(&BugsnagKey, "IMGPROXY_BUGSNAG_KEY")
  449. configurators.String(&BugsnagStage, "IMGPROXY_BUGSNAG_STAGE")
  450. configurators.String(&HoneybadgerKey, "IMGPROXY_HONEYBADGER_KEY")
  451. configurators.String(&HoneybadgerEnv, "IMGPROXY_HONEYBADGER_ENV")
  452. configurators.String(&SentryDSN, "IMGPROXY_SENTRY_DSN")
  453. configurators.String(&SentryEnvironment, "IMGPROXY_SENTRY_ENVIRONMENT")
  454. configurators.String(&SentryRelease, "IMGPROXY_SENTRY_RELEASE")
  455. configurators.Int(&AirbrakeProjecID, "IMGPROXY_AIRBRAKE_PROJECT_ID")
  456. configurators.String(&AirbrakeProjecKey, "IMGPROXY_AIRBRAKE_PROJECT_KEY")
  457. configurators.String(&AirbrakeEnv, "IMGPROXY_AIRBRAKE_ENVIRONMENT")
  458. configurators.Bool(&ReportDownloadingErrors, "IMGPROXY_REPORT_DOWNLOADING_ERRORS")
  459. configurators.Bool(&EnableDebugHeaders, "IMGPROXY_ENABLE_DEBUG_HEADERS")
  460. configurators.Int(&FreeMemoryInterval, "IMGPROXY_FREE_MEMORY_INTERVAL")
  461. configurators.Int(&DownloadBufferSize, "IMGPROXY_DOWNLOAD_BUFFER_SIZE")
  462. configurators.Int(&BufferPoolCalibrationThreshold, "IMGPROXY_BUFFER_POOL_CALIBRATION_THRESHOLD")
  463. if len(Keys) != len(Salts) {
  464. return fmt.Errorf("Number of keys and number of salts should be equal. Keys: %d, salts: %d", len(Keys), len(Salts))
  465. }
  466. if len(Keys) == 0 {
  467. log.Warning("No keys defined, so signature checking is disabled")
  468. }
  469. if len(Salts) == 0 {
  470. log.Warning("No salts defined, so signature checking is disabled")
  471. }
  472. if SignatureSize < 1 || SignatureSize > 32 {
  473. return fmt.Errorf("Signature size should be within 1 and 32, now - %d\n", SignatureSize)
  474. }
  475. if len(Bind) == 0 {
  476. return errors.New("Bind address is not defined")
  477. }
  478. if ReadTimeout <= 0 {
  479. return fmt.Errorf("Read timeout should be greater than 0, now - %d\n", ReadTimeout)
  480. }
  481. if WriteTimeout <= 0 {
  482. return fmt.Errorf("Write timeout should be greater than 0, now - %d\n", WriteTimeout)
  483. }
  484. if KeepAliveTimeout < 0 {
  485. return fmt.Errorf("KeepAlive timeout should be greater than or equal to 0, now - %d\n", KeepAliveTimeout)
  486. }
  487. if ClientKeepAliveTimeout < 0 {
  488. return fmt.Errorf("Client KeepAlive timeout should be greater than or equal to 0, now - %d\n", ClientKeepAliveTimeout)
  489. }
  490. if DownloadTimeout <= 0 {
  491. return fmt.Errorf("Download timeout should be greater than 0, now - %d\n", DownloadTimeout)
  492. }
  493. if Workers <= 0 {
  494. return fmt.Errorf("Workers number should be greater than 0, now - %d\n", Workers)
  495. }
  496. if RequestsQueueSize < 0 {
  497. return fmt.Errorf("Requests queue size should be greater than or equal 0, now - %d\n", RequestsQueueSize)
  498. }
  499. if MaxClients < 0 {
  500. return fmt.Errorf("Max clients number should be greater than or equal 0, now - %d\n", MaxClients)
  501. }
  502. if TTL <= 0 {
  503. return fmt.Errorf("TTL should be greater than 0, now - %d\n", TTL)
  504. }
  505. if MaxSrcResolution <= 0 {
  506. return fmt.Errorf("Max src resolution should be greater than 0, now - %d\n", MaxSrcResolution)
  507. }
  508. if MaxSrcFileSize < 0 {
  509. return fmt.Errorf("Max src file size should be greater than or equal to 0, now - %d\n", MaxSrcFileSize)
  510. }
  511. if MaxAnimationFrames <= 0 {
  512. return fmt.Errorf("Max animation frames should be greater than 0, now - %d\n", MaxAnimationFrames)
  513. }
  514. if PngQuantizationColors < 2 {
  515. return fmt.Errorf("Png quantization colors should be greater than 1, now - %d\n", PngQuantizationColors)
  516. } else if PngQuantizationColors > 256 {
  517. return fmt.Errorf("Png quantization colors can't be greater than 256, now - %d\n", PngQuantizationColors)
  518. }
  519. if AvifSpeed < 0 {
  520. return fmt.Errorf("Avif speed should be greater than 0, now - %d\n", AvifSpeed)
  521. } else if AvifSpeed > 9 {
  522. return fmt.Errorf("Avif speed can't be greater than 9, now - %d\n", AvifSpeed)
  523. }
  524. if Quality <= 0 {
  525. return fmt.Errorf("Quality should be greater than 0, now - %d\n", Quality)
  526. } else if Quality > 100 {
  527. return fmt.Errorf("Quality can't be greater than 100, now - %d\n", Quality)
  528. }
  529. if len(PreferredFormats) == 0 {
  530. return errors.New("At least one preferred format should be specified")
  531. }
  532. if IgnoreSslVerification {
  533. log.Warning("Ignoring SSL verification is very unsafe")
  534. }
  535. if LocalFileSystemRoot != "" {
  536. stat, err := os.Stat(LocalFileSystemRoot)
  537. if err != nil {
  538. return fmt.Errorf("Cannot use local directory: %s", err)
  539. }
  540. if !stat.IsDir() {
  541. return errors.New("Cannot use local directory: not a directory")
  542. }
  543. if LocalFileSystemRoot == "/" {
  544. log.Warning("Exposing root via IMGPROXY_LOCAL_FILESYSTEM_ROOT is unsafe")
  545. }
  546. }
  547. if _, ok := os.LookupEnv("IMGPROXY_USE_GCS"); !ok && len(GCSKey) > 0 {
  548. log.Warning("Set IMGPROXY_USE_GCS to true since it may be required by future versions to enable GCS support")
  549. GCSEnabled = true
  550. }
  551. if WatermarkOpacity <= 0 {
  552. return errors.New("Watermark opacity should be greater than 0")
  553. } else if WatermarkOpacity > 1 {
  554. return errors.New("Watermark opacity should be less than or equal to 1")
  555. }
  556. if FallbackImageHTTPCode < 100 || FallbackImageHTTPCode > 599 {
  557. return errors.New("Fallback image HTTP code should be between 100 and 599")
  558. }
  559. if len(PrometheusBind) > 0 && PrometheusBind == Bind {
  560. return errors.New("Can't use the same binding for the main server and Prometheus")
  561. }
  562. if OpenTelemetryConnectionTimeout < 1 {
  563. return errors.New("OpenTelemetry connection timeout should be greater than zero")
  564. }
  565. if FreeMemoryInterval <= 0 {
  566. return errors.New("Free memory interval should be greater than zero")
  567. }
  568. if DownloadBufferSize < 0 {
  569. return errors.New("Download buffer size should be greater than or equal to 0")
  570. } else if DownloadBufferSize > math.MaxInt32 {
  571. return fmt.Errorf("Download buffer size can't be greater than %d", math.MaxInt32)
  572. }
  573. if BufferPoolCalibrationThreshold < 64 {
  574. return errors.New("Buffer pool calibration threshold should be greater than or equal to 64")
  575. }
  576. return nil
  577. }