Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
91de209
Create docker-transmission-openvpn application
SunFlowerOwl Sep 3, 2025
4022543
Partially addressed review 1
SunFlowerOwl Sep 5, 2025
781851a
Fix: Avoid .env generation error
SunFlowerOwl Sep 6, 2025
1135f85
Add execute right on image scripts
SunFlowerOwl Sep 6, 2025
7050bed
Fix: Force transmission home var
SunFlowerOwl Sep 6, 2025
9017776
Fix: unsupported custom app path
SunFlowerOwl Sep 6, 2025
7f6ce18
Review: Make .env generation simpler
SunFlowerOwl Sep 6, 2025
4ad7f58
Fix: Change cron command causing error due to crlf
SunFlowerOwl Sep 6, 2025
27a8345
Review: Rework fetching WebUI
SunFlowerOwl Sep 6, 2025
43ce133
Improve cleaning up
SunFlowerOwl Sep 6, 2025
ab709cd
Add warning message to setup vpn provider
SunFlowerOwl Sep 7, 2025
427c264
Rework update function
SunFlowerOwl Sep 7, 2025
c731ff8
Fix: Change var_tun default value to yes
SunFlowerOwl Sep 7, 2025
59758de
Review: Remove Healthcheck cron job
SunFlowerOwl Sep 7, 2025
60309db
Review: Directly deploy WebUI to /opt/transmission-ui/
SunFlowerOwl Sep 7, 2025
13ff7f0
Make custom config persistent when updating
SunFlowerOwl Sep 8, 2025
2a1a39a
Fix: fetch WebUI from correct URL (old one was invalid)
SunFlowerOwl Sep 8, 2025
44a131d
Fix: resolve conflicting Privoxy instance
SunFlowerOwl Sep 9, 2025
b75f9c8
Fix: align binary path when fetching branch vs release
SunFlowerOwl Sep 9, 2025
e92605b
Security: Remove old and deprecated WebUI for security reasons
SunFlowerOwl Sep 13, 2025
28c7298
Review: drop unnecessary packages and optimize implementations
SunFlowerOwl Sep 13, 2025
567a209
Review: Implement local network dynamic detection
SunFlowerOwl Sep 26, 2025
375909e
CR, OS: Migrate to Debian 13
SunFlowerOwl Oct 9, 2025
351f7ed
Merge branch 'community-scripts:main' into dev/SunFlowerOwl
SunFlowerOwl Oct 9, 2025
e5b5378
Merge branch 'community-scripts:main' into dev/SunFlowerOwl
SunFlowerOwl Oct 10, 2025
7cc5d4a
Use quiet mode for several commands as recommended
SunFlowerOwl Oct 10, 2025
3be233b
Review: Replace hard coding app name instead of using var $APP
SunFlowerOwl Oct 10, 2025
a4a5cd4
Review: Reduce amount of msg_blocks
SunFlowerOwl Oct 10, 2025
50c52bd
refactor
CrazyWolf13 Oct 14, 2025
1557a98
refactor
CrazyWolf13 Oct 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions ct/transmission-openvpn.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: SunFlowerOwl
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/haugene/docker-transmission-openvpn

APP="transmission-openvpn"
var_tags="${var_tags:-torrent;vpn}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
var_tun="${var_tun:-yes}"

header_info "$APP"
variables
color
catch_errors

function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/transmission-openvpn/ ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi

