docker.md

June 9, 2023 ยท View on GitHub

Docker Quickstart

Use registry.gitlab.com/timvisee/send:latest from timvisee/send's Gitlab image registry for the latest Docker image.

docker pull registry.gitlab.com/timvisee/send:latest

# example quickstart (point REDIS_HOST to an already-running redis server)
docker run -v $PWD/uploads:/uploads -p 1443:1443 \
    -e 'DETECT_BASE_URL=true' \
    -e 'REDIS_HOST=localhost' \
    -e 'FILE_DIR=/uploads' \
    registry.gitlab.com/timvisee/send:latest

Or clone this repo and run docker build -t send:latest . to build an image locally.

Note: for Docker Compose, see: https://github.com/timvisee/send-docker-compose

Environment Variables

All the available config options and their defaults can be found here: https://github.com/timvisee/send/blob/master/server/config.js

Config options should be set as unquoted environment variables. Boolean options should be true/false, time/duration should be integers (seconds), and filesize values should be integers (bytes).

Config options expecting array values (e.g. EXPIRE_TIMES_SECONDS, DOWNLOAD_COUNTS) should be in unquoted CSV format. UI dropdowns will default to the first value in the CSV, e.g. DOWNLOAD_COUNTS=5,1,10,100 will show four dropdown options, with 5 selected by the default.

Server Configuration

