## 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: whether to reject any operations that would change the state of pict-rs.
# environment variable: PICTRS__SERVER__READ_ONLY
# default: false
#
# This can be useful if you need to run a copy of pict-rs while performing maintenance.
read_only = false

## Optional: whether to run pict-rs without dependencies.
# environment variable: PICTRS__SERVER__DANGER_DUMMY_MODE
# default: false
#
# This means pict-rs will not be able to inspect metadata of uploaded media, or perform processing
# on it. This mode is provided for use in test environments. It should not be used in production.
danger_dummy_mode = false

## 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

## Optional: directory pict-rs will use to create temporary files
# environment variable: PICTRS__SERVER__TEMPORARY_DIRECTORY
# default: The system's advertised temporary directory ("/tmp" on most linuxes)
temporary_directory = "/tmp"

## Client configuration
[client]
## 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

[upgrade]
## Optional: How many hashes will be migrated from the previous version of pict-rs at the same time
# environment variable: PICTRS__UPGRADE__CONCURRENCY
# default: 32
#
# Increasing this value will increase the number of concurrent connections to the Repo, and to the
# Store, so make sure your deployment can handle more throughput before tweaking this.
concurrency = 32


## 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: info
#
# Dictates which traces should print to stdout
# Follows the same format as RUST_LOG
targets = 'info'

## Optional: whether pict-rs should log the new & close span events for tracing spans to stdout
# environment variable: PICTRS__TRACING__LOGGING__LOG_SPANS
# default: false
log_spans = false


## 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.4
[old_repo]
## Optional: path to sled repository
# environment variable: PICTRS__OLD_REPO__PATH
# default: /mnt/sled-repo
path = '/mnt/sled-repo'


## Media Processing Configuration
[media]
## Optional: URL for external validation of media
# environment variable: PICTRS__MEDIA__EXTERNAL_VALIDATION
# default: empty
#
# The expected API for external validators is to accept a POST with the media as the request body,
# and a valid `Content-Type` header. The validator should return a 2XX response when the media
# passes validation. Any other status code is considered a validation failure.
external_validation = 'http://localhost:8076'

## 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: 1920
max_width = 1920

## Optional: max animation height (in pixels)
# environment variable: PICTRS__MEDIA__ANIMATION__MAX_HEIGHT
# default: 1920
max_height = 1920

## Optional: max animation area (in pixels)
# environment variable: PICTRS__MEDIA__ANIMATION__MAX_AREA
# default: 2,073,600
max_area = 2073600

## Optional: max animation size (in Megabytes)
# environment variable: PICTRS__MEDIA__ANIMATION__MAX_FILE_SIZE
# default: 40
max_file_size = 40

## Optional: max frame count
# environment variable: PICTRS__MEDIA__ANIMATION__MAX_FRAME_COUNT
# default: 100
max_frame_count = 900

## 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 animated 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: empty
#
# 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

## Sled repo configuration example
[repo]
## Optional: database backend to use
# environment variable: PICTRS__REPO__TYPE
# default: sled
#
# available options: sled, postgres
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"


## Postgres repo configuration example
[repo]
## Optional: database backend to use
# environment variable: PICTRS__REPO__TYPE
# default: sled
#
# available options: sled, postgres
type = 'postgres'

## Required: URL to postgres database
# environment variable: PICTRS__REPO__URL
# default: empty
url = 'postgres://user:password@host:5432/db'


### Media storage configuration

## Filesystem media storage example
[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'


## Object media storage example
[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
