## Server configuration [server] ## Optional: pict-rs binding address # environment variable: PICTRS__SERVER__ADDRESS # default: 0.0.0.0:8080 address = '0.0.0.0:8080' ## Optional: shared secret for internal endpoints # environment variable: PICTRS__SERVER__API_KEY # default: empty # # Not specifying api_key disables internal endpoints api_key = 'API_KEY' ## Optional: How many files are allowed to be uploaded per request # environment variable: PICTRS__SERVER__MAX_FILE_COUNT # default: 1 max_file_count = 1 ## Client configuration [client] ## Optional: connection pool size for internal http client # environment variable: PICTRS__CLIENT__POOL_SIZE # default: 100 # # Sets the maximum number of allowed idle connections per-host. pool_size = 100 ## Optional: time (in seconds) the client will wait for a response before giving up # environment variable: PICTRS__CLIENT__TIMEOUT # default: 30 # # This is used for the `/image/download` endpoint when fetching media from another server. It is # distinct from the object storage client timeout, which can be configured separately timeout = 30 ## Logging configuration [tracing.logging] ## Optional: log format # environment variable: PICTRS__TRACING__LOGGING__FORMAT # default: normal # # available options: compact, json, normal, pretty format = 'normal' ## Optional: log targets # environment variable: PICTRS__TRACING__LOGGING__TARGETS # default: warn,tracing_actix_web=info,actix_server=info,actix_web=info # # Dictates which traces should print to stdout # Follows the same format as RUST_LOG targets = 'warn,tracing_actix_web=info,actix_server=info,actix_web=info' ## Console configuration [tracing.console] ## Optional: console address # environment variable: PICTRS__TRACING__CONSOLE__ADDRESS # default: empty # # Dictates whether console should be enabled, and what address it should be exposed on. # # When set, tokio-console can connect to the pict-rs service # # Configure your container to expose the console port # ``` # # docker-compose.yml # version: '3.3' # # services: # pictrs: # image: asonix/pictrs:0.4.1 # ports: # - "127.0.0.1:8080:8080" # - "127.0.0.1:6669:6669" # this is the line that exposes console # restart: always # volumes: # - ./volumes/pictrs:/mnt # ``` # # Connect from console # ``` # $ tokio-console http://localhost:6669 # ``` address = '0.0.0.0:6669' ## Optional: console buffer capacity # environment variable: PICTRS__TRACING__CONSOLE__BUFFER_CAPACITY # default: 102400 # # This is the number of _events_ to buffer, not the number of bytes. In reality, the amount of # RAM used will be significatnly larger (in bytes) than the buffer capacity (in events) buffer_capacity = 102400 ## OpenTelemetry configuration [tracing.opentelemetry] ## Optional: url for exporting otlp traces # environment variable: PICTRS__TRACING__OPENTELEMETRY__URL # default: empty # # Not specifying opentelemetry_url means no traces will be exported # When set, pict-rs will export OpenTelemetry traces to the provided URL. If the URL is # inaccessible, this can cause performance degredation in pict-rs, so it is best left unset unless # you have an OpenTelemetry collector url = 'http://localhost:4317/' ## Optional: name to relate OpenTelemetry traces # environment variable: PICTRS__TRACING__OPENTELEMETRY__SERVICE_NAME # default: pict-rs service_name = 'pict-rs' ## Optional: trace level to export # environment variable: PICTRS__TRACING__OPENTELEMETRY__TARGETS # default: info # # Follows the same format as RUST_LOG targets = 'info' [metrics] ## Optional: enable a prometheus scrape endpoint for pict-rs # environment variable: PICTRS__METRICS__PROMETHEUS_ADDRESS # default: empty # # Setting this value enables pointing prometheus at pict-rs to receive metrics. It can also be # queried with curl. prometheus_address = "0.0.0.0:9000" ## Configuration for migrating from pict-rs 0.2 [old_db] ## Optional: path to old pict-rs directory # environment variable: PICTRS__OLD_DB__PATH # default: /mnt path = '/mnt' ## Media Processing Configuration [media] ## Optional: max file size (in Megabytes) # environment variable: PICTRS__MEDIA__MAX_FILE_SIZE # default: 40 max_file_size = 40 ## Optional: Timeout (in seconds) for all spawned media processing operations # environment variable: PICTRS__MEDIA__PROCESS_TIMEOUT # default: 30 process_timeout = 30 ## Optional: preprocessing steps for uploaded images # environment variable: PICTRS__MEDIA__PREPROCESS_STEPS # default: empty # # This configuration is the same format as the process endpoint's query arguments preprocess_steps = 'crop=16x9&resize=1200&blur=0.2' ## Optional: set allowed filters for image processing # environment variable: PICTRS__MEDIA__FILTERS # default: ['blur', 'crop', 'identity', 'resize', 'thumbnail'] filters = ['blur', 'crop', 'identity', 'resize', 'thumbnail'] [media.retention] ## Optional: retention period for image variants # environment variable: PICTRS__MEDIA__RETENTION__VARIANTS # default: 7d # # Variants are any image served from the process.{ext} endpoint. These images are generated based on # an original upload, and can be regenerated when needed. The retention period is after last access # rather than after generation, so a value of "7d" means "7 days after the last access of this # variant" # # Available units are # - m (minutes) # - h (hours) # - d (days) # - y (years) variants = "7d" ## Optional: retention period for proxied images # environment variable: PICTRS__MEDIA__RETENTION__PROXY # default: 7d # # Proxied images reside originally on other servers, and can be re-fetched if needed. The retention # period is after last access rather than after fetch, so a value of "7d" means "7 days after the # last access of this image" # # Available units are # - m (minutes) # - h (hours) # - d (days) # - y (years) proxy = "7d" [media.image] ## Optional: max media width (in pixels) # environment variable: PICTRS__MEDIA__IMAGE__MAX_WIDTH # default: 10,000 max_width = 10000 ## Optional: max media height (in pixels) # environment variable: PICTRS__MEDIA__IMAGE__MAX_HEIGHT # default: 10,000 max_height = 10000 ## Optional: max media area (in pixels) # environment variable: PICTRS__MEDIA__IMAGE__MAX_AREA # default: 40,000,000 max_area = 40000000 ## Optional: max file size (in Megabytes) # environment variable: PICTRS__MEDIA__IMAGE__MAX_FILE_SIZE # default: 40 max_file_size = 40 ## Optional: set file type for all images # environment variable: PICTRS__MEDIA__IMAGE__FORMAT # default: empty # # available options: avif, png, jpeg, jxl, webp # When set, all uploaded still images will be converted to this file type. For balancing quality vs # file size vs browser support, 'avif', 'jxl', and 'webp' should be considered. By default, images # are stored in their original file type. format = "webp" [media.image.quality] ## Optional: set quality for AVIF images # environment variable : PICTRS__MEDIA__IMAGE__QUALITY__AVIF # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 40 and 100 makes # the most sense. avif = 100 ## Optional: set compression for PNG images # environment variable : PICTRS__MEDIA__IMAGE__QUALITY__PNG # default: empty # # availabe range: 0-100 # 100 means best compression and 0 means worst compression. Since PNG is a lossless format, changing # this value will not change how the images look. png = 100 ## Optional: set quality for JPEG images # environment variable : PICTRS__MEDIA__IMAGE__QUALITY__JPEG # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 60 and 100 makes # the most sense. jpeg = 100 ## Optional: set quality for JXL images # environment variable : PICTRS__MEDIA__IMAGE__QUALITY__JXL # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 40 and 100 makes # the most sense. jxl = 100 ## Optional: set quality for WEBP images # environment variable : PICTRS__MEDIA__IMAGE__QUALITY__WEBP # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 50 and 100 makes # the most sense. webp = 100 [media.animation] ## Optional: max animation width (in pixels) # environment variable: PICTRS__MEDIA__ANIMATION__MAX_WIDTH # default: 256 # # If an animation exceeds this value, it may be converted to a silent video max_width = 256 ## Optional: max animation height (in pixels) # environment variable: PICTRS__MEDIA__ANIMATION__MAX_HEIGHT # default: 256 # # If an animation exceeds this value, it may be converted to a silent video max_height = 256 ## Optional: max animation area (in pixels) # environment variable: PICTRS__MEDIA__ANIMATION__MAX_AREA # default: 65,526 # # If an animation exceeds this value, it may be converted to a silent video max_area = 65536 ## Optional: max animation size (in Megabytes) # environment variable: PICTRS__MEDIA__ANIMATION__MAX_FILE_SIZE # default: 40 # # If an animation exceeds this value, it may be converted to a silent video max_file_size = 40 ## Optional: max frame count # environment variable: PICTRS__MEDIA__ANIMATION__MAX_FRAME_COUNT # default: 100 # # If an animation exceeds this value, it may be converted to a silent video max_frame_count = 100 ## Optional: set file type for all animations # environment variable: PICTRS__MEDIA__ANIMATION__FORMAT # default: empty # # available options: apng, avif, gif, webp # When set, all uploaded still images will be converted to this file type. For balancing quality vs # file size vs browser support, 'avif', 'jxl', and 'webp' should be considered. By default, images # are stored in their original file type. format = "webp" [media.animation.quality] ## Optional: set compression for APNG animations # environment variable : PICTRS__MEDIA__ANIMATION__QUALITY__APNG # default: empty # # availabe range: 0-100 # 100 means best compression and 0 means worst compression. Since APNG is a lossless format, # changing this value will not change how the animations look. apng = 100 ## Optional: set quality for AVIF animations # environment variable : PICTRS__MEDIA__ANIMATION__QUALITY__AVIF # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 40 and 100 makes # the most sense. avif = 100 ## Optional: set quality for WEBP animations # environment variable : PICTRS__MEDIA__ANIMATION__QUALITY__WEBP # default: empty # # availabe range: 0-100 # 100 means best quality and 0 means worst quality. Playing with numbers between 50 and 100 makes # the most sense. webp = 100 [media.video] ## Optional: enable MP4 and WEBM uploads (without sound) # environment variable: PICTRS__MEDIA__VIDEO__ENABLE # default: true # # Set this to false to serve static images only enable = true ## Optional: enable Sound for MP4 and WEBM uploads # environment variable: PICTRS__MEDIA__VIDEO__ALLOW_AUDIO # default: false # # this setting does nothing if video is not enabled allow_audio = false ## Optional: max video width (in pixels) # environment variable: PICTRS__MEDIA__VIDEO__MAX_WIDTH # default: 3,840 # # this setting does nothing if video is not enabled max_width = 3840 ## Optional: max video height (in pixels) # environment variable: PICTRS__MEDIA__VIDEO__MAX_HEIGHT # default: 3,840 # # this setting does nothing if video is not enabled max_height = 3840 ## Optional: max video area (in pixels) # environment variable: PICTRS__MEDIA__VIDEO__MAX_AREA # default: 8,294,400 # # this setting does nothing if video is not enabled max_area = 8294400 ## Optional: max video size (in Megabytes) # environment variable: PICTRS__MEDIA__VIDEO__MAX_FILE_SIZE # default: 40 # # this setting does nothing if video is not enabled max_file_size = 40 ## Optional: max frame count # environment variable: PICTRS__MEDIA__VIDEO__MAX_FRAME_COUNT # default: 900 # # this setting does nothing if video is not enabled max_frame_count = 900 ## Optional: set the default video codec # environment variable: PICTRS__MEDIA__VIDEO__VIDEO_CODEC # default: vp9 # # available options: av1, h264, h265, vp8, vp9 # this setting does nothing if video is not enabled video_codec = "vp9" ## Optional: set the default audio codec # environment variable: PICTRS__MEDIA__VIDEO__AUDIO_CODEC # default: empty # # available options: aac, opus, vorbis # The audio codec is automatically selected based on video codec, but can be overriden to `vorbis` # for webm uploads # automatic mappings: # - av1, vp8, and vp9 map to opus # - h264 and h265 map to aac # - vorbis is not default for any codec # this setting does nothing if full video is not enabled audio_codec = "opus" [media.video.quality] ## Optional: set maximum quality for all videos # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_MAX # default: 32 # # This value means different things for different video codecs: # - it ranges from 0 to 63 for AV1 # - it ranges from 4 to 63 for VP8 # - it ranges from 0 to 63 for VP9 # - it ranges from 0 to 51 for H265 # - it ranges from 0 to 51 for 8bit H264 # - it ranges from 0 to 63 for 10bit H264 # # A lower value (closer to 0) is higher quality, while a higher value (closer to 63) is lower # quality. Generally acceptable ranges are 15-38, where lower values are preferred for larger # videos # # This value may be overridden for some videos depending on whether other crf configurations are set # For example, if crf_max is set to 32 and crf_720 is set to 34, then all videos smaller than or # equal to 720p video will be encoded with a `crf` of 34, while all videos larger than 720p will be # encoded with a `crf` of 32 # # The example values here are taken from a google document about reasonable CRF values for VP9 # video. More information about `crf` can be found on ffmpeg's wiki # # - AV1: https://trac.ffmpeg.org/wiki/Encode/AV1#ConstantQuality # - H264: https://trac.ffmpeg.org/wiki/Encode/H.264#crf # - H265: https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF # - VP8: https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF # - VP9: https://trac.ffmpeg.org/wiki/Encode/VP9#constantq crf_max = 12 ## Optional: set quality for videos up to 240p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_240 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 240px (240p) crf_240 = 37 ## Optional: set quality for videos up to 360p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_360 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 360px (260p) crf_360 = 36 ## Optional: set quality for videos up to 480p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_480 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 480px (480p) crf_480 = 33 ## Optional: set quality for videos up to 720p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_720 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 720px (720p) crf_720 = 32 ## Optional: set quality for videos up to 1080p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_1080 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 1080px (1080p) crf_1080 = 31 ## Optional: set quality for videos up to 1440p # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_1440 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 1440px (1440p) crf_1440 = 24 ## Optional: set quality for videos up to 4K # environment variable: PICTRS__MEDIA__VIDEO__QUALITY__CRF_2160 # default: empty # # This value overrides `crf_max` for videos with a smaller dimension of at most 2160px (4K) crf_2160 = 15 ## Database configuration [repo] ## Optional: database backend to use # environment variable: PICTRS__REPO__TYPE # default: sled # # available options: sled type = 'sled' ## Optional: path to sled repository # environment variable: PICTRS__REPO__PATH # default: /mnt/sled-repo path = '/mnt/sled-repo' ## Optional: in-memory cache capacity for sled data (in bytes) # environment variable: PICTRS__REPO__CACHE_CAPACITY # default: 67,108,864 (1024 * 1024 * 64, or 64MB) cache_capacity = 67108864 ## Optional: path for storing database exports # environment variable: PICTRS__REPO__EXPORT_PATH # default: /mnt/exports # # Used in combination with the /internal/export endpoint to dump the current sled database into a # new file. This can be helpful for backing up a running pict-rs server. export_path = "/mnt/exports" ## Media storage configuration [store] ## Optional: type of media storage to use # environment variable: PICTRS__STORE__TYPE # default: filesystem # # available options: filesystem, object_storage type = 'object_storage' ## Required: endpoint at which the object storage exists # environment variable: PICTRS__STORE__ENDPOINT # default: empty # # examples: # - `http://localhost:9000` # minio # - `https://s3.dualstack.eu-west-1.amazonaws.com` # s3 endpoint = 'http://minio:9000' ## Optional: How to format object storage requests # environment variable: PICTRS__STORE__USE_PATH_STYLE # default: false # # When this is true, objects will be fetched from http{s}://{endpoint}:{port}/{bucket_name}/{object} # When false, objects will be fetched from http{s}://{bucket_name}.{endpoint}:{port}/{object} # # Set to true when using minio use_path_style = false ## Required: object storage bucket name # environment variable: PICTRS__STORE__BUCKET_NAME # default: empty bucket_name = 'pict-rs' ## Required: object storage region # environment variable: PICTRS__STORE__REGION # default: empty # # When using minio, this can be set to `minio` region = 'minio' ## Required: object storage access key # environment variable: PICTRS__STORE__ACCESS_KEY # default: empty access_key = 'ACCESS_KEY' ## Required: object storage secret key # environment variable: PICTRS__STORE__SECRET_KEY # default: empty secret_key = 'SECRET_KEY' ## Optional: object storage session token # environment variable: PICTRS__STORE__SESSION_TOKEN # default: empty session_token = 'SESSION_TOKEN' ## Optional: set how long object storage signatures are valid for (in seconds) # environment variable: PICTRS__STORE__SIGNATURE_EXPIRATION # default: 15 # # This can be useful if your object storage might take a while to process requests. It should not be # increased more than needed to prevent replay attacks. signature_expiration = 15 ## Optional: set how long pict-rs will wait (in seconds) for a response from object storage # environment variable: PICTRS__STORE__CLIENT_TIMEOUT # default: 30 # # This value is the total wait time, and not additional wait time on top of the # signature_expiration. client_timeout = 30 ## Filesystem media storage example # ## Media storage configuration # [store] # ## Optional: type of media storage to use # # environment variable: PICTRS__STORE__TYPE # # default: filesystem # # # # available options: filesystem, object_storage # type = 'filesystem' # # ## Optional: path to uploaded media # # environment variable: PICTRS__STORE__PATH # # default: /mnt/files # path = '/mnt/files'