• 哈基 项目推荐

    25
    25 帖子
    500 浏览
    四折光曲
    https://github.com/Raven777777/UDP2CAL
  • nginx zstd压缩

    1
    1 帖子
    27 浏览
    四折光曲
    Zstd(Zstandard), Facebook(Meta)开发的开源无损数据压缩算法,2016 年发布, “高性能+高压缩比”的平衡——既比传统压缩算法(如 Gzip、Deflate)压缩更快、压缩率更高,也比同级别高压缩比算法(如 LZMA)速度更快,同时支持可配置的压缩级别(1-22,级别越高压缩率越高但速度越慢),还提供“快速模式”(级别 -1 到 -13)满足低延迟场景。 测试环境:Debain 13 Nginx1.31.0 I 编译最新的Zstd库 # 安装编译工具 sudo apt install build-essential git libpcre3-dev zlib1g-dev libssl-dev debhelper sudo apt remove libzstd-dev libzstd1 # 1. 进入源码存放目录 cd /usr/src # 2. 克隆 Facebook Zstd 官方主分支源码 sudo git clone --depth 1 https://github.com/facebook/zstd.git cd zstd # 3. 编译并安装(核心库编译非常快) sudo make -j$(nproc) sudo make install # 4. 刷新系统的动态链接库缓存,让系统认出刚刚安装的最新 libzstd.so sudo ldconfig II 编译zstd-nginx模块 # 1. 下载并解压 Nginx 1.31.0 官方源码 sudo wget http://nginx.org/download/nginx-1.31.0.tar.gz sudo tar -zxf nginx-1.31.0.tar.gz # 2. 克隆 zstd-nginx-module 源码 sudo git clone https://github.com/tokers/zstd-nginx-module.git # 3. 进入 Nginx 源码目录 cd nginx-1.31.0 # 4. 配置编译参数:通过包含路径,强行让它关联到我们刚才安装在 /usr/local/include 的最新 Zstd 头文件 sudo ./configure --with-compat \ --add-dynamic-module=/usr/src/zstd-nginx-module \ --with-cc-opt="-I/usr/local/include" \ --with-ld-opt="-L/usr/local/lib -Wl,-rpath,/usr/local/lib" # 5. 仅编译模块 sudo make modules III 载入zstd模块 # 1. 覆盖复制到 Nginx 模块目录 sudo cp objs/ngx_http_zstd_filter_module.so /usr/lib/nginx/modules/ sudo cp objs/ngx_http_zstd_static_module.so /usr/lib/nginx/modules/ 2. 赋予标准权限 sudo chmod 644 /usr/lib/nginx/modules/ngx_http_zstd_*.so 打开 /etc/nginx/nginx.conf,在最顶部添加加载指令: # 引入 Zstd 动态过滤和静态加载模块 load_module modules/ngx_http_zstd_filter_module.so; load_module modules/ngx_http_zstd_static_module.so; user www-data; worker_processes auto; IV 修改网页配置 以Flarum 为例 zstd on; zstd_comp_level 3; # 动态压缩推荐级别 3(1-5 之间性能与压缩率平衡最佳,最大为 22) zstd_min_length 256; # 小于 256 字节的文件不压缩 zstd_buffers 16 8k; # 允许 Nginx 直接读取预先压缩好的 .zst 静态文件(如果存在) zstd_static on; # 精准针对 Flarum 的 API、JS 和各种文本格式进行 Zstd 压缩 zstd_types text/plain text/css text/javascript application/javascript application/json application/xml application/rss+xml application/atom+xml image/svg+xml image/x-icon; #检查配置文件,重启Nginx nginx -t systemctl reload nginx 在线检测:https://zstd.wcode.net 按下 F12 打开开发者工具,前往 Network(网络) 面板。 Content-Encoding: zstd Vary: Accept-Encoding 表明 Nginx 1.31.0 已经成功部署了目前业界公认在动态生成场景下处理效率极高、对 CPU 压迫极小的 Zstd 压缩引擎!
  • MariaDB 安装

    3
    3 帖子
    40 浏览
    四折光曲
    轻量化配置 针对 50MB 极小 内存目标 sudo nano /etc/mysql/mariadb.conf.d/99-lightweight.cnf [mysqld] # 核心:关闭性能监控,立省约 40MB+ performance_schema = OFF # 存储引擎:将缓冲池压到最低 (适用于轻量 PHP 项目) innodb_buffer_pool_size = 16M innodb_log_buffer_size = 2M innodb_flush_log_at_trx_commit = 2 innodb_stats_on_metadata = OFF # 连接与线程:降低堆栈消耗 max_connections = 15 thread_stack = 192K thread_cache_size = 0 # 临时表与缓存:防止内存突发占用 tmp_table_size = 2M max_heap_table_size = 2M table_open_cache = 400 table_definition_cache = 400 # 日志:禁用不必要的日志 skip-log-bin sudo systemctl restart mariadb 查看内存情况 ps aux | grep mariadbd | grep -v grep | awk '{print $6/1024 " MB"}' !作为个人博客使用及时不配置其内存占用也较低,实际上配置了之后内存占用并没有降低多少,全站负载500MB!<
  • Postfix 发信配置

    3
    3 帖子
    36 浏览
    四折光曲
    SSL 加密 基础 TLS 设置 sudo nano /etc/postfix/main.cf # 可以使用网站域名证书 smtpd_tls_cert_file = /your.pem smtpd_tls_key_file = /your.key smtpd_use_tls = yes # encrypt 强制启用 smtpd_tls_security_level = may smtpd_tls_auth_only = yes smtpd_tls_loglevel = 1 smtp_tls_CAfile = /your.crt smtp_tls_security_level = may smtp_tls_loglevel = 1 开启 465 和 587 端口 sudo nano /etc/postfix/master.cf submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
  • openppp2简易使用教程

    openppp2
    2
    2 帖子
    140 浏览
    clouldonC
    因为在移动平台ppp的支持不好,所以我们可以采取ppp支持的代理来连接到ppp。电脑或软路由(windows,macos,linux(openwrt除外)),运行ppp,其中启动命令 --yun-host=no ,不更改系统路由。示例如下,客户端启动命令,我们甚至可以通过代理软件来分流: windows start ppp.exe --mode=client --tun-ip=10.0.0.5 --tun-gw=10.0.0.0 --tun-flash=yes --tun-mask=24 --tun-host=no --tun-vnet=yes --tun-static=no --block-quic=yes --config=./config/bwgUS.json --tun-mux=4 linux: ./ppp --mode=client --config=./HKBN.json --tun-ip=10.0.0.8 --tun-gw=10.0.0.0 --tun-mask=24 --tun-host=no --link-restart=3 --tun-mux-acceleration=3 --tun-static=no --tun-ssmt=4/st --block-quic=yes > ./ppp.log 然后根据配置文件里面的http或sock项来填写代理,当然可以通过ppp应用看到 [image: Pasted-image-20260418204517.png] [image: Pasted-image-20260418204548.png] 因为0.0.0.0代表本机地址,所以在局域网下,填入ppp客户端的IP,端口,代理类型即可达到效果 [image: Screenshot-2026-04-18-20-46-38-82-0745948e13496426d21696226f28cc3a.jpg] 效果如图 [image: Screenshot-2026-04-18-20-48-10-72-0745948e13496426d21696226f28cc3a.jpg]
  • Docker mongodb备份还原数据库

    1
    1 帖子
    31 浏览
    clouldonC
    查看容器名字 docker ps 进入mongodb docker exec -it 容器名 mongosh \ -u '数据库应用账号' -p '数据库应用密码' \ --authenticationDatabase admin \ 备份mongodb docker exec 容器名 mongodump \ -u '数据库应用账号' -p '数据库应用密码' \ --authenticationDatabase admin \ --db nodebb --archive --gzip \ > /home/nodebb-mongo-backup-$(date +%Y%m%d-%H%M%S).archive.gz 还原mongodb cat /home/nodebb-mongo-backup-20250401-120000.archive.gz | docker exec -i 容器名 mongorestore \ -u '数据库应用账号' -p '数据库应用密码' \ --authenticationDatabase admin \ --archive --gzip \ --drop
  • OPENPPP2 配置示例 与分流

    3
    3 帖子
    38 浏览
    四折光曲
    [image: 1778464489356-qq20260511-095410.webp]
  • 吉吉 网站推荐

    2
    2 帖子
    24 浏览
    四折光曲
    https://www.softwareok.com/ 神秘的小软件 https://www.softwareok.com/?seite=microsoft/autohidedesktopicons
  • 神秘 软件推荐

    3
    3 帖子
    50 浏览
    四折光曲
    https://www.cgsecurity.org/wiki/TestDisk_Download 免费开源的数据恢复软件
  • Rustdesk自托管中继服务端安装教程

    1
    1 帖子
    45 浏览
    clouldonC
    下面就是 只安装 hbbs + hbbr 的简单版本。 1)先看当前最新版本 浏览器打开: https://github.com/rustdesk/rustdesk-server/releases/latest 现在会跳到 1.1.15。 2)在 Debian 上判断你的架构 执行: dpkg --print-architecture 记住输出结果。 常见是 amd64 或 arm64。 这里我只示范 amd64。 如果你的输出不是 amd64,只需要把下面所有命令里的 amd64 换成你的架构名。 3)创建下载目录 执行: mkdir -p ~/rustdesk-server cd ~/rustdesk-server 4)下载第一个包:hbbs 将下面的1.1.15换成Latest的版本号 执行: wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.15/rustdesk-server-hbbs_1.1.15_amd64.deb 5)下载第二个包:hbbr 执行: wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.15/rustdesk-server-hbbr_1.1.15_amd64.deb 6)确认两个包已经下好了 执行: ls -lh *.deb 正常会看到这两个文件: rustdesk-server-hbbs_1.1.15_amd64.deb rustdesk-server-hbbr_1.1.15_amd64.deb 7)开始安装 先执行: sudo apt update 然后依次安装: sudo dpkg -i rustdesk-server-hbbs_1.1.15_amd64.deb sudo dpkg -i rustdesk-server-hbbr_1.1.15_amd64.deb 8)如果提示依赖问题,再补一次 执行: sudo apt-get -f install -y 9)检查服务是否已经就绪 先检查: systemctl status rustdesk-hbbs --no-pager systemctl status rustdesk-hbbr --no-pager 你希望看到的是: active (running) 10)如果没运行,就手动启动 执行: sudo systemctl start rustdesk-hbbs sudo systemctl start rustdesk-hbbr 然后再检查一次: systemctl status rustdesk-hbbs --no-pager systemctl status rustdesk-hbbr --no-pager 11)查看公钥 执行: cat /var/lib/rustdesk-server/id_ed25519.pub 把输出内容保存好。 12)补充端口使用 RustDesk 官方文档给出的核心端口是: TCP 21114-21119 UDP 21116 其中 最小可工作端口集合 是: TCP 21115 TCP/UDP 21116 TCP 21117 这些端口分别做什么官方链接 到底该开哪些端口 如果你只是部署 普通 OSS 自建服务器,最稳妥的做法是直接开放: 21115/tcp 21116/tcp 21116/udp 21117/tcp 这是官方文档定义的最小可工作端口集合。 如果你想少折腾、一步到位,也可以直接开放: 21114-21119/tcp 21116/udp 如果你用 UFW,就这样放行端口,只开最小必需端口 sudo ufw allow 21115/tcp sudo ufw allow 21116/tcp sudo ufw allow 21116/udp sudo ufw allow 21117/tcp 如果你想一步全开官方建议范围 sudo ufw allow 21114:21119/tcp sudo ufw allow 21116/udp 12)客户端怎么填 客户端里填: ID 服务器:你的服务器 IP 或域名 Key:刚才看到的公钥 中继服务器:同ID 服务器 API服务器:留空 示例 如果你的服务器 IP 是 1.2.3.4,那客户端里填: ID 服务器:1.2.3.4 Key:粘贴 id_ed25519.pub 的内容 中继服务器:ID 服务器 API服务器:留空 13)如果服务异常,先看日志 执行: journalctl -u rustdesk-hbbs -n 100 --no-pager journalctl -u rustdesk-hbbr -n 100 --no-pager 也可以直接看文件: tail -n 50 /var/log/rustdesk-server/hbbs.log tail -n 50 /var/log/rustdesk-server/hbbr.log 一句话记住 先用 dpkg --print-architecture 看架构; 然后把我示范里的 amd64 替换成你的架构; 下载 GitHub release 的 2 个 .deb; 安装后检查 rustdesk-hbbs 和 rustdesk-hbbr; 最后读取 /var/lib/rustdesk-server/id_ed25519.pub 给客户端用。
  • Mumble 语音服务器搭建

    2
    2 帖子
    42 浏览
    四折光曲
    https://github.com/mumble-voip/mumble-docker https://gitcode.com/gh_mirrors/mu/mumble/blob/master/auxiliary_files/mumble-server.ini 添加环境变量: MUMBLE_CONFIG_PORT=3322 MUMBLE_CUSTOM_CONFIG_FILE=/data/mumble_server_config.ini (不然每次重启都重置) MUMBLE_SUPERUSER_PASSWORD=xxxxx (超级用户名为:SuperUser) MUMBLE_CONFIG_SERVERPASSWORD=xxxxx MUMBLE_CONFIG_SENDVERSION=false 允许中文用户名:在配置文件添加 username=[-\w\x{4e00}-\x{9fa5}=\[\]{}\(\)\@\|\.]+ 已注册用户,需要清除密码才能连接,即注册后无需密码连接,保留证书
  • Linux自用命令脚本

    1
    1 帖子
    79 浏览
    clouldonC
    Linux自用命令脚本 speedtest测速 sudo apt-get install curl && curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash && sudo apt-get install speedtest 适用于Debian vkit工具箱 作者@vps.dance 原文链接 GitHub源码链接 bash <(curl -Lso- https://sh.vps.dance/vkit.sh) 国内机如果不能用, 可尝试切换镜像 bash <(curl -Lso- https://sh.vps.dance/vkit.sh) ghproxy VKit 提供Linux VPS常用的系统软件安装, 以及系统优化脚本, 目前集成功能如下. 配置SSH Public Key (SSH免密登录) 终端优化 (颜色美化/上下键查找历史) 安装并开启 BBR 系统优化 (TCP网络优化/资源限制优化) 安装常用软件 (ping/traceroute/nslookup/nping/nc/tcpdump) 修改默认SSH端口 (减少被扫描风险) 增加swap分区 (虚拟内存) IPv4/IPv6优先级调整, 启用/禁用IPv6 安装 Xray (同时安装 增强版的geosite/geoip规则) 安装 SS 安装 snell 安装 hy2 安装 realm (端口转发工具) 安装 gost (隧道/端口转发工具) 安装 nali (IP查询工具) 安装 ddns-go (DDNS工具) 安装 miniserve (HTTP 文件服务器) 使用 CF WARP 添加 IPv4/IPv6 网络 检测 VPS流媒体解锁 (RegionRestrictionCheck) 检测 单线程/多线程网速 (i-abc/Speedtest) 检测 VPS信息/IO/到国际网速 (Bench.sh) 性能/IO 测试 (YABS) 检测 TCP回程路由 (BestTrace) 检测 TCP回程路由 (NextTrace) 检测 Tiktok解锁 (TikTokCheck) 检测 IP质量 (IPQuality) 理论支持的Linux: Ubuntu/Debian, Centos/Redhat (未做严格测试).
  • ppp_install.sh

    openppp2
    1
    1 帖子
    68 浏览
    clouldonC
    PPP 安装与管理脚本 这是一个用于安装、配置、更新和管理 openppp2 服务的 Bash 脚本。脚本需要 root 权限才能执行,并提供菜单驱动的界面来执行各种操作。 自动(半自动):一键脚本,仅支持 x86 wget -4 -O ppp_install.sh https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/ppp_install.sh && chmod +x ppp_install.sh && ./ppp_install.sh GitHub优化加速 wget -4 -O ppp_install.sh https://git.apad.pro/https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/ppp_install.sh && chmod +x ppp_install.sh && ./ppp_install.sh 脚本内容 #!/bin/bash # ============================================================================= # openppp2 一键安装脚本(v3.6 智能最优版) # 自动检测架构 + tc + io-uring + simd,选择最佳版本 # ============================================================================= set -o pipefail # ==================== 颜色定义 ==================== RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' BLUE='\033[34m' RESET='\033[0m' print() { echo -e "${2:-$GREEN}$1${RESET}"; } # ==================== 创建 ppp 快捷命令 ==================== create_ppp_shortcut() { if [ ! -f "/usr/local/bin/ppp" ]; then cat > /usr/local/bin/ppp << 'EOF' #!/bin/bash if [ -f "/root/ppp_install.sh" ]; then bash /root/ppp_install.sh else echo "❌ 脚本文件不存在,请重新下载" echo "wget -4 -O /root/ppp_install.sh https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/ppp_install.sh" echo "chmod +x /root/ppp_install.sh" fi EOF chmod +x /usr/local/bin/ppp print "✅ 已创建 ppp 快捷命令!以后直接输入 ppp 即可运行" $GREEN else print "✅ ppp 快捷命令已存在" $GREEN fi } # ==================== 系统能力检测 ==================== has_aesni() { grep -q 'aes' /proc/cpuinfo 2>/dev/null } kernel_supports_io_uring() { local major=$(uname -r | cut -d. -f1) local minor=$(uname -r | cut -d. -f2) [ "$major" -gt 5 ] || { [ "$major" -eq 5 ] && [ "$minor" -ge 1 ]; } } has_tc() { command -v tc >/dev/null 2>&1 } # ==================== 自动选择最优版本 ==================== choose_best_zip() { local arch=$(uname -m) case "$arch" in x86_64|amd64) if kernel_supports_io_uring && has_aesni && has_tc; then echo "openppp2-linux-amd64-tc-io-uring-simd.zip" elif kernel_supports_io_uring && has_aesni; then echo "openppp2-linux-amd64-tc-io-uring-simd.zip" elif kernel_supports_io_uring && has_tc; then echo "openppp2-linux-amd64-tc-io-uring.zip" elif has_aesni && has_tc; then echo "openppp2-linux-amd64-tc-simd.zip" elif has_tc; then echo "openppp2-linux-amd64-tc.zip" else echo "openppp2-linux-amd64.zip" fi ;; aarch64|arm64) if kernel_supports_io_uring && has_tc; then echo "openppp2-linux-aarch64-tc-io-uring.zip" else echo "openppp2-linux-aarch64.zip" fi ;; armv7l|armv7) if kernel_supports_io_uring; then echo "openppp2-linux-armv7l-io-uring.zip" else echo "openppp2-linux-armv7l.zip" fi ;; mips|mipsel) echo "openppp2-linux-mipsel.zip" ;; ppc64le|ppc64el) echo "openppp2-linux-ppc64el.zip" ;; riscv64) echo "openppp2-linux-riscv64.zip" ;; s390x) echo "openppp2-linux-s390x.zip" ;; *) print "❌ 不支持的架构: $arch" $RED exit 1 ;; esac } # ==================== 下载函数 ==================== prompt_replace_file() { local target_path="$1" local url="$2" local desc="$3" mkdir -p "$(dirname "$target_path")" if [ -f "$target_path" ]; then print "⚠️ $desc 已存在" $YELLOW read -p "是否替换?(y/n,默认 n): " REPLACE if [[ ! "$REPLACE" =~ ^[Yy]$ ]]; then return 0; fi fi print "📥 正在下载 $desc ..." $BLUE if wget -4 --no-check-certificate -q --show-progress -O "$target_path" "$url"; then print "✅ $desc 下载完成" $GREEN return 0 else print "❌ 下载失败!" $RED return 1 fi } # ==================== 主菜单 ==================== while true; do clear print "=============== openppp2 一键脚本(v3.6 智能版)===============" $BLUE echo "1) 服务端 - 完整自动安装(推荐,自动最优版本)" echo "2) 服务端 - 配置系统服务(自行修改配置后使用)" echo "3) 通用 - 更新二进制文件(自动最优版本)" echo "4) 通用 - 重启服务" echo "5) 通用 - 停止服务" echo "6) 通用 - 查看运行状态(日志前50行)" echo "7) 通用 - 完全卸载" echo "8) 设置 ppp 快捷命令" echo "9) 更新本脚本" echo "10) 退出" read -p "请输入选项 [1-10]: " OPERATION case $OPERATION in 1|3) print "🌍 是否使用国内加速代理 (git.apad.pro)?" $BLUE read -p "输入 y 使用加速,n 直连 (默认 y): " USE_PROXY if [[ "$USE_PROXY" =~ ^[Nn]$ ]]; then GITHUB_PROXY="" print "✅ 使用直连 GitHub" $YELLOW else GITHUB_PROXY="https://git.apad.pro/" print "✅ 已启用国内加速代理" $GREEN fi ZIP_NAME=$(choose_best_zip) print "🔍 自动选择最优版本:$ZIP_NAME" $BLUE mkdir -p /opt/ppp && cd /opt/ppp URL="${GITHUB_PROXY}https://github.com/liulilittle/openppp2/releases/latest/download/${ZIP_NAME}" prompt_replace_file "/opt/ppp/${ZIP_NAME}" "$URL" "$ZIP_NAME" || continue unzip -o "$ZIP_NAME" ppp -d . && chmod +x ppp && rm -f "$ZIP_NAME" print "✅ openppp2 最优版本处理完成" $GREEN if [ "$OPERATION" = "1" ]; then print "🔧 正在安装依赖..." $BLUE if command -v apt-get >/dev/null; then apt-get update && apt-get install -y jq uuid-runtime unzip elif command -v dnf >/dev/null; then dnf install -y jq util-linux unzip elif command -v yum >/dev/null; then yum install -y jq util-linux unzip else print "❌ 无法识别包管理器,请手动安装 jq uuid-runtime unzip" $RED continue fi print "✅ 依赖安装完成" $GREEN prompt_replace_file "/opt/ppp/ppp.sh" "${GITHUB_PROXY}https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/config/ppp.sh" "ppp.sh" || continue chmod +x ppp.sh read -p "是否自行修改 appsettings.json?(y/n,默认 n): " SELF if [[ "$SELF" =~ ^[Yy]$ ]]; then print "请手动修改 /opt/ppp/appsettings.json 后,运行选项 2" $YELLOW create_ppp_shortcut continue fi prompt_replace_file "/opt/ppp/appsettings.json" "${GITHUB_PROXY}https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/config/appsettings.json" "appsettings.json" || continue read -p "服务器 IP(默认 0.0.0.0): " NEW_IP read -p "端口(默认 20000): " NEW_PORT read -p "GUID(留空自动生成): " NEW_GUID NEW_IP=${NEW_IP:-0.0.0.0} NEW_PORT=${NEW_PORT:-20000} [[ -z "$NEW_GUID" ]] && NEW_GUID=$(uuidgen) PROTOCOL_KEY=$(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 16) TRANSPORT_KEY=$(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 16) cp -f appsettings.json appsettings.json.bak 2>/dev/null jq --indent 4 \ --arg ip "$NEW_IP" --arg port "$NEW_PORT" --arg guid "$NEW_GUID" \ --arg pkey "$PROTOCOL_KEY" --arg tkey "$TRANSPORT_KEY" ' .tcp.listen.port = ($port|tonumber) | .udp.listen.port = ($port|tonumber) | .udp.static.servers[0] = ($ip + ":" + $port) | .client.server = ("ppp://" + $ip + ":" + $port) | .client.guid = $guid | .key."protocol-key" = $pkey | .key."transport-key" = $tkey ' appsettings.json > temp.json && mv temp.json appsettings.json prompt_replace_file "/etc/systemd/system/ppp.service" "${GITHUB_PROXY}https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/config/ppp.service" "ppp.service" || continue chmod 644 /etc/systemd/system/ppp.service systemctl daemon-reload systemctl enable --now ppp.service if systemctl is-active --quiet ppp.service; then print "🎉 安装成功!服务已启动" $GREEN create_ppp_shortcut else print "⚠️ 服务启动失败,请检查日志" $YELLOW fi fi ;; 2) if [ ! -f "/opt/ppp/appsettings.json" ]; then print "❌ 未找到 appsettings.json,请先运行选项 1" $RED continue fi cd /opt/ppp || { print "❌ /opt/ppp 目录不存在" $RED; continue; } prompt_replace_file "/etc/systemd/system/ppp.service" \ "${GITHUB_PROXY:-https://git.apad.pro/}https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/config/ppp.service" \ "ppp.service" || continue systemctl daemon-reload && systemctl enable --now ppp.service print "✅ 系统服务配置完成并启动" $GREEN ;; 4) systemctl restart ppp.service && print "✅ 服务已重启" $GREEN ;; 5) systemctl stop ppp.service && print "✅ 服务已停止" $GREEN ;; 6) print "=== ppp.log(前 50 行)===" $BLUE if [ -f "/opt/ppp/ppp.log" ]; then head -n 50 /opt/ppp/ppp.log else print "日志文件不存在" $YELLOW fi echo print "=== ppp.service 状态 ===" $BLUE systemctl status ppp.service --no-pager -l ;; 7) print "🗑️ 开始卸载..." $YELLOW systemctl stop ppp.service 2>/dev/null systemctl disable ppp.service 2>/dev/null rm -f /etc/systemd/system/ppp.service systemctl daemon-reload print "是否保留配置文件?(默认保留)" $BLUE read -p "输入 y 保留(默认),n 删除: " KEEP_CONFIG if [[ "$KEEP_CONFIG" =~ ^[Nn]$ ]]; then rm -rf /opt/ppp print "✅ 已删除所有文件" $GREEN else rm -f /opt/ppp/ppp /opt/ppp/ppp.sh /opt/ppp/openppp2-linux-*.zip 2>/dev/null print "✅ 已保留配置文件" $GREEN fi rm -f /usr/local/bin/ppp print "✅ 卸载完成" $GREEN exit 0 ;; 8) create_ppp_shortcut ;; 9) print "🌍 更新本脚本 - 请选择方式" $BLUE echo "1) 使用国内加速 (推荐)" echo "2) 直连 GitHub" read -p "请输入 [1-2](默认 1): " UPDATE_MODE if [ "$UPDATE_MODE" = "2" ]; then UPDATE_URL="https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/ppp_install.sh" else UPDATE_URL="https://git.apad.pro/https://raw.githubusercontent.com/zouazhi/zouazhi/main/ppp/ppp_install.sh" fi print "📥 正在下载最新脚本..." $BLUE wget -4 -O /root/ppp_install.sh "$UPDATE_URL" && chmod +x /root/ppp_install.sh if [ $? -eq 0 ]; then print "✅ 脚本更新成功!正在重新启动..." $GREEN exec /root/ppp_install.sh else print "❌ 更新失败" $RED fi ;; 10) print "👋 退出脚本" $GREEN exit 0 ;; *) print "❌ 无效选项" $RED ;; esac echo read -p "按 Enter 键返回主菜单..." done