Files
pyTorrent/scripts/stack_installers/install_stack_debian_ubuntu.sh
T
Mateusz Gruszczyński f04eb7016f fix init
2026-05-31 10:09:47 +02:00

169 lines
5.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# One-command installer for rTorrent + pyTorrent on Debian/Ubuntu.
# Notes:
# - rTorrent is built as a minimal v0.16.11 install with tinyxml2 XML-RPC by default.
# - pyTorrent is configured through its HTTP API after the service starts.
if [[ "${EUID}" -ne 0 ]]; then
echo "Run as root: sudo $0" >&2
exit 1
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
RTORRENT_USER="${RTORRENT_USER:-rtorrent}"
RTORRENT_HOME="${RTORRENT_HOME:-/home/${RTORRENT_USER}}"
RTORRENT_BASE_DIR="${RTORRENT_BASE_DIR:-/opt/rtorrent_build}"
RTORRENT_SCGI_PORT="${RTORRENT_SCGI_PORT:-5000}"
RTORRENT_TORRENT_PORT="${RTORRENT_TORRENT_PORT:-51300}"
RTORRENT_REF="${RTORRENT_REF:-v0.16.11}"
LIBTORRENT_REF="${LIBTORRENT_REF:-v0.16.11}"
PYTORRENT_APP_DIR="${PYTORRENT_APP_DIR:-/opt/pytorrent}"
PYTORRENT_PORT="${PYTORRENT_PORT:-8090}"
PYTORRENT_BASE_URL="${PYTORRENT_BASE_URL:-http://127.0.0.1:${PYTORRENT_PORT}}"
PYTORRENT_PROFILE_NAME="${PYTORRENT_PROFILE_NAME:-Local rTorrent}"
PYTORRENT_API_TOKEN="${PYTORRENT_API_TOKEN:-}"
PYTORRENT_SERVICE_NAME="${PYTORRENT_SERVICE_NAME:-pytorrent}"
RTORRENT_SCGI_BACKEND="${RTORRENT_SCGI_BACKEND:-tcp}"
RTORRENT_SCGI_SOCKET="${RTORRENT_SCGI_SOCKET:-/run/rtorrent/rtorrent.sock}"
RTORRENT_SCGI_PROXY_LISTEN="${RTORRENT_SCGI_PROXY_LISTEN:-127.0.0.1:5050}"
RTORRENT_SCGI_PROXY_TOKEN="${RTORRENT_SCGI_PROXY_TOKEN:-}"
PYTORRENT_RTORRENT_SCGI_URL="${PYTORRENT_RTORRENT_SCGI_URL:-scgi://127.0.0.1:${RTORRENT_SCGI_PORT}}"
RTORRENT_EXTRA_ARGS=()
while [[ $# -gt 0 ]]; do
case "$1" in
--with-xmlrpc-c)
RTORRENT_EXTRA_ARGS+=(--with-xmlrpc-c)
shift
;;
--scgi-unix-socket)
RTORRENT_SCGI_BACKEND=unix
shift
;;
--rtorrent-socket)
RTORRENT_SCGI_BACKEND=unix
RTORRENT_SCGI_SOCKET="$2"
shift 2
;;
*)
echo "Unknown option: $1" >&2
exit 1
;;
esac
done
if [[ "${RTORRENT_WITH_XMLRPC_C:-0}" == "1" ]]; then
RTORRENT_EXTRA_ARGS+=(--with-xmlrpc-c)
fi
if [[ "${RTORRENT_SCGI_BACKEND}" == "unix" ]]; then
if [[ -z "${RTORRENT_SCGI_PROXY_TOKEN}" ]]; then
RTORRENT_SCGI_PROXY_TOKEN="$(${PYTHON_BIN:-python3} - <<'PYTOKEN'
import secrets
print(secrets.token_urlsafe(32))
PYTOKEN
)"
fi
PYTORRENT_RTORRENT_SCGI_URL="scgi://${RTORRENT_SCGI_PROXY_LISTEN}/proxy/${RTORRENT_SCGI_PROXY_TOKEN}"
elif [[ "${RTORRENT_SCGI_BACKEND}" != "tcp" ]]; then
echo "Invalid RTORRENT_SCGI_BACKEND: ${RTORRENT_SCGI_BACKEND}" >&2
exit 1
fi
export PYTORRENT_APP_DIR PYTORRENT_PORT PYTORRENT_SERVICE_NAME PYTORRENT_API_TOKEN
install_debian_stack_prerequisites() {
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
tar \
gzip \
sudo \
python3 \
python3-venv \
python3-pip \
build-essential \
pkg-config \
libtool \
autoconf \
automake \
git \
make \
gcc \
g++ \
libssl-dev \
libncurses-dev \
libncurses5-dev \
libncursesw5-dev \
libexpat1-dev \
libcurl4-openssl-dev \
libxml2-dev \
libtinyxml2-dev \
libreadline-dev \
zlib1g-dev \
bison \
flex \
m4 \
gettext \
texinfo \
patch \
diffutils \
file \
procps \
xz-utils
}
install_debian_stack_prerequisites
RTORRENT_INSTALL_ARGS=(
--yes
--minimal
"${RTORRENT_EXTRA_ARGS[@]}"
)
if [[ "${PYTORRENT_DEBUG_INSTALL:-0}" == "1" ]]; then
RTORRENT_INSTALL_ARGS+=(--debug)
fi
if [[ "${RTORRENT_SCGI_BACKEND}" == "unix" ]]; then
RTORRENT_INSTALL_ARGS+=(--scgi-unix-socket "${RTORRENT_SCGI_SOCKET}")
fi
python3 "${SCRIPT_DIR}/install_rtorrent.py" \
"${RTORRENT_INSTALL_ARGS[@]}" \
--force-config \
--base-dir "${RTORRENT_BASE_DIR}" \
--user "${RTORRENT_USER}" \
--group "${RTORRENT_USER}" \
--home "${RTORRENT_HOME}" \
--scgi-port "${RTORRENT_SCGI_PORT}" \
--torrent-port "${RTORRENT_TORRENT_PORT}" \
--rtorrent-ref "${RTORRENT_REF}" \
--libtorrent-ref "${LIBTORRENT_REF}"
cd "${PROJECT_DIR}"
PYTORRENT_ONLY_ARGS=(
--yes
--app-dir "${PYTORRENT_APP_DIR}"
--port "${PYTORRENT_PORT}"
--service-name "${PYTORRENT_SERVICE_NAME}"
--profile-name "${PYTORRENT_PROFILE_NAME}"
--scgi-url "${PYTORRENT_RTORRENT_SCGI_URL}"
)
if [[ "${RTORRENT_SCGI_BACKEND}" == "unix" ]]; then
PYTORRENT_ONLY_ARGS+=(
--install-scgi-proxy yes
--rtorrent-user "${RTORRENT_USER}"
--rtorrent-socket "${RTORRENT_SCGI_SOCKET}"
--proxy-target-network unix
--proxy-target-address "${RTORRENT_SCGI_SOCKET}"
--proxy-listen "${RTORRENT_SCGI_PROXY_LISTEN}"
--proxy-token "${RTORRENT_SCGI_PROXY_TOKEN}"
)
fi
bash "${PROJECT_DIR}/scripts/install_pytorrent_only.sh" "${PYTORRENT_ONLY_ARGS[@]}"
echo "Done. pyTorrent: ${PYTORRENT_BASE_URL} | rTorrent SCGI: ${PYTORRENT_RTORRENT_SCGI_URL}"