From 2ea0c242e58a59e6b0be23ee7037261c825ef14f Mon Sep 17 00:00:00 2001 From: JigSaw Date: Thu, 31 Aug 2023 12:21:04 +0200 Subject: [PATCH] feat(store): add transmission-vpn (#1116) --- apps/transmission-vpn/config.json | 171 ++++++++++++++++++ apps/transmission-vpn/data/config/.gitkeep | 0 apps/transmission-vpn/docker-compose.yml | 79 ++++++++ apps/transmission-vpn/metadata/description.md | 54 ++++++ apps/transmission-vpn/metadata/logo.jpg | Bin 0 -> 21494 bytes 5 files changed, 304 insertions(+) create mode 100644 apps/transmission-vpn/config.json create mode 100644 apps/transmission-vpn/data/config/.gitkeep create mode 100644 apps/transmission-vpn/docker-compose.yml create mode 100644 apps/transmission-vpn/metadata/description.md create mode 100644 apps/transmission-vpn/metadata/logo.jpg diff --git a/apps/transmission-vpn/config.json b/apps/transmission-vpn/config.json new file mode 100644 index 00000000..ef0aee7b --- /dev/null +++ b/apps/transmission-vpn/config.json @@ -0,0 +1,171 @@ +{ + "$schema": "../schema.json", + "name": "Transmission (VPN)", + "available": true, + "exposable": true, + "port": 9091, + "requirements": { + "ports": [ + 51413 + ] + }, + "id": "transmission-vpn", + "tipi_version": 1, + "version": "5.0.2", + "categories": [ + "utilities", + "security" + ], + "description": "Transmission is running only when OpenVPN has an active tunnel. It has built-in support for many popular VPN providers to make the setup easier.", + "short_desc": "BitTorrent client with VPN support.", + "author": "haugene", + "source": "https://github.com/haugene/docker-transmission-openvpn", + "form_fields": [ + { + "type": "numeric", + "label": "Container > UserID (UID)", + "placeholder": "1000", + "env_variable": "TRANSMISSION_PUID" + }, + { + "type": "numeric", + "label": "Container > GroupID (PGID)", + "placeholder": "1000", + "env_variable": "TRANSMISSION_PGID" + }, + { + "type": "boolean", + "label": "Container > Create TUN device", + "env_variable": "TRANSMISSION_CREATE_TUN_DEVICE" + }, + { + "type": "text", + "label": "OpenVPN > Local Network", + "placeholder": "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16", + "env_variable": "TRANSMISSION_OVPN_LOCAL_NETWORK" + }, + { + "type": "text", + "label": "OpenVPN > Username", + "required": true, + "env_variable": "TRANSMISSION_OVPN_USERNAME" + }, + { + "type": "password", + "label": "OpenVPN > Password", + "required": true, + "env_variable": "TRANSMISSION_OVPN_PASSWORD" + }, + { + "type": "text", + "label": "OpenVPN > Default Provider Config", + "required": true, + "placeholder": "france,sweden,austria,italy,belgium", + "env_variable": "TRANSMISSION_OVPN_CONFIG" + }, + { + "label": "OpenVPN > Provider", + "type": "text", + "required": true, + "options": [ + { "label": "Anonine", "value": "ANONINE" }, + { "label": "AnonVPN", "value": "ANONVPN" }, + { "label": "BlackVPN", "value": "BLACKVPN" }, + { "label": "BTGuard", "value": "BTGUARD" }, + { "label": "Cryptostorm", "value": "CRYPTOSTORM" }, + { "label": "ExpressVPN", "value": "EXPRESSVPN" }, + { "label": "FastestVPN", "value": "FASTESTVPN" }, + { "label": "FreeVPN", "value": "FREEVPN" }, + { "label": "FrootVPN", "value": "FROOT" }, + { "label": "FrostVPN", "value": "FROSTVPN" }, + { "label": "Getflix", "value": "GETFLIX" }, + { "label": "GhostPath", "value": "GHOSTPATH" }, + { "label": "Giganews", "value": "GIGANEWS" }, + { "label": "HideMe", "value": "HIDEME" }, + { "label": "HideMyAss", "value": "HIDEMYASS" }, + { "label": "IntegrityVPN", "value": "INTEGRITYVPN" }, + { "label": "IPVanish", "value": "IPVANISH" }, + { "label": "IronSocket", "value": "IRONSOCKET" }, + { "label": "Ivacy", "value": "IVACY" }, + { "label": "IVPN", "value": "IVPN" }, + { "label": "Mullvad", "value": "MULLVAD" }, + { "label": "NordVPN", "value": "NORDVPN" }, + { "label": "OctaneVPN", "value": "OCTANEVPN" }, + { "label": "OVPN", "value": "OVPN" }, + { "label": "Privado", "value": "PRIVADO" }, + { "label": "Private Internet Access", "value": "PIA" }, + { "label": "PrivateVPN", "value": "PRIVATEVPN" }, + { "label": "ProtonVPN", "value": "PROTONVPN" }, + { "label": "proXPN", "value": "PROXPN" }, + { "label": "PureVPN", "value": "PUREVPN" }, + { "label": "RA4W VPN", "value": "RA4W" }, + { "label": "SaferVPN", "value": "SAFERVPN" }, + { "label": "SlickVPN", "value": "SLICKVPN" }, + { "label": "SlickVPNCore", "value": "SLICKVPNCORE" }, + { "label": "Smart DNS Proxy", "value": "SMARTDNSPROXY" }, + { "label": "SmartVPN", "value": "SMARTVPN" }, + { "label": "Surfshark", "value": "SURFSHARK" }, + { "label": "TigerVPN", "value": "TIGER" }, + { "label": "TorGuard", "value": "TORGUARD" }, + { "label": "Trust.Zone", "value": "TRUSTZONE" }, + { "label": "TunnelBear", "value": "TUNNELBEAR" }, + { "label": "VPN.AC", "value": "VPNAC" }, + { "label": "VPNArea.com", "value": "VPNAREA" }, + { "label": "VPNBook.com", "value": "VPNBOOK" }, + { "label": "VPNFacile", "value": "VPNFACILE" }, + { "label": "VPN.ht", "value": "VPNHT" }, + { "label": "VPNTunnel", "value": "VPNTUNNEL" }, + { "label": "VPNUnlimited", "value": "VPNUNLIMITED" }, + { "label": "VyprVpn", "value": "VYPRVPN" }, + { "label": "Windscribe", "value": "WINDSCRIBE" }, + { "label": "ZoogVPN", "value": "ZOOGVPN" } + ], + "env_variable": "TRANSMISSION_OVPN_PROVIDER" + }, + { + "type": "boolean", + "label": "OpenVPN > Use VPN DNS", + "env_variable": "TRANSMISSION_PEER_DNS" + }, + { + "label": "Transmission > WebUI", + "type": "text", + "required": true, + "options": [ + { "label": "Combustion", "value": "combustion" }, + { "label": "Kettu", "value": "kettu" }, + { "label": "Web-Control", "value": "transmission-web-control" }, + { "label": "Flood", "value": "flood-for-transmission" }, + { "label": "Shift", "value": "shift" }, + { "label": "Transmissionic", "value": "transmissionic" } + ], + "env_variable": "TRANSMISSION_WEBUI" + }, + { + "type": "boolean", + "label": "Transmission > Enable DHT", + "env_variable": "TRANSMISSION_DHT_ENABLED" + }, + { + "type": "boolean", + "label": "Transmission > Enable LPD", + "env_variable": "TRANSMISSION_LPD_ENABLED" + }, + { + "type": "boolean", + "label": "Transmission > Enable PEX", + "env_variable": "TRANSMISSION_PEX_ENABLED" + }, + { + "type": "boolean", + "label": "Transmission > Enable Blocklist", + "env_variable": "TRANSMISSION_BLOCKLIST_ENABLED" + }, + { + "type": "text", + "label": "Transmission > Blocklist URL", + "placeholder": "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz", + "env_variable": "TRANSMISSION_BLOCKLIST_URL" + } + ] +} diff --git a/apps/transmission-vpn/data/config/.gitkeep b/apps/transmission-vpn/data/config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/transmission-vpn/docker-compose.yml b/apps/transmission-vpn/docker-compose.yml new file mode 100644 index 00000000..ffe77893 --- /dev/null +++ b/apps/transmission-vpn/docker-compose.yml @@ -0,0 +1,79 @@ +services: + transmission-vpn: + image: haugene/transmission-openvpn:5.0.2 + container_name: transmission-vpn + cap_add: + - NET_ADMIN + devices: + - /dev/net/tun + dns: + - ${DNS_IP} + environment: + - PUID=${TRANSMISSION_PUID-1000} + - PGID=${TRANSMISSION_PGID-1000} + - TZ=${TZ-Europe/Paris} + - USER=${TRANSMISSION_USERNAME} + - PASS=${TRANSMISSION_PASSWORD} + - OPENVPN_PROVIDER=${TRANSMISSION_OVPN_PROVIDER-NORDVPN} + - OPENVPN_CONFIG=${TRANSMISSION_OVPN_CONFIG} + - OPENVPN_USERNAME=${TRANSMISSION_OVPN_USERNAME} + - OPENVPN_PASSWORD=${TRANSMISSION_OVPN_PASSWORD} + - OPENVPN_OPTS=--inactive 3600 --ping 10 --ping-exit 60 --pull-filter ignore ping + - LOCAL_NETWORK=${TRANSMISSION_OVPN_LOCAL_NETWORK-10.0.0.0/8,172.16.0.0/12,192.168.0.0/16} + - TRANSMISSION_WEB_UI=${TRANSMISSION_WEBUI} + - LOG_TO_STDOUT=true + - GLOBAL_APPLY_PERMISSIONS=false + - CREATE_TUN_DEVICE=${TRANSMISSION_CREATE_TUN_DEVICE-false} + - PEER_DNS=${TRANSMISSION_PEER_DNS-false} + - TRANSMISSION_DOWNLOAD_DIR=/media/torrents/complete + - TRANSMISSION_INCOMPLETE_DIR_ENABLED=true + - TRANSMISSION_INCOMPLETE_DIR=/media/torrents/incomplete + - TRANSMISSION_PREALLOCATION=1 + - TRANSMISSION_DHT_ENABLED=${TRANSMISSION_DHT_ENABLED-false} + - TRANSMISSION_LPD_ENABLED=${TRANSMISSION_LPD_ENABLED-false} + - TRANSMISSION_PEX_ENABLED=${TRANSMISSION_PEX_ENABLED-false} + - TRANSMISSION_BLOCKLIST_ENABLED=${TRANSMISSION_BLOCKLIST_ENABLED-true} + - TRANSMISSION_BLOCKLIST_URL=${TRANSMISSION_BLOCKLIST_URL-http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz} + + volumes: + - ${APP_DATA_DIR}/data/config:/config + - ${ROOT_FOLDER_HOST}/media/torrents:/media/torrents + ports: + - ${APP_PORT}:9091 + - 51413:51413 + - 51413:51413/udp + restart: unless-stopped + networks: + - tipi_main_network + sysctls : + - net.ipv6.conf.all.disable_ipv6=0 + logging: + driver: json-file + options: + max-size: 10m + labels: + # Main + traefik.enable: true + traefik.http.middlewares.transmission-web-redirect.redirectscheme.scheme: https + traefik.http.services.transmission.loadbalancer.server.scheme: http + traefik.http.services.transmission.loadbalancer.server.port: 9091 + # Web + traefik.http.routers.transmission-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.transmission-insecure.entrypoints: web + traefik.http.routers.transmission-insecure.service: transmission + traefik.http.routers.transmission-insecure.middlewares: transmission-web-redirect + # Websecure + traefik.http.routers.transmission.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.transmission.entrypoints: websecure + traefik.http.routers.transmission.service: transmission + traefik.http.routers.transmission.tls.certresolver: myresolver + # Local domain + traefik.http.routers.transmission-local-insecure.rule: Host(`transmission.${LOCAL_DOMAIN}`) + traefik.http.routers.transmission-local-insecure.entrypoints: web + traefik.http.routers.transmission-local-insecure.service: transmission + traefik.http.routers.transmission-local-insecure.middlewares: transmission-web-redirect + # Local domain secure + traefik.http.routers.transmission-local.rule: Host(`transmission.${LOCAL_DOMAIN}`) + traefik.http.routers.transmission-local.entrypoints: websecure + traefik.http.routers.transmission-local.service: transmission + traefik.http.routers.transmission-local.tls: true diff --git a/apps/transmission-vpn/metadata/description.md b/apps/transmission-vpn/metadata/description.md new file mode 100644 index 00000000..94776ed0 --- /dev/null +++ b/apps/transmission-vpn/metadata/description.md @@ -0,0 +1,54 @@ +## Recommended VPN +This container is heavily tested using +[NordVPN, get 3 months free here.](https://ref.nordvpn.com/EQNOEHVwOCW) + +## Features + * Choose your Web UI ! + * Support many OpenVPN providers ([complete list](https://haugene.github.io/docker-transmission-openvpn/supported-providers/)) + * Works with traefik ! + * Pre-configured for Tipi. + * Healthcheck + * Highly configurable. + +## Documentation + +Don't hesitate to read related docs available here: https://haugene.github.io/docker-transmission-openvpn/ + +## VPN Provider Settings +You can configure specific settings to your provider by creating a `docker-compose.yml` file in your `user-config` directory. +| Directory | File | +|-------------------------------|------------------| +| /runtipi/user-config/transmission-vpn/ | docker-compose.yml | + +With the following content by e.g. for NordVPN: +``` +services: + transmission-vpn: + environment: + - NORDVPN_COUNTRY=FR + - NORDVPN_CATEGORY=legacy_p2p # Servers optimized for P2P usage + - NORDVPN_PROTOCOL=tcp + - NORDVPN_SERVER=fr000.nordvpn.com +``` +Instructions for NordVPN can be found here: https://haugene.github.io/docker-transmission-openvpn/provider-specific/ + +For other's supported providers: https://haugene.github.io/docker-transmission-openvpn/supported-providers/ + +## Fast, easy, and free BitTorrent client + +Docker container running Transmission torrent client with WebUI over an OpenVPN tunnel + +Transmission is a fast, easy, and free BitTorrent client. It comes in several flavors: + * A native macOS GUI application + * GTK+ and Qt GUI applications for Linux, BSD, etc. + * A headless daemon for servers and routers + * A web UI for remote controlling any of the above + +Visit [https://transmissionbt.com/](https://transmissionbt.com/) for more information. + +## Folder Info + +| Root Folder | Container Folder | +|-------------------------------|------------------| +| /runtipi/app-data/transmission/data/config | /config | +| /runtipi/media/torrents | /media/torrents | diff --git a/apps/transmission-vpn/metadata/logo.jpg b/apps/transmission-vpn/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca44baf060b0ed2587e3ec1b6ed449b07befd802 GIT binary patch literal 21494 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