Categorygithub.com/quix-labs/caddy-image-processor
modulepackage
0.0.0-20241215122631-f8ae9fbc97af
Repository: https://github.com/quix-labs/caddy-image-processor.git
Documentation: pkg.go.dev

# README

Build Static Releases Build Docker

Caddy Image Processor

This repository contains a CaddyServer module for processing images on the fly using libvips.

Features

  • Automatic image processing based on URL query parameters
  • Supports resizing, rotating, cropping, quality adjustments, format conversion, and more
  • Efficient processing using libvips

Prerequisites

  • libvips installed on your system
  • libvips-dev installed on your system (only for xcaddy build)

Installation and Configuration

Using Docker

  • Pull the Docker image from the GitHub Container Registry:
    docker pull ghcr.io/quix-labs/caddy-image-processor:latest
    

Using xcaddy

  • Before building the module, ensure you have xcaddy installed 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.

Using prebuilt assets

  • 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.

Usage

Using Docker

docker run -p 80:80 -v $PWD/Caddyfile:/etc/caddy/Caddyfile -d ghcr.io/quix-labs/caddy-image-processor:latest

Your can see more information in the official docker documentation for caddy

Using xcaddy build / prebuilt assets

/path/to/your/caddy run --config /etc/caddy/Caddyfile

Your can see more information in the official documentation for caddy

Example Caddyfile

Using file_server

localhost {
    root /your-images-directory
    file_server
    image_processor
}

Using reverse_proxy

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.

Available Query Parameters

ParamNameDescriptionType
hHeightImage heightInteger
wWidthImage widthInteger
ahAreaHeightArea heightInteger
awAreaWidthArea widthInteger
tTopY-coordinate of the top-left cornerInteger
lLeftX-coordinate of the top-left cornerInteger
qQualityImage quality (JPEG compression)Integer (default 75)
cpCompressionCompression level (0-9, 0 = lossless)Integer
zZoomZoom levelInteger
cropCropWhether cropping is enabledBoolean
enEnlargeWhether enlargement is enabledBoolean
emEmbedWhether embedding is enabledBoolean
flipFlipWhether vertical flipping is enabledBoolean
flopFlopWhether horizontal flipping is enabledBoolean
forceForceWhether to force actionBoolean
narNoAutoRotateWhether auto-rotation is disabledBoolean
npNoProfileWhether profile is disabledBoolean
itlInterlaceWhether interlacing is enabledBoolean (default true)
smdStripMetadataWhether to strip metadataBoolean (default true)
trTrimWhether trimming is enabledBoolean
llLosslessWhether compression is losslessBoolean
thThresholdColor thresholdFloat
gGammaGamma correctionFloat
brBrightnessBrightnessFloat
cContrastContrastFloat
rRotateRotation angle (45, 90, 135, 180, 235, 270, 315)Integer
bGaussianBlurGaussian blur levelInteger
bgBackgroundBackground color (white, black, red, magenta, blue, cyan, green, yellow, or hexadecimal format #RRGGBB)Color
fmTypeImage type (jpg, png, gif, webp, avif)Image Type (default original)

Examples

Advanced Configuration

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.

Example with on_fail and Security Configuration

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

Explanation:

  • 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_params vs allowed_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 to disallowed_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)

Planned Features

The following features are planned for future implementation:

  • Sharp compliance: fit,...

Development

To contribute to the development of Caddy Image Processor, follow these steps:

  1. Make sure you have Go installed on your system.

  2. Clone this repository to your local machine:

    git clone https://github.com/quix-labs/caddy-image-processor.git
    
  3. Navigate to the project directory:

  4. Install xcaddy if you haven't already:

    go get -u github.com/caddyserver/xcaddy/cmd/xcaddy
    
  5. Make your changes in the source code.

  6. Run tests to ensure your changes haven't introduced any issues:

    make test
    
  7. If tests pass, you can build the project:

    make build
    
  8. To run the project in development mode, use the following command:

    make run
    
  9. Once you're satisfied with your changes, create a pull request to the main branch of the repository for review.

Credits

License

The MIT License (MIT). Please see License File for more information.

# Functions

No description provided by the author

# Constants

OnFailAbort returns a 500 Internal Server Error to the client.
OnFailBypass forces the response to return the initial (unprocessed) image.
OnSecurityFailAbort Returns a 400 Bad Request error to the client.
OnSecurityFailBypass Forces the response to return the initial (unprocessed) image.
OnSecurityFailIgnore Deletes invalid parameters from the request but continues processing.

# Variables

No description provided by the author

# Structs

No description provided by the author
Middleware allow user to do image processing on the fly using libvips With simple queries parameters you can resize, convert, crop your served images.
No description provided by the author
No description provided by the author
No description provided by the author

# Interfaces

No description provided by the author

# Type aliases

Constraints represent constraints as {params:[{type:..., customConfig..}]}.
OnFail represents the possible values for the "on_fail" directive.
No description provided by the author