msg_info "Updating Transmission Web UIs"
rm -rf /opt/transmission-ui/*
if check_for_gh_release "flood-for-transmission" "johman10/flood-for-transmission"; then
fetch_and_deploy_gh_release "flood-for-transmission" "johman10/flood-for-transmission" "tarball" "latest" "/opt/transmission-ui/flood-for-transmission"
fi
if check_for_gh_release "combustion" "Secretmapper/combustion"; then
fetch_and_deploy_gh_release "combustion" "Secretmapper/combustion" "tarball" "latest" "/opt/transmission-ui/combustion"
fi
if check_for_gh_release "transmissionic" "6c65726f79/Transmissionic"; then
fetch_and_deploy_gh_release "transmissionic" "6c65726f79/Transmissionic" "tarball" "latest" "/opt/transmission-ui/transmissionic"
fi
curl -fsSL -o "Shift-master.tar.gz" "https://github.com/killemov/Shift/archive/master.tar.gz"
tar xzf Shift-master.tar.gz
mv Shift-master /opt/transmission-ui/shift
curl -fsSL -o "kettu-master.tar.gz" "https://github.com/endor/kettu/archive/master.tar.gz"
tar xzf kettu-master.tar.gz
mv kettu-master /opt/transmission-ui/kettu
msg_ok "Updated Transmission Web UIs"

msg_info "Updating Dependencies"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated Dependencies"

if check_for_gh_release "docker-transmission-openvpn" "haugene/docker-transmission-openvpn"; then
msg_info "Stopping $APP"
systemctl stop openvpn-custom
msg_ok "Stopped $APP"

msg_info "Updating ${APP} LXC"
fetch_and_deploy_gh_release "docker-transmission-openvpn" "haugene/docker-transmission-openvpn" "tarball" "latest" "/opt/docker-transmission-openvpn"
rm -rf /etc/openvpn/* /etc/transmission/* /etc/scripts/* /opt/privoxy/*
cp -r /opt/docker-transmission-openvpn/openvpn/* /etc/openvpn/
cp -r /opt/docker-transmission-openvpn/transmission/* /etc/transmission/
cp -r /opt/docker-transmission-openvpn/scripts/* /etc/scripts/
cp -r /opt/docker-transmission-openvpn/privoxy/scripts/* /opt/privoxy/
chmod +x /etc/openvpn/*.sh || true
chmod +x /etc/scripts/*.sh || true
chmod +x /opt/privoxy/*.sh || true
msg_ok "Updated ${APP} LXC"

msg_info "Starting $APP"
systemctl start openvpn-custom
msg_ok "Started $APP"
fi

msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
rm -rf /opt/docker-transmission-openvpn
rm -f Shift-master.tar.gz
rm -f kettu-master.tar.gz
msg_ok "Cleaned"

exit
}

start
build_container
description

msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091${CL}"
40 changes: 40 additions & 0 deletions frontend/public/json/transmission-openvpn.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"name": "Transmission-Openvpn",
"slug": "transmission-openvpn",
"categories": [
11
],
"date_created": "2025-09-04",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 9091,
"documentation": "https://haugene.github.io/docker-transmission-openvpn/",
"config_path": "/opt/transmission-openvpn/",
"website": "https://github.com/haugene/docker-transmission-openvpn",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/transmission.webp",
"description": "This project runs Transmission + OpenVPN natively in an LXC container, using the popular docker-transmission-openvpn image as a base. It ensures all torrent traffic is securely routed through a VPN tunnel, supports a wide range of VPN providers, and offers flexible configuration options",
"install_methods": [
{
"type": "default",
"script": "ct/transmission-openvpn.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 8,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "This application requires a VPN provider to work. Please refer to your VPN provider’s documentation for setting up OpenVPN.",
"type": "warning"
}
]
}
156 changes: 156 additions & 0 deletions install/transmission-openvpn-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
#!/usr/bin/env bash

# Copyright (c) 2021-2025 community-scripts ORG
# Author: SunFlowerOwl
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/haugene/docker-transmission-openvpn

# Import Functions und Setup
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os

msg_info "Installing Dependencies"
$STD apt-get install -y \
dumb-init \
tzdata \
dnsutils \
iputils-ping \
ufw \
iproute2 \
openssh-client \
git \
jq \
curl \
wget \
unrar-free \
unzip \
bc \
systemd
msg_ok "Installed Dependencies"

msg_info "Installing Transmission"
mkdir -p /etc/systemd/system-preset
echo "disable *" > /etc/systemd/system-preset/99-no-autostart.preset
export DEBIAN_FRONTEND=noninteractive
$STD apt install -y transmission-daemon
rm -f /etc/systemd/system-preset/99-no-autostart.preset
systemctl preset-all
systemctl disable --now transmission-daemon
systemctl mask transmission-daemon
msg_ok "Installed Transmission"

msg_info "Installing Openvpn"
$STD apt-get install -y openvpn
msg_ok "Installed Openvpn"

msg_info "Installing Privoxy"
$STD apt-get install -y privoxy
msg_ok "Installed Privoxy"

msg_info "Installing ${APPLICATION}"
useradd -u 911 -U -d /config -s /usr/sbin/nologin abc
fetch_and_deploy_gh_release "docker-transmission-openvpn" "haugene/docker-transmission-openvpn" "tarball" "latest" "/opt/docker-transmission-openvpn"
mkdir -p /etc/openvpn /etc/transmission /etc/scripts /opt/privoxy
cp -r /opt/docker-transmission-openvpn/openvpn/* /etc/openvpn/
cp -r /opt/docker-transmission-openvpn/transmission/* /etc/transmission/
cp -r /opt/docker-transmission-openvpn/scripts/* /etc/scripts/
cp -r /opt/docker-transmission-openvpn/privoxy/scripts/* /opt/privoxy/
chmod +x /etc/openvpn/*.sh || true
chmod +x /etc/scripts/*.sh || true
chmod +x /opt/privoxy/*.sh || true
msg_ok "Installed ${APPLICATION}"

msg_info "Support legacy IPTables commands"
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
msg_ok "Support legacy IPTables commands"

msg_info "Installing WebUI"
mkdir -p /opt/transmission-ui
curl -fsSL -o "Shift-master.tar.gz" "https://github.com/killemov/Shift/archive/master.tar.gz"
tar xzf Shift-master.tar.gz
mv Shift-master /opt/transmission-ui/shift
curl -fsSL -o "kettu-master.tar.gz" "https://github.com/endor/kettu/archive/master.tar.gz"
tar xzf kettu-master.tar.gz
mv kettu-master /opt/transmission-ui/kettu
fetch_and_deploy_gh_release "flood-for-transmission" "johman10/flood-for-transmission" "tarball" "latest" "/opt/transmission-ui/flood-for-transmission"
fetch_and_deploy_gh_release "combustion" "Secretmapper/combustion" "tarball" "latest" "/opt/transmission-ui/combustion"
fetch_and_deploy_gh_release "transmissionic" "6c65726f79/Transmissionic" "tarball" "latest" "/opt/transmission-ui/transmissionic"
msg_ok "Installed WebUI"

msg_info "Creating Service"
mkdir -p /opt/transmission-openvpn
cat > "/opt/transmission-openvpn/.env" <<EOF
OPENVPN_USERNAME="username"
OPENVPN_PASSWORD="password"
OPENVPN_PROVIDER="PIA"
OPENVPN_CONFIG=france
OPENVPN_OPTS="--inactive 3600 --ping 10 --ping-exit 60 --mute-replay-warnings"
CUSTOM_OPENVPN_CONFIG_DIR="/opt/transmission-openvpn"
GLOBAL_APPLY_PERMISSIONS="true"
TRANSMISSION_HOME="/config/transmission-home"
TRANSMISSION_RPC_PORT="9091"
TRANSMISSION_RPC_USERNAME=""
TRANSMISSION_RPC_PASSWORD=""
TRANSMISSION_DOWNLOAD_DIR="/data/complete"
TRANSMISSION_INCOMPLETE_DIR="/data/incomplete"
TRANSMISSION_WATCH_DIR="/data/watch"
TRANSMISSION_WEB_UI=""
TRANSMISSION_UMASK="2"
TRANSMISSION_RATIO_LIMIT_ENABLED="true"
TRANSMISSION_RATIO_LIMIT="0"
TRANSMISSION_RPC_WHITELIST_ENABLED="false"
TRANSMISSION_RPC_WHITELIST="127.0.0.1,192.168.*.*"
CREATE_TUN_DEVICE="false"
ENABLE_UFW="false"
UFW_ALLOW_GW_NET="false"
UFW_EXTRA_PORTS=""
UFW_DISABLE_IPTABLES_REJECT="false"
PUID="911"
PGID=""
PEER_DNS="true"
PEER_DNS_PIN_ROUTES="true"
DROP_DEFAULT_ROUTE=""
WEBPROXY_ENABLED="true"
WEBPROXY_PORT="8118"
WEBPROXY_BIND_ADDRESS=""
WEBPROXY_USERNAME=""
WEBPROXY_PASSWORD=""
LOG_TO_STDOUT="false"
HEALTH_CHECK_HOST="google.com"
SELFHEAL="false"
EOF

cat > /etc/systemd/system/openvpn-custom.service <<EOF
[Unit]
Description=Custom OpenVPN start service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/dumb-init /etc/openvpn/start.sh
Restart=on-failure
RestartSec=5
EnvironmentFile=/opt/transmission-openvpn/.env

[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now -q openvpn-custom.service
msg_ok "Created Service"

motd_ssh
customize

msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
rm -rf /opt/docker-transmission-openvpn
rm -f Shift-master.tar.gz
rm -f kettu-master.tar.gz
msg_ok "Cleaned"