Minimalist Self-hosted Image Service for user submitted images in your app
Minimalist Self-hosted Image Service for user submitted images in your app (e.g. avatars).
Uploading an image: ```bash
curl -F '[email protected]/some/file.jpg' http://some.host {"filename":"somename.png"}
Fetching a file in a specific size(e.g. 320x240):http://some.host/somename.png?w=320&h=240 ``` returns the image cropped to the desired size
imgpush requires docker
docker run -v :/images -p 5000:5000 hauxir/imgpush:latest
This is fully optional and is only needed if you want to run imgpush in Kubernetes.
If you want to deploy imgpush in Kubernetes, there is an example deployment available in the Kubernetes directory. In case you do not have a running Kubernetes cluster yet, you can use Minikube to setup a local single-node Kubernetes cluster. Otherwise you can just use your existing cluster.
Verify that your cluster works: ``` $ kubectl get pods
Apply the
kubernetes/deployment-example.yamlfile:
$ kubectl apply -f kubernetes/deployment-example.yaml namespace/imgpush created deployment.apps/imgpush created persistentvolumeclaim/imgpush created service/imgpush created
It will take a moment while your Kubernetes downloads the current imgpush image.
Verify that the deployment was successful: ``` $ kubectl -n imgpush get deployments. NAME READY UP-TO-DATE AVAILABLE AGE imgpush 1/1 1 1 3m41s
$ kubectl -n imgpush get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE imgpush ClusterIP 10.10.10.41 5000/TCP 3m57s ```
1/1.
Afterwards you can forward the port to your local machine and upload an image via your webbrowser (visit http://127.0.0.1:5000/).
$ kubectl -n imgpush port-forward service/imgpush 5000 Forwarding from 127.0.0.1:5000 -> 5000 Handling connection for 5000 Handling connection for 5000 Handling connection for 5000 Handling connection for 5000
To expose imgpush to the internet you need to configure an Ingress. The exact configuration depends on you cluster but you can find an example in the
kubernetes/deployment-example.yamlfile that you can adapt to your setup.
imgpush provides the
/livenessendpoint that always returns
200 OKthat you can use for docker Healthcheck and kubernetes liveness probe.
For Docker, as
curlis install in the image :
healthcheck: start_period: 0s test: ['CMD-SHELL', 'curl localhost:5000/liveness -s -f -o /dev/null || exit 1'] interval: 30s
For Kubernetes
yaml livenessProbe: httpGet: path: /liveness port: 5000 initialDelaySeconds: 5 periodSeconds: 30
| Setting | Default value | Description | | ------------- | ------------- |------------- | | OUTPUTTYPE | Same as Input file | An image type supported by imagemagick, e.g. png or jpg | | MAXSIZEMB | "16" | Integer, Max size per uploaded file in megabytes | | MAXUPLOADSPERDAY | "1000" | Integer, max per IP address | | MAXUPLOADSPERHOUR | "100" | Integer, max per IP address | | MAXUPLOADSPERMINUTE | "20" | Integer, max per IP address | | ALLOWEDORIGINS | "['*']" | array of domains, e.g ['https://a.com'] | | VALIDSIZES | Any size | array of integers allowed in the h= and w= parameters, e.g "[100,200,300]". You should set this to protect against being bombarded with requests! | | NAME_STRATEGY | "randomstr" |
randomstrfor random 5 chars,
uuidv4for UUIDv4 |
Setting configuration variables is all set through env variables that get passed to the docker container.
docker run -e ALLOWED_ORIGINS="['https://a.com', 'https://b.com']" -s -v :/images -p 5000:5000 hauxir/imgpush:latest
or to quickly deploy it locally, run
docker-compose up -d