safe-transmission

A Docker image that runs the Transmission BitTorrent daemon with its web interface behind nginx. nginx adds a per-client rate limit and, when you set a user name and password, HTTP basic authentication. An optional OpenVPN client starts before Transmission, so torrent traffic can leave through your VPN provider instead of your own connection.

The image is psyb0t/safe-transmission on Docker Hub, built for linux/amd64 and linux/arm64, so it also runs on a 64-bit Raspberry Pi.

What’s inside

Part Does
Transmission 4.0 The BitTorrent daemon and its web interface, run as the user and group you pick with PUID and PGID.
nginx The only exposed port (80). Proxies to Transmission, limits each client to 1 request per second with a burst of 5, and asks for a password when USERNAME and PASSWORD are set.
OpenVPN 2.6 Started from your .ovpn file when WITH_OPENVPN=true. Off by default.
run.sh The entrypoint. Starts everything in order, watches the processes, and stops the container when one of them dies.

Everything comes from the Alpine 3.22 package repositories. See the Dockerfile.

Quick start

Without a VPN, with a password on the web interface:

docker run -d \
  --name safe-transmission \
  -e USERNAME=your_username \
  -e PASSWORD=your_password \
  -v "$PWD/config:/config" \
  -v "$PWD/downloads:/downloads" \
  -v "$PWD/watch:/watch" \
  -p 8080:80 \
  psyb0t/safe-transmission:latest

Open http://localhost:8080/, log in, and add a torrent. Getting started has the VPN version and the Compose file.

You want to

You want to Read
Run it for the first time, with or without a VPN Getting started
Look up a variable, volume or port Configuration
Route torrent traffic through OpenVPN and check that it works OpenVPN
Know what is protected and what is not before exposing it Security
Understand the startup order and shutdown How it works
Fix a container that exits, a 503, or a wrong clock Troubleshooting
Change the image, run the tests, build these docs Development