Docker Hubโ - Quay.ioโ - bfren ecosystemโ
Sendโ lets you share files with end-to-end encryption and a link that expires - a community fork of Mozilla's discontinued Firefox Send.
It is built on Node.jsโ (version 24), with Send built from source when the image is built. Configure it with BF_SEND_* variables using friendly values such as 1wk and 2gb, and expired uploads are deleted from disk every hour.
Send needs Redisโ to store details of uploads, and should run behind an HTTPS reverse proxy such as Caddy Proxyโ .
docker-compose.yml:
services:
proxy:
image: quay.io/bfren/caddy-proxy:1.0
restart: unless-stopped
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
environment:
- BF_PROXY_DOMAIN=proxy.example.com
- [email protected]
- BF_PROXY_AUTO_PRIMARY=send.example.com
- BF_PROXY_AUTO_UPSTREAM=http://send:3000
volumes:
- ./v/ssl:/ssl
- ./v/sites:/sites
send:
image: quay.io/bfren/send:3.0
restart: unless-stopped
environment:
- BF_SEND_URI=https://send.example.com
- BF_SEND_REDIS_HOST=redis
volumes:
- ./v/uploads:/uploads
redis:
image: quay.io/bfren/redis:redis8
restart: unless-stopped
Run docker compose up -d and open https://send.example.com. Caddy Proxy passes on the WebSocket connections Send uses for uploads automatically - with another proxy, make sure WebSockets are allowed.
1wk, 2gb, [1hr, 1day, 1wk]node (UID 1000), not rootImages are published to Docker Hub (bfren/send) and Quay.io (quay.io/bfren/send) for linux/amd64 and linux/arm64.
| Tag | Example | Use when |
|---|---|---|
latest | You always want the newest image | |
MAJOR | 3 | You want updates, but not breaking changes |
MINOR | 3.0 | You want fixes only - recommended |
VERSION | 3.0.16 | You want to pin this image exactly |
sendX, sendX.Y | send3.4 | You want a Send version |
sendX.Y.Z | send3.4.27 | You want an exact Send release |
sendX-VERSION | send3-3.0.16 | You want to pin both |
This version of the image includes Send 3.4.27.
| Port | Purpose |
|---|---|
3000 | Send |
| Volume | Purpose |
|---|---|
/uploads | Uploaded files (encrypted), owned by node. |
Durations and sizes use Nushell's formatsโ , e.g. 30min, 1day, 1wk, 500mb, 2gb (Nushell has no months - use 4wk). Lists are written like [1, 5, 10].
| Variable | Values | Description | Default |
|---|---|---|---|
BF_SEND_URI | URL | Required. The address Send is used at, e.g. https://send.example.com. | |
BF_SEND_DIR | path | Where uploads are stored. | /uploads |
BF_SEND_EXPIRE | list of durations | Expiry options shown when uploading. | [1hr, 1day, 1wk, 4wk] |
BF_SEND_EXPIRE_DEFAULT | duration | Expiry option selected by default. | 1wk |
BF_SEND_EXPIRE_MAX | duration | Longest expiry allowed. | 4wk |
BF_SEND_DOWNLOAD_COUNT | list of numbers | Download limit options shown when uploading. | [1, 5, 10] |
BF_SEND_DOWNLOAD_COUNT_DEFAULT | number | Download limit selected by default. | 1 |
BF_SEND_DOWNLOAD_COUNT_MAX | number | Highest download limit allowed. | 10 |
BF_SEND_FILES_MAX_PER_ARCHIVE | number | Most files allowed in one upload. | 64 |
BF_SEND_FILES_MAX_SIZE | size | Largest upload allowed (2gb is 2,000,000,000 bytes). | 2gb |
BF_SEND_REDIS_HOST | host name | Redis server - Send uses localhost if this is not set. | |
BF_SEND_REDIS_PORT | number | Redis port. | 6379 |
BF_SEND_REDIS_USER | string | Redis user name. | |
BF_SEND_REDIS_PASS | string | Redis password. | |
BF_SEND_REDIS_DB | number | Redis database number. |
See Alpine + S6โ for BF_DEBUG, BF_TZ and the other base image variables.
On every start the BF_SEND_* variables are converted into the variables Send reads (BASE_URL, EXPIRE_TIMES_SECONDS, MAX_FILE_SIZE and so on), with durations in seconds and sizes in bytes. Then Send's server runs under S6 as node, on port 3000. The container stops if Send crashes, as in the Node.jsโ image.
Send stores each upload in /uploads as DAYS-ID, where DAYS is how many days it may be kept. Send forgets an upload when it expires, but leaves the file on disk - so every hour, files older than their DAYS are deleted.
The health check is the base image's, which checks cron (and so the hourly cleanup) is running.
./test.nu # builds the image and runs /test
./run.sh # builds the image and opens a shell, with Send on 127.0.0.1:3000
/test runs this image's tests alongside the base images' tests: converting the BF_SEND_* variables (defaults, settings, whole numbers and Redis settings), the hourly cleanup, and the installed Send server.
Check docker logs <container>. BF_SEND_URI cannot be empty means it isn't set. Otherwise Send itself failed - often because it can't reach Redis.
Send uploads over a WebSocket. Make sure your proxy allows WebSockets (Caddy Proxy does by default), and that BF_SEND_URI is the address in your browser, including https://.
Send keeps upload details in Redis. If Redis loses its data, uploads can't be found - mount a volume at Redis's /data (see Redisโ ).
Files are deleted by the hourly cleanup, and DAYS is whole days, so a file can stay for up to a day after its link expires. It is encrypted, and Send no longer knows about it, so it can't be downloaded.
Copyright (c) 2022-2026 bfrenโ (unless otherwise stated)
Content type
Image
Digest
sha256:bad5e915fโฆ
Size
80 MB
Last updated
about 16 hours ago
docker pull bfren/send