diff --git a/README.md b/README.md index 7ea9964..91db2f9 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Clone the repository and run the local development installer: git clone https://github.com/zdzichu6969/pyTorrent.git cd pyTorrent ./install.sh -. venv/bin/activate +. .venv/bin/activate python app.py ``` @@ -196,7 +196,7 @@ curl -fsSL https://raw.githubusercontent.com/zdzichu6969/pyTorrent/master/script Recommended production command: ```bash -. venv/bin/activate +. .venv/bin/activate gunicorn --worker-class gthread \ --workers 1 \ --threads 32 \ @@ -276,7 +276,7 @@ PYTORRENT_AUTH_PROVIDER=local Reset a local user's password: ```bash -. venv/bin/activate +. .venv/bin/activate python -m pytorrent.cli reset-password admin new_password ``` @@ -470,7 +470,7 @@ PYTORRENT_DEBUG_INSTALL=1 bash scripts/install_stack.sh ## Development ```bash -. venv/bin/activate +. .venv/bin/activate python app.py ``` diff --git a/deploy/pytorrent.service b/deploy/pytorrent.service index 2cffdfd..1813d76 100644 --- a/deploy/pytorrent.service +++ b/deploy/pytorrent.service @@ -13,7 +13,7 @@ Group=pytorrent WorkingDirectory=/opt/pyTorrent Environment="PYTHONUNBUFFERED=1" EnvironmentFile=/opt/pyTorrent/.env -ExecStart=/opt/pyTorrent/venv/bin/gunicorn -c /opt/pyTorrent/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind ${PYTORRENT_HOST}:${PYTORRENT_PORT} wsgi:app +ExecStart=/opt/pyTorrent/.venv/bin/gunicorn -c /opt/pyTorrent/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind ${PYTORRENT_HOST}:${PYTORRENT_PORT} wsgi:app Restart=always RestartSec=3 KillSignal=SIGINT diff --git a/install.sh b/install.sh index b4303e5..9dae580 100755 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -python3 -m venv venv -. venv/bin/activate +python3 -m venv .venv +. .venv/bin/activate pip install --upgrade pip pip install -r requirements.txt cp -n .env.example .env || true @@ -11,4 +11,4 @@ mkdir -p data chmod 755 data ./scripts/download_geoip.sh data/GeoLite2-City.mmdb python -c "from pytorrent.db import init_db; init_db(); print(\"SQLite initialized\")" -echo "Run: . venv/bin/activate && python app.py" +echo "Run: . .venv/bin/activate && python app.py" diff --git a/scripts/INSTALL.md b/scripts/INSTALL.md index c143a66..95f0c49 100644 --- a/scripts/INSTALL.md +++ b/scripts/INSTALL.md @@ -131,7 +131,7 @@ curl -fsSL https://raw.githubusercontent.com/zdzichu6969/pyTorrent/master/script The API configurator can be run manually: ```bash -/opt/pytorrent/venv/bin/python /opt/pytorrent/scripts/stack_installers/configure_pytorrent_api.py \ +/opt/pytorrent/.venv/bin/python /opt/pytorrent/scripts/stack_installers/configure_pytorrent_api.py \ --base-url http://127.0.0.1:8090 \ --profile-name "Local rTorrent" \ --scgi-url scgi://127.0.0.1:5000 diff --git a/scripts/install_debian_ubuntu.sh b/scripts/install_debian_ubuntu.sh index 55e284d..fe8482e 100755 --- a/scripts/install_debian_ubuntu.sh +++ b/scripts/install_debian_ubuntu.sh @@ -46,6 +46,7 @@ mkdir -p "${APP_DIR}" rsync -a --delete \ --exclude '.git' \ + --exclude '.venv' \ --exclude 'venv' \ --exclude '__pycache__' \ --exclude '*.pyc' \ @@ -53,10 +54,10 @@ rsync -a --delete \ cd "${APP_DIR}" -"${PYTHON_BIN}" -m venv venv +"${PYTHON_BIN}" -m venv .venv -venv/bin/pip install --upgrade pip wheel -venv/bin/pip install -r requirements.txt +.venv/bin/pip install --upgrade pip wheel +.venv/bin/pip install -r requirements.txt mkdir -p data instance logs @@ -91,7 +92,7 @@ chown "${APP_USER}:${APP_USER}" .env if [[ -f scripts/download_frontend_libs.py ]]; then sudo -u "${APP_USER}" \ - "${APP_DIR}/venv/bin/python" \ + "${APP_DIR}/.venv/bin/python" \ scripts/download_frontend_libs.py || true fi @@ -113,7 +114,7 @@ Group=${APP_USER} WorkingDirectory=${APP_DIR} Environment="PYTHONUNBUFFERED=1" EnvironmentFile=${APP_DIR}/.env -ExecStart=${APP_DIR}/venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} --access-logfile - --error-logfile - wsgi:app +ExecStart=${APP_DIR}/.venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} --access-logfile - --error-logfile - wsgi:app Restart=always RestartSec=3 KillSignal=SIGINT diff --git a/scripts/install_pytorrent_only.sh b/scripts/install_pytorrent_only.sh index 0dd355e..818db46 100755 --- a/scripts/install_pytorrent_only.sh +++ b/scripts/install_pytorrent_only.sh @@ -299,16 +299,16 @@ copy_application() { local project_dir project_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" mkdir -p "${APP_DIR}" - rsync -a --delete --exclude '.git' --exclude 'venv' --exclude '__pycache__' --exclude '*.pyc' "${project_dir}/" "${APP_DIR}/" + rsync -a --delete --exclude '.git' --exclude 'venv' --exclude '.venv' --exclude '__pycache__' --exclude '*.pyc' "${project_dir}/" "${APP_DIR}/" chown -R "${APP_USER}:${APP_USER}" "${APP_DIR}" "/var/lib/${APP_USER}" || true } install_python_app() { # Note: A private virtualenv keeps pyTorrent dependencies isolated from system Python packages. cd "${APP_DIR}" - "${PYTHON_BIN}" -m venv venv - venv/bin/pip install --upgrade pip wheel - venv/bin/pip install -r requirements.txt + "${PYTHON_BIN}" -m venv .venv + .venv/bin/pip install --upgrade pip wheel + .venv/bin/pip install -r requirements.txt mkdir -p data instance logs chown -R "${APP_USER}:${APP_USER}" "${APP_DIR}" } @@ -426,7 +426,7 @@ write_env() { install_frontend_libs() { # Note: Offline mode downloads local JS/CSS assets during installation; online mode uses CDN links. if [[ "${LIBS_MODE}" == "offline" && -f "${APP_DIR}/scripts/download_frontend_libs.py" ]]; then - sudo -u "${APP_USER}" "${APP_DIR}/venv/bin/python" "${APP_DIR}/scripts/download_frontend_libs.py" || true + sudo -u "${APP_USER}" "${APP_DIR}/.venv/bin/python" "${APP_DIR}/scripts/download_frontend_libs.py" || true fi if [[ -f "${APP_DIR}/scripts/download_geoip.sh" ]]; then sudo -u "${APP_USER}" bash "${APP_DIR}/scripts/download_geoip.sh" "${APP_DIR}/data/GeoLite2-City.mmdb" || true @@ -444,7 +444,7 @@ configure_database() { PROFILE_NAME="${PROFILE_NAME}" \ SCGI_URL="${SCGI_URL}" \ SKIP_PROFILE="${SKIP_PROFILE}" \ - "${APP_DIR}/venv/bin/python" - <<'PY' + "${APP_DIR}/.venv/bin/python" - <<'PY' import os from pytorrent.db import connect, init_db, utcnow from pytorrent.services.auth import password_hash @@ -518,7 +518,7 @@ Group=${APP_USER} WorkingDirectory=${APP_DIR} Environment="PYTHONUNBUFFERED=1" EnvironmentFile=${APP_DIR}/.env -ExecStart=${APP_DIR}/venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} wsgi:app +ExecStart=${APP_DIR}/.venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} wsgi:app Restart=always RestartSec=3 KillSignal=SIGINT diff --git a/scripts/stack_installers/install_pytorrent_rhel.sh b/scripts/stack_installers/install_pytorrent_rhel.sh index 61dda79..94d91a6 100755 --- a/scripts/stack_installers/install_pytorrent_rhel.sh +++ b/scripts/stack_installers/install_pytorrent_rhel.sh @@ -44,15 +44,16 @@ mkdir -p "${APP_DIR}" rsync -a --delete \ --exclude '.git' \ --exclude 'venv' \ + --exclude '.venv' \ --exclude '__pycache__' \ --exclude '*.pyc' \ ./ "${APP_DIR}/" cd "${APP_DIR}" -"${PYTHON_BIN}" -m venv venv -venv/bin/pip install --upgrade pip wheel -venv/bin/pip install -r requirements.txt +"${PYTHON_BIN}" -m venv .venv +.venv/bin/pip install --upgrade pip wheel +.venv/bin/pip install -r requirements.txt mkdir -p data instance logs data/logs chown -R "${APP_USER}:${APP_USER}" "${APP_DIR}" "/var/lib/${APP_USER}" @@ -95,7 +96,7 @@ chown -R "${APP_USER}:${APP_USER}" "${PYTORRENT_LOG_DIR_VALUE}" || true chown "${APP_USER}:${APP_USER}" .env if [[ -f scripts/download_frontend_libs.py ]]; then - sudo -u "${APP_USER}" "${APP_DIR}/venv/bin/python" scripts/download_frontend_libs.py || true + sudo -u "${APP_USER}" "${APP_DIR}/.venv/bin/python" scripts/download_frontend_libs.py || true fi if [[ -f scripts/download_geoip.sh ]]; then @@ -115,7 +116,7 @@ Group=${APP_USER} WorkingDirectory=${APP_DIR} Environment="PYTHONUNBUFFERED=1" EnvironmentFile=${APP_DIR}/.env -ExecStart=${APP_DIR}/venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} --access-logfile - --error-logfile - wsgi:app +ExecStart=${APP_DIR}/.venv/bin/gunicorn -c ${APP_DIR}/gunicorn.conf.py --worker-class gthread --workers 1 --threads 32 --bind \${PYTORRENT_HOST}:\${PYTORRENT_PORT} --access-logfile - --error-logfile - wsgi:app Restart=always RestartSec=3 KillSignal=SIGINT diff --git a/scripts/stack_installers/install_stack_arch.sh b/scripts/stack_installers/install_stack_arch.sh index 66501af..c32f53c 100755 --- a/scripts/stack_installers/install_stack_arch.sh +++ b/scripts/stack_installers/install_stack_arch.sh @@ -233,7 +233,7 @@ fi bash "${PROJECT_DIR}/scripts/install_pytorrent_only.sh" "${PYTORRENT_ONLY_ARGS[@]}" if [[ -n "${PYTORRENT_API_TOKEN}" ]]; then - "${PYTORRENT_APP_DIR}/venv/bin/python" "${PYTORRENT_APP_DIR}/scripts/stack_installers/configure_pytorrent_api.py" \ + "${PYTORRENT_APP_DIR}/.venv/bin/python" "${PYTORRENT_APP_DIR}/scripts/stack_installers/configure_pytorrent_api.py" \ --base-url "${PYTORRENT_BASE_URL}" \ --profile-name "${PYTORRENT_PROFILE_NAME}" \ --scgi-url "${PYTORRENT_RTORRENT_SCGI_URL}" \