This project is deployed with Docker Compose (three api replicas behind an
nginx load balancer, plus MinIO and Redis). Upgrades are performed by pulling
the new code and rebuilding the images — there is no systemd unit.
# 1. Pull the new version
git pull
# 2. Add any new environment variables to .env using .env.example as reference
# 3. Rebuild and restart all API replicas (a few seconds of blip)
docker compose up -d --build
# 4. Verify
docker compose ps
curl -s http://localhost:${APP_PORT:-9090}/healthThe build compiles ImageMagick and uses cgo; this is handled inside the Dockerfile, so no local Go toolchain is required for a container deploy.
Two things in this release need a decision before you deploy, and one needs a decision before you ever run the backfill.
-
Check
MINIO_BIND/REDIS_BINDdid not break your access. MinIO's API and console (9000,9001) and Redis (6379) are now published on127.0.0.1instead of every interface. If anything outside the host reached them directly, it will stop working, and that is the point: a published Docker port bypassesufw, so these were previously on the public internet of any host with a public IP. Reach them through a proxy or an SSH tunnel, or setMINIO_BIND=0.0.0.0if you genuinely need the old behaviour.While you are here: if those ports were reachable from outside, treat
MINIO_ROOT_PASSWORDas exposed and rotate it. -
Remove
Cache-Controlfromproxy_ignore_headersin any reverse proxy in front of this service. When every decode slot is busy the service now answers a resize request with the original image and marks itno-store; a proxy that ignores that will cache a full-size image under a?width=URL for the lifetime of the entry. -
aws_uploadstops doing anything. Archiving is now a property of the deployment rather than of the request. The field is still accepted so existing clients do not fail validation, but it is ignored. If you relied on it to choose which uploads were mirrored, seeARCHIVE_ONLY_BUCKETSbelow.
ARCHIVE_BUCKET. Blank means one S3 bucket per MinIO bucket, sharing names. Setting it puts everything in one bucket under a<minio-bucket>/prefix, which is recommended: S3 bucket names are unique across every AWS account, so ordinary names likemediaoruploadscannot be recreated there. The mapping is resolved fresh on every request, so changing this later strands everything already archived. See Cold Storage Archive.
Everything else defaults to the previous behaviour:
- The archive is off unless
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYandAWS_REGIONare all set. A MinIO-only deployment is unchanged and says so once at boot. - Retention is off (
RETENTION_ENABLED=false) and reports without deleting the first time it is switched on (RETENTION_DRY_RUN=true). IMAGICK_THREAD_LIMIT(default 2) andMALLOC_ARENA_MAXin the image are what fixed replicas growing to several GB each and being OOM-killed. Raise the thread limit only if you have measured that you need to.RESIZE_MAX_CONCURRENT(default 4) bounds decodes on the read path..doc,.docx,.csvand.zipare now accepted uploads.
Nothing in the upload/get/delete contract changed, and object URLs are stable across archiving: an object moved to cold storage is served from the same URL.
v1.7.0 adds opt-in upload optimization and a round of security hardening. The following require action before deploying:
TOKENis now mandatory. The service refuses to boot with an emptyTOKEN. Ensure.envcontains a non-emptyTOKENon the server..envis injected via Composeenv_file. Theapiservice now hasenv_file: - .env, and.envis excluded from the image via.dockerignore. Keep.envat the repo root on the server (already the case).godotenvloading is now non-fatal — configuration also comes from the process environment./metricsnow requires a Bearer token. Update your Prometheus scrape config to sendAuthorization: Bearer <TOKEN>./wsnow requires a?token=<TOKEN>query parameter. Update any WebSocket monitoring client.- On-the-fly resize dimensions are clamped to
MAX_RESIZE_DIMENSION(default 4096). Raise it via env if you legitimately request larger sizes.
New optional environment variables (all have safe defaults, so an unchanged
.env still boots): MINIO_USE_SSL, MAX_BATCH_FILES, READ_BUFFER_SIZE_KB,
MAX_RESIZE_DIMENSION, OPTIMIZE_*, IMAGICK_*, UPLOAD_URL_ALLOW_PRIVATE.
See .env.example for the full list and defaults.
Nothing in the upload/get/delete HTTP contract changed: requests without the new
optimize parameter behave exactly as before.
To move a bucket/project to a new MinIO instance (for example splitting two
projects onto separate VMs), use mc mirror server-to-server. See
Server-to-Server Migration
in the MinIO Client guide.