#!/bin/bash # ============================================ # HYC下载站 v2.3 - ARMv7 / 低内存设备 安装脚本 # # 电视盒子(1G 内存)上很多带 C 扩展的包没有预编译 wheel, # 一次性 pip install -r requirements.txt 会在编译某个包时整体失败。 # 本脚本按"核心必装 / 可选按需"分开安装,单个失败不连累其他。 # # 用法: # bash scripts/install-armv7.sh # 只装核心 # bash scripts/install-armv7.sh --with-postgresql # 加 PostgreSQL # bash scripts/install-armv7.sh --with-mysql # 加 MySQL # bash scripts/install-armv7.sh --with-sftp # 加 SFTP 同步(paramiko) # # 环境变量: # PYTHON=python3.11 指定 Python(默认 python3) # VENV_DIR=./venv 虚拟环境目录(默认 ./venv) # ============================================ set -e PYTHON=${PYTHON:-python3} VENV_DIR=${VENV_DIR:-./venv} echo "==========================================" echo " HYC下载站 v2.3 - ARMv7 安装" echo "==========================================" # ---------- 1. 检查 Python ---------- echo "" echo "==> [1/5] 检查 Python 版本" if ! command -v "$PYTHON" >/dev/null 2>&1; then echo "错误: 找不到 $PYTHON" echo "提示: 电视盒子 Debian 系可用: apt install python3 python3-venv" exit 1 fi $PYTHON --version python_ok=$($PYTHON -c 'import sys; print(1 if sys.version_info >= (3, 8) else 0)') if [ "$python_ok" != "1" ]; then echo "警告: Python 版本过低(需要 3.8+),建议 python3.11" fi # ---------- 2. 创建虚拟环境 ---------- echo "" echo "==> [2/5] 创建虚拟环境: $VENV_DIR" if ! $PYTHON -m venv "$VENV_DIR" 2>/dev/null; then echo "错误: 创建虚拟环境失败" echo "提示: 需要先安装 python3-venv: apt install python3-venv" exit 1 fi # shellcheck disable=SC1091 source "$VENV_DIR/bin/activate" pip install --upgrade pip 2>/dev/null || echo " (pip 升级跳过)" # ---------- 3. 核心依赖(必装) ---------- echo "" echo "==> [3/5] 安装核心依赖" CORE_PKGS="psutil requests croniter sqlalchemy python-multipart" for pkg in $CORE_PKGS; do if pip install "$pkg" >/dev/null 2>&1; then echo " ✓ $pkg" else echo " ✗ $pkg 安装失败(继续,不影响其他)" fi done # bcrypt: armv7 可能需要编译;装不上则走 PBKDF2 回退(认证仍可用,但建议装上) echo " ... bcrypt(密码哈希)" if pip install bcrypt >/dev/null 2>&1; then echo " ✓ bcrypt" else echo " ⚠ bcrypt 安装失败 → 将使用 PBKDF2 回退(功能可用;建议装 gcc 后重试)" fi # ---------- 4. 可选依赖(按参数) ---------- echo "" echo "==> [4/5] 可选依赖" if [[ "$*" == *"--with-postgresql"* ]]; then echo " ... psycopg2-binary(PostgreSQL)" pip install psycopg2-binary >/dev/null 2>&1 && echo " ✓ psycopg2" \ || echo " ⚠ psycopg2 编译失败 → PostgreSQL 不可用(可先用 SQLite)" fi if [[ "$*" == *"--with-mysql"* ]]; then echo " ... pymysql / cryptography(MySQL)" pip install pymysql cryptography >/dev/null 2>&1 && echo " ✓ pymysql" \ || echo " ⚠ MySQL 依赖失败(可先用 SQLite)" fi if [[ "$*" == *"--with-sftp"* ]]; then echo " ... paramiko(SFTP 同步)" pip install paramiko >/dev/null 2>&1 && echo " ✓ paramiko" \ || echo " ⚠ paramiko 失败 → SFTP 同步不可用" fi # ---------- 5. 目录与收尾 ---------- echo "" echo "==> [5/5] 创建数据目录" mkdir -p downloads data logs echo " ✓ downloads/ data/ logs/ 已就绪" echo "" echo "==========================================" echo " 安装完成!" echo "==========================================" echo " 启动服务器:" echo " source $VENV_DIR/bin/activate" echo " python main.py --memory-limit 256M --workers 2" echo "" echo " 1G 内存建议(电视盒子):" echo " - 已适配 settings.json(show_hash 关闭、max_workers=2、缓存 64MB)" echo " - 强烈建议加 swap,否则大文件同步/上传易 OOM:" echo " fallocate -l 1G /swapfile && chmod 600 /swapfile" echo " mkswap /swapfile && swapon /swapfile" echo " echo '/swapfile none swap sw 0 0' >> /etc/fstab" echo " - 外接 300G 存储请把 settings.json 的 base_dir 指向挂载点" echo " (如 /mnt/usb/downloads),并同步改 database.sqlite.path" echo "=========================================="