1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2024-11-29 08:22:11 +02:00
imgproxy/config/config.go

782 lines
24 KiB
Go

package config
import (
"errors"
"flag"
"fmt"
"math"
"os"
"regexp"
"runtime"
log "github.com/sirupsen/logrus"
"github.com/imgproxy/imgproxy/v3/config/configurators"
"github.com/imgproxy/imgproxy/v3/imagetype"
"github.com/imgproxy/imgproxy/v3/version"
)
type URLReplacement = configurators.URLReplacement
var (
Network string
Bind string
Timeout int
ReadRequestTimeout int
WriteResponseTimeout int
KeepAliveTimeout int
ClientKeepAliveTimeout int
DownloadTimeout int
Workers int
RequestsQueueSize int
MaxClients int
TTL int
CacheControlPassthrough bool
SetCanonicalHeader bool
SoReuseport bool
PathPrefix string
MaxSrcResolution int
MaxSrcFileSize int
MaxAnimationFrames int
MaxAnimationFrameResolution int
MaxSvgCheckBytes int
MaxRedirects int
PngUnlimited bool
SvgUnlimited bool
AllowSecurityOptions bool
JpegProgressive bool
PngInterlaced bool
PngQuantize bool
PngQuantizationColors int
AvifSpeed int
Quality int
FormatQuality map[imagetype.Type]int
StripMetadata bool
KeepCopyright bool
StripColorProfile bool
AutoRotate bool
EnforceThumbnail bool
ReturnAttachment bool
SvgFixUnsupported bool
EnableWebpDetection bool
EnforceWebp bool
EnableAvifDetection bool
EnforceAvif bool
EnableClientHints bool
PreferredFormats []imagetype.Type
SkipProcessingFormats []imagetype.Type
UseLinearColorspace bool
DisableShrinkOnLoad bool
Keys [][]byte
Salts [][]byte
SignatureSize int
TrustedSignatures []string
Secret string
AllowOrigin string
UserAgent string
IgnoreSslVerification bool
DevelopmentErrorsMode bool
AllowedSources []*regexp.Regexp
AllowLoopbackSourceAddresses bool
AllowLinkLocalSourceAddresses bool
AllowPrivateSourceAddresses bool
SanitizeSvg bool
AlwaysRasterizeSvg bool
CookiePassthrough bool
CookieBaseURL string
LocalFileSystemRoot string
S3Enabled bool
S3Region string
S3Endpoint string
S3EndpointUsePathStyle bool
S3AssumeRoleArn string
S3AssumeRoleExternalID string
S3MultiRegion bool
S3DecryptionClientEnabled bool
GCSEnabled bool
GCSKey string
GCSEndpoint string
ABSEnabled bool
ABSName string
ABSKey string
ABSEndpoint string
SwiftEnabled bool
SwiftUsername string
SwiftAPIKey string
SwiftAuthURL string
SwiftDomain string
SwiftTenant string
SwiftAuthVersion int
SwiftConnectTimeoutSeconds int
SwiftTimeoutSeconds int
ETagEnabled bool
ETagBuster string
LastModifiedEnabled bool
BaseURL string
URLReplacements []URLReplacement
Presets []string
OnlyPresets bool
WatermarkData string
WatermarkPath string
WatermarkURL string
WatermarkOpacity float64
FallbackImageData string
FallbackImagePath string
FallbackImageURL string
FallbackImageHTTPCode int
FallbackImageTTL int
DataDogEnable bool
DataDogEnableMetrics bool
NewRelicAppName string
NewRelicKey string
NewRelicLabels map[string]string
PrometheusBind string
PrometheusNamespace string
OpenTelemetryEnable bool
OpenTelemetryEnableMetrics bool
OpenTelemetryServerCert string
OpenTelemetryClientCert string
OpenTelemetryClientKey string
OpenTelemetryTraceIDGenerator string
CloudWatchServiceName string
CloudWatchNamespace string
CloudWatchRegion string
BugsnagKey string
BugsnagStage string
HoneybadgerKey string
HoneybadgerEnv string
SentryDSN string
SentryEnvironment string
SentryRelease string
AirbrakeProjectID int
AirbrakeProjectKey string
AirbrakeEnv string
ReportDownloadingErrors bool
ReportIOErrors bool
EnableDebugHeaders bool
FreeMemoryInterval int
DownloadBufferSize int
BufferPoolCalibrationThreshold int
HealthCheckPath string
ArgumentsSeparator string
)
var (
keyPath string
saltPath string
presetsPath string
)
func init() {
Reset()
flag.StringVar(&keyPath, "keypath", "", "path of the file with hex-encoded key")
flag.StringVar(&saltPath, "saltpath", "", "path of the file with hex-encoded salt")
flag.StringVar(&presetsPath, "presets", "", "path of the file with presets")
}
func Reset() {
Network = "tcp"
Bind = ":8080"
Timeout = 10
ReadRequestTimeout = 10
WriteResponseTimeout = 10
KeepAliveTimeout = 10
ClientKeepAliveTimeout = 90
DownloadTimeout = 5
Workers = runtime.GOMAXPROCS(0) * 2
RequestsQueueSize = 0
MaxClients = 2048
TTL = 31536000
CacheControlPassthrough = false
SetCanonicalHeader = false
SoReuseport = false
PathPrefix = ""
MaxSrcResolution = 50000000
MaxSrcFileSize = 0
MaxAnimationFrames = 1
MaxAnimationFrameResolution = 0
MaxSvgCheckBytes = 32 * 1024
MaxRedirects = 10
PngUnlimited = false
SvgUnlimited = false
AllowSecurityOptions = false
JpegProgressive = false
PngInterlaced = false
PngQuantize = false
PngQuantizationColors = 256
AvifSpeed = 9
Quality = 80
FormatQuality = map[imagetype.Type]int{imagetype.AVIF: 65}
StripMetadata = true
KeepCopyright = true
StripColorProfile = true
AutoRotate = true
EnforceThumbnail = false
ReturnAttachment = false
SvgFixUnsupported = false
EnableWebpDetection = false
EnforceWebp = false
EnableAvifDetection = false
EnforceAvif = false
EnableClientHints = false
PreferredFormats = []imagetype.Type{
imagetype.JPEG,
imagetype.PNG,
imagetype.GIF,
}
SkipProcessingFormats = make([]imagetype.Type, 0)
UseLinearColorspace = false
DisableShrinkOnLoad = false
Keys = make([][]byte, 0)
Salts = make([][]byte, 0)
SignatureSize = 32
TrustedSignatures = make([]string, 0)
Secret = ""
AllowOrigin = ""
UserAgent = fmt.Sprintf("imgproxy/%s", version.Version)
IgnoreSslVerification = false
DevelopmentErrorsMode = false
AllowedSources = make([]*regexp.Regexp, 0)
AllowLoopbackSourceAddresses = false
AllowLinkLocalSourceAddresses = false
AllowPrivateSourceAddresses = true
SanitizeSvg = true
AlwaysRasterizeSvg = false
CookiePassthrough = false
CookieBaseURL = ""
LocalFileSystemRoot = ""
S3Enabled = false
S3Region = ""
S3Endpoint = ""
S3EndpointUsePathStyle = true
S3AssumeRoleArn = ""
S3AssumeRoleExternalID = ""
S3MultiRegion = false
S3DecryptionClientEnabled = false
GCSEnabled = false
GCSKey = ""
ABSEnabled = false
ABSName = ""
ABSKey = ""
ABSEndpoint = ""
SwiftEnabled = false
SwiftUsername = ""
SwiftAPIKey = ""
SwiftAuthURL = ""
SwiftAuthVersion = 0
SwiftTenant = ""
SwiftDomain = ""
SwiftConnectTimeoutSeconds = 10
SwiftTimeoutSeconds = 60
ETagEnabled = false
ETagBuster = ""
LastModifiedEnabled = false
BaseURL = ""
URLReplacements = make([]URLReplacement, 0)
Presets = make([]string, 0)
OnlyPresets = false
WatermarkData = ""
WatermarkPath = ""
WatermarkURL = ""
WatermarkOpacity = 1
FallbackImageData = ""
FallbackImagePath = ""
FallbackImageURL = ""
FallbackImageHTTPCode = 200
FallbackImageTTL = 0
DataDogEnable = false
NewRelicAppName = ""
NewRelicKey = ""
NewRelicLabels = make(map[string]string)
PrometheusBind = ""
PrometheusNamespace = ""
OpenTelemetryEnable = false
OpenTelemetryEnableMetrics = false
OpenTelemetryServerCert = ""
OpenTelemetryClientCert = ""
OpenTelemetryClientKey = ""
OpenTelemetryTraceIDGenerator = "xray"
CloudWatchServiceName = ""
CloudWatchNamespace = "imgproxy"
CloudWatchRegion = ""
BugsnagKey = ""
BugsnagStage = "production"
HoneybadgerKey = ""
HoneybadgerEnv = "production"
SentryDSN = ""
SentryEnvironment = "production"
SentryRelease = fmt.Sprintf("imgproxy@%s", version.Version)
AirbrakeProjectID = 0
AirbrakeProjectKey = ""
AirbrakeEnv = "production"
ReportDownloadingErrors = true
ReportIOErrors = false
EnableDebugHeaders = false
FreeMemoryInterval = 10
DownloadBufferSize = 0
BufferPoolCalibrationThreshold = 1024
HealthCheckPath = ""
ArgumentsSeparator = ":"
}
func Configure() error {
Reset()
if port := os.Getenv("PORT"); len(port) > 0 {
Bind = fmt.Sprintf(":%s", port)
}
configurators.String(&Network, "IMGPROXY_NETWORK")
configurators.String(&Bind, "IMGPROXY_BIND")
if _, ok := os.LookupEnv("IMGPROXY_WRITE_TIMEOUT"); ok {
log.Warning("IMGPROXY_WRITE_TIMEOUT is deprecated, use IMGPROXY_TIMEOUT instead")
configurators.Int(&Timeout, "IMGPROXY_WRITE_TIMEOUT")
}
configurators.Int(&Timeout, "IMGPROXY_TIMEOUT")
if _, ok := os.LookupEnv("IMGPROXY_READ_TIMEOUT"); ok {
log.Warning("IMGPROXY_READ_TIMEOUT is deprecated, use IMGPROXY_READ_REQUEST_TIMEOUT instead")
configurators.Int(&ReadRequestTimeout, "IMGPROXY_READ_TIMEOUT")
}
configurators.Int(&ReadRequestTimeout, "IMGPROXY_READ_REQUEST_TIMEOUT")
configurators.Int(&WriteResponseTimeout, "IMGPROXY_WRITE_RESPONSE_TIMEOUT")
configurators.Int(&KeepAliveTimeout, "IMGPROXY_KEEP_ALIVE_TIMEOUT")
configurators.Int(&ClientKeepAliveTimeout, "IMGPROXY_CLIENT_KEEP_ALIVE_TIMEOUT")
configurators.Int(&DownloadTimeout, "IMGPROXY_DOWNLOAD_TIMEOUT")
if lambdaFn := os.Getenv("AWS_LAMBDA_FUNCTION_NAME"); len(lambdaFn) > 0 {
Workers = 1
log.Info("AWS Lambda environment detected, setting workers to 1")
} else {
configurators.Int(&Workers, "IMGPROXY_CONCURRENCY")
configurators.Int(&Workers, "IMGPROXY_WORKERS")
}
configurators.Int(&RequestsQueueSize, "IMGPROXY_REQUESTS_QUEUE_SIZE")
configurators.Int(&MaxClients, "IMGPROXY_MAX_CLIENTS")
configurators.Int(&TTL, "IMGPROXY_TTL")
configurators.Bool(&CacheControlPassthrough, "IMGPROXY_CACHE_CONTROL_PASSTHROUGH")
configurators.Bool(&SetCanonicalHeader, "IMGPROXY_SET_CANONICAL_HEADER")
configurators.Bool(&SoReuseport, "IMGPROXY_SO_REUSEPORT")
configurators.URLPath(&PathPrefix, "IMGPROXY_PATH_PREFIX")
configurators.MegaInt(&MaxSrcResolution, "IMGPROXY_MAX_SRC_RESOLUTION")
configurators.Int(&MaxSrcFileSize, "IMGPROXY_MAX_SRC_FILE_SIZE")
configurators.Int(&MaxSvgCheckBytes, "IMGPROXY_MAX_SVG_CHECK_BYTES")
configurators.Int(&MaxAnimationFrames, "IMGPROXY_MAX_ANIMATION_FRAMES")
configurators.MegaInt(&MaxAnimationFrameResolution, "IMGPROXY_MAX_ANIMATION_FRAME_RESOLUTION")
configurators.Int(&MaxRedirects, "IMGPROXY_MAX_REDIRECTS")
configurators.Patterns(&AllowedSources, "IMGPROXY_ALLOWED_SOURCES")
configurators.Bool(&AllowLoopbackSourceAddresses, "IMGPROXY_ALLOW_LOOPBACK_SOURCE_ADDRESSES")
configurators.Bool(&AllowLinkLocalSourceAddresses, "IMGPROXY_ALLOW_LINK_LOCAL_SOURCE_ADDRESSES")
configurators.Bool(&AllowPrivateSourceAddresses, "IMGPROXY_ALLOW_PRIVATE_SOURCE_ADDRESSES")
configurators.Bool(&SanitizeSvg, "IMGPROXY_SANITIZE_SVG")
configurators.Bool(&AlwaysRasterizeSvg, "IMGPROXY_ALWAYS_RASTERIZE_SVG")
configurators.Bool(&PngUnlimited, "IMGPROXY_PNG_UNLIMITED")
configurators.Bool(&SvgUnlimited, "IMGPROXY_SVG_UNLIMITED")
configurators.Bool(&AllowSecurityOptions, "IMGPROXY_ALLOW_SECURITY_OPTIONS")
configurators.Bool(&JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")
configurators.Bool(&PngInterlaced, "IMGPROXY_PNG_INTERLACED")
configurators.Bool(&PngQuantize, "IMGPROXY_PNG_QUANTIZE")
configurators.Int(&PngQuantizationColors, "IMGPROXY_PNG_QUANTIZATION_COLORS")
configurators.Int(&AvifSpeed, "IMGPROXY_AVIF_SPEED")
configurators.Int(&Quality, "IMGPROXY_QUALITY")
if err := configurators.ImageTypesQuality(FormatQuality, "IMGPROXY_FORMAT_QUALITY"); err != nil {
return err
}
configurators.Bool(&StripMetadata, "IMGPROXY_STRIP_METADATA")
configurators.Bool(&KeepCopyright, "IMGPROXY_KEEP_COPYRIGHT")
configurators.Bool(&StripColorProfile, "IMGPROXY_STRIP_COLOR_PROFILE")
configurators.Bool(&AutoRotate, "IMGPROXY_AUTO_ROTATE")
configurators.Bool(&EnforceThumbnail, "IMGPROXY_ENFORCE_THUMBNAIL")
configurators.Bool(&ReturnAttachment, "IMGPROXY_RETURN_ATTACHMENT")
configurators.Bool(&SvgFixUnsupported, "IMGPROXY_SVG_FIX_UNSUPPORTED")
configurators.Bool(&EnableWebpDetection, "IMGPROXY_ENABLE_WEBP_DETECTION")
configurators.Bool(&EnforceWebp, "IMGPROXY_ENFORCE_WEBP")
configurators.Bool(&EnableAvifDetection, "IMGPROXY_ENABLE_AVIF_DETECTION")
configurators.Bool(&EnforceAvif, "IMGPROXY_ENFORCE_AVIF")
configurators.Bool(&EnableClientHints, "IMGPROXY_ENABLE_CLIENT_HINTS")
configurators.URLPath(&HealthCheckPath, "IMGPROXY_HEALTH_CHECK_PATH")
configurators.String(&ArgumentsSeparator, "IMGPROXY_ARGUMENTS_SEPARATOR")
if err := configurators.ImageTypes(&PreferredFormats, "IMGPROXY_PREFERRED_FORMATS"); err != nil {
return err
}
if err := configurators.ImageTypes(&SkipProcessingFormats, "IMGPROXY_SKIP_PROCESSING_FORMATS"); err != nil {
return err
}
configurators.Bool(&UseLinearColorspace, "IMGPROXY_USE_LINEAR_COLORSPACE")
configurators.Bool(&DisableShrinkOnLoad, "IMGPROXY_DISABLE_SHRINK_ON_LOAD")
if err := configurators.HexSlice(&Keys, "IMGPROXY_KEY"); err != nil {
return err
}
if err := configurators.HexSlice(&Salts, "IMGPROXY_SALT"); err != nil {
return err
}
configurators.Int(&SignatureSize, "IMGPROXY_SIGNATURE_SIZE")
configurators.StringSlice(&TrustedSignatures, "IMGPROXY_TRUSTED_SIGNATURES")
if err := configurators.HexSliceFile(&Keys, keyPath); err != nil {
return err
}
if err := configurators.HexSliceFile(&Salts, saltPath); err != nil {
return err
}
configurators.String(&Secret, "IMGPROXY_SECRET")
configurators.String(&AllowOrigin, "IMGPROXY_ALLOW_ORIGIN")
configurators.String(&UserAgent, "IMGPROXY_USER_AGENT")
configurators.Bool(&IgnoreSslVerification, "IMGPROXY_IGNORE_SSL_VERIFICATION")
configurators.Bool(&DevelopmentErrorsMode, "IMGPROXY_DEVELOPMENT_ERRORS_MODE")
configurators.Bool(&CookiePassthrough, "IMGPROXY_COOKIE_PASSTHROUGH")
configurators.String(&CookieBaseURL, "IMGPROXY_COOKIE_BASE_URL")
configurators.String(&LocalFileSystemRoot, "IMGPROXY_LOCAL_FILESYSTEM_ROOT")
configurators.Bool(&S3Enabled, "IMGPROXY_USE_S3")
configurators.String(&S3Region, "IMGPROXY_S3_REGION")
configurators.String(&S3Endpoint, "IMGPROXY_S3_ENDPOINT")
configurators.Bool(&S3EndpointUsePathStyle, "IMGPROXY_S3_ENDPOINT_USE_PATH_STYLE")
configurators.String(&S3AssumeRoleArn, "IMGPROXY_S3_ASSUME_ROLE_ARN")
configurators.String(&S3AssumeRoleExternalID, "IMGPROXY_S3_ASSUME_ROLE_EXTERNAL_ID")
configurators.Bool(&S3MultiRegion, "IMGPROXY_S3_MULTI_REGION")
configurators.Bool(&S3DecryptionClientEnabled, "IMGPROXY_S3_USE_DECRYPTION_CLIENT")
configurators.Bool(&GCSEnabled, "IMGPROXY_USE_GCS")
configurators.String(&GCSKey, "IMGPROXY_GCS_KEY")
configurators.String(&GCSEndpoint, "IMGPROXY_GCS_ENDPOINT")
configurators.Bool(&ABSEnabled, "IMGPROXY_USE_ABS")
configurators.String(&ABSName, "IMGPROXY_ABS_NAME")
configurators.String(&ABSKey, "IMGPROXY_ABS_KEY")
configurators.String(&ABSEndpoint, "IMGPROXY_ABS_ENDPOINT")
configurators.Bool(&SwiftEnabled, "IMGPROXY_USE_SWIFT")
configurators.String(&SwiftUsername, "IMGPROXY_SWIFT_USERNAME")
configurators.String(&SwiftAPIKey, "IMGPROXY_SWIFT_API_KEY")
configurators.String(&SwiftAuthURL, "IMGPROXY_SWIFT_AUTH_URL")
configurators.String(&SwiftDomain, "IMGPROXY_SWIFT_DOMAIN")
configurators.String(&SwiftTenant, "IMGPROXY_SWIFT_TENANT")
configurators.Int(&SwiftConnectTimeoutSeconds, "IMGPROXY_SWIFT_CONNECT_TIMEOUT_SECONDS")
configurators.Int(&SwiftTimeoutSeconds, "IMGPROXY_SWIFT_TIMEOUT_SECONDS")
configurators.Bool(&ETagEnabled, "IMGPROXY_USE_ETAG")
configurators.String(&ETagBuster, "IMGPROXY_ETAG_BUSTER")
configurators.Bool(&LastModifiedEnabled, "IMGPROXY_USE_LAST_MODIFIED")
configurators.String(&BaseURL, "IMGPROXY_BASE_URL")
if err := configurators.Replacements(&URLReplacements, "IMGPROXY_URL_REPLACEMENTS"); err != nil {
return err
}
presetsSep := ","
configurators.String(&presetsSep, "IMGPROXY_PRESETS_SEPARATOR")
configurators.StringSliceSep(&Presets, "IMGPROXY_PRESETS", presetsSep)
if err := configurators.StringSliceFile(&Presets, presetsPath); err != nil {
return err
}
configurators.Bool(&OnlyPresets, "IMGPROXY_ONLY_PRESETS")
configurators.String(&WatermarkData, "IMGPROXY_WATERMARK_DATA")
configurators.String(&WatermarkPath, "IMGPROXY_WATERMARK_PATH")
configurators.String(&WatermarkURL, "IMGPROXY_WATERMARK_URL")
configurators.Float(&WatermarkOpacity, "IMGPROXY_WATERMARK_OPACITY")
configurators.String(&FallbackImageData, "IMGPROXY_FALLBACK_IMAGE_DATA")
configurators.String(&FallbackImagePath, "IMGPROXY_FALLBACK_IMAGE_PATH")
configurators.String(&FallbackImageURL, "IMGPROXY_FALLBACK_IMAGE_URL")
configurators.Int(&FallbackImageHTTPCode, "IMGPROXY_FALLBACK_IMAGE_HTTP_CODE")
configurators.Int(&FallbackImageTTL, "IMGPROXY_FALLBACK_IMAGE_TTL")
configurators.Bool(&DataDogEnable, "IMGPROXY_DATADOG_ENABLE")
configurators.Bool(&DataDogEnableMetrics, "IMGPROXY_DATADOG_ENABLE_ADDITIONAL_METRICS")
configurators.String(&NewRelicAppName, "IMGPROXY_NEW_RELIC_APP_NAME")
configurators.String(&NewRelicKey, "IMGPROXY_NEW_RELIC_KEY")
configurators.StringMap(&NewRelicLabels, "IMGPROXY_NEW_RELIC_LABELS")
configurators.String(&PrometheusBind, "IMGPROXY_PROMETHEUS_BIND")
configurators.String(&PrometheusNamespace, "IMGPROXY_PROMETHEUS_NAMESPACE")
configurators.Bool(&OpenTelemetryEnable, "IMGPROXY_OPEN_TELEMETRY_ENABLE")
configurators.Bool(&OpenTelemetryEnableMetrics, "IMGPROXY_OPEN_TELEMETRY_ENABLE_METRICS")
configurators.String(&OpenTelemetryServerCert, "IMGPROXY_OPEN_TELEMETRY_SERVER_CERT")
configurators.String(&OpenTelemetryClientCert, "IMGPROXY_OPEN_TELEMETRY_CLIENT_CERT")
configurators.String(&OpenTelemetryClientKey, "IMGPROXY_OPEN_TELEMETRY_CLIENT_KEY")
configurators.String(&OpenTelemetryTraceIDGenerator, "IMGPROXY_OPEN_TELEMETRY_TRACE_ID_GENERATOR")
configurators.String(&CloudWatchServiceName, "IMGPROXY_CLOUD_WATCH_SERVICE_NAME")
configurators.String(&CloudWatchNamespace, "IMGPROXY_CLOUD_WATCH_NAMESPACE")
configurators.String(&CloudWatchRegion, "IMGPROXY_CLOUD_WATCH_REGION")
configurators.String(&BugsnagKey, "IMGPROXY_BUGSNAG_KEY")
configurators.String(&BugsnagStage, "IMGPROXY_BUGSNAG_STAGE")
configurators.String(&HoneybadgerKey, "IMGPROXY_HONEYBADGER_KEY")
configurators.String(&HoneybadgerEnv, "IMGPROXY_HONEYBADGER_ENV")
configurators.String(&SentryDSN, "IMGPROXY_SENTRY_DSN")
configurators.String(&SentryEnvironment, "IMGPROXY_SENTRY_ENVIRONMENT")
configurators.String(&SentryRelease, "IMGPROXY_SENTRY_RELEASE")
configurators.Int(&AirbrakeProjectID, "IMGPROXY_AIRBRAKE_PROJECT_ID")
configurators.String(&AirbrakeProjectKey, "IMGPROXY_AIRBRAKE_PROJECT_KEY")
configurators.String(&AirbrakeEnv, "IMGPROXY_AIRBRAKE_ENVIRONMENT")
configurators.Bool(&ReportDownloadingErrors, "IMGPROXY_REPORT_DOWNLOADING_ERRORS")
configurators.Bool(&ReportIOErrors, "IMGPROXY_REPORT_IO_ERRORS")
configurators.Bool(&EnableDebugHeaders, "IMGPROXY_ENABLE_DEBUG_HEADERS")
configurators.Int(&FreeMemoryInterval, "IMGPROXY_FREE_MEMORY_INTERVAL")
configurators.Int(&DownloadBufferSize, "IMGPROXY_DOWNLOAD_BUFFER_SIZE")
configurators.Int(&BufferPoolCalibrationThreshold, "IMGPROXY_BUFFER_POOL_CALIBRATION_THRESHOLD")
if len(Keys) != len(Salts) {
return fmt.Errorf("Number of keys and number of salts should be equal. Keys: %d, salts: %d", len(Keys), len(Salts))
}
if len(Keys) == 0 {
log.Warning("No keys defined, so signature checking is disabled")
}
if len(Salts) == 0 {
log.Warning("No salts defined, so signature checking is disabled")
}
if SignatureSize < 1 || SignatureSize > 32 {
return fmt.Errorf("Signature size should be within 1 and 32, now - %d\n", SignatureSize)
}
if len(Bind) == 0 {
return errors.New("Bind address is not defined")
}
if Timeout <= 0 {
return fmt.Errorf("Timeout should be greater than 0, now - %d\n", Timeout)
}
if ReadRequestTimeout <= 0 {
return fmt.Errorf("Read request timeout should be greater than 0, now - %d\n", ReadRequestTimeout)
}
if WriteResponseTimeout <= 0 {
return fmt.Errorf("Write response timeout should be greater than 0, now - %d\n", WriteResponseTimeout)
}
if KeepAliveTimeout < 0 {
return fmt.Errorf("KeepAlive timeout should be greater than or equal to 0, now - %d\n", KeepAliveTimeout)
}
if ClientKeepAliveTimeout < 0 {
return fmt.Errorf("Client KeepAlive timeout should be greater than or equal to 0, now - %d\n", ClientKeepAliveTimeout)
}
if DownloadTimeout <= 0 {
return fmt.Errorf("Download timeout should be greater than 0, now - %d\n", DownloadTimeout)
}
if Workers <= 0 {
return fmt.Errorf("Workers number should be greater than 0, now - %d\n", Workers)
}
if RequestsQueueSize < 0 {
return fmt.Errorf("Requests queue size should be greater than or equal 0, now - %d\n", RequestsQueueSize)
}
if MaxClients < 0 {
return fmt.Errorf("Max clients number should be greater than or equal 0, now - %d\n", MaxClients)
}
if TTL < 0 {
return fmt.Errorf("TTL should be greater than or equal to 0, now - %d\n", TTL)
}
if MaxSrcResolution <= 0 {
return fmt.Errorf("Max src resolution should be greater than 0, now - %d\n", MaxSrcResolution)
}
if MaxSrcFileSize < 0 {
return fmt.Errorf("Max src file size should be greater than or equal to 0, now - %d\n", MaxSrcFileSize)
}
if MaxAnimationFrames <= 0 {
return fmt.Errorf("Max animation frames should be greater than 0, now - %d\n", MaxAnimationFrames)
}
if PngQuantizationColors < 2 {
return fmt.Errorf("Png quantization colors should be greater than 1, now - %d\n", PngQuantizationColors)
} else if PngQuantizationColors > 256 {
return fmt.Errorf("Png quantization colors can't be greater than 256, now - %d\n", PngQuantizationColors)
}
if AvifSpeed < 0 {
return fmt.Errorf("Avif speed should be greater than 0, now - %d\n", AvifSpeed)
} else if AvifSpeed > 9 {
return fmt.Errorf("Avif speed can't be greater than 9, now - %d\n", AvifSpeed)
}
if Quality <= 0 {
return fmt.Errorf("Quality should be greater than 0, now - %d\n", Quality)
} else if Quality > 100 {
return fmt.Errorf("Quality can't be greater than 100, now - %d\n", Quality)
}
if len(PreferredFormats) == 0 {
return errors.New("At least one preferred format should be specified")
}
if IgnoreSslVerification {
log.Warning("Ignoring SSL verification is very unsafe")
}
if LocalFileSystemRoot != "" {
stat, err := os.Stat(LocalFileSystemRoot)
if err != nil {
return fmt.Errorf("Cannot use local directory: %s", err)
}
if !stat.IsDir() {
return errors.New("Cannot use local directory: not a directory")
}
if LocalFileSystemRoot == "/" {
log.Warning("Exposing root via IMGPROXY_LOCAL_FILESYSTEM_ROOT is unsafe")
}
}
if _, ok := os.LookupEnv("IMGPROXY_USE_GCS"); !ok && len(GCSKey) > 0 {
log.Warning("Set IMGPROXY_USE_GCS to true since it may be required by future versions to enable GCS support")
GCSEnabled = true
}
if WatermarkOpacity <= 0 {
return errors.New("Watermark opacity should be greater than 0")
} else if WatermarkOpacity > 1 {
return errors.New("Watermark opacity should be less than or equal to 1")
}
if FallbackImageTTL < 0 {
return fmt.Errorf("Fallback image TTL should be greater than or equal to 0, now - %d\n", TTL)
}
if FallbackImageHTTPCode != 0 && (FallbackImageHTTPCode < 100 || FallbackImageHTTPCode > 599) {
return errors.New("Fallback image HTTP code should be between 100 and 599")
}
if len(PrometheusBind) > 0 && PrometheusBind == Bind {
return errors.New("Can't use the same binding for the main server and Prometheus")
}
if FreeMemoryInterval <= 0 {
return errors.New("Free memory interval should be greater than zero")
}
if DownloadBufferSize < 0 {
return errors.New("Download buffer size should be greater than or equal to 0")
} else if DownloadBufferSize > math.MaxInt32 {
return fmt.Errorf("Download buffer size can't be greater than %d", math.MaxInt32)
}
if BufferPoolCalibrationThreshold < 64 {
return errors.New("Buffer pool calibration threshold should be greater than or equal to 64")
}
return nil
}