mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-08-20 19:42:42 +02:00
05fdd15406
* Shelfmark: fix internal bypasser under the gevent worker The internal captcha bypasser never worked on this install. Shelfmark is served by gunicorn's GeventWebSocketWorker, and DOCKERMODE controls whether the bypass browser runs in a helper process "isolated from gunicorn/gevent" (upstream's _get_via_subprocess). With DOCKERMODE=false the SeleniumBase CDP browser starts inside the monkey-patched loop, its asyncio websocket never connects, and every bypass dies at "Pure CDP browser startup timed out after 45s" — searches then burn their whole retry budget and surface as "mirrors are blocked". Set DOCKERMODE=true for deployment type 1, and migrate existing installs on update. The flag is misnamed upstream: it gates gevent isolation, not Docker. Also drop chromium.service. Nothing in Shelfmark connects to port 9222 — the bypasser launches its own browser on a random port — so it only consumed ~226MB. With DOCKERMODE enabled it is additionally killed by Shelfmark's orphan-process reaper (pkill -f chromium) on every bypass and respawned by systemd, since an LXC shares its PID namespace. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Ln3yVj3sWHG2c6T78W1we * Shelfmark: address review — one check, drop comments Collapse the chromium.service removal and the DOCKERMODE migration into the single internal-bypasser check, as every affected install has both. Guard the disable so a second update run does not fail on the removed unit, matching esphome.sh. Drop the explanatory comments. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Ln3yVj3sWHG2c6T78W1we --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
208 lines
5.9 KiB
Bash
208 lines
5.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (c) 2021-2026 community-scripts ORG
|
|
# Author: vhsdream
|
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
# Source: https://github.com/calibrain/shelfmark
|
|
|
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
color
|
|
verb_ip6
|
|
catch_errors
|
|
setting_up_container
|
|
network_check
|
|
update_os
|
|
|
|
msg_info "Installing Dependencies"
|
|
$STD apt install -y unrar-free
|
|
ln -sf /usr/bin/unrar-free /usr/bin/unrar
|
|
msg_ok "Installed Dependencies"
|
|
|
|
mkdir -p /etc/shelfmark
|
|
cat <<EOF >/etc/shelfmark/.env
|
|
DOCKERMODE=false
|
|
URL_BASE=""
|
|
CONFIG_DIR=/etc/shelfmark
|
|
TMP_DIR=/tmp/shelfmark
|
|
ENABLE_LOGGING=true
|
|
FLASK_HOST=0.0.0.0
|
|
FLASK_PORT=8084
|
|
# SESSION_COOKIES_SECURE=true
|
|
# CWA_DB_PATH=
|
|
USE_CF_BYPASS=true
|
|
USING_EXTERNAL_BYPASSER=false
|
|
# EXT_BYPASSER_URL=
|
|
# EXT_BYPASSER_PATH=/v1
|
|
EOF
|
|
|
|
echo ""
|
|
echo ""
|
|
echo -e "${BL}Shelfmark Deployment Type${CL}"
|
|
echo "─────────────────────────────────────────"
|
|
echo "Please choose your deployment type:"
|
|
echo ""
|
|
echo " 1) Use Shelfmark's internal captcha bypasser (default)"
|
|
echo " 2) Install FlareSolverr in this LXC"
|
|
echo " 3) Use an existing Flaresolverr/Byparr LXC"
|
|
echo " 4) Disable captcha bypassing altogether (not recommended)"
|
|
echo ""
|
|
|
|
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
|
|
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}"
|
|
if [[ "$(arch_resolve)" == "arm64" && "$DEPLOYMENT_TYPE" == "2" ]]; then
|
|
msg_warn "FlareSolverr has no arm64 build; using Shelfmark's internal bypasser instead"
|
|
DEPLOYMENT_TYPE="1"
|
|
fi
|
|
|
|
case "$DEPLOYMENT_TYPE" in
|
|
1)
|
|
msg_ok "Using Shelfmark's internal captcha bypasser"
|
|
;;
|
|
2)
|
|
msg_ok "Proceeding with FlareSolverr installation"
|
|
;;
|
|
3)
|
|
echo ""
|
|
echo -e "${BL}Use an existing FlareSolverr/Byparr LXC${CL}"
|
|
echo "─────────────────────────────────────────"
|
|
echo "Enter the URL/IP address with port of your Flaresolverr/Byparr instance"
|
|
echo "Example: http://flaresoverr.homelab.lan:8191 or"
|
|
echo "http://192.168.10.99:8191"
|
|
echo ""
|
|
read -r -p "FlareSolverr/Byparr URL: " BYPASSER_URL
|
|
|
|
if [[ -z "$BYPASSER_URL" ]]; then
|
|
msg_warn "No Flaresolverr/Byparr URL provided. Falling back to Shelfmark's internal bypasser."
|
|
else
|
|
BYPASSER_URL="${BYPASSER_URL%/}"
|
|
msg_ok "FlareSolverr/Byparr URL: ${BYPASSER_URL}"
|
|
fi
|
|
;;
|
|
4)
|
|
msg_warn "Disabling captcha bypass. This may cause the majority of searches and downloads to fail."
|
|
;;
|
|
*)
|
|
msg_warn "Invalid selection. Reverting to default (internal bypasser)!"
|
|
;;
|
|
esac
|
|
|
|
if [[ "$DEPLOYMENT_TYPE" == "2" ]]; then
|
|
fetch_and_deploy_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "prebuild" "latest" "/opt/flaresolverr" "flaresolverr_linux_x64.tar.gz"
|
|
msg_info "Installing FlareSolverr (patience)"
|
|
$STD apt install -y xvfb
|
|
setup_deb822_repo \
|
|
"google-chrome" \
|
|
"https://dl.google.com/linux/linux_signing_key.pub" \
|
|
"https://dl.google.com/linux/chrome/deb/" \
|
|
"stable"
|
|
$STD apt install -y google-chrome-stable
|
|
rm /etc/apt/sources.list.d/google-chrome.list
|
|
sed -i -e '/BYPASSER=/s/false/true/' \
|
|
-e 's/^# EXT_/EXT_/' \
|
|
-e "s|_URL=.*|_URL=http://localhost:8191|" /etc/shelfmark/.env
|
|
msg_ok "Installed FlareSolverr"
|
|
elif [[ "$DEPLOYMENT_TYPE" == "3" ]]; then
|
|
sed -i -e '/BYPASSER=/s/false/true/' \
|
|
-e 's/^# EXT_/EXT_/' \
|
|
-e "s|_URL=.*|_URL=${BYPASSER_URL}|" /etc/shelfmark/.env
|
|
elif [[ "$DEPLOYMENT_TYPE" == "4" ]]; then
|
|
sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env
|
|
else
|
|
DEPLOYMENT_TYPE="1"
|
|
msg_info "Installing internal bypasser dependencies"
|
|
$STD apt install -y --no-install-recommends \
|
|
xvfb \
|
|
ffmpeg \
|
|
chromium-common \
|
|
chromium \
|
|
python3-tk
|
|
sed -i '/DOCKERMODE=/s/false/true/' /etc/shelfmark/.env
|
|
msg_ok "Installed internal bypasser dependencies"
|
|
fi
|
|
|
|
NODE_VERSION="24" setup_nodejs
|
|
PYTHON_VERSION="3.14" setup_uv
|
|
|
|
fetch_and_deploy_gh_release "shelfmark" "calibrain/shelfmark" "tarball" "latest" "/opt/shelfmark"
|
|
RELEASE_VERSION=$(cat "$HOME/.shelfmark")
|
|
|
|
msg_info "Building Shelfmark frontend"
|
|
cd /opt/shelfmark/src/frontend
|
|
echo "RELEASE_VERSION=${RELEASE_VERSION}" >>/etc/shelfmark/.env
|
|
$STD npm ci
|
|
$STD npm run build
|
|
mv /opt/shelfmark/src/frontend/dist /opt/shelfmark/frontend-dist
|
|
msg_ok "Built Shelfmark frontend"
|
|
|
|
msg_info "Configuring Shelfmark"
|
|
export VIRTUAL_ENV=/opt/shelfmark/venv
|
|
cd /opt/shelfmark
|
|
$STD uv venv --clear ./venv
|
|
$STD source ./venv/bin/activate
|
|
if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
|
|
$STD uv sync --active --locked --no-default-groups --extra browser
|
|
else
|
|
$STD uv sync --active --locked --no-default-groups
|
|
fi
|
|
mkdir -p {/var/log/shelfmark,/tmp/shelfmark}
|
|
msg_ok "Configured Shelfmark"
|
|
|
|
msg_info "Creating Services and start script"
|
|
cat <<EOF >/etc/systemd/system/shelfmark.service
|
|
[Unit]
|
|
Description=Shelfmark server
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/opt/shelfmark
|
|
EnvironmentFile=/etc/shelfmark/.env
|
|
ExecStart=/usr/bin/bash /opt/shelfmark/start.sh
|
|
Restart=always
|
|
RestartSec=10
|
|
KillMode=mixed
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
if [[ "$DEPLOYMENT_TYPE" == "2" ]]; then
|
|
cat <<EOF >/etc/systemd/system/flaresolverr.service
|
|
[Unit]
|
|
Description=FlareSolverr
|
|
After=network.target
|
|
[Service]
|
|
SyslogIdentifier=flaresolverr
|
|
Restart=always
|
|
RestartSec=5
|
|
Type=simple
|
|
Environment="LOG_LEVEL=info"
|
|
Environment="CAPTCHA_SOLVER=none"
|
|
WorkingDirectory=/opt/flaresolverr
|
|
ExecStart=/opt/flaresolverr/flaresolverr
|
|
TimeoutStopSec=30
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
systemctl enable -q --now flaresolverr
|
|
fi
|
|
|
|
cat <<EOF >/opt/shelfmark/start.sh
|
|
#!/usr/bin/env bash
|
|
|
|
source /opt/shelfmark/venv/bin/activate
|
|
set -a
|
|
source /etc/shelfmark/.env
|
|
set +a
|
|
|
|
gunicorn --worker-class geventwebsocket.gunicorn.workers.GeventWebSocketWorker --workers 1 -t 300 -b 0.0.0.0:8084 shelfmark.main:app
|
|
EOF
|
|
chmod +x /opt/shelfmark/start.sh
|
|
|
|
systemctl enable -q --now shelfmark
|
|
msg_ok "Created Services and start script"
|
|
|
|
motd_ssh
|
|
customize
|
|
cleanup_lxc
|