前言:
最近看到一個套件 imagor 蠻有趣的 ,可以透過 Golang binding C 的 libvips 來做類似 ImageMagick 的圖片編輯。 但是我喜歡的一鍵部署到 Heroku 按鍵卻沒有,就幫他送了一個 PR 。
我一直蠻喜歡在 Github Repo 直接加上「一鍵部署到 Heroku 」的按鈕,隨著近期不少的 Golang Repo 因為有使用到一些 C 語言相關的底層套件。 不少的服務都有打包成 Docker 的方式來做 Github 的 CICD 。 但是對於只是想要透過 Heroku 快速使用這個套件功能的開發者,如何快速導入 Heroku 的 Deploy on Heroku 就是本文敘述的重點。
一個關於圖片編輯的套件 imagor
這次文章所敘述的修改,將透過套件 https://github.com/cshum/imagor 作為範例。
什麼是 imagor
是一個透過 Golang 來直接操作知名的圖片編輯套件 libvips (用 C 打造的) 的套件,本身已經有 Docker 的打包好的 docker image (shumc/imagor
) 。這邊有一套類似的已經商業化的套件為 Imgproxy 。
使用簡單,功能強大
快速的部署可以透過以下指令:
docker run -p 8000:8000 shumc/imagor -imagor-unsafe -imagor-auto-webp
並且可以有以下的成果,可以到 https://github.com/cshum/imagor 查看。
原圖
合成
修改流程:
其實 https://github.com/cshum/imagor 本來已經有 Docker Image 了, 這邊講一些基本導入流程:
加上 Heroku 支援:
1. 加入新檔案 app.json
{
"name": "imagor",
"description": "Fast, Docker-ready image processing server in Go with libvips",
"keywords": [
"image",
"resize-images",
"crop-image",
"microservice",
"docker",
"jpeg",
"png",
"libvips"
],
"repository": "https://github.com/cshum/imagor",
"stack": "container",
"env": {
"IMAGOR_UNSAFE": {
"description": "Use Unsafe mode, default 1 for testing. In production environment, it is highly recommended turning off `IMAGOR_UNSAFE` and setting up URL signature using `IMAGOR_SECRET`, to prevent DDoS attacks that abuse multiple image operations.",
"required": true,
"value": "1"
},
"IMAGOR_SECRET": {
"description": "Secret key for URL signature.",
"required": false
}
}
}
- 幾個重要的寫一下:
- ` “repository”: “https://github.com/cshum/imagor”,`: 讓 Heroku 知道要去哪找其他檔案。
"stack": "container",
:這就是告訴 Heroku 要去找Heroku.yml
這個檔案來繼續接下來流程。- `IMAGOR_UNSAFE 這個參數因為這個套件預設要 url signature (可以參考 這篇說明文章)
2. 加上 heroku.yml
build:
docker:
web: heroku/Dockerfile
稍後會繼續寫 heroku/Dockerfile
的內容。 但是其實這邊除了 build:
以外,還有以下功能:
-
參數設定: 這個例子,設定了一個 ENV
S3_BUCKET
setup: config: S3_BUCKET: my-example-bucket
-
其他 Pluging 設定: 這個例子,起了一個 postgresql 並且用 DATABASE 的 alias
setup: addons: - plan: heroku-postgresql as: DATABASE
只要參考一下文章 Building Docker Images with heroku.yml 可以查到更多關於 Heroku.yml
的用法。
3. 專屬 Heroku 的 Dockerfile
FROM shumc/imagor:latest
LABEL maintainer="Adrian Shum <[email protected]>"
這邊沒有太多預設流程,可以每次 build ,但是我選擇讓 release management 回歸本來 image owner。所以這邊直接引用就可以。
完整的內容可以參考這次 PR https://github.com/cshum/imagor/pull/142
成果:
可以直接到這個 Repo ,按下 Deploy 來部署。 https://github.com/cshum/imagor
也可以透過以下伺服器來看成果: