This repository contains a CaddyServer module for processing images on the fly using libvips.
- Automatic image processing based on URL query parameters
- Supports resizing, rotating, cropping, quality adjustments, format conversion, and more
- Efficient processing using libvips
- libvips installed on your system
- libvips-dev installed on your system (only for xcaddy build)
- Pull the Docker image from the GitHub Container Registry:
docker pull ghcr.io/quix-labs/caddy-image-processor:latest
-
Before building the module, ensure you have
xcaddyinstalled on your system. You can install it using the following command:go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
-
To build this module into Caddy, run the following command:
CGO_ENABLED=1 xcaddy build --with github.com/quix-labs/caddy-image-processor
This command compiles Caddy with the image processing module included.
-
You can also install the tool using release assets.
Download the appropriate package from the Releases page, and then follow the instructions provided for your specific platform.
docker run -p 80:80 -v $PWD/Caddyfile:/etc/caddy/Caddyfile -d ghcr.io/quix-labs/caddy-image-processor:latestYour can see more information in the official docker documentation for caddy
/path/to/your/caddy run --config /etc/caddy/CaddyfileYour can see more information in the official documentation for caddy
localhost {
root /your-images-directory
file_server
image_processor
}
localhost {
reverse_proxy your-domain.com
image_processor
}
In this example, all requests undergo processing by the image processor module before being served by the caddy.
| Param | Name | Description | Type |
|---|---|---|---|
| h | Height | Image height | Integer |
| w | Width | Image width | Integer |
| ah | AreaHeight | Area height | Integer |
| aw | AreaWidth | Area width | Integer |
| t | Top | Y-coordinate of the top-left corner | Integer |
| l | Left | X-coordinate of the top-left corner | Integer |
| q | Quality | Image quality (JPEG compression) | Integer (default 75) |
| cp | Compression | Compression level (0-9, 0 = lossless) | Integer |
| z | Zoom | Zoom level | Integer |
| crop | Crop | Whether cropping is enabled | Boolean |
| en | Enlarge | Whether enlargement is enabled | Boolean |
| em | Embed | Whether embedding is enabled | Boolean |
| flip | Flip | Whether vertical flipping is enabled | Boolean |
| flop | Flop | Whether horizontal flipping is enabled | Boolean |
| force | Force | Whether to force action | Boolean |
| nar | NoAutoRotate | Whether auto-rotation is disabled | Boolean |
| np | NoProfile | Whether profile is disabled | Boolean |
| itl | Interlace | Whether interlacing is enabled | Boolean (default true) |
| smd | StripMetadata | Whether to strip metadata | Boolean (default true) |
| tr | Trim | Whether trimming is enabled | Boolean |
| ll | Lossless | Whether compression is lossless | Boolean |
| th | Threshold | Color threshold | Float |
| g | Gamma | Gamma correction | Float |
| br | Brightness | Brightness | Float |
| c | Contrast | Contrast | Float |
| r | Rotate | Rotation angle (45, 90, 135, 180, 235, 270, 315) | Integer |
| b | GaussianBlur | Gaussian blur level | Integer |
| bg | Background | Background color (white, black, red, magenta, blue, cyan, green, yellow, or hexadecimal format #RRGGBB) | Color |
| fm | Type | Image type (jpg, png, gif, webp, avif) | Image Type (default original) |
- Resize an image to a width of 400 pixels and a height of 300 pixels:
- Crop an image to a width of 200 pixels and a height of 150 pixels starting from the top-left corner (x=50, y=50):
- Adjust the quality of the image to 80:
- Convert an image to PNG format and apply a Gaussian blur of 5:
- Rotate an image by 180 degrees and flip it horizontally:
- Apply a color threshold of 0.5 and adjust the brightness to -10:
- Convert an image to AVIF format with lossless compression:
This configuration allows you to control error handling with on_fail and on_security_fail.
You can also manage query parameter processing using allowed_params and disallowed_params.
This gives you fine-grained control over image processing in your Caddy server.
localhost:80 {
root test-dataset
file_server
image_processor {
# Serve original image if image in unprocessable
on_fail bypass
# Return 500 Internal Server Error if processing fails
# on_fail abort
security {
# Use ignore to remove param from processing, all valid param are processed
on_security_fail ignore
# Use abort to return 400 Bad Request when fails
# on_security_fail abort
# Use bypass to serve original image without processing
# on_security_fail bypass
# Explicitely disable rotate capabilities
disallowed_params r
# As an alternative use this to only accept width and height processing
# allowed_params w h
constraints {
h range 60 480
w {
values 60 130 240 480 637
# Shortcut range 60 637
range {
from 60
to 637
}
}
}
}
}
}
-
on_fail:bypass(default value): If any error occurs, the original, unprocessed image will be returned.abort: If an error occurs, a 500 Internal Server Error response will be returned.
-
on_security_fail:ignore(default value): If any security checks fail, they are ignored, and the image processing continues.bypass: If any security checks fail, the original, unprocessed image will be returned.abort: If any security checks fail, a 400 Bad Request response will be returned.
-
Security Configuration (
disallowed_paramsvsallowed_params):-
disallowed_params: Specifies which query parameters are not allowed.For example, parameters like w (width) and r (rotation) can be restricted.
-
allowed_params: Specify which query parameters are allowed. As an alternative todisallowed_params. -
Important: You cannot use both allowed_params and disallowed_params in the same configuration.
-
constraints: You san specify constraints for each parameter (see example)
-
The following features are planned for future implementation:
- Sharp compliance: fit,...
To contribute to the development of Caddy Image Processor, follow these steps:
-
Make sure you have Go installed on your system.
-
Clone this repository to your local machine:
git clone https://github.com/quix-labs/caddy-image-processor.git
-
Navigate to the project directory:
-
Install
xcaddyif you haven't already:go get -u github.com/caddyserver/xcaddy/cmd/xcaddy
-
Make your changes in the source code.
-
Run tests to ensure your changes haven't introduced any issues:
make test -
If tests pass, you can build the project:
make build
-
To run the project in development mode, use the following command:
make run
-
Once you're satisfied with your changes, create a pull request to the main branch of the repository for review.
The MIT License (MIT). Please see License File for more information.