easterbrooka/mike: AWS S3 support and ECS-ready Dockerfile for the backend

easterbrooka reworked the storage layer so the backend can deploy against AWS S3 via an ECS task role, without touching R2 compatibility, then added a production-oriented Dockerfile for Fargate.

infrastructureintegration

The storage client was rewritten to make endpoint and explicit credentials optional. When R2_ENDPOINT_URL is absent, the S3 SDK talks to native AWS. When R2_ACCESS_KEY_ID and R2_SECRET_ACCESS_KEY are absent, the SDK's default credential provider chain runs and picks up an ECS task role automatically. Region falls back through R2_REGION, then AWS_REGION, then "auto" for R2 compatibility. The storageEnabled check now returns true when either explicit credentials or a configured AWS region is present.

One thing to watch: any environment variable that sets AWS_REGION (even outside of ECS) will now flip storageEnabled to true. If your deployment previously short-circuited upload paths by leaving the R2 creds unset, verify that an ambient AWS_REGION won't change that behavior.

The Dockerfile is a two-stage build on node:22-bookworm-slim. The runtime image installs libreoffice-core, libreoffice-writer, fonts-liberation, and tini for signal handling. LibreOffice runs as the node user with a writable home directory for its profile. Build artifacts, dev dependencies, and secrets are excluded via .dockerignore. The env example was rewritten to document both deployment shapes with inline comments on when to omit credentials for task-role auth.

So what Worth pulling if you want AWS S3 as a storage option or need a baseline Dockerfile for ECS. The storage diff is small and backwards-compatible with R2. Skip if you're staying on R2 and Cloudflare Workers - nothing here breaks your path, but there's nothing new for you either.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?