#!/usr/bin/env bash # Copyright (c) 2021-2026 community-scripts ORG # Author: vhsdream # License: MIT | https://github.com/community-scripts/ProxmoxVED/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 </etc/shelfmark/.env DOCKERMODE=false 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}" 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 existing FlareSolverr LXC${CL}" echo "─────────────────────────────────────────" echo "Enter the URL/IP address with port of your Flaresolverr instance" echo "Example: http://flaresoverr.homelab.lan:8191 or" echo "http://192.168.10.99:8191" echo "" read -r -p "FlareSolverr URL: " FLARESOLVERR_URL if [[ -z "$FLARESOLVERR_URL" ]]; then msg_warn "No Flaresolverr URL provided. Falling back to Shelfmark's internal bypasser." else FLARESOLVERR_URL="${FLARESOLVERR_URL%/}" msg_ok "FlareSolverr URL: ${FLARESOLVERR_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 (please wait)" $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 update $STD apt install -y google-chrome-stable # remove google-chrome.list added by 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=${FLARESOLVERR_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=143.0.7499.169-1~deb13u1 \ chromium=143.0.7499.169-1~deb13u1 \ chromium-driver=143.0.7499.169-1~deb13u1 \ python3-tk msg_ok "Installed internal bypasser dependencies" fi NODE_VERSION="22" setup_nodejs PYTHON_VERSION="3.12" 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" cd /opt/shelfmark $STD uv venv ./venv $STD source ./venv/bin/activate $STD uv pip install -r ./requirements-base.txt [[ "$DEPLOYMENT_TYPE" == "1" ]] && $STD uv pip install -r ./requirements-shelfmark.txt mkdir -p {/var/log/shelfmark,/tmp/shelfmark} msg_ok "Configured Shelfmark" msg_info "Creating Services and start script" cat </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 [Install] WantedBy=multi-user.target EOF if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then cat </etc/systemd/system/chromium.service [Unit] Description=karakeep Headless Browser After=network.target [Service] User=root ExecStart=/usr/bin/chromium --headless --no-sandbox --disable-gpu --disable-dev-shm-usage --remote-debugging-address=127.0.0.1 --remote-debugging-port=9222 --hide-scrollbars Restart=always [Install] WantedBy=multi-user.target EOF systemctl enable -q --now chromium fi if [[ "$DEPLOYMENT_TYPE" == "2" ]]; then cat </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 </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