NameDescription
BASE_URLThe HTTPS URL where traffic will be served (e.g. https://send.firefox.com)
DETECT_BASE_URLAutodetect the base URL using browser if BASE_URL is unset (defaults to false)
PORTPort the server will listen on (defaults to 1443)
NODE_ENVRun in development mode (unsafe) or production mode (the default)
SEND_FOOTER_DMCA_URLA URL to a contact page for DMCA requests (empty / not shown by default)
SENTRY_CLIENT, SENTRY_DSNSentry Client ID and DSN for error tracking (optional, disabled by default)

Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js

Upload and Download Limits

Configure the limits for uploads and downloads. Long expiration times are risky on public servers as people may use you as free hosting for copyrighted content or malware (which is why Mozilla shut down their send service). It's advised to only expose your service on a LAN/intranet, password protect it with a proxy/gateway, or make sure to set SEND_FOOTER_DMCA_URL above so you can respond to takedown requests.

NameDescription
MAX_FILE_SIZEMaximum upload file size in bytes (defaults to 2147483648 aka 2GB)
MAX_FILES_PER_ARCHIVEMaximum number of files per archive (defaults to 64)
MAX_EXPIRE_SECONDSMaximum upload expiry time in seconds (defaults to 604800 aka 7 days)
MAX_DOWNLOADSMaximum number of downloads (defaults to 100)
DOWNLOAD_COUNTSDownload limit options to show in UI dropdown, e.g. 10,1,2,5,10,15,25,50,100,1000
EXPIRE_TIMES_SECONDSExpire time options to show in UI dropdown, e.g. 3600,86400,604800,2592000,31536000
DEFAULT_DOWNLOADSDefault download limit in UI (defaults to 1)
DEFAULT_EXPIRE_SECONDSDefault expire time in UI (defaults to 86400)

Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js

Storage Backend Options

Pick how you want to store uploaded files and set these config options accordingly:

  • Local filesystem (the default): set FILE_DIR to the local path used inside the container for storage (or leave the default)
  • S3-compatible object store: set S3_BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY (and S3_ENDPOINT if using something other than AWS)
  • Google Cloud Storage: set GCS_BUCKET to the name of a GCS bucket (auth should be set up using Application Default Credentials)

Redis is used as the metadata database for the backend and is required no matter which storage method you use.

NameDescription
REDIS_HOST, REDIS_PORT, REDIS_USER, REDIS_PASSWORD, REDIS_DBHost name, port, and pass of the Redis server (defaults to localhost, 6379, and no password)
FILE_DIRDirectory for storage inside the Docker container (defaults to /uploads)
S3_BUCKETThe S3 bucket name to use (only set if using S3 for storage)
S3_ENDPOINTAn optional custom endpoint to use for S3 (defaults to AWS)
S3_USE_PATH_STYLE_ENDPOINTWhether to force path style URLs for S3 objects (defaults to false)
AWS_ACCESS_KEY_IDS3 access key ID (only set if using S3 for storage)
AWS_SECRET_ACCESS_KEYS3 secret access key ID (only set if using S3 for storage)
GCS_BUCKETGoogle Cloud Storage bucket (only set if using GCP for storage)

Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js

Branding

To change the look the colors aswell as some graphics can be changed via environment variables.
See the table below for the variables and their default values.

NameDefaultDescription
UI_COLOR_PRIMARY#0a84ffThe primary color
UI_COLOR_ACCENT#003eaaThe accent color (eg. for hover-effects)
UI_CUSTOM_ASSETS_ANDROID_CHROME_192PXA custom icon for Android (192x192px)
UI_CUSTOM_ASSETS_ANDROID_CHROME_512PXA custom icon for Android (512x512px)
UI_CUSTOM_ASSETS_APPLE_TOUCH_ICONA custom icon for Apple
UI_CUSTOM_ASSETS_FAVICON_16PXA custom favicon (16x16px)
UI_CUSTOM_ASSETS_FAVICON_32PXA custom favicon (32x32px)
UI_CUSTOM_ASSETS_ICONA custom icon (Logo on the top-left of the UI)
UI_CUSTOM_ASSETS_SAFARI_PINNED_TABA custom icon for Safari
UI_CUSTOM_ASSETS_FACEBOOKA custom header image for Facebook
UI_CUSTOM_ASSETS_TWITTERA custom header image for Twitter
UI_CUSTOM_ASSETS_WORDMARKA custom wordmark (Text next to the logo)
UI_CUSTOM_CSSAllows you to define a custom CSS file for custom styling
CUSTOM_FOOTER_TEXTAllows you to define a custom footer
CUSTOM_FOOTER_URLAllows you to define a custom URL in your footer

Side note: If you define a custom URL and a custom footer, only the footer text will display, but will be hyperlinked to the URL.

Examples

Run using an Amazon Elasticache for the Redis DB, Amazon S3 for the storage backend, and Sentry for error reporting.

$ docker run -p 1443:1443 \
  -e 'S3_BUCKET=testpilot-p2p-dev' \
  -e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \
  -e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \
  -e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \
  -e 'BASE_URL=https://send.example.com' \
  registry.gitlab.com/timvisee/send:latest

Note: make sure to replace the example values above with your real values before running.

Run totally self-hosted using the current filesystem directry ($PWD) to store the Redis data and file uploads, with a 5GB upload limit, 1 month expiry, and contact URL set.

# create a network for the send backend and redis containers to talk to each other
$ docker network create timviseesend

# start the redis container
$ docker run --net=timviseesend -v $PWD/redis:/data redis-server --appendonly yes

# start the send backend container
$ docker run --net=timviseesend -v $PWD/uploads:/uploads -p 1443:1443 \
    -e 'BASE_URL=http://localhost:1443' \
    -e 'MAX_FILE_SIZE=5368709120' \
    -e 'MAX_EXPIRE_SECONDS=2592000' \
    -e 'SEND_FOOTER_DMCA_URL=https://example.com/dmca-contact-info' \
    registry.gitlab.com/timvisee/send:latest

Then open http://localhost:1443 to view the UI. (change the localhost to your IP or hostname above to serve the UI to others)

To run with HTTPS, you will need to set up a reverse proxy with SSL termination in front of the backend. See Docker Compose below for an example setup.

Run with custom branding.

$ docker run -p 1443:1443 \
    -v $PWD/custom_assets:/app/dist/custom_assets \
    -e 'UI_COLOR_PRIMARY=#f00' \
    -e 'UI_COLOR_ACCENT=#a00' \
    -e 'UI_CUSTOM_ASSETS_ICON=custom_assets/logo.svg' \
    registry.gitlab.com/timvisee/send:latest

Docker Compose

For a Docker compose configuration example, see:

https://github.com/timvisee/send-docker-compose