Fast, Docker-ready image processing server written in Go and libvips, with Thumbor URL syntax

Overview

Imagor

Imagor is a fast, Docker-ready image processing server written in Go.

Imagor uses one of the most efficient image processing library libvips (with govips). It is typically 4-8x faster than using the quickest ImageMagick and GraphicsMagick settings.

Imagor is a Go library that is easily extensible, ready to be installed and used in any Unix environment, and ready to be containerized using Docker.

Imagor adopts the Thumbor URL syntax and covers most of the web image processing use cases. If these fit your requirements, Imagor would be a lightweight, high performance drop-in replacement.

Quick Start

docker run -p 8000:8000 shumc/imagor -imagor-unsafe

Try out the following image URLs:

# original images
https://raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png
https://raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher-front.png

http://localhost:8000/unsafe/500x500/top/https://raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png
http://localhost:8000/unsafe/fit-in/500x500/filters:fill(white):format(jpeg)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png
http://localhost:8000/unsafe/fit-in/-500x500/10x10/filters:hue(290):saturation(100):fill(yellow):format(jpeg):quality(80)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png
http://localhost:8000/unsafe/fit-in/800x800/filters:fill(white):watermark(raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher-front.png,repeat,bottom,10):format(jpeg)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png

Docker Compose Example

Imagor with File Loader and Storage using mounted volume:

version: "3"
services:
  imagor:
    image: shumc/imagor:latest
    volumes:
      - ./:/mnt/data
    environment:
      PORT: 8000
      IMAGOR_UNSAFE: 1 # unsafe URL for testing
      FILE_LOADER_BASE_DIR: /mnt/data # enable file loader by specifying base dir
      FILE_STORAGE_BASE_DIR: /mnt/data # enable file storage by specifying base dir
    ports:
      - "8000:8000"

Imagor with AWS S3 Loader and Storage:

version: "3"
services:
  imagor:
    image: shumc/imagor:latest
    environment:
      PORT: 8000
      IMAGOR_SECRET: mysecret # secret key for URL signature
      AWS_ACCESS_KEY_ID: ...
      AWS_SECRET_ACCESS_KEY: ...
      AWS_REGION: ...
      S3_LOADER_BUCKET: mybucket # enable S3 loader by specifying loader bucket
      S3_LOADER_BASE_DIR: images # optional
      S3_STORAGE_BUCKET: mybucket # enable S3 storage by specifying storage bucket
      S3_STORAGE_BASE_DIR: images # optional
    ports:
      - "8000:8000"

Imagor Endpoint

Imagor endpoint is a series of URL parts which defines the image operations, followed by the image URI:

/HASH|unsafe/trim/AxB:CxD/fit-in/stretch/-Ex-F/GxH/HALIGN/VALIGN/smart/filters:NAME(ARGS):NAME(ARGS):.../IMAGE
  • HASH is the URL Signature hash, or unsafe if unsafe mode is used
  • trim removes surrounding space in images using top-left pixel color
  • AxB:CxD means manually crop the image at left-top point AxB and right-bottom point CxD
  • fit-in means that the generated image should not be auto-cropped and otherwise just fit in an imaginary box specified by ExF
  • stretch means resize the image to ExF without keeping its aspect ratios
  • -Ex-F means resize the image to be ExF of width per height size. The minus signs mean flip horizontally and vertically
  • GxH add horizontal padding G and vertical padding H under fit-in
  • HALIGN is horizontal alignment of crop. Accepts left, right or center, defaults to center
  • VALIGN is vertical alignment of crop. Accepts top, bottom or middle, defaults to middle
  • smart means using smart detection of focal points
  • filters a pipeline of image filter operations to be applied, see filters section
  • IMAGE is the image URI

Imagor provides utilities for previewing and generating Imagor endpoint URI:

GET /params

Prepending /params to the existing endpoint returns the endpoint attributes in JSON form, useful for preview:

curl http://localhost:8000/params/g5bMqZvxaQK65qFPaP1qlJOTuLM=/fit-in/500x400/0x20/filters:fill(white)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png

{
  "path": "fit-in/500x400/0x20/filters:fill(white)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png",
  "image": "raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png",
  "hash": "g5bMqZvxaQK65qFPaP1qlJOTuLM=",
  "fit_in": true,
  "width": 500,
  "height": 400,
  "v_padding": 20,
  "filters": [
    {
      "name": "fill",
      "args": "white"
    }
  ]
}

imagorpath package

Imagor Go library provides a imagorpath package which allows you to parse and generate Imagor endpoint using the Params struct:

import "github.com/cshum/imagor/imagorpath"

...

func Test(t *testing.T) {
	params := imagorpath.Params{
		Image:    "raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png",
		FitIn:    true,
		Width:    500,
		Height:   400,
		VPadding: 20,
		Filters: imagorpath.Filters{
			{
				Name: "fill",
				Args: "white",
			},
		},
	}

	// generate signed Imagor endpoint from Params struct with secret
	path := imagorpath.Generate(params, "mysecret")

	assert.Equal(t, path, "g5bMqZvxaQK65qFPaP1qlJOTuLM=/fit-in/500x400/0x20/filters:fill(white)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png")
}

URL Signature

In production environment, it is highly recommended turning off IMAGOR_UNSAFE and setup IMAGOR_SECRET to avoid DDoS attacks that abuse multiple image operations.

The hash is based on HMAC digest, created by taking the URL path (excluding /unsafe/) with secret. The hash is then base64url-encoded. An example in Go:

func SignPath(path, secret string) string {
	h := hmac.New(sha1.New, []byte(secret))
	h.Write([]byte(strings.TrimPrefix(path, "/")))
	hash := base64.URLEncoding.EncodeToString(h.Sum(nil))
	return hash + "/" + path
}

func main() {
	fmt.Println(SignPath("500x500/top/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png", "mysecret"))
	// RArq3FZw_bqxLcpKo1WI0aX_q7s=/fit-in/500x500/filters:fill(white):format(jpeg)/raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher.png
}

Filters

Filters /filters:NAME(ARGS):NAME(ARGS):.../ is a pipeline of image operations that will be sequentially applied to the image. Examples:

/filters:fill(white):format(jpeg)/
/filters:hue(290):saturation(100):fill(yellow):format(jpeg):quality(80)/
/filters:fill(white):watermark(raw.githubusercontent.com/golang-samples/gopher-vector/master/gopher-front.png,repeat,bottom,10):format(jpeg)/

Imagor supports the following filters:

  • background_color(color) sets the background color of a transparent image
    • color the color name or hexadecimal rgb expression without the “#” character
  • blur(sigma) applies gaussian blur to the image
  • brightness(amount) increases or decreases the image brightness
    • amount -100 to 100, the amount in % to increase or decrease the image brightness
  • contrast(amount) increases or decreases the image contrast
    • amount -100 to 100, the amount in % to increase or decrease the image contrast
  • fill(color) fill the missing area or transparent image with the specified color:
    • color - color name or hexadecimal rgb expression without the “#” character
      • If color is "blur" - missing parts are filled with blurred original image.
      • If color is "auto" - the top left image pixel will be chosen as the filling color
  • format(format) specifies the output format of the image
    • format accepts jpeg, png, webp, gif, jp2, tiff
  • grayscale() changes the image to grayscale
  • hue(angle) increases or decreases the image hue
    • angle the angle in degree to increase or decrease the hue rotation
  • quality(amount) changes the overall quality of the image, does nothing for png
    • amount 0 to 100, the quality level in %
  • rgb(r,g,b) amount of color in each of the rgb channels in %. Can range from -100 to 100
  • rotate(angle) rotates the given image according to the angle value passed
    • angle accepts 0, 90, 180, 270
  • round_corner(rx [, ry [, color]]) adds rounded corners to the image with the specified color as background
    • rx, ry amount of pixel to use as radius. ry = rx if ry is not provided
    • color the color name or hexadecimal rgb expression without the “#” character
  • saturation(amount) increases or decreases the image saturation
    • amount -100 to 100, the amount in % to increase or decrease the image saturation
  • sharpen(sigma) sharpens the image
  • trim([tolerance [, position]]) apply trim operation as part of the filter pipeline
    • tolerance the euclidean distance between the colors to get trimmed within the tolerance, default 1
    • position default using top-left pixel color unless specified bottom-right
  • upscale() upscale the image if fit-in is used
  • watermark(image, x, y, alpha [, w_ratio [, h_ratio]]) adds a watermark to the image. It can be positioned inside the image with the alpha channel specified and optionally resized based on the image size by specifying the ratio
    • image watermark image URI, using the same image loader configured for Imagor
    • x horizontal position that the watermark will be in:
      • Positive numbers indicate position from the left and negative numbers indicate position from the right.
      • Number followed by a p e.g. 20p means calculating the value from the image width as percentage
      • left,right,center positioned left, right or centered respectively
      • repeat the watermark will be repeated horizontally
    • y vertical position that the watermark will be in:
      • Positive numbers indicate position from the top and negative numbers indicate position from the bottom.
      • Number followed by a p e.g. 20p means calculating the value from the image height as percentage
      • top,bottom,center positioned top, bottom or centered respectively
      • repeat the watermark will be repeated vertically
    • alpha watermark image transparency, a number between 0 (fully opaque) and 100 (fully transparent).
    • w_ratio percentage of the width of the image the watermark should fit-in
    • h_ratio percentage of the height of the image the watermark should fit-in

Configurations

Imagor supports command-line arguments, see available options imagor -h. You may check main.go for better understanding the initialization sequences.

Imagor also supports environment variables or .env file for the arguments equivalent in capitalized snake case. For instances -imagor-secret would become IMAGOR_SECRET:

# both are equivalent

imagor -debug -imagor-secret=1234

DEBUG=1 IMAGOR_SECRET=1234 imagor

Available options:

