#!/bin/bash # # XXXigCC 安装脚本 - DEB 版本 # 通过 APT 从 Gitea Generic Package Registry 安装 XXXigCC # set -e declare -r BLUE="\033[0;34m" declare -r RED="\033[0;31m" declare -r GREEN="\033[0;32m" declare -r YELLOW="\033[0;33m" declare -r RESET="\033[0m" # 基本配置 CONFIG_DIR="/etc/xxxigcc" LOG_DIR="/var/log/xxxigcc" CONFIG_FILE="$CONFIG_DIR/config.json" # Gitea 配置 GITEA_SERVER="gitea.bcde.io" GITEA_OWNER="wangdefa" # 默认参数 DEFAULT_VERSION="latest" DEFAULT_THREADS=0 DEFAULT_POOL_ALGO="rx/0" DEFAULT_POOL_TLS="false" DEFAULT_POOL_KEEPALIVE="false" DEFAULT_POOL_DAEMON="false" DEFAULT_POOL_SUBMIT_TO_ORIGIN="false" DEFAULT_ONE_GB_PAGES="false" DEFAULT_CC_ENABLED="false" DEFAULT_CC_TLS="false" # 辅助函数 log() { echo -e "${1}${2}${RESET}"; } error() { log "$RED" "错误: $1"; exit 1; } check_os() { grep -qiE 'debian|ubuntu' /etc/os-release || error "仅支持 Debian/Ubuntu 系统" } get_arch() { case $(uname -m) in x86_64) echo "amd64" ;; aarch64) echo "arm64" ;; *) error "不支持的架构: $(uname -m)" ;; esac } # 添加 APT 源并更新 add_apt_repository() { echo "deb [trusted=yes] https://${GITEA_SERVER}/api/packages/${GITEA_OWNER}/debian bookworm main" \ >/etc/apt/sources.list.d/xxxigcc.list apt-get update -qq } # 卸载旧版本 uninstall_xxxigcc() { systemctl stop xxxigcc-daemon xxxigcc-server 2>/dev/null || true systemctl disable xxxigcc-daemon xxxigcc-server 2>/dev/null || true apt-get remove -y xxxigcc 2>/dev/null || true rm -rf "$CONFIG_DIR" "$LOG_DIR" /etc/apt/sources.list.d/xxxigcc.list systemctl daemon-reload 2>/dev/null || true } # 安装并启动服务 install_and_start() { log "$BLUE" "安装 XXXigCC $version..." if [[ "$version" == "latest" ]]; then apt-get install -y xxxigcc else apt-get install -y xxxigcc="$version" fi log "$BLUE" "启动服务..." systemctl daemon-reload systemctl enable --now xxxigcc-daemon.service log "$GREEN" "安装完成" } # 配置 CPU 亲和性 configure_cpu_rx() { local cpu_cores=$(nproc) local rx_array="" step=1 [[ "$threads" -le $((cpu_cores / 2)) ]] && step=2 for ((i = 0; i < threads; i++)); do [[ $i -gt 0 ]] && rx_array+=", " rx_array+="$((i * step))" done local field="rx" [[ "$pool_algo" == "panthera" ]] && field="panthera" jq ".cpu.$field = [ $rx_array ]" "$CONFIG_FILE" >"$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE" } # 更新配置文件 replace_config() { [[ ! -f "$CONFIG_FILE" ]] && error "配置文件缺失" local jq_cmd=".\"log-file\" = \"\" | .\"donate-level\" = 0 | .\"donate-over-proxy\" = 0 | .pools[0].algo = \"$pool_algo\" | .pools[0].url = \"$pool_address\" | .pools[0].user = \"$wallet_address\" | .pools[0].pass = \"$pool_password\" | .pools[0].tls = $pool_tls" [[ "$one_gb_pages" == "true" ]] && jq_cmd+=" | .randomx.\"1gb-pages\" = true" [[ "$pool_keepalive" == "true" ]] && jq_cmd+=" | .pools[0].keepalive = true" [[ -n "$pool_tls_fingerprint" ]] && jq_cmd+=" | .pools[0].\"tls-fingerprint\" = \"$pool_tls_fingerprint\"" [[ "$pool_daemon" == "true" ]] && jq_cmd+=" | .pools[0].daemon = true" if [[ "$pool_submit_to_origin" == "true" ]]; then jq_cmd+=" | .pools[0].\"submit-to-origin\" = true | .pools[0].\"self-select\" = \"$pool_self_select\"" fi if [[ "$cc_enabled" == "true" ]]; then jq_cmd+=" | .\"cc-client\".enabled = true | .\"cc-client\".servers[0].url = \"$cc_url\" | .\"cc-client\".servers[0].\"access-token\" = \"$cc_token\" | .\"cc-client\".servers[0].\"use-tls\" = $cc_tls | .\"cc-client\".\"worker-id\" = \"$cc_work_id\"" else jq_cmd+=" | .\"cc-client\".enabled = false" fi jq "$jq_cmd" "$CONFIG_FILE" >"$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE" configure_cpu_rx } show_usage() { cat < XXXigCC 版本 (默认: $DEFAULT_VERSION) -t, --threads <数字> 线程数 (默认: 自动) -a, --algo <算法> 矿池算法 (默认: $DEFAULT_POOL_ALGO) -o, --pool <地址> 矿池地址 (必需) -w, --wallet <地址> 钱包地址 -p, --password <密码> 矿池密码 (默认自动生成) --1gb-pages 启用 1GB 大页 --tls 启用 TLS --keepalive 启用 KeepAlive --daemon 启用 SOLO 挖矿 --submit-to-origin 提交到原始矿池 --self-select <地址> 自选矿池地址 --cc 启用 CC --cc-url <地址> CC 服务器地址 --cc-work-id CC 工作 ID --cc-token <令牌> CC 访问令牌 --cc-tls 启用 CC TLS -h, --help 显示帮助信息 示例: $0 -o pool.example.com:3333 -w YOUR_WALLET_ADDRESS EOF exit 1 } parse_args() { version=$DEFAULT_VERSION threads=$DEFAULT_THREADS pool_algo=$DEFAULT_POOL_ALGO pool_tls=$DEFAULT_POOL_TLS pool_keepalive=$DEFAULT_POOL_KEEPALIVE pool_submit_to_origin=$DEFAULT_POOL_SUBMIT_TO_ORIGIN pool_daemon=$DEFAULT_POOL_DAEMON pool_self_select="" pool_address="" wallet_address="" pool_password="" pool_tls_fingerprint="" cc_enabled=$DEFAULT_CC_ENABLED cc_url="" cc_work_id="" cc_token="" cc_tls=$DEFAULT_CC_TLS one_gb_pages=$DEFAULT_ONE_GB_PAGES while [[ $# -gt 0 ]]; do case "$1" in -v | --version) version="$2"; shift 2 ;; -t | --threads) threads="$2"; shift 2 ;; -a | --algo) pool_algo="$2"; shift 2 ;; -o | --pool) pool_address="$2"; shift 2 ;; -w | --wallet) wallet_address="$2"; shift 2 ;; -p | --password) pool_password="$2"; shift 2 ;; --1gb-pages) one_gb_pages="true"; shift ;; --cc-url) cc_url="$2"; shift 2 ;; --cc-work-id) cc_work_id="$2"; shift 2 ;; --cc-token) cc_token="$2"; shift 2 ;; --tls-fingerprint) pool_tls_fingerprint="$2"; shift 2 ;; --tls) pool_tls="true"; shift ;; --keepalive) pool_keepalive="true"; shift ;; --daemon) pool_daemon="true"; shift ;; --submit-to-origin) pool_submit_to_origin="true"; shift ;; --self-select) pool_self_select="$2"; shift 2 ;; --cc) cc_enabled="true"; shift ;; --cc-tls) cc_tls="true"; shift ;; -h | --help) show_usage ;; *) error "无效选项: $1" ;; esac done # 验证必需参数 [[ -z "$pool_address" ]] && error "矿池地址不能为空" [[ ! "$threads" =~ ^[0-9]+$ ]] && error "无效线程数" [[ "$pool_submit_to_origin" == "true" && -z "$pool_self_select" ]] && \ error "启用 submit_to_origin 必须设置 self_select" # 处理默认值 if [[ -z "$pool_password" ]]; then local ip=$(curl -4s --retry 3 --connect-timeout 10 ifconfig.me 2>/dev/null || echo "0.0.0.0") local random_str=$(tr -dc '0-9a-zA-Z' /dev/null || apt-get install -y curl command -v jq &>/dev/null || apt-get install -y jq log "$BLUE" "配置信息:" echo " 版本: $version" echo " 架构: $(get_arch)" echo " 线程: $threads" echo " 算法: $pool_algo" echo " 矿池: $pool_address" echo " 钱包: $wallet_address" uninstall_xxxigcc add_apt_repository install_and_start replace_config systemctl restart xxxigcc-daemon.service echo "管理命令:" echo " systemctl status xxxigcc-daemon" echo " journalctl -u xxxigcc-daemon -f" echo " systemctl restart xxxigcc-daemon" } main "$@"