About
rTorrent and ruTorrent Docker image based on Alpine Linux.
If you are interested, check out my other Docker images!
💡 Want to be notified of new releases? Check out 🔔 Diun (Docker Image Update Notifier) project!
- Features
- Build locally
- Image
- Environment variables
- Volumes
- Ports
- Usage
- Notes
- Upgrade
- Contributing
- License
Features
- Run as non-root user
- Multi-platform image
- Latest rTorrent / libTorrent release compiled from source
- Latest ruTorrent release
- Name resolving enhancements with c-ares for asynchronous DNS requests (including name resolves)
- Enhanced rTorrent config and bootstraping with a local config
- XMLRPC through nginx over SCGI socket (basic auth optional)
- WebDAV on completed downloads (basic auth optional)
- Ability to add a custom ruTorrent plugin / theme
- Allow persisting specific configuration for ruTorrent plugins
- ruTorrent GeoIP2 plugin
- mktorrent installed for ruTorrent create plugin
- Traefik Docker image as reverse proxy and creation/renewal of Let's Encrypt certificates (see this template)
- geoip-updater Docker image to download MaxMind's GeoIP2 databases on a time-based schedule for geolocation
Build locally
git clone https://github.com/crazy-max/docker-rtorrent-rutorrent.git
cd docker-rtorrent-rutorrent
# Build image and output to docker (default)
docker buildx bake
# Build image
docker buildx bake image
# Build multi-platform image
docker buildx bake image-all
Image
Registry | Image |
---|---|
Docker Hub | crazymax/rtorrent-rutorrent |
GitHub Container Registry | ghcr.io/crazy-max/rtorrent-rutorrent |
Following platforms for this image are available:
$ docker run --rm mplatform/mquery crazymax/rtorrent-rutorrent:latest
Image: crazymax/rtorrent-rutorrent:latest
* Manifest List: Yes
* Supported platforms:
- linux/amd64
- linux/arm/v6
- linux/arm/v7
- linux/arm64
Environment variables
General
TZ
: The timezone assigned to the container (defaultUTC
)PUID
: rTorrent user id (default1000
)PGID
: rTorrent group id (default1000
)WAN_IP
: Public IP address reported to the tracker (auto if empty)WAN_IP_CMD
: Command to resolve the Public IP addressMEMORY_LIMIT
: PHP memory limit (default256M
)UPLOAD_MAX_SIZE
: Upload max size (default16M
)CLEAR_ENV
: Clear environment in FPM workers (defaultyes
)OPCACHE_MEM_SIZE
: PHP OpCache memory consumption (default128
)MAX_FILE_UPLOADS
: The maximum number of files allowed to be uploaded simultaneously (default50
)AUTH_DELAY
: The time in seconds to wait for Basic Auth (default0s
)REAL_IP_FROM
: Trusted addresses that are known to send correct replacement addresses (default0.0.0.0/32
)REAL_IP_HEADER
: Request header field whose value will be used to replace the client address (defaultX-Forwarded-For
)LOG_IP_VAR
: Use another variable to retrieve the remote IP address for access log_format on Nginx. (defaultremote_addr
)LOG_ACCESS
: Output access log (defaulttrue
)XMLRPC_AUTHBASIC_STRING
: Message displayed during validation of XMLRPC Basic Auth (defaultrTorrent XMLRPC restricted access
)XMLRPC_PORT
: XMLRPC port through nginx over SCGI socket (default8000
)XMLRPC_SIZE_LIMIT
: Maximum body size of XMLRPC calls (default1M
)RUTORRENT_AUTHBASIC_STRING
: Message displayed during validation of ruTorrent Basic Auth (defaultruTorrent restricted access
)RUTORRENT_PORT
: ruTorrent HTTP port (default8080
)WEBDAV_AUTHBASIC_STRING
: Message displayed during validation of WebDAV Basic Auth (defaultWebDAV restricted access
)WEBDAV_PORT
: WebDAV port on completed downloads (default9000
)
rTorrent
RT_LOG_LEVEL
: rTorrent log level (defaultinfo
)RT_LOG_EXECUTE
: Log executed commands to/data/rtorrent/log/execute.log
(defaultfalse
)RT_LOG_XMLRPC
: Log XMLRPC queries to/data/rtorrent/log/xmlrpc.log
(defaultfalse
)RT_DHT_PORT
: DHT UDP port (dht.port.set
, default6881
)RT_INC_PORT
: Incoming connections (network.port_range.set
, default50000
)
ruTorrent
RU_REMOVE_CORE_PLUGINS
: Remove ruTorrent core plugins ; comma separated (defaulterasedata,httprpc
)RU_HTTP_USER_AGENT
: ruTorrent HTTP user agent (defaultMozilla/5.0 (Windows NT 6.0; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
)RU_HTTP_TIME_OUT
: ruTorrent HTTP timeout in seconds (default30
)RU_HTTP_USE_GZIP
: Use HTTP Gzip compression (defaulttrue
)RU_RPC_TIME_OUT
: ruTorrent RPC timeout in seconds (default5
)RU_LOG_RPC_CALLS
: Log ruTorrent RPC calls (defaultfalse
)RU_LOG_RPC_FAULTS
: Log ruTorrent RPC faults (defaulttrue
)RU_PHP_USE_GZIP
: Use PHP Gzip compression (defaultfalse
)RU_PHP_GZIP_LEVEL
: PHP Gzip compression level (default2
)RU_SCHEDULE_RAND
: Rand for schedulers start, +0..X seconds (default10
)RU_LOG_FILE
: ruTorrent log file path for errors messages (default/data/rutorrent/rutorrent.log
)RU_DO_DIAGNOSTIC
: ruTorrent diagnostics like permission checking (defaulttrue
)RU_SAVE_UPLOADED_TORRENTS
: Save torrents files added wia ruTorrent in/data/rutorrent/share/torrents
(defaulttrue
)RU_OVERWRITE_UPLOADED_TORRENTS
: Existing .torrent files will be overwritten (defaultfalse
)RU_FORBID_USER_SETTINGS
: If true, allows for single user style configuration, even with webauth (defaultfalse
)RU_LOCALE
: Set default locale for ruTorrent (defaultUTF8
)
Volumes
/data
: rTorrent / ruTorrent config, session files, log, .../downloads
: Downloaded files/passwd
: Contains htpasswd files for basic auth
⚠️ Note that the volumes should be owned by the user/group with the specifiedPUID
andPGID
. If you don't give the volumes correct permissions, the container may not start.
Ports
6881
(orRT_DHT_PORT
): DHT UDP port (dht.port.set
)8000
(orXMLRPC_PORT
): XMLRPC port through nginx over SCGI socket8080
(orRUTORRENT_PORT
): ruTorrent HTTP port9000
(orWEBDAV_PORT
): WebDAV port on completed downloads50000
(orRT_INC_PORT
): Incoming connections (network.port_range.set
)
⚠️ Port p+1 defined forXMLRPC_PORT
,RUTORRENT_PORT
andWEBDAV_PORT
will also be reserved for healthcheck. (e.g. if you defineRUTORRENT_PORT=8080
, port8081
will be reserved)
Usage
Docker Compose
Docker compose is the recommended way to run this image. Copy the content of
folder examples/compose in /var/rtorrent-rutorrent/
on
your host for example. Edit the compose file with your preferences and run the
following command:
mkdir data downloads passwd
chown ${PUID}:${PGID} data downloads passwd
docker-compose up -d
docker-compose logs -f
Command line
You can also use the following minimal command:
mkdir data downloads passwd
chown ${PUID}:${PGID} data downloads passwd
docker run -d --name rtorrent_rutorrent \
--ulimit nproc=65535 \
--ulimit nofile=32000:40000 \
-p 6881:6881/udp \
-p 8000:8000 \
-p 8080:8080 \
-p 9000:9000 \
-p 50000:50000 \
-v $(pwd)/data:/data \
-v $(pwd)/downloads:/downloads \
-v $(pwd)/passwd:/passwd \
crazymax/rtorrent-rutorrent:latest
Notes
XMLRPC through nginx
rTorrent 0.9.7+ has a built-in daemon mode disabling the user interface, so you
can only control it via XMLRPC. Nginx will route XMLRPC requests to rtorrent
through port 8000
. These requests can be secured with basic authentication
through the /passwd/rpc.htpasswd
file in which you will need to add a username
with his password. See below to populate this file with a user / password.
WebDAV
WebDAV allows you to retrieve your completed torrent files in /downloads/complete
on port 9000
. Like XMLRPC, these requests can be secured with basic authentication
through the /passwd/webdav.htpasswd
file in which you will need to add a
username with his password. See below to populate this file with a user / password.
Populate .htpasswd files
For ruTorrent basic auth, XMLRPC through nginx and WebDAV on completed downloads,
you can populate .htpasswd
files with the following command:
docker run --rm -it httpd:2.4-alpine htpasswd -Bbn <username> <password> >> $(pwd)/passwd/webdav.htpasswd
Htpasswd files used:
rpc.htpasswd
: XMLRPC through nginxrutorrent.htpasswd
: ruTorrent basic authwebdav.htpasswd
: WebDAV on completed downloads
.rtlocal.rc
Boostrap config When rTorrent is started the bootstrap config /etc/rtorrent/.rtlocal.rc
is imported. This configuration cannot be changed unless you rebuild the image
or overwrite these elements in your .rtorrent.rc
. Here are the particular
properties of this file:
system.daemon.set = true
: Launcher rTorrent as a daemon- A config layout for the rTorrent's instance you can use in your
.rtorrent.rc
:cfg.basedir
: Home directory of rtorrent (/data/rtorrent/
)cfg.download
: Download directory (/downloads/
)cfg.download_complete
: Completed downloads (/downloads/complete/
)cfg.download_temp
: Downloads in progress (/downloads/temp/
)cfg.logs
: Logs directory (/data/rtorrent/log/
)cfg.session
: Session directory (/data/rtorrent/.session/
)cfg.watch
: Watch directory for torrents (/data/rtorrent/watch/
)cfg.rundir
: Runtime data of rtorrent (/var/run/rtorrent/
)
d.data_path
: Config var to get the full path of data of a torrent (workaround for the possibly emptyd.base_path
attribute)directory.default.set
: Default directory to save the downloaded torrents (cfg.download_temp
)session.path.set
: Default session directory (cfg.session
)- PID file to
/var/run/rtorrent/rtorrent.pid
network.scgi.open_local
: SCGI local socket and make it group-writable and securenetwork.port_range.set
: Listening port for incoming peer traffic (50000-50000
)dht.port.set
: UDP port to use for DHT (6881
)log.open_file
: Default logging to/data/rtorrent/log/rtorrent.log
- Log level can be modified with the environment variable
RT_LOG_LEVEL
rpc_events
are logged be default- To log executed commands, add the environment variable
RT_LOG_EXECUTE
- To log XMLRPC queries, add the environment variable
RT_LOG_XMLRPC
- Log level can be modified with the environment variable
Override or add a ruTorrent plugin/theme
You can add a plugin for ruTorrent in /data/rutorrent/plugins/
. If you add a
plugin that already exists in ruTorrent, it will be removed from ruTorrent core
plugins and yours will be used. And you can also add a theme in /data/rutorrent/themes/
.
The same principle as for plugins will be used if you want to override one.
⚠️ Container has to be restarted to propagate changes
Edit a ruTorrent plugin configuration
As you probably know, plugin configuration is not outsourced in ruTorrent.
Loading the configuration of a plugin is done via a conf.php
file placed at
the root of the plugin folder. To solve this issue with Docker, a special folder
has been created in /data/rutorrent/plugins-conf
to allow you to configure
plugins. For example to configure the diskspace
plugin, you will need to create
the /data/rutorrent/plugins-conf/diskspace.php
file with your configuration:
<?php
$diskUpdateInterval = 10; // in seconds
$notifySpaceLimit = 512; // in Mb
$partitionDirectory = null; // if null, then we will check rtorrent download directory (or $topDirectory if rtorrent is unavailable)
// otherwise, set this to the absolute path for checked partition.
⚠️ Container has to be restarted to propagate changes
Increase Docker timeout to allow rTorrent to shutdown gracefully
After issuing a shutdown command, Docker waits 10 seconds for the container to exit before it is killed. If you are a seeding many torrents, rTorrent may be unable to gracefully close within that time period. As a result, rTorrent is closed forcefully and the lockfile isn't removed. This stale lockfile will prevent rTorrent from restarting until the lockfile is removed manually.
The timeout period can be extended by either adding the parameter -t XX
to
the docker command or stop_grace_period: XXs
in docker-compose.yml, where
XX
is the number of seconds to wait for a graceful shutdown.
WAN IP address
WAN_IP
is the public IP address sent to the tracker. In the majority of cases
you don't need to set it as it will be automatically determined by the tracker.
But it can be sometimes required to enforce the public IP address when you are behind a VPN where an erroneous IP is sometimes reported.
You can also use the WAN_IP_CMD
environment variable to specify a command to
resolve your public IP address. Here are some commands you can use:
dig +short myip.opendns.com @resolver1.opendns.com
curl -s ifconfig.me
curl -s ident.me
Upgrade
To upgrade, pull the newer image and launch the container:
docker-compose pull
docker-compose up -d
Contributing
Want to contribute? Awesome! The most basic way to show your support is to star the project, or to raise issues. You can also support this project by becoming a sponsor on GitHub or by making a Paypal donation to ensure this journey continues indefinitely!
Thanks again for your support, it is much appreciated! 🙏
License
MIT. See LICENSE
for more details.