imagor -h
Usage of imagor:
  -debug
        Debug mode
  -port int
        Sever port (default 8000)

  -imagor-secret string
        Secret key for signing Imagor URL
  -imagor-unsafe
        Unsafe Imagor that does not require URL signature. Prone to URL tampering
  -imagor-version
        Imagor version
  -imagor-cache-header-ttl duration
        Imagor HTTP cache header ttl for successful image response (default 24h0m0s)
  -imagor-request-timeout duration
        Timeout for performing imagor request (default 30s)
  -imagor-load-timeout duration
        Timeout for Imagor Loader request, should be smaller than imagor-request-timeout (default 20s)
  -imagor-save-timeout duration
        Timeout for saving image for storage (default 1m0s)

  -server-address string
        Server address
  -server-cors
        Enable CORS
  -server-strip-query-string
        Enable strip query string redirection
  -server-path-prefix string
        Server path prefix

  -vips-concurrency-level int
        VIPS concurrency level. Default to the number of CPU cores.
  -vips-disable-blur
        VIPS disable blur operations for vips processor
  -vips-disable-filters string
        VIPS disable filters by csv e.g. blur,watermark,rgb
  -vips-max-filter-ops int
        VIPS maximum number of filter operations allowed (default 10)

  -http-loader-allowed-sources string
        HTTP Loader allowed hosts whitelist to load images from if set. Accept csv wth glob pattern e.g. *.google.com,*.github.com.
  -http-loader-default-scheme string
        HTTP Loader default scheme if not specified by image path. Set "nil" to disable default scheme. (default "https")
  -http-loader-forward-headers string
        Forward request header to HTTP Loader request by csv e.g. User-Agent,Accept
  -http-loader-forward-all-headers
        Forward all request headers to HTTP Loader request
  -http-loader-insecure-skip-verify-transport
        HTTP Loader to use HTTP transport with InsecureSkipVerify true
  -http-loader-max-allowed-size int
        HTTP Loader maximum allowed size in bytes for loading images if set
  -http-loader-disable
        Disable HTTP Loader

  -file-loader-base-dir string
        Base directory for File Loader. Will activate File Loader only if this value present
  -file-loader-path-prefix string
        Base path prefix for File Loader

  -file-storage-base-dir string
        Base directory for File Storage. Will activate File Storage only if this value present
  -file-storage-path-prefix string
        Base path prefix for File Storage
  -file-storage-mkdir-permission string
        File Storage mkdir permission (default "0755")
  -file-storage-write-permission string
        File Storage write permission (default "0666")

  -aws-access-key-id string
        AWS Access Key ID. Required if using S3 Loader or S3 Storage
  -aws-region string
        AWS Region. Required if using S3 Loader or S3 Storage
  -aws-secret-access-key string
        AWS Secret Access Key. Required if using S3 Loader or S3 Storage

  -s3-loader-base-dir string
        Base directory for S3 Loader (default "/")
  -s3-loader-bucket string
        S3 Bucket for S3 Loader. Will activate S3 Loader only if this value present
  -s3-loader-path-prefix string
        Base path prefix for S3 Loader (default "/")

  -s3-storage-base-dir string
        Base directory for S3 Storage
  -s3-storage-bucket string
        S3 Bucket for S3 Storage. Will activate S3 Storage only if this value present
  -s3-storage-path-prefix string
        Base path prefix for S3 Storage
  -s3-storage-acl string
        Upload ACL for S3 Storage (default "public-read")

