Sign inSign up

bfren/send

By bfren

โ€ขUpdated about 16 hours ago

Image
0

10K+

bfren/send repository overview

โ Send

GitHub release (latest by date) Docker Pulls Docker Image Size GitHub Workflow Status

Docker Hubโ  - Quay.ioโ  - bfren ecosystemโ 

โ Introduction

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โ .

โ Quickstart

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.

โ Features

  • ๐Ÿ”’ End-to-end encrypted file sharing, with links that expire after a time or a number of downloads
  • โš™๏ธ Limits set with friendly values - 1wk, 2gb, [1hr, 1day, 1wk]
  • ๐Ÿงน Expired uploads deleted from disk every hour
  • ๐Ÿ‘ค Runs as node (UID 1000), not root
  • ๐Ÿงช Built-in tests

โ Tags

Images are published to Docker Hub (bfren/send) and Quay.io (quay.io/bfren/send) for linux/amd64 and linux/arm64.

TagExampleUse when
latestYou always want the newest image
MAJOR3You want updates, but not breaking changes
MINOR3.0You want fixes only - recommended
VERSION3.0.16You want to pin this image exactly
sendX, sendX.Ysend3.4You want a Send version
sendX.Y.Zsend3.4.27You want an exact Send release
sendX-VERSIONsend3-3.0.16You want to pin both

This version of the image includes Send 3.4.27.

โ Configuration

โ Ports
PortPurpose
3000Send
โ Volumes
VolumePurpose
/uploadsUploaded files (encrypted), owned by node.
โ Environment Variables

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].

VariableValuesDescriptionDefault
BF_SEND_URIURLRequired. The address Send is used at, e.g. https://send.example.com.
BF_SEND_DIRpathWhere uploads are stored./uploads
BF_SEND_EXPIRElist of durationsExpiry options shown when uploading.[1hr, 1day, 1wk, 4wk]
BF_SEND_EXPIRE_DEFAULTdurationExpiry option selected by default.1wk
BF_SEND_EXPIRE_MAXdurationLongest expiry allowed.4wk
BF_SEND_DOWNLOAD_COUNTlist of numbersDownload limit options shown when uploading.[1, 5, 10]
BF_SEND_DOWNLOAD_COUNT_DEFAULTnumberDownload limit selected by default.1
BF_SEND_DOWNLOAD_COUNT_MAXnumberHighest download limit allowed.10
BF_SEND_FILES_MAX_PER_ARCHIVEnumberMost files allowed in one upload.64
BF_SEND_FILES_MAX_SIZEsizeLargest upload allowed (2gb is 2,000,000,000 bytes).2gb
BF_SEND_REDIS_HOSThost nameRedis server - Send uses localhost if this is not set.
BF_SEND_REDIS_PORTnumberRedis port.6379
BF_SEND_REDIS_USERstringRedis user name.
BF_SEND_REDIS_PASSstringRedis password.
BF_SEND_REDIS_DBnumberRedis database number.

See Alpine + S6โ  for BF_DEBUG, BF_TZ and the other base image variables.

โ How It Works

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.

โ Testing

./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.

โ Troubleshooting

โ The container stops straight after starting

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.

โ Uploads start but never finish

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://.

โ Downloads fail after a restart

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โ ).

โ FAQs

โ Why are expired files still on disk?

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.

โ Licence

Copyright (c) 2022-2026 bfrenโ  (unless otherwise stated)

Tag summary

Content type

Image

Digest

sha256:bad5e915fโ€ฆ

Size

80 MB

Last updated

about 16 hours ago

docker pull bfren/send