diff --git a/Dockerfile b/Dockerfile index 3276f33..789c96b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,22 +7,14 @@ MAINTAINER Kristian Haugene VOLUME /data -# Update package sources list -RUN apt-get update - -# Add transmission ppa repository for latest releases -RUN apt-get -y install software-properties-common -RUN add-apt-repository ppa:transmissionbt/ppa - # Update packages and install software -RUN apt-get update -RUN apt-get install -y transmission-cli -RUN apt-get install -y transmission-common -RUN apt-get install -y transmission-daemon -RUN apt-get install -y openvpn -RUN apt-get install -y curl - -VOLUME /config +RUN apt-get update \ + && apt-get -y install software-properties-common \ + && add-apt-repository ppa:transmissionbt/ppa \ + && apt-get update \ + && apt-get install -y transmission-cli transmission-common transmission-daemon openvpn curl \ + && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ + && curl -L https://github.com/jwilder/dockerize/releases/download/v0.0.2/dockerize-linux-amd64-v0.0.2.tar.gz | tar -C /usr/local/bin -xzv # Add configuration and scripts ADD piaconfig/* /etc/openvpn/ @@ -36,9 +28,81 @@ ADD transmission/runUpdates.sh /etc/transmission-daemon/startPortUpdates.sh ADD transmission/down.sh /etc/transmission-daemon/stop.sh ADD runOpenVpn.sh /etc/openvpn/start.sh +ENV PIA_USERNAME=**None** \ + PIA_PASSWORD=**None** \ + "TRANSMISSION_ALT_SPEED_DOWN=50" \ + "TRANSMISSION_ALT_SPEED_ENABLED=false" \ + "TRANSMISSION_ALT_SPEED_TIME_BEGIN=540" \ + "TRANSMISSION_ALT_SPEED_TIME_DAY=127" \ + "TRANSMISSION_ALT_SPEED_TIME_ENABLED=false" \ + "TRANSMISSION_ALT_SPEED_TIME_END=1020" \ + "TRANSMISSION_ALT_SPEED_UP=50" \ + "TRANSMISSION_BIND_ADDRESS_IPV4=0.0.0.0" \ + "TRANSMISSION_BIND_ADDRESS_IPV6=::" \ + "TRANSMISSION_BLOCKLIST_ENABLED=false" \ + "TRANSMISSION_BLOCKLIST_URL=http://www.example.com/blocklist" \ + "TRANSMISSION_CACHE_SIZE_MB=4" \ + "TRANSMISSION_DHT_ENABLED=true" \ + "TRANSMISSION_DOWNLOAD_DIR=/data/completed" \ + "TRANSMISSION_DOWNLOAD_LIMIT=100" \ + "TRANSMISSION_DOWNLOAD_LIMIT_ENABLED=0" \ + "TRANSMISSION_DOWNLOAD_QUEUE_ENABLED=true" \ + "TRANSMISSION_DOWNLOAD_QUEUE_SIZE=5" \ + "TRANSMISSION_ENCRYPTION=1" \ + "TRANSMISSION_IDLE_SEEDING_LIMIT=30" \ + "TRANSMISSION_IDLE_SEEDING_LIMIT_ENABLED=false" \ + "TRANSMISSION_INCOMPLETE_DIR=/data/incomplete" \ + "TRANSMISSION_INCOMPLETE_DIR_ENABLED=true" \ + "TRANSMISSION_LPD_ENABLED=false" \ + "TRANSMISSION_MAX_PEERS_GLOBAL=200" \ + "TRANSMISSION_MESSAGE_LEVEL=2" \ + "TRANSMISSION_PEER_CONGESTION_ALGORITHM=" \ + "TRANSMISSION_PEER_ID_TTL_HOURS=6" \ + "TRANSMISSION_PEER_LIMIT_GLOBAL=200" \ + "TRANSMISSION_PEER_LIMIT_PER_TORRENT=50" \ + "TRANSMISSION_PEER_PORT=51413" \ + "TRANSMISSION_PEER_PORT_RANDOM_HIGH=65535" \ + "TRANSMISSION_PEER_PORT_RANDOM_LOW=49152" \ + "TRANSMISSION_PEER_PORT_RANDOM_ON_START=false" \ + "TRANSMISSION_PEER_SOCKET_TOS=default" \ + "TRANSMISSION_PEX_ENABLED=true" \ + "TRANSMISSION_PORT_FORWARDING_ENABLED=false" \ + "TRANSMISSION_PREALLOCATION=1" \ + "TRANSMISSION_PREFETCH_ENABLED=1" \ + "TRANSMISSION_QUEUE_STALLED_ENABLED=true" \ + "TRANSMISSION_QUEUE_STALLED_MINUTES=30" \ + "TRANSMISSION_RATIO_LIMIT=2" \ + "TRANSMISSION_RATIO_LIMIT_ENABLED=false" \ + "TRANSMISSION_RENAME_PARTIAL_FILES=true" \ + "TRANSMISSION_RPC_AUTHENTICATION_REQUIRED=false" \ + "TRANSMISSION_RPC_BIND_ADDRESS=0.0.0.0" \ + "TRANSMISSION_RPC_ENABLED=true" \ + "TRANSMISSION_RPC_PASSWORD={425745bf3914984c2abcc013276f40e8fa5d84ecC5.df8oF" \ + "TRANSMISSION_RPC_PORT=9091" \ + "TRANSMISSION_RPC_URL=/transmission/" \ + "TRANSMISSION_RPC_USERNAME=username" \ + "TRANSMISSION_RPC_WHITELIST=127.0.0.1" \ + "TRANSMISSION_RPC_WHITELIST_ENABLED=false" \ + "TRANSMISSION_SCRAPE_PAUSED_TORRENTS_ENABLED=true" \ + "TRANSMISSION_SCRIPT_TORRENT_DONE_ENABLED=false" \ + "TRANSMISSION_SCRIPT_TORRENT_DONE_FILENAME=" \ + "TRANSMISSION_SEED_QUEUE_ENABLED=false" \ + "TRANSMISSION_SEED_QUEUE_SIZE=10" \ + "TRANSMISSION_SPEED_LIMIT_DOWN=100" \ + "TRANSMISSION_SPEED_LIMIT_DOWN_ENABLED=false" \ + "TRANSMISSION_SPEED_LIMIT_UP=100" \ + "TRANSMISSION_SPEED_LIMIT_UP_ENABLED=false" \ + "TRANSMISSION_START_ADDED_TORRENTS=true" \ + "TRANSMISSION_TRASH_ORIGINAL_TORRENT_FILES=false" \ + "TRANSMISSION_UMASK=2" \ + "TRANSMISSION_UPLOAD_LIMIT=100" \ + "TRANSMISSION_UPLOAD_LIMIT_ENABLED=0" \ + "TRANSMISSION_UPLOAD_SLOTS_PER_TORRENT=14" \ + "TRANSMISSION_UTP_ENABLED=true" \ + "TRANSMISSION_WATCH_DIR=/data/watch" \ + "TRANSMISSION_WATCH_DIR_ENABLED=true" \ + RESOLV_OVERRIDE=**None** + # Expose port and run. Use baseimage-docker's init system EXPOSE 9091 CMD ["/etc/openvpn/start.sh"] - -# Clean up APT when done. -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/README.md b/README.md index fb844e2..116f61a 100644 --- a/README.md +++ b/README.md @@ -8,26 +8,55 @@ The container is available from the Docker registry and this is the simplest way ``` $ docker run --privileged -d \ -v /your/storage/path/:/data \ - -v /your/config/path/:/config \ + -e "PIA_USERNAME=user" \ + -e "PIA_PASSWORD=pass" \ -p 9091:9091 \ haugene/transmission-openvpn ``` -or you could optionally specify which vpn server to use by setting an environment variable to one of the ovpn configs avaliable in this folder. +or you could optionally specify which vpn server to use by setting an environment variable to one of the ovpn configs avaliable [in this folder](https://github.com/haugene/docker-transmission-openvpn/tree/master/piaconfig). ``` $ docker run --privileged -d \ -v /your/storage/path/:/data \ - -v /your/config/path/:/config \ + -e "PIA_USERNAME=user" \ + -e "PIA_PASSWORD=pass" \ -p 9091:9091 \ -e "OPEN_VPN_CONFIG=US West" \ haugene/transmission-openvpn ``` -As you can see, the container expects two volumes to be mounted. One is used for storing your downloads from Transmission, and the other provides configurations. The container comes with a default Transmission settings.json file that expects the folders "completed, incomplete and watch" to be present in /your/storage/path (aka /data). This is where Transmission will store your downloads, incomplete downloads and a watch directory to look for new .torrent files. +As you can see, the container expects a data volume to be mounted. It is used for storing your downloads from Transmission. The container comes with a default Transmission `settings.json` file that expects the folders `completed`, `incomplete`, and `watch` to be present in /your/storage/path (aka /data). This is where Transmission will store your downloads, incomplete downloads and a watch directory to look for new .torrent files. -The only mandatory configuration is a pia-credentials.txt file that needs to be put in /your/config/path/ directory. In the file you supply your username and password for Private Internet Access VPN connections. The file should have two lines; your username on line 1 and your password on line 2. The container will connect to the Private Internet Access VPN servers in Netherlands by default. +The only mandatory configuration is to set two environment variables for your PIA username and password. You must set the environment variables `PIA_USERNAME` and `PIA_PASSWORD` to your login credentials. The container will connect to the Private Internet Access VPN servers in Netherlands by default. NB: Instructions on how to use your own Transmission settings, and how to connect to the WebUI, is further down in the README. +## Required environment options +| Variable | Function | Example | +|----------|----------|-------| +|`PIA_USERNAME`|Your login username for PIA|`PIA_USERNAME=asdf`| +|`PIA_PASSWORD`|Your login password for PIA|`PIA_PASSWORD=asdf`| + +## Network configuration options +| Variable | Function | Example | +|----------|----------|-------| +|`OPEN_VPN_CONFIG` | Sets the PIA endpoint to connect to. | `OPEN_VPN_CONFIG=UK Southampton`| +|`RESOLV_OVERRIDE` | The value of this variable will be written to `/etc/resolv.conf`. | `RESOLV_OVERRIDE=nameserver 8.8.8.8\nnameserver 8.8.4.4\n`| + +## Transmission configuration options + +You may override transmission options by setting the appropriate environment variable. + +The environment variables are the same name as used in the transmission settings.json file and follow the format given in these examples: + +| Transmission variable name | Environment variable name | +|----------------------------|---------------------------| +| `speed-limit-up` | `TRANSMISSION_SPEED_LIMIT_UP` | +| `speed-limit-up-enabled` | `TRANSMISSION_SPEED_LIMIT_UP_ENABLED` | +| `ratio-limit` | `TRANSMISSION_RATIO_LIMIT` | +| `ratio-limit-enabled` | `TRANSMISSION_RATIO_LIMIT_ENABLED` | + +As you can see the variables are prefixed with `TRANSMISSION_`, the variable is capitalized, and `-` is converted to `_`. + # Building the container yourself To build this container, clone the repository and cd into it. @@ -40,7 +69,8 @@ $ docker build -t="docker-transmission-openvpn" . ``` $ docker run --privileged -d \ -v /your/storage/path/:/data \ - -v /your/config/path/:/config \ + -e "PIA_USERNAME=user" \ + -e "PIA_PASSWORD=pass" \ -p 9091:9091 \ docker-transmission-openvpn ``` diff --git a/runOpenVpn.sh b/runOpenVpn.sh index 6240674..dffa00e 100755 --- a/runOpenVpn.sh +++ b/runOpenVpn.sh @@ -5,14 +5,37 @@ then if [ -f /etc/openvpn/"${OPEN_VPN_CONFIG}".ovpn ] then echo "Starting OpenVPN using config ${OPEN_VPN_CONFIG}.ovpn" - exec openvpn --config /etc/openvpn/"${OPEN_VPN_CONFIG}".ovpn + OPEN_VPN_CONFIG=/etc/openvpn/${OPEN_VPN_CONFIG}.ovpn else echo "Supplied config ${OPEN_VPN_CONFIG}.ovpn could not be found." echo "Using default OpenVPN gateway: Netherlands" - exec openvpn --config /etc/openvpn/Netherlands.ovpn + OPEN_VPN_CONFIG=/etc/openvpn/Netherlands.ovpn fi else echo "No VPN configuration provided. Using default: Netherlands" - exec openvpn --config /etc/openvpn/Netherlands.ovpn + OPEN_VPN_CONFIG=/etc/openvpn/Netherlands.ovpn fi +# override resolv.conf +if [ "$RESOLV_OVERRIDE" != "**None**" ]; +then + echo "Overriding resolv.conf..." + printf "$RESOLV_OVERRIDE" > /etc/resolv.conf +fi + +# add PIA user/pass +if [ "$PIA_USERNAME" != "**None**" ]; +then + echo "Setting PIA credentials..." + mkdir -p /config + echo $PIA_USERNAME > /config/pia-credentials.txt + echo $PIA_PASSWORD >> /config/pia-credentials.txt +else + echo "Not setting PIA credentials." +fi + +dockerize \ + -template /etc/transmission-daemon/settings.json:/etc/transmission-daemon/settings.json \ + true + +exec openvpn --config "$OPEN_VPN_CONFIG" diff --git a/transmission/defaultSettings.json b/transmission/defaultSettings.json index 20c1864..3f3b11c 100644 --- a/transmission/defaultSettings.json +++ b/transmission/defaultSettings.json @@ -1,74 +1,74 @@ { - "alt-speed-down": 50, - "alt-speed-enabled": false, - "alt-speed-time-begin": 540, - "alt-speed-time-day": 127, - "alt-speed-time-enabled": false, - "alt-speed-time-end": 1020, - "alt-speed-up": 50, - "bind-address-ipv4": "0.0.0.0", - "bind-address-ipv6": "::", - "blocklist-enabled": false, - "blocklist-url": "http://www.example.com/blocklist", - "cache-size-mb": 4, - "dht-enabled": true, - "download-dir": "/data/completed", - "download-limit": 100, - "download-limit-enabled": 0, - "download-queue-enabled": true, - "download-queue-size": 5, - "encryption": 1, - "idle-seeding-limit": 30, - "idle-seeding-limit-enabled": false, - "incomplete-dir": "/data/incomplete", - "incomplete-dir-enabled": true, - "lpd-enabled": false, - "max-peers-global": 200, - "message-level": 2, - "peer-congestion-algorithm": "", - "peer-id-ttl-hours": 6, - "peer-limit-global": 200, - "peer-limit-per-torrent": 50, - "peer-port": 51413, - "peer-port-random-high": 65535, - "peer-port-random-low": 49152, - "peer-port-random-on-start": false, - "peer-socket-tos": "default", - "pex-enabled": true, - "port-forwarding-enabled": false, - "preallocation": 1, - "prefetch-enabled": 1, - "queue-stalled-enabled": true, - "queue-stalled-minutes": 30, - "ratio-limit": 2, - "ratio-limit-enabled": false, - "rename-partial-files": true, - "rpc-authentication-required": false, - "rpc-bind-address": "0.0.0.0", - "rpc-enabled": true, - "rpc-password": "{425745bf3914984c2abcc013276f40e8fa5d84ecC5.df8oF", - "rpc-port": 9091, - "rpc-url": "/transmission/", - "rpc-username": "username", - "rpc-whitelist": "127.0.0.1", - "rpc-whitelist-enabled": false, - "scrape-paused-torrents-enabled": true, - "script-torrent-done-enabled": false, - "script-torrent-done-filename": "", - "seed-queue-enabled": false, - "seed-queue-size": 10, - "speed-limit-down": 100, - "speed-limit-down-enabled": false, - "speed-limit-up": 100, - "speed-limit-up-enabled": false, - "start-added-torrents": true, - "trash-original-torrent-files": false, - "umask": 2, - "upload-limit": 100, - "upload-limit-enabled": 0, - "upload-slots-per-torrent": 14, - "utp-enabled": true, - "watch-dir": "/data/watch", - "watch-dir-enabled": true + "alt-speed-down": {{ .Env.TRANSMISSION_ALT_SPEED_DOWN }}, + "alt-speed-enabled": {{ .Env.TRANSMISSION_ALT_SPEED_ENABLED }}, + "alt-speed-time-begin": {{ .Env.TRANSMISSION_ALT_SPEED_TIME_BEGIN }}, + "alt-speed-time-day": {{ .Env.TRANSMISSION_ALT_SPEED_TIME_DAY }}, + "alt-speed-time-enabled": {{ .Env.TRANSMISSION_ALT_SPEED_TIME_ENABLED }}, + "alt-speed-time-end": {{ .Env.TRANSMISSION_ALT_SPEED_TIME_END }}, + "alt-speed-up": {{ .Env.TRANSMISSION_ALT_SPEED_UP }}, + "bind-address-ipv4": "{{ .Env.TRANSMISSION_BIND_ADDRESS_IPV4 }}", + "bind-address-ipv6": "{{ .Env.TRANSMISSION_BIND_ADDRESS_IPV6 }}", + "blocklist-enabled": {{ .Env.TRANSMISSION_BLOCKLIST_ENABLED }}, + "blocklist-url": "{{ .Env.TRANSMISSION_BLOCKLIST_URL }}", + "cache-size-mb": {{ .Env.TRANSMISSION_CACHE_SIZE_MB }}, + "dht-enabled": {{ .Env.TRANSMISSION_DHT_ENABLED }}, + "download-dir": "{{ .Env.TRANSMISSION_DOWNLOAD_DIR }}", + "download-limit": {{ .Env.TRANSMISSION_DOWNLOAD_LIMIT }}, + "download-limit-enabled": {{ .Env.TRANSMISSION_DOWNLOAD_LIMIT_ENABLED }}, + "download-queue-enabled": {{ .Env.TRANSMISSION_DOWNLOAD_QUEUE_ENABLED }}, + "download-queue-size": {{ .Env.TRANSMISSION_DOWNLOAD_QUEUE_SIZE }}, + "encryption": {{ .Env.TRANSMISSION_ENCRYPTION }}, + "idle-seeding-limit": {{ .Env.TRANSMISSION_IDLE_SEEDING_LIMIT }}, + "idle-seeding-limit-enabled": {{ .Env.TRANSMISSION_IDLE_SEEDING_LIMIT_ENABLED }}, + "incomplete-dir": "{{ .Env.TRANSMISSION_INCOMPLETE_DIR }}", + "incomplete-dir-enabled": {{ .Env.TRANSMISSION_INCOMPLETE_DIR_ENABLED }}, + "lpd-enabled": {{ .Env.TRANSMISSION_LPD_ENABLED }}, + "max-peers-global": {{ .Env.TRANSMISSION_MAX_PEERS_GLOBAL }}, + "message-level": {{ .Env.TRANSMISSION_MESSAGE_LEVEL }}, + "peer-congestion-algorithm": "{{ .Env.TRANSMISSION_PEER_CONGESTION_ALGORITHM }}", + "peer-id-ttl-hours": {{ .Env.TRANSMISSION_PEER_ID_TTL_HOURS }}, + "peer-limit-global": {{ .Env.TRANSMISSION_PEER_LIMIT_GLOBAL }}, + "peer-limit-per-torrent": {{ .Env.TRANSMISSION_PEER_LIMIT_PER_TORRENT }}, + "peer-port": {{ .Env.TRANSMISSION_PEER_PORT }}, + "peer-port-random-high": {{ .Env.TRANSMISSION_PEER_PORT_RANDOM_HIGH }}, + "peer-port-random-low": {{ .Env.TRANSMISSION_PEER_PORT_RANDOM_LOW }}, + "peer-port-random-on-start": {{ .Env.TRANSMISSION_PEER_PORT_RANDOM_ON_START }}, + "peer-socket-tos": "{{ .Env.TRANSMISSION_PEER_SOCKET_TOS }}", + "pex-enabled": {{ .Env.TRANSMISSION_PEX_ENABLED }}, + "port-forwarding-enabled": {{ .Env.TRANSMISSION_PORT_FORWARDING_ENABLED }}, + "preallocation": {{ .Env.TRANSMISSION_PREALLOCATION }}, + "prefetch-enabled": {{ .Env.TRANSMISSION_PREFETCH_ENABLED }}, + "queue-stalled-enabled": {{ .Env.TRANSMISSION_QUEUE_STALLED_ENABLED }}, + "queue-stalled-minutes": {{ .Env.TRANSMISSION_QUEUE_STALLED_MINUTES }}, + "ratio-limit": {{ .Env.TRANSMISSION_RATIO_LIMIT }}, + "ratio-limit-enabled": {{ .Env.TRANSMISSION_RATIO_LIMIT_ENABLED }}, + "rename-partial-files": {{ .Env.TRANSMISSION_RENAME_PARTIAL_FILES }}, + "rpc-authentication-required": {{ .Env.TRANSMISSION_RPC_AUTHENTICATION_REQUIRED }}, + "rpc-bind-address": "{{ .Env.TRANSMISSION_RPC_BIND_ADDRESS }}", + "rpc-enabled": {{ .Env.TRANSMISSION_RPC_ENABLED }}, + "rpc-password": "{{ .Env.TRANSMISSION_RPC_PASSWORD }}", + "rpc-port": {{ .Env.TRANSMISSION_RPC_PORT }}, + "rpc-url": "{{ .Env.TRANSMISSION_RPC_URL }}", + "rpc-username": "{{ .Env.TRANSMISSION_RPC_USERNAME }}", + "rpc-whitelist": "{{ .Env.TRANSMISSION_RPC_WHITELIST }}", + "rpc-whitelist-enabled": {{ .Env.TRANSMISSION_RPC_WHITELIST_ENABLED }}, + "scrape-paused-torrents-enabled": {{ .Env.TRANSMISSION_SCRAPE_PAUSED_TORRENTS_ENABLED }}, + "script-torrent-done-enabled": {{ .Env.TRANSMISSION_SCRIPT_TORRENT_DONE_ENABLED }}, + "script-torrent-done-filename": "{{ .Env.TRANSMISSION_SCRIPT_TORRENT_DONE_FILENAME }}", + "seed-queue-enabled": {{ .Env.TRANSMISSION_SEED_QUEUE_ENABLED }}, + "seed-queue-size": {{ .Env.TRANSMISSION_SEED_QUEUE_SIZE }}, + "speed-limit-down": {{ .Env.TRANSMISSION_SPEED_LIMIT_DOWN }}, + "speed-limit-down-enabled": {{ .Env.TRANSMISSION_SPEED_LIMIT_DOWN_ENABLED }}, + "speed-limit-up": {{ .Env.TRANSMISSION_SPEED_LIMIT_UP }}, + "speed-limit-up-enabled": {{ .Env.TRANSMISSION_SPEED_LIMIT_UP_ENABLED }}, + "start-added-torrents": {{ .Env.TRANSMISSION_START_ADDED_TORRENTS }}, + "trash-original-torrent-files": {{ .Env.TRANSMISSION_TRASH_ORIGINAL_TORRENT_FILES }}, + "umask": {{ .Env.TRANSMISSION_UMASK }}, + "upload-limit": {{ .Env.TRANSMISSION_UPLOAD_LIMIT }}, + "upload-limit-enabled": {{ .Env.TRANSMISSION_UPLOAD_LIMIT_ENABLED }}, + "upload-slots-per-torrent": {{ .Env.TRANSMISSION_UPLOAD_SLOTS_PER_TORRENT }}, + "utp-enabled": {{ .Env.TRANSMISSION_UTP_ENABLED }}, + "watch-dir": "{{ .Env.TRANSMISSION_WATCH_DIR }}", + "watch-dir-enabled": {{ .Env.TRANSMISSION_WATCH_DIR_ENABLED }} }