Comments
  • Benchmarks

    Benchmarks

    Hi again :)

    I'm trying to run some simple benchmarks to compare thumbor performance to imagor. For some reason I'm not sure the VIPS_CONCURRENCY_LEVEL env has an effect? It seems like it's always using all available CPUs ... Also interesting is that whilst it seems to run faster compared it to a single-process thumbor, when I run it with concurrency of 4 against thumbor (with the same concurrency), thumbor out-performs imagor (without caching, only keeping the original image in file storage) ...

    Perhaps it's due to the way I've setup the benchmark? maybe it doesn't keep the original image in storage and always fetches it? or some other trivial misconfiguration? because otherwise I would expect libvips to outperform thumbor ...

    You can see the benchmark code I'm running at https://github.com/MinimalCompact/thumbor/tree/imagor-thumbor-benchmark/benchmarks/locust (it's based on an older benchmark I created for optimizing thumbor on a multi-proc environment, so it's a bit messy unfortunately, but hope it's still useful)

    I tested it on a DigitalOcean droplet with 4 cpus. Here's a sheet with the stats

    opened by gingerlime 53
  • How to activate file saving?

    How to activate file saving?

    Great tool! The only question I have is how to activate file saving: I have defined the FILE_STORAGE_BASE_DIR in the docker-compose.yml file yet nothing happens when triggering the image treatments from the browser.

    opened by asitemade4u 18
  • S3 paths with url encoding not working

    S3 paths with url encoding not working

    I am currently testing locally imagor as a drop in replacement for our Thumbor implementation. We currently use an S3 loader and we're trying to emulate that with our local testing. However, we are getting errors when trying to implement it. I believe it has to do with url encoding special characters in the file path.

    Here is the url we are using:

    http://localhost:8888/unsafe/400x200/smart/photos/j/006b8bbe2c1baa8f2d12c06988a6efa7a15f048d.jpg
    

    Here is the result:

    {"message":"Get \"https://photos/j/006b8bbe2c1baa8f2d12c06988a6efa7a15f048d.jpg\": dial tcp: lookup photos on 127.0.0.11:53: no such host","status":500}
    

    If I url encode the path of the photo, then it works:

    photos%2Fj%2F006b8bbe2c1baa8f2d12c06988a6efa7a15f048d.jpg
    

    But if the url encoded path has special characters in the filename, such as { to %7B, it gets an error:

    photos%2F{1089856636549d026d369fb}.jpg
    

    to

    photos%2F%7B1089856636549d026d369fb%7D.jpg
    
    {"message":"Get \"https://photos/%7B1089856636549d026d369fb%7D.jpg\": dial tcp: lookup photos on 127.0.0.11:53: no such host","status":500}
    

    I'm assuming this is an issue because when querying s3 for the file, imagor is passing the url-encoded string instead of the actual filename. imagor should probably url-decode the string before making the request to s3. Thoughts?

    opened by r0bdiabl0 10
  • 406 VipsJpeg: Premature end of input file

    406 VipsJpeg: Premature end of input file

    Hi, I recently upgraded the imagor to v1.0.0 and I saw this error in docker container log many times for different images:

    {
        "level": "warn",
        "ts": 1660161069.1208205,
        "caller": "imagor/imagor.go:326",
        "msg": "process",
        "params": {
            "path": "fit-in/1280x720/filters:format(webp)/xxxx",
            "image": "xxxx",
            "hash": "xxxxx",
            "fit_in": true,
            "width": 1280,
            "height": 720,
            "filters": [
                {
                    "name": "format",
                    "args": "webp"
                }
            ]
        },
        "error": "imagor: 406 VipsJpeg: Premature end of input file"
    }
    
    opened by WatchDogsDev 6
  • Access rights considerations in a docker installation

    Access rights considerations in a docker installation

    I have an image present at the right location (I checked), with the right authorizations, with a fairly standard name: IMG_20180408_153807553_HDR.jpg

    And yet it is not treated by the Imagor server with this error: {"Op":"Get","URL":"https://pho/tst/IMG_20180408_153807553_HDR.jpg","Err":{"Op":"dial","Net":"tcp","Source":null,"Addr":null,"Err":{"Err":"no such host","Name":"pho","Server":"127.0.0.11:53","IsTimeout":false,"IsTemporary":false,"IsNotFound":true}}}

    Other images with underscores or uppercase letters are being treated fine in the exact same environment. The only difference is that the image weighs 3MB but that should not be an issue and is not what the error reports anyway.

    Please let me know what I am doing wrong.

    opened by asitemade4u 6
  • Suggestion :: Encode the storage path

    Suggestion :: Encode the storage path

    Hi there,

    I'm currently dealing with the following issue from S3 Storage: KeyTooLongError (https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)

    As I try to work with the images with multiple layers, the URL gets longer for every image I generate. Example of a processed image: https://url.com/processed/filters%3Awatermark%28df4bb201-03d2-4cb7-bf1b-c68e1d787009/original.png%2C-75%2C-51%2C0%2C18%2C10%29/processed/filters%253Awatermark%2528https%253A/url.com/processed/413x111%25253A723x421/smart/4d262fd3-1f67-40ad-a0c7-c37a3910083d/original.jpeg%252C135%252C-165%252C0%252C17%252Cnone%2529/processed/filters%25253Awatermark%252528https%2525253A%2525252F%2525252Furl.com%2525252F1500x165%2525252Ffilters%2525253Afill%25252528FFFFFF%25252529%2525253Aformat%25252528png%25252529%2525252Fb7161cdf-3afd-42c1-9a57-7c5100f4a4b8%2525252Ftransparent-pixel.png%25252Ccenter%25252Cbottom%25252C0%252529/processed/filters%2525253Awatermark%25252528https%252525253A%252525252F%252525252Furl.com%252525252F270x785%252525252Ffilters%252525253Afill%2525252528EAEAEA%2525252529%252525253Aformat%2525252528png%2525252529%252525252Fb7161cdf-3afd-42c1-9a57-7c5100f4a4b8%252525252Ftransparent-pixel.png%2525252Cleft%2525252Ctop%2525252C0%25252529/processed/1500x785/center/middle/8b881144-4c46-4c50-843f-488d2cc74baf/original.jpg

    One suggestion to reduce the number of characters for that is to try to hash the path when storing it. What do you think about it? I believe this would help out to reduce the number of chars considerably.

    Thanks in advance.

    opened by jvahldick 5
  • ffmpeg backend, thoughts?

    ffmpeg backend, thoughts?

    So I've noticed Thumbor has https://github.com/theatlantic/thumbor-video-engine

    Was wondering if @cshum has any thoughts on this, or if there is any ongoing effort to add ffmpeg as a backend (or something else that can do video, alongside vips) and/or what steps would be involved to do this?

    Would be crazy useful to have the same basic interface with some different options for video.

    Could just call whatever version of ffmpeg is on the host to Keep It Simple. :thinking:

    Thanks and keep up the amazing work.

    enhancement help wanted 
    opened by gnat 5
  • Add support for a -config flag/file

    Add support for a -config flag/file

    This PR adds support for a -config flag, as described in the docs for the github.com/peterbourgon/ff/v3 package.

    The motivation for this is to support deployments where the config will be stored in some secret management system and loaded wholesale.

    opened by bcspragu 5
  • Loading an image directly from S3 Storage

    Loading an image directly from S3 Storage

    Hello, first of all, thank you for the great tool!

    I have a question and hope you could help me.

    I have a minio server and two buckets in it, the first one is named source, the second one is result I upload a random image into source bucket, and it is directly accessible via this link, for example http://localhost:9000/source/ship.jpg So my question is, is it possible to pass only an image name (or its directory + image name) as an argument to imagor and the image will be fetched directly from S3 and after processing stored in result bucket?

    For example, like this: http://localhost:8000/unsafe/200x200/ship.jpg

    These are my docker env parameters

        environment:
          - 'PORT=8000'
          - 'AWS_REGION=us-east-1'
          - 'AWS_ACCESS_KEY_ID=***'
          - 'AWS_SECRET_ACCESS_KEY=***'
          - 'S3_ENDPOINT=http://minio2:9000/'
          - 'S3_STORAGE_BUCKET=source'
          - 'S3_RESULT_STORAGE_BUCKET=result'
          - 'SERVER_ACCESS_LOG=1'
          - 'IMAGOR_UNSAFE=1'
          - 'DEBUG=1'
    
    opened by beeyev 5
  • Support for path style S3 URL

    Support for path style S3 URL

    Hi, I am trying to use a S3 object storage which doesn't support subdomain style URL like bucket.namespace.domain.tld. It supports only path style URL like namespace.domain.tld/bucket. Can you please make changes to the s3storage adapter so that it could support path style URL too? Maybe a new config option for s3 storage. Sometjing like S3_URL=path (default url) would be nice. I am not familiar with GO. So, I can't make a PR.

    Thanks

    opened by mhhakim 5
  • Image files that have a name containing

    Image files that have a name containing "+" are not treated

    With the same setting as #2 , I have tried to treat images from the map folder. They are named according to another scheme, for example: map/air-lanes-jfk-lga-2018-5b+6DVXbdWRw86PJv+0.png

    When I try to treat the above image I get an error:

    • the URL: http://mdi.lan.ourquietplaces.com:7123/unsafe/fit-in/-500x500/10x10/filters:hue(290):saturation(100):fill(yellow):format(jpeg):quality(80)/map/air-lanes-jfk-lga-2018-5b+6DVXbdWRw86PJv+0.png
    • the error I get: {"Op":"Get","URL":"https://'map/air-lanes-jfk-lga-2018-5b%206DVXbdWRw86PJv%200.png%27","Err":{"Op":"dial","Net":"tcp","Source":null,"Addr":null,"Err":{"Err":"no such host","Name":"'map","Server":"","IsTimeout":false,"IsTemporary":false,"IsNotFound":true}}}
    opened by asitemade4u 5
  • Missing filter to strip exif data like in Thumbor

    Missing filter to strip exif data like in Thumbor

    @cshum, thank you for building this pretty cool library!

    We could not find a way to strip the metadata from the images to reduce the file sizes. Is there a filter similar to the one found in Thumbor or config that does this?

    opened by mevinbabuc 0
  • build(deps): bump github.com/aws/aws-sdk-go from 1.44.93 to 1.44.100

    build(deps): bump github.com/aws/aws-sdk-go from 1.44.93 to 1.44.100

    Bumps github.com/aws/aws-sdk-go from 1.44.93 to 1.44.100.

    Release notes

    Sourced from github.com/aws/aws-sdk-go's releases.

    Release v1.44.100 (2022-09-16)

    Service Client Updates

    • service/codestar-notifications: Updates service API and documentation
    • service/ecs: Updates service documentation
      • This release supports new task definition sizes.

    Release v1.44.99 (2022-09-15)

    Service Client Updates

    • service/dynamodb: Updates service API, documentation, waiters, paginators, and examples
      • Increased DynamoDB transaction limit from 25 to 100.
    • service/ec2: Updates service API and documentation
      • This feature allows customers to create tags for vpc-endpoint-connections and vpc-endpoint-service-permissions.
    • service/sagemaker: Updates service API and documentation
      • Amazon SageMaker Automatic Model Tuning now supports specifying Hyperband strategy for tuning jobs, which uses a multi-fidelity based tuning strategy to stop underperforming hyperparameter configurations early.

    Release v1.44.98 (2022-09-14)

    Service Client Updates

    • service/amplifyuibuilder: Updates service API, documentation, and paginators
    • service/ec2: Updates service API and documentation
      • This update introduces API operations to manage and create local gateway route tables, CoIP pools, and VIF group associations.

    Release v1.44.97 (2022-09-13)

    Service Client Updates

    • service/customer-profiles: Updates service API and documentation
    • service/drs: Updates service API and documentation
    • service/ec2: Updates service API and documentation
      • Two new features for local gateway route tables: support for static routes targeting Elastic Network Interfaces and direct VPC routing.
    • service/evidently: Updates service API and documentation
    • service/kendra: Updates service API and documentation
      • This release enables our customer to choose the option of Sharepoint 2019 for the on-premise Sharepoint connector.
    • service/transfer: Updates service API and documentation
      • This release introduces the ability to have multiple server host keys for any of your Transfer Family servers that use the SFTP protocol.

    Release v1.44.96 (2022-09-12)

    Service Client Updates

    • service/eks: Updates service API and documentation

    Release v1.44.95 (2022-09-09)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Imagor crashes sometimes

    Imagor crashes sometimes

    Hi, from time to time (every day or every to days) imagor crashes and restarts.

    I cannot reproduce the error, I can see this traces in the log:

    {"log":"fatal error: unexpected signal during runtime execution\n","stream":"stderr","time":"2022-09-07T10:26:21.691272038Z"}
    {"log":"[signal SIGSEGV: segmentation violation code=0x1 addr=0x125 pc=0x7f749a91b3a0]\n","stream":"stderr","time":"2022-09-07T10:26:21.693398049Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.69341131Z"}
    {"log":"runtime stack:\n","stream":"stderr","time":"2022-09-07T10:26:21.693413756Z"}
    {"log":"runtime.throw({0xf780d7?, 0x3?})\n","stream":"stderr","time":"2022-09-07T10:26:21.693730377Z"}
    {"log":"\u0009/usr/local/go/src/runtime/panic.go:1047 +0x5d fp=0x7f7332c75a60 sp=0x7f7332c75a30 pc=0x43b77d\n","stream":"stderr","time":"2022-09-07T10:26:21.693734236Z"}
    {"log":"runtime.sigpanic()\n","stream":"stderr","time":"2022-09-07T10:26:21.693737062Z"}
    {"log":"\u0009/usr/local/go/src/runtime/signal_unix.go:819 +0x369 fp=0x7f7332c75ab0 sp=0x7f7332c75a60 pc=0x451689\n","stream":"stderr","time":"2022-09-07T10:26:21.693739123Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.693741245Z"}
    {"log":"goroutine 5715652 [syscall]:\n","stream":"stderr","time":"2022-09-07T10:26:21.693743343Z"}
    {"log":"runtime.cgocall(0xd0e560, 0xc000ff4f40)\n","stream":"stderr","time":"2022-09-07T10:26:21.693754002Z"}
    {"log":"\u0009/usr/local/go/src/runtime/cgocall.go:158 +0x5c fp=0xc000ff4f18 sp=0xc000ff4ee0 pc=0x4096dc\n","stream":"stderr","time":"2022-09-07T10:26:21.693757499Z"}
    {"log":"github.com/cshum/imagor/vips._Cfunc_thumbnail_source_with_option(0x7f7434207270, 0xc0013bc010, 0x1f4, 0x1388, 0x0, 0x2, 0x7f742d60d780)\n","stream":"stderr","time":"2022-09-07T10:26:21.694102171Z"}
    {"log":"\u0009_cgo_gotypes.go:1402 +0x4c fp=0xc000ff4f40 sp=0xc000ff4f18 pc=0xcfea0c\n","stream":"stderr","time":"2022-09-07T10:26:21.694106296Z"}
    {"log":"github.com/cshum/imagor/vips.vipsThumbnailFromSource.func2(0xc00184e020?, 0x9?, 0x1f4, 0x1388, 0x0, 0x2, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694108351Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/vips.go:99 +0xbc fp=0xc000ff4f98 sp=0xc000ff4f40 pc=0xd06e3c\n","stream":"stderr","time":"2022-09-07T10:26:21.694110387Z"}
    {"log":"github.com/cshum/imagor/vips.vipsThumbnailFromSource(0x7f7496d85d28?, 0x8?, 0xc001d1e400?, 0xc0013bc008?, 0x0?, 0xc000ff50b0)\n","stream":"stderr","time":"2022-09-07T10:26:21.694112449Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/vips.go:99 +0x155 fp=0xc000ff5058 sp=0xc000ff4f98 pc=0xd06bf5\n","stream":"stderr","time":"2022-09-07T10:26:21.694117436Z"}
    {"log":"github.com/cshum/imagor/vips.LoadThumbnailFromSource(0x1225d38?, 0xc000960420?, 0xc000ff51d8?, 0x41d46b?, 0x7f746f2b4100?, 0xc00042e8c0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.69413578Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/image.go:137 +0x86 fp=0xc000ff5180 sp=0xc000ff5058 pc=0xd019e6\n","stream":"stderr","time":"2022-09-07T10:26:21.694139392Z"}
    {"log":"github.com/cshum/imagor/vips.(*Source).LoadThumbnail(...)\n","stream":"stderr","time":"2022-09-07T10:26:21.694503284Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/source.go:61\n","stream":"stderr","time":"2022-09-07T10:26:21.694507062Z"}
    {"log":"github.com/cshum/imagor/vips.newThumbnailFromBlob({0x1225d38, 0xc000960420}, 0xc000988200, 0x203000?, 0xc000960420?, 0xc0009603f0?, 0xc000753860?, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694509083Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/processor.go:174 +0x1a5 fp=0xc000ff5208 sp=0xc000ff5180 pc=0xcfa3c5\n","stream":"stderr","time":"2022-09-07T10:26:21.69451134Z"}
    {"log":"github.com/cshum/imagor/vips.(*Processor).NewThumbnail(0xdf86c0?, {0x1225d38, 0xc000960420}, 0xc000988200, 0xe12080?, 0xc0009603f0?, 0x0, 0x2, 0x1)\n","stream":"stderr","time":"2022-09-07T10:26:21.694513437Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/processor.go:219 +0x44f fp=0xc000ff5350 sp=0xc000ff5208 pc=0xcfa88f\n","stream":"stderr","time":"2022-09-07T10:26:21.694515589Z"}
    {"log":"github.com/cshum/imagor/vips.(*Processor).Process(_, {_, _}, _, {0x0, {0xc001b180a8, 0x91}, {0xc002050300, 0x51}, 0x1, ...}, ...)\n","stream":"stderr","time":"2022-09-07T10:26:21.694554902Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/vips/process.go:119 +0x32f fp=0xc000ff5738 sp=0xc000ff5350 pc=0xcf4c2f\n","stream":"stderr","time":"2022-09-07T10:26:21.694570019Z"}
    {"log":"github.com/cshum/imagor.(*Imagor).Do.func2({0x1225d38, 0xc0022542d0}, 0xc001e02140)\n","stream":"stderr","time":"2022-09-07T10:26:21.694573673Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/imagor.go:306 +0x10a3 fp=0xc000ff5e58 sp=0xc000ff5738 pc=0x7581a3\n","stream":"stderr","time":"2022-09-07T10:26:21.694576598Z"}
    {"log":"github.com/cshum/imagor.(*Imagor).suppress.func2()\n","stream":"stderr","time":"2022-09-07T10:26:21.694579764Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/imagor.go:496 +0xc7 fp=0xc000ff5f00 sp=0xc000ff5e58 pc=0x75b207\n","stream":"stderr","time":"2022-09-07T10:26:21.69458286Z"}
    {"log":"golang.org/x/sync/singleflight.(*Group).doCall.func2(0xc000ff5f56, 0xc001152420, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694586323Z"}
    {"log":"\u0009/go/pkg/mod/golang.org/x/[email protected]/singleflight/singleflight.go:193 +0x6f fp=0xc000ff5f38 sp=0xc000ff5f00 pc=0x75158f\n","stream":"stderr","time":"2022-09-07T10:26:21.694596584Z"}
    {"log":"golang.org/x/sync/singleflight.(*Group).doCall(0xc000636480?, 0xc0011eefd0?, {0xc001b180a8?, 0xc0011ba060?}, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694603798Z"}
    {"log":"\u0009/go/pkg/mod/golang.org/x/[email protected]/singleflight/singleflight.go:195 +0xa5 fp=0xc000ff5fa8 sp=0xc000ff5f38 pc=0x7514a5\n","stream":"stderr","time":"2022-09-07T10:26:21.694605955Z"}
    {"log":"golang.org/x/sync/singleflight.(*Group).DoChan.func1()\n","stream":"stderr","time":"2022-09-07T10:26:21.694613684Z"}
    {"log":"\u0009/go/pkg/mod/golang.org/x/[email protected]/singleflight/singleflight.go:133 +0x36 fp=0xc000ff5fe0 sp=0xc000ff5fa8 pc=0x7513d6\n","stream":"stderr","time":"2022-09-07T10:26:21.694615979Z"}
    {"log":"runtime.goexit()\n","stream":"stderr","time":"2022-09-07T10:26:21.694618162Z"}
    {"log":"\u0009/usr/local/go/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc000ff5fe8 sp=0xc000ff5fe0 pc=0x46cb81\n","stream":"stderr","time":"2022-09-07T10:26:21.694620142Z"}
    {"log":"created by golang.org/x/sync/singleflight.(*Group).DoChan\n","stream":"stderr","time":"2022-09-07T10:26:21.69462219Z"}
    {"log":"\u0009/go/pkg/mod/golang.org/x/[email protected]/singleflight/singleflight.go:133 +0x315\n","stream":"stderr","time":"2022-09-07T10:26:21.694624208Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.694626248Z"}
    {"log":"goroutine 1 [chan receive, 861 minutes]:\n","stream":"stderr","time":"2022-09-07T10:26:21.694628117Z"}
    {"log":"runtime.gopark(0x30cc80c?, 0x1890060?, 0x0?, 0x0?, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694631229Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:363 +0xd6 fp=0xc000a86d90 sp=0xc000a86d70 pc=0x43e456\n","stream":"stderr","time":"2022-09-07T10:26:21.694633251Z"}
    {"log":"runtime.chanrecv(0xc0000d84e0, 0x0, 0x1)\n","stream":"stderr","time":"2022-09-07T10:26:21.694635648Z"}
    {"log":"\u0009/usr/local/go/src/runtime/chan.go:583 +0x49b fp=0xc000a86e20 sp=0xc000a86d90 pc=0x40c6db\n","stream":"stderr","time":"2022-09-07T10:26:21.694638531Z"}
    {"log":"runtime.chanrecv1(0xc00019c420?, 0xf4ad58?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694642103Z"}
    {"log":"\u0009/usr/local/go/src/runtime/chan.go:442 +0x18 fp=0xc000a86e48 sp=0xc000a86e20 pc=0x40c1d8\n","stream":"stderr","time":"2022-09-07T10:26:21.694645043Z"}
    {"log":"github.com/cshum/imagor/server.(*Server).RunContext(0xc00019c420, {0x12264e0, 0xc0001d0a40})\n","stream":"stderr","time":"2022-09-07T10:26:21.69464934Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/server/server.go:83 +0x16b fp=0xc000a86ed0 sp=0xc000a86e48 pc=0x76548b\n","stream":"stderr","time":"2022-09-07T10:26:21.694652347Z"}
    {"log":"github.com/cshum/imagor/server.(*Server).Run(0xc000036240?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694654428Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/server/server.go:71 +0xa5 fp=0xc000a86f28 sp=0xc000a86ed0 pc=0x7652c5\n","stream":"stderr","time":"2022-09-07T10:26:21.694656349Z"}
    {"log":"main.main()\n","stream":"stderr","time":"2022-09-07T10:26:21.694658373Z"}
    {"log":"\u0009/go/src/github.com/cshum/imagor/cmd/imagor/main.go:19 +0xb7 fp=0xc000a86f80 sp=0xc000a86f28 pc=0xd0d6b7\n","stream":"stderr","time":"2022-09-07T10:26:21.694660416Z"}
    {"log":"runtime.main()\n","stream":"stderr","time":"2022-09-07T10:26:21.694663029Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:250 +0x212 fp=0xc000a86fe0 sp=0xc000a86f80 pc=0x43e092\n","stream":"stderr","time":"2022-09-07T10:26:21.69466493Z"}
    {"log":"runtime.goexit()\n","stream":"stderr","time":"2022-09-07T10:26:21.694667047Z"}
    {"log":"\u0009/usr/local/go/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc000a86fe8 sp=0xc000a86fe0 pc=0x46cb81\n","stream":"stderr","time":"2022-09-07T10:26:21.694669512Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.694671574Z"}
    {"log":"goroutine 2 [force gc (idle), 861 minutes]:\n","stream":"stderr","time":"2022-09-07T10:26:21.694673803Z"}
    {"log":"runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.6946842Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:363 +0xd6 fp=0xc0000a0fb0 sp=0xc0000a0f90 pc=0x43e456\n","stream":"stderr","time":"2022-09-07T10:26:21.694692563Z"}
    {"log":"runtime.goparkunlock(...)\n","stream":"stderr","time":"2022-09-07T10:26:21.69469481Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:369\n","stream":"stderr","time":"2022-09-07T10:26:21.694704646Z"}
    {"log":"runtime.forcegchelper()\n","stream":"stderr","time":"2022-09-07T10:26:21.694706723Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:302 +0xad fp=0xc0000a0fe0 sp=0xc0000a0fb0 pc=0x43e2ed\n","stream":"stderr","time":"2022-09-07T10:26:21.694711758Z"}
    {"log":"runtime.goexit()\n","stream":"stderr","time":"2022-09-07T10:26:21.694715028Z"}
    {"log":"\u0009/usr/local/go/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc0000a0fe8 sp=0xc0000a0fe0 pc=0x46cb81\n","stream":"stderr","time":"2022-09-07T10:26:21.694718055Z"}
    {"log":"created by runtime.init.6\n","stream":"stderr","time":"2022-09-07T10:26:21.694721206Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:290 +0x25\n","stream":"stderr","time":"2022-09-07T10:26:21.694725907Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.694728948Z"}
    {"log":"goroutine 3 [GC sweep wait]:\n","stream":"stderr","time":"2022-09-07T10:26:21.694730856Z"}
    {"log":"runtime.gopark(0x188fa01?, 0x0?, 0x0?, 0x0?, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694732793Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:363 +0xd6 fp=0xc0000a1790 sp=0xc0000a1770 pc=0x43e456\n","stream":"stderr","time":"2022-09-07T10:26:21.694735235Z"}
    {"log":"runtime.goparkunlock(...)\n","stream":"stderr","time":"2022-09-07T10:26:21.694759617Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:369\n","stream":"stderr","time":"2022-09-07T10:26:21.694767234Z"}
    {"log":"runtime.bgsweep(0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694770359Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgcsweep.go:297 +0xd7 fp=0xc0000a17c8 sp=0xc0000a1790 pc=0x42a897\n","stream":"stderr","time":"2022-09-07T10:26:21.694773261Z"}
    {"log":"runtime.gcenable.func1()\n","stream":"stderr","time":"2022-09-07T10:26:21.694776628Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgc.go:178 +0x26 fp=0xc0000a17e0 sp=0xc0000a17c8 pc=0x41f506\n","stream":"stderr","time":"2022-09-07T10:26:21.694779532Z"}
    {"log":"runtime.goexit()\n","stream":"stderr","time":"2022-09-07T10:26:21.694782534Z"}
    {"log":"\u0009/usr/local/go/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc0000a17e8 sp=0xc0000a17e0 pc=0x46cb81\n","stream":"stderr","time":"2022-09-07T10:26:21.694785472Z"}
    {"log":"created by runtime.gcenable\n","stream":"stderr","time":"2022-09-07T10:26:21.694788725Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgc.go:178 +0x6b\n","stream":"stderr","time":"2022-09-07T10:26:21.694792508Z"}
    {"log":"\n","stream":"stderr","time":"2022-09-07T10:26:21.694795503Z"}
    {"log":"goroutine 4 [GC scavenge wait]:\n","stream":"stderr","time":"2022-09-07T10:26:21.694798322Z"}
    {"log":"runtime.gopark(0x1c9d63eb19ee6f?, 0x201f13?, 0x0?, 0x0?, 0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694801343Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:363 +0xd6 fp=0xc0000a1f70 sp=0xc0000a1f50 pc=0x43e456\n","stream":"stderr","time":"2022-09-07T10:26:21.694804511Z"}
    {"log":"runtime.goparkunlock(...)\n","stream":"stderr","time":"2022-09-07T10:26:21.694807658Z"}
    {"log":"\u0009/usr/local/go/src/runtime/proc.go:369\n","stream":"stderr","time":"2022-09-07T10:26:21.694810682Z"}
    {"log":"runtime.(*scavengerState).park(0x18900e0)\n","stream":"stderr","time":"2022-09-07T10:26:21.694813669Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgcscavenge.go:389 +0x53 fp=0xc0000a1fa0 sp=0xc0000a1f70 pc=0x4288f3\n","stream":"stderr","time":"2022-09-07T10:26:21.694816562Z"}
    {"log":"runtime.bgscavenge(0x0?)\n","stream":"stderr","time":"2022-09-07T10:26:21.694819748Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgcscavenge.go:622 +0x65 fp=0xc0000a1fc8 sp=0xc0000a1fa0 pc=0x428ee5\n","stream":"stderr","time":"2022-09-07T10:26:21.694823288Z"}
    {"log":"runtime.gcenable.func2()\n","stream":"stderr","time":"2022-09-07T10:26:21.694827605Z"}
    {"log":"\u0009/usr/local/go/src/runtime/mgc.go:179 +0x26 fp=0xc0000a1fe0 sp=0xc0000a1fc8 pc=0x41f4a6\n","stream":"stderr","time":"2022-09-07T10:26:21.694830585Z"}
    {"log":"runtime.goexit()\n","stream":"stderr","time":"2022-09-07T10:26:21.69483364Z"}
    ...
    

    This is with 1.0.3. It was also happening in 0.9.7 (and others I guess). I think that it happens a bit more frequently in this version.

    I'm not sure about it, but I think that related to this crashes I get the result storage populated with truncated images, like this one: https://cdn4.travelconline.com/unsafe/fit-in/800x0/filters:quality(75):format(jpg)/https%3A%2F%2Fi.travelapi.com%2Fhotels%2F22000000%2F21540000%2F21537500%2F21537420%2F8a95c8cf_z.jpg

    (it looks fine in the browser but it's truncated and some utilities will crash when they read this image)

    If I delete the file from the result storage the image works fine again

    opened by cocorossello 32
  •  WIP feat(vips): implement VipsTargetCustom

    WIP feat(vips): implement VipsTargetCustom

    This is a WIP of write stream implementation using VipsTargetCustom.

    Screenshot 2022-08-16 at 10 36 10 Using this build, the memory usage of 6 instances exploded then starting to scale up. Need investigations.

    opened by cshum 0
  • Disable default caching

    Disable default caching

    Hi, I tried using this as a docker image but it has problem with caching.

    I don't want the cache header because of CDN caching, but I could not disable it.

    I'm using docker-compose with these variables but still getting cache header with default values Cache-Control: public, s-maxage=86400, max-age=86400, no-transform

    IMAGOR_CACHE_HEADER_NO_CACHE: 1
    IMAGOR_CACHE_HEADER_TTL: 0h0m0s
    IMAGOR_CACHE_HEADER_TTL: 0h0m0s
    

    Please disable the cache for default.

    opened by WatchDogsDev 2
Releases(v1.1.3)
  • v1.1.3(Sep 18, 2022)

    Stability Release

    What's Changed

    • feat(vips): create image from memory by @cshum in https://github.com/cshum/imagor/pull/170
    • fix(vips): remove finalizer by @cshum in https://github.com/cshum/imagor/pull/171
    • fix(vips): conditional vips_thumbnail fallback by @cshum in https://github.com/cshum/imagor/pull/172
    • fix(vips): fix premature end on save for storage by @cshum in https://github.com/cshum/imagor/pull/173
    • fix(vips): fix file context and cleanup by @cshum in https://github.com/cshum/imagor/pull/174
    • fix(imagor): fix blob reader close by @cshum in https://github.com/cshum/imagor/pull/175
    • fix(imagor): fix fanout reader concurrent buffer by @cshum in https://github.com/cshum/imagor/pull/176

    Full Changelog: https://github.com/cshum/imagor/compare/v1.1.0...v1.1.3

    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Sep 9, 2022)

    Introducing imagorvideo

    imagorvideo is a new initiative that brings video thumbnail capability with ffmpeg, built on the foundations of imagor v1.1.

    Imagorvideo uses ffmpeg C bindings that extracts image thumbnail from video by attempting to select the best frame, then forwards to libvips to perform all existing image operations supported by imagor.

    Check it out at https://github.com/cshum/imagorvideo

    What's Changed

    • feat(imagor): preview mode by @cshum in https://github.com/cshum/imagor/pull/150
    • feat(imagor): ErrForward - forward params through series of processors by @cshum in https://github.com/cshum/imagor/pull/155
    • feat(imagor): blob.NewReadSeeker() by @cshum in https://github.com/cshum/imagor/pull/164
    • build(deps): bump go.uber.org/zap from 1.22.0 to 1.23.0 by @dependabot in https://github.com/cshum/imagor/pull/157
    • build(deps): bump github.com/fsouza/fake-gcs-server from 1.38.2 to 1.40.1 by @dependabot in https://github.com/cshum/imagor/pull/160
    • build(deps): bump github.com/aws/aws-sdk-go from 1.44.76 to 1.44.93 by @dependabot in https://github.com/cshum/imagor/pull/165
    • fix(vips): restrict image type for vips_thumbnail by @cshum in https://github.com/cshum/imagor/pull/166
    • test(vips): fit-in/resize with unspecified width/height by @cshum in https://github.com/cshum/imagor/pull/168
    • feat(imagor): Storage and Result Storage Path Style by @cshum in https://github.com/cshum/imagor/pull/154

    Full Changelog: https://github.com/cshum/imagor/compare/v1.0.3...v1.1.0

    Source code(tar.gz)
    Source code(zip)
  • v1.0.3(Aug 21, 2022)

    What's Changed

    • #141 Add support for Heroku by @kkdai in https://github.com/cshum/imagor/pull/142
    • fix(imagor): return json for meta error by @cshum in https://github.com/cshum/imagor/pull/143
    • build: go 1.19 by @cshum in https://github.com/cshum/imagor/pull/144
    • fix(vips): fix metadata pages by @cshum in https://github.com/cshum/imagor/pull/145
    • fix(imagor): fix context error propagation by @cshum in https://github.com/cshum/imagor/pull/146
    • feat(imagor): conditional result key by @cshum in https://github.com/cshum/imagor/pull/147
    • feat(storage): stat context cache for file, s3, gcloud storage by @cshum in https://github.com/cshum/imagor/pull/149

    New Contributors

    • @kkdai made their first contribution in https://github.com/cshum/imagor/pull/142

    Full Changelog: https://github.com/cshum/imagor/compare/v1.0.2...v1.0.3

    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Aug 17, 2022)

    Text Label Filter

    label(text, x, y, size, color[, alpha[, font]])

    Adds a text label to the image. It can be positioned inside the image with the alignment specified, color and transparency support:

    • text text label, also support url encoded text.
    • x horizontal position that the text label will be in:
      • Positive number indicate position from the left, negative number from the right.
      • Number followed by a p e.g. 20p means calculating the value from the image width as percentage
      • left,right,center align left, right or centered respectively
    • y vertical position that the text label will be in:
      • Positive number indicate position from the top, negative number from the bottom.
      • Number followed by a p e.g. 20p means calculating the value from the image height as percentage
      • top,bottom,center vertical align top, bottom or centered respectively
    • size - text label font size
    • color - color name or hexadecimal rgb expression without the “#” character
    • alpha - text label transparency, a number between 0 (fully opaque) and 100 (fully transparent).
    • font - text label font type

    What's Changed

    • feat(vips): vips load from source alias by @cshum in https://github.com/cshum/imagor/pull/130
    • feat(imagor): improve process response concurrency by @cshum in https://github.com/cshum/imagor/pull/132
    • build(deps): bump go.uber.org/zap from 1.21.0 to 1.22.0 by @dependabot in https://github.com/cshum/imagor/pull/135
    • build(deps): bump github.com/aws/aws-sdk-go from 1.44.70 to 1.44.76 by @dependabot in https://github.com/cshum/imagor/pull/134
    • feat(vips): text label filter by @cshum in https://github.com/cshum/imagor/pull/139

    Full Changelog: https://github.com/cshum/imagor/compare/v1.0.1...v1.0.2

    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Aug 13, 2022)

    What's Changed

    • fix(vips): handle vips_source_custom_new without seeker by @cshum in https://github.com/cshum/imagor/pull/128
    • fix(vips): fix error parsing for VipsForeignLoad by @cshum

    Full Changelog: https://github.com/cshum/imagor/compare/v1.0.0...v1.0.1

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Aug 10, 2022)

    Streaming libvips

    At the moment, all existing popular Go + libvips image applications (imgproxy, imaginary, bimg etc) bridge libvips through buffer. While these are all good with normal web images, the latency and memory overhead can be noticeable when working through large, raw images, as they are all loading the whole image buffer in memory, one step at a time.

    Imagor v1 fully revamped the libvips binding, now implemented its streaming capability that enables parallel processing across Loader, Storage and Processor. This greatly increases network throughput especially with network sources like HTTPs, S3, GCS, by giving the ability to overlap processing pipelines.

    Metadata and Exif

    Imagor now provides metadata endpoint that extracts image info such as image format, dimensions and Exif metadata. With streaming in place, same goes for image Exif metadata. Imagor can try to retrieve data just enough to extract the header, without reading and processing the whole image in memory.

    To use the metadata endpoint, add /meta right after the URL signature hash before the image operations. Example:

    http://localhost:8000/unsafe/meta/fit-in/50x50/raw.githubusercontent.com/cshum/imagor/master/testdata/Canon_40D.jpg
    
    {
      "format": "jpeg",
      "content_type": "image/jpeg",
      "width": 50,
      "height": 34,
      "orientation": 1,
      "pages": 1,
      "exif": {
        "ApertureValue": "368640/65536",
        "ColorSpace": 1,
        "ComponentsConfiguration": "Y Cb Cr -",
        "Compression": 6,
        "DateTime": "2008:07:31 10:38:11",
        // ...
        "WhiteBalance": 0,
        "XResolution": "72/1",
        "YCbCrPositioning": 2,
        "YResolution": "72/1"
      }
    }
    

    What's Changed

    • feat(vips): revamp libvips binding by @cshum
    • feat(vips): vips load image directly from file by @cshum
    • build(docker): fix docker build steps by @cshum
    • feat(vips): true streaming for libvips by @cshum
    • refactor(vips): context gc tracking by @cshum
    • build(deps): bump github.com/peterbourgon/ff/v3 from 3.2.0-rc.1 to 3.3.0 by @dependabot
    • build(deps): bump github.com/aws/aws-sdk-go from 1.44.66 to 1.44.70 by @dependabot
    • refactor(imagor): improve processor and storage concurrency by @cshum
    • feat(vips): exif metadata support by @cshum
    • refactor: simplify metadata architecture by @cshum

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.13...v1.0.0

    Source code(tar.gz)
    Source code(zip)
  • v0.9.13(Aug 5, 2022)

    New Config Options

      -imagor-process-concurrency int
            Maximum number of image process to be executed simultaneously. Requests that exceed this limit are put in the queue. Set -1 for no limit (default -1)
      -imagor-process-queue-size int
            Maximum number of image process that can be put in the queue. Requests that exceed this limit are rejected with HTTP status 429. Set -1 for no limit (default -1)
    
    

    What's Changed

    • fix(imagor): client canceled request handling by @cshum
    • build(actions): ghcr delete untagged images by @cshum
    • refactor(filestorage): cleanup redundant logic by @cshum
    • feat(imagor): process-queue-size by @cshum

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.12...v0.9.13

    Source code(tar.gz)
    Source code(zip)
  • v0.9.12(Aug 4, 2022)

    Image Bombs Prevention

    Imagor now checks the image type and its resolution before the actual processing happens. The image processing will be rejected if the dimensions are too big (you can set the max allowed image resolution using -vips-max-resolution), which protects from so called "image bombs”.

    What's Changed

    • build(vips): auto commit golden files by @cshum in https://github.com/cshum/imagor/pull/96
    • build: cache libvips build on test by @cshum in https://github.com/cshum/imagor/pull/99
    • build(docker): Upgrade Go to 1.18.5 by @cshum
    • fix(vips): fix proportion out of bound by @cshum in https://github.com/cshum/imagor/pull/102
    • feat(vips): vips-max-resolution by @cshum in https://github.com/cshum/imagor/pull/104

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.11...v0.9.12

    Source code(tar.gz)
    Source code(zip)
  • v0.9.11(Aug 3, 2022)

    What's Changed

    • fix(imagorpath): hash length for custom signer by @cshum in https://github.com/cshum/imagor/pull/95
    • build(deps): bump github.com/aws/aws-sdk-go from 1.44.61 to 1.44.66 by @dependabot in https://github.com/cshum/imagor/pull/93

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.10...v0.9.11

    Source code(tar.gz)
    Source code(zip)
  • v0.9.10(Aug 1, 2022)

    Revamp Config Initialization

    When using Imagor as a Go package, it is now much easier to reuse and enable/disable components being loaded. For instance the main function now looks like this:

    package main
    
    import (
    	"github.com/cshum/imagor/config"
    	"github.com/cshum/imagor/config/awsconfig"
    	"github.com/cshum/imagor/config/gcloudconfig"
    	"github.com/cshum/imagor/config/vipsconfig"
    	"os"
    )
    
    func main() {
    	var server = config.CreateServer(
    		os.Args[1:],
    		vipsconfig.WithVips, // enable libvips Processor config
    		awsconfig.WithAWS, // enable AWS Loader, Storage, Result Storage config
    		gcloudconfig.WithGCloud // enable GCS Loader, Storage, Result Storage config
    	)
    	if server != nil {
    		server.Run()
    	}
    }
    

    Better PNG Performance

    Added libspng to Docker build. When possible, libvips 8.13 will use the library for PNG write as well as PNG read. This can produce a useful increase in PNG speed.

    What's Changed

    • build(vips): meson build for libvips by @cshum in https://github.com/cshum/imagor/pull/87
    • build(deps): bump cloud.google.com/go/storage from 1.23.0 to 1.24.0 by @dependabot in https://github.com/cshum/imagor/pull/86
    • refactor: revamp config architecture by @cshum in https://github.com/cshum/imagor/pull/88
    • build(docker): add jp2 by @cshum
    • build(docker): add libspng by @cshum in https://github.com/cshum/imagor/pull/89
    • build(docker): improve docker build and push workflow by @cshum in https://github.com/cshum/imagor/pull/92

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.8...v0.9.10

    Source code(tar.gz)
    Source code(zip)
  • v0.9.8(Jul 25, 2022)

    libvips 8.13

    Imagor now with upgraded libvips to v8.13: https://www.libvips.org/2022/05/28/What's-new-in-8.13.html

    Much better GIF performance

    The most noticeable improvements is GIF handling, which has been reworked again in libvips 8.13, producing smaller files with much lower CPU and memory load.

    Compared to imagemagick6, libvips is around 10x faster, needs 4x less memory, makes GIFs which are 20% smaller, and produces higher quality output.

    What's Changed

    • build(deps): bump github.com/stretchr/testify from 1.7.1 to 1.7.5 by @dependabot in https://github.com/cshum/imagor/pull/69
    • build(deps): bump cloud.google.com/go/storage from 1.22.1 to 1.23.0 by @dependabot in https://github.com/cshum/imagor/pull/70
    • build(deps): bump github.com/fsouza/fake-gcs-server from 1.37.12 to 1.38.2 by @dependabot in https://github.com/cshum/imagor/pull/72
    • build(deps): bump github.com/aws/aws-sdk-go from 1.44.25 to 1.44.41 by @dependabot in https://github.com/cshum/imagor/pull/71
    • docs: ghcr badge by @cshum in https://github.com/cshum/imagor/pull/82
    • build(deps): bump github.com/stretchr/testify from 1.7.5 to 1.8.0 by @dependabot in https://github.com/cshum/imagor/pull/76
    • fix(vips): fix rotate with fill by @cshum in https://github.com/cshum/imagor/pull/83
    • build: vips 8.13 by @cshum in https://github.com/cshum/imagor/pull/84

    New Contributors

    • @dependabot made their first contribution in https://github.com/cshum/imagor/pull/69

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.7...v0.9.8

    Source code(tar.gz)
    Source code(zip)
  • v0.9.7(Jun 22, 2022)

    Custom HMAC Signer Support

    Imagor uses SHA1 HMAC signer by default, the same one used by Thumbor. However, SHA1 is not considered cryptographically secure. If that is a concern it is possible to configure different HMAC signing method and truncate length. Imagor supports sha1, sha256, sha512 signer type:

    IMAGOR_SIGNER_TYPE=sha256
    IMAGOR_SIGNER_TRUNCATE=32
    

    An example URL signature generator in Node.js:

    var hmacSHA256 = require("crypto-js/hmac-sha256")
    var Base64 = require("crypto-js/enc-base64")
    
    function sign(path, secret) {
      var hash = hmacSHA256(path, secret)
      hash = Base64.stringify(hash).slice(0, 32).replace(/\+/g, '-').replace(/\//g, '_')
      return hash + '/' + path
    }
    

    What's Changed

    • feat(imagor): imagor-signer-type by @cshum in https://github.com/cshum/imagor/pull/67
    • fix(imagor): fix fanout reader upstream error and premature close handling
    • fix(imagor): ErrPass handling
    • refactor(imagor): fanout reader lazy init
    • build: docker go 1.18.3

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.6...v0.9.7

    Source code(tar.gz)
    Source code(zip)
  • v0.9.6(Jun 20, 2022)

    What's Changed

    • fix(imagor): should not write empty bytes if blob originated from storage
    • refactor(imagor): loader storage sequence enhancement
    • feat(imagor): blob.Sniff() method
    • feat: storage.Del interface and implementation for filestorage, s3storage, gcloudstorage
    • refactor(imagor): imagor.ErrInvalid

    Full Changelog: https://github.com/cshum/imagor/compare/v0.9.3...v0.9.6

    Source code(tar.gz)
    Source code(zip)
  • v0.9.3(Jun 17, 2022)

    Improved Throughput with imagor.Blob

    Imagor v0.9 introduced imagor.Blob as the mechanism for bytes transfer and content type sniffing, which supports spawning multiple concurrent Reader stream from a single source. This greatly improved the throughput across Loader, Storage, Result Storage and HTTP response.

    Base Params Support

    Using -imagor-base-pararms You can now configure predefined endpoint params that applies to all resulting images. For example, a watermark for every generated images:

    docker run -p 8000:8000 shumc/imagor:0.9.3 -imagor-unsafe -imagor-base-params 'filters:watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/gopher-front.png,-15,-15,20,30,30)'
    

    Try out the following URLs:

    http://localhost:8000/unsafe/fit-in/200x200/filters:fill(white)/raw.githubusercontent.com/cshum/imagor/master/testdata/gopher.png
    http://localhost:8000/unsafe/fit-in/200x200/filters:fill(yellow)/raw.githubusercontent.com/cshum/imagor/master/testdata/nyan-cat.gif
    

    gopher nyan-cat

    New Config Options

      -imagor-base-params string
            Imagor endpoint base params that applies to all resulting images e.g. fitlers:watermark(example.jpg)
      -imagor-disable-params-endpoint
            Imagor disable /params endpoint
      -imagor-disable-error-body
            Imagor disable response body on error
    

    What's Changed

    • feat(imagor): metadata from result storage by @cshum in https://github.com/cshum/imagor/pull/65
    • feat(imagor): io.Reader, io.Writer stream based Blob container by @cshum in https://github.com/cshum/imagor/pull/66
    • feat(imagor): -imagor-disable-error-body
    • feat(imagor): -imagor-disable-params-endpoint
    • feat(imagor): base endpoint params support with -imagor-base-params
    • fix(vips): fix image ref gc
    • fix(imagor): fix blob error expansion

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.29...v0.9.3

    Source code(tar.gz)
    Source code(zip)
  • v0.8.29(Jun 8, 2022)

    Stability Release

    • fix(imagor): empty bytes handling
    • perf: improve bytes content-type determination
    • fix(vips): find trim fail should not disrupt image operations
    • fix(imagor): emtpy image key handling
    • fix(imagor): empty filter arg handling
    • improved test coverage

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.28...v0.8.29

    Source code(tar.gz)
    Source code(zip)
  • v0.8.28(Jun 3, 2022)

    Cache-Control Header Options

    New options for Cache-Control header - stale-while-revalidate and no-cache support

      -imagor-cache-header-swr duration
            Imagor HTTP Cache-Control header stale-while-revalidate for successful image response (default 24h0m0s)
      -imagor-cache-header-no-cache
            Imagor HTTP Cache-Control header no-cache for successful image response
    

    What's Changed

    • feat(imagor): Cache-Control header stale-while-revalidate support by @cshum in https://github.com/cshum/imagor/pull/63
    • fix(vips): crop with trim handling
    • fix(vips): focal filter with crop
    • feat(imagor): http HEAD method support
    • fix(imagor): fix avif load error

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.23...v0.8.28

    Source code(tar.gz)
    Source code(zip)
  • v0.8.23(May 30, 2022)

    Filter focal(AxB:CxD)

    Adds a focal region for custom transformation, coordinated by left-top point AxB and right-bottom point CxD. Also accepts float values between 0 and 1 that represents percentage of image dimensions.

    http://localhost:8000/unsafe/200x50/smart/filters:fill(white)/https://raw.githubusercontent.com/cshum/imagor/master/testdata/gopher.png
    http://localhost:8000/unsafe/200x50/smart/filters:fill(white):focal(589x401:1000x814)/https://raw.githubusercontent.com/cshum/imagor/master/testdata/gopher.png
    http://localhost:8000/unsafe/200x50/smart/filters:fill(white):focal(0.35x0.25:0.6x0.3)/https://raw.githubusercontent.com/cshum/imagor/master/testdata/gopher.png
    

    gopher gopher (1) gopher (2)

    What's Changed

    • feat(imagor): modified time check by @cshum in https://github.com/cshum/imagor/pull/58
    • feat(imagorpath): signer abstraction by @cshum in https://github.com/cshum/imagor/pull/59
    • feat(imagorpath): safe chars abstraction by @cshum in https://github.com/cshum/imagor/pull/60
    • feat(vips): focal filter by @cshum in https://github.com/cshum/imagor/pull/61

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.22...v0.8.23

    Source code(tar.gz)
    Source code(zip)
  • v0.8.22(May 26, 2022)

    Filter max_bytes(amount)

    Automatically degrades the quality of the image until the image is under the specified amount of bytes

    Improved Memory Control

    Improved memory control using jemalloc

    What's Changed

    • build: jemalloc by @cshum in https://github.com/cshum/imagor/pull/54
    • feat(vips): max_bytes by @cshum in https://github.com/cshum/imagor/pull/55
    • fix(vips): fix max_bytes with thumbnailNotSupported by @cshum in https://github.com/cshum/imagor/pull/57
    • fix: .env handling for undefined flag

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.20...v0.8.22

    Source code(tar.gz)
    Source code(zip)
  • v0.8.20(May 24, 2022)

    Improved GIF Performance

    Imagor Docker now adopts cgif library for GIF Save in libvips , resulting faster export speed and significantly reduced memory usage.

    What's Changed

    • build: cgif 0.3.0, govips 2.11.0
    • build: remove magick
    • refactor: MaxFilterOps default unlimited
    • refactor(imagor): blob type handling

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.18...v0.8.20

    Source code(tar.gz)
    Source code(zip)
  • v0.8.18(May 20, 2022)

    PDF Thumbnail Support

    Imagor now supports generating PDF Thumbnail. Example:

    http://localhost:8000/unsafe/fit-in/200x200/filters:fill(cyan)/http://www.africau.edu/images/default/sample.pdf
    

    Config File

    Configuration may be specified in a .env configuration file and referenced with the -config flag.

    PORT=8000
    IMAGOR_SECRET=mysecret
    AWS_ACCESS_KEY_ID=...
    AWS_SECRET_ACCESS_KEY=...
    AWS_REGION=...
    imagor -config path/to/config.env
    
    imagor -config path/to/config.env
    

    What's Changed

    • Add support for a -config flag/file by @bcspragu in https://github.com/cshum/imagor/pull/51
    • PDF Support by @cshum in https://github.com/cshum/imagor/pull/53

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.17...v0.8.18

    Source code(tar.gz)
    Source code(zip)
  • v0.8.17(May 18, 2022)

    Experimental AVIF Conversion

    Output AVIF format automatically if browser supports, based on Accept request header check for image/avif (thanks @lorenries)

      -imagor-auto-avif
            Output Avif format automatically if browser supports
    

    However AVIF encoder at this stage is very slow and image size is not optimal compare to the WebP counterpart.

    GitHub Container Registry

    Starting from v0.8.17, Imagor Docker image is now available at Github Container Registry with multi-CPU architecture support.

    Quick Start

    docker run -p 8000:8000 ghcr.io/cshum/imagor:v0.8.17 -imagor-unsafe -imagor-auto-webp
    

    What's Changed

    • Add support for avif and auto avif by @lorenries in https://github.com/cshum/imagor/pull/52
    • Update Go to 1.18 by @bcspragu in https://github.com/cshum/imagor/pull/50
    • build: GitHub Container Registry publish actions

    New Contributors

    • @lorenries made their first contribution in https://github.com/cshum/imagor/pull/52
    • @bcspragu made their first contribution in https://github.com/cshum/imagor/pull/50

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.16...v0.8.17

    Source code(tar.gz)
    Source code(zip)
  • v0.8.16(Apr 8, 2022)

    Automatic WebP Conversion

    Output WebP format automatically if browser supports, based on Accept request header check for image/webp

      -imagor-auto-webp
            Output WebP format automatically if browser supports
    

    Base Path Redirect URL

    Ability to configure URL for redirection on base path /

      -imagor-base-path-redirect string
            URL to redirect for Imagor / base path e.g. https://www.google.com
    

    What's Changed

    • feat(imagor): base path redirect option by @cshum in https://github.com/cshum/imagor/pull/43 #40
    • refactor(httploader): HTTP Loader default accepts image/* by @cshum in https://github.com/cshum/imagor/pull/42
    • feat(imagor): output WebP format automatically if browser supports by @cshum in https://github.com/cshum/imagor/pull/41 #39

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.15...v0.8.16

    Source code(tar.gz)
    Source code(zip)
  • v0.8.15(Mar 13, 2022)

    Google Cloud Storage Support

    Imagor now supports Google Cloud Storage for Loader, Storage and Result Storage (thanks @srlk).

    Docker Compose Example

    version: "3"
    services:
      imagor:
        image: shumc/imagor:latest
        volumes:
          - ./googlesecret:/etc/secrets/google
        environment:
          PORT: 8000
          IMAGOR_SECRET: mysecret # secret key for URL signature
          GOOGLE_APPLICATION_CREDENTIALS: /etc/secrets/google/appcredentials.json # google cloud secrets file
    
          GCLOUD_LOADER_BUCKET: mybucket # enable loader by specifying bucket
          GCLOUD_LOADER_BASE_DIR: images # optional
    
          GCLOUD_STORAGE_BUCKET: mybucket # enable storage by specifying bucket
          GCLOUD_STORAGE_BASE_DIR: images # optional
    
          GCLOUD_RESULT_STORAGE_BUCKET: mybucket # enable result storage by specifying bucket
          GCLOUD_RESULT_STORAGE_BASE_DIR: images/result # optional
          GCLOUD_RESULT_STORAGE_ACL: publicRead # optional - see https://cloud.google.com/storage/docs/json_api/v1/objects/insert
        ports:
          - "8000:8000"
    

    What's Changed

    • Google Cloud Storage support by @srlk in https://github.com/cshum/imagor/pull/33
    • fix: rename -http-loader-forward-all-headers to -http-loader-forward-client-headers #36

    New Contributors

    • @srlk made their first contribution in https://github.com/cshum/imagor/pull/33

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.12...v0.8.15

    Source code(tar.gz)
    Source code(zip)
  • v0.8.12(Feb 16, 2022)

    Crop params in percentage

    Imagor now supports cropping image by percentage float params. Useful for cropping image when image size is not known beforehand. (thanks @pletessier )

    Example:

    http://localhost:8000/unsafe/0.1x0.2:0.8x0.9/filters:fill(cyan)/raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif
    

    dancing-banana

    What's Changed

    • Crop params in percentage by @pletessier in https://github.com/cshum/imagor/pull/28
    • feat(vips): float support for watermark position
    • fix(vips): crop animated height handling and cleanup
    • fix(imagor): neglect warn log for result loader error

    New Contributors

    • @pletessier made their first contribution in https://github.com/cshum/imagor/pull/28

    Full Changelog: https://github.com/cshum/imagor/compare/v0.8.10...v0.8.12

    Source code(tar.gz)
    Source code(zip)
  • v0.8.10(Feb 12, 2022)

    Expiration support for File & S3, Storage & Result Storage

    New configuration options:

      -file-storage-expiration duration
            File Storage expiration duration e.g. 24h. Default no expiration
      -file-result-storage-expiration duration
            File Result Storage expiration duration e.g. 24h. Default no expiration
      -s3-storage-expiration duration
            S3 Storage expiration duration e.g. 24h. Default no expiration
      -s3-result-storage-expiration duration
            S3 Result Storage expiration duration e.g. 24h. Default no expiration
    

    Changes

    • feat(storage): s3 and file storage expiration support
    • refactor(imagorpath): Normlize add escapeByte func
    • build: update govips
    Source code(tar.gz)
    Source code(zip)
  • v0.8.9(Feb 4, 2022)

    Animation support for repeated watermarks

    Example

    http://localhost:8000/unsafe/fit-in/200x150/filters:fill(cyan):watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif,repeat,bottom,0,40,40)/raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif
    

    dancing-banana (6)

    Changes

    • feat(vips): animated repeated watermark support
    • feat(imagor): imagor process concurrency semaphore
    • feat(vips): new proportion(percentage) filter
    • feat(vips): new crop(top,left,right,bottom) filter
    • fix(imagor) IsPNG should call readAllOnce
    • feat: add s3 force path style option
    • fix(imagor): move semaphore before load storage
    Source code(tar.gz)
    Source code(zip)
  • v0.8.6(Feb 3, 2022)

    Introducing frames filter

    • frames(n[, delay]) set the number of frames to repeat for animation with gif or webp. Otherwise, stack all the frames vertically
      • n number of frames to repeat
      • delay frames delay in milliseconds, default 100

    Frames filter allows you to control number of frames and animation speed. It also allows animating a static image in conjunction with a gif watermark. Example:

    http://localhost:8000/unsafe/fit-in/200x200/filters:fill(white):frames(8,150):watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif,center,bottom):format(gif)/raw.githubusercontent.com/cshum/imagor/master/testdata/gopher.png
    

    gopher

    Changes

    • feat(vips): frames filter
    • fix(vips): watermark missing args
    • build: update vips to v8.12.2
    Source code(tar.gz)
    Source code(zip)
  • v0.8.5(Jan 30, 2022)

    • feat(vips): added animated watermark support
    • feat(vips): aded left-top and right-bottom padding support, using the new URL syntax GxH:IxJ

    Example:

    http://localhost:8000/unsafe/300x0/0x20:100x20/filters:fill(yellow):watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif,-30,10,0,50,50):watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif,-10,-10,0,50,50)/raw.githubusercontent.com/cshum/imagor/master/testdata/nyan-cat.gif
    

    nyan-cat

    Source code(tar.gz)
    Source code(zip)
  • v0.8.3(Jan 28, 2022)

    Introducing Animation Support

    Imagor is rewritten to support animation for various common operations. The maximum of animated image frames can be configured using cli arguments:

     -vips-max-animation-frames int
            VIPS maximum of animated image frames to be processed. Set 1 to disable animation, -1 for unlimited. (default -1)
    

    original image

    https://raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif
    

    dancing-banana

    fit-in, fill and watermark example:

    http://localhost:8000/unsafe/fit-in/200x150/filters:fill(yellow):watermark(raw.githubusercontent.com/cshum/imagor/master/testdata/gopher-front.png,repeat,bottom,0,40,40)/raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif
    

    dancing-banana

    crop and fill example:

    http://localhost:8000/unsafe/30x40:100x150/filters:fill(cyan)/raw.githubusercontent.com/cshum/imagor/master/testdata/dancing-banana.gif
    

    dancing-banana (2)

    Source code(tar.gz)
    Source code(zip)
  • v0.7.6(Jan 12, 2022)

Owner
Adrian Shum
Adrian Shum
Fast docker image distribution plugin for containerd, based on CRFS/stargz

[ ⬇️ Download] [ ?? Browse images] [ ☸ Quick Start (Kubernetes)] [ ?? Quick Start (nerdctl)] Stargz Snapshotter Read also introductory blog: Startup C

containerd 700 Sep 25, 2022
Putty-url-scheme - Open PuTTY as a url scheme

PuTTY URL Scheme Helper Open PuTTY as a url scheme Install download release bina

Dark495 4 Apr 25, 2022
This image is primarily used to ping/call a URL on regular intervals using Kubernetes (k8s) CronJob.

A simple webhook caller This image is primarily used to ping/call a URL on regular intervals using Kubernetes (k8s) CronJob. A sample job would look s

Goavega Software 0 Nov 30, 2021
A docker image and a launcher to run sasm on Windows and MacOS

Sasm-docker Sasm-docker simplifies the setup and use of SASM by running it inside a docker container and using x11 (X Window System) in order to displ

Keinen Clue 8 Dec 20, 2021
k8s-image-swapper Mirror images into your own registry and swap image references automatically.

k8s-image-swapper Mirror images into your own registry and swap image references automatically. k8s-image-swapper is a mutating webhook for Kubernetes

Enrico Stahn 316 Sep 19, 2022
Dockpin - A tool for pinning Docker image and apt package versions

Dockpin Install dockpin with: go install github.com/Jille/[email protected] Dockpin

Jille Timmermans 15 Sep 20, 2022
This action prints "true" if image is required to update based on the base image update.

container-image-updater This action prints "true" if image is required to update based on the base image update. Inputs Name Type Description base-ima

Manjunath Kumatagi 1 Apr 15, 2022
A minimal Go project with user authentication ready out of the box. All frontend assets should be less than 100 kB on every page load

Golang Base Project A minimal Golang project with user authentication ready out of the box. All frontend assets should be less than 100 kB on every pa

Markus Tenghamn 223 Sep 18, 2022
Ready to deploy, distributed cryptocurrency trading bot

HyperTrade Ready to deploy, distributed cryptocurrency trading bot. USE THIS SOFTWARE AT YOUR OWN RISK. THE AUTHOR ASSUMES NO LIABILITY FOR YOUR TRADI

Karan Pratap Singh 139 Sep 20, 2022
Explore Docker registries and manipulate Docker images!

L/S tags Utility and API to manipulate (analyze, synchronize and aggregate) images across different Docker registries. Example invocation $ lstags alp

Ivan Ilves 293 Sep 12, 2022
Dotnet-appsettings-env - Convert .NET appsettings.json file to Kubernetes, Docker and Docker-Compose environment variables

dotnet-appsettings-env Convert .NET appsettings.json file to Kubernetes, Docker

Daniel Dias de Assumpção 12 Sep 6, 2022
Dotnet-appsettings-env - Convert .NET appsettings.json file to Kubernetes, Docker and Docker-Compose environment variables

dotnet-appsettings-env Convert .NET appsettings.json file to Kubernetes, Docker

Daniel Dias de Assumpção 1 Feb 16, 2022
A tool to restart a Docker container with a newer version of the image

repull A tool to restart a Docker container with a newer version of an image used by the container Often you may need to pull a newer version of an im

Eugene 24 Aug 22, 2022
Triggers an update to a Koyeb app service to re-deploy the latest docker image

Triggers an update to a Koyeb app service to re-deploy the latest docker image

Reece May 3 May 5, 2021
Docker image for setting up one or multiple TCP ports forwarding, using socat

Docker socat Port Forward Docker image for setting up one or multiple TCP ports forwarding, using socat. Getting started The ports mappings are set wi

David Lorenzo 4 May 15, 2022
A docker image for test redis HA

Guide 测试集群模式(Test Redis Cluster) redis-test --arch cluster 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 测试哨兵模式(TEST Redis Sentinel) redis-test --arc

DevineLiu 1 Nov 30, 2021
A Docker image that allows you to use Hetzner DNS as a DynDNS Provider

Docker Hetzner DDNS This Docker image will allow you to use the Hetzner DNS Service as a Dynamic DNS Provider (DDNS). How does it work? The Go script

Matthias Kutz 6 Jun 7, 2022
EdgeDB-Golang-Docker-Sample - The sample of connection between EdgeDB Server and Go Echo API Server

EdgeDB Golang Docker Sample 『Go + Docker Composeを使ってEdgeDBを動かしてみた』のサンプルコードです。 使い

null 6 Aug 29, 2022
Docker-based remote code runner / 基于 Docker 的远程代码运行器

Docker-based remote code runner / 基于 Docker 的远程代码运行器

E99p1ant 36 Sep 13, 2022