config.go 22 KB

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