1 mac

1.1 path

00.汇总
    a.自启
        服务                 自启  原因
        kafka                ✗   在 ~/Library/LaunchAgents/
        minio                ✓   在 ~/Library/LaunchAgents/
        mongodb-community    ✗   在 ~/Library/LaunchAgents/
        [email protected]            ✓   在 /opt/homebrew/opt/
        [email protected]            ✓   在 /opt/homebrew/opt/
        nacos                ✓   在 /opt/homebrew/opt/nacos
        nginx                ✓   在 ~/Library/LaunchAgents/
        postgresql@16        ✗   在 ~/Library/LaunchAgents/
        rabbitmq             ✗   在 ~/Library/LaunchAgents/
        redis                ✓   在 /opt/homebrew/opt/
    b.图示
                    官方     homebrew       docker
        mysql5      √        ×              √
        mysql8      √        √              √
        oracle      ×        ×              √
        redis       √        √              √
        mongodb     √        √              √
        sqlite3     √        √              √
        mariadb     √        √              √
        postgre     √        √              √
        sqlserver   ×        ×              ×
        memcached   ×        ×              ×
        dameng      ×        ×              √
        kingbase    ×        ×              √
    c.打开
        vi .zshrc
        open .zshrc
        code .zshrc,需要VScode种Cmd + Shift + P,Shell Command: Install 'code' command in PATH
    d.brew
        open /opt/homebrew/opt/
        oepn /opt/homebrew/Cellar
        brew doctor
        brew cleanup

01.介绍
    a.说明
        a.默认
            bash与zsh都是mac终端自带的shell命令解释器,早期macos系统默认使用bash解释器,在macos10.15系统中官方推荐使用zsh解释器
            zsh原称为Z Shell。也是一种shell,兼容最常用的bash这种shell的命令和操作,并且有很多增强,超强的订制性
            zsh功能很强大,但是配置超难,oh-my-zsh工具简化了zsh的配置过程,oh-my-zsh 帮我们整理了一些常用的zsh 扩展功能和主题
            Z shell(Zsh)是在 bash(macOS 的默认 shell)之上构建的 Unix shell,并进行了大量改进
        b.切换方法
            切换bash:chsh -s /bin/bash
            切换zsh:chsh -s /bin/zsh
            关闭:exit;
            当前终端会话启动新的Shell:exec "$SHELL"
            -------------------------------------------------------------------------------------------------
            也可以在终端app的系统偏好设置里手动设置
        c.读取环境配置文件
            bash读取的配置文件:~/.bash_profile文件
            zsh读取的配置文件:~/.zshrc文件
            -------------------------------------------------------------------------------------------------
            当从bash切换为zsh时,如果不想重新配置一遍.zshrc文件
            可以在.zshrc文件中加上source ~/.bash_profile; 直接从.bash_profile文件读取配置
        d.查看shell
            # 查看当前系统有哪些shell版本
            cat /etc/shells
            # 查看当前使用的shell版本
            echo @SHELL
    b.环境变量1
        a.介绍
            1./etc/profile
            2./etc/paths
            3.~/.bash_profile
            4.~/.bash_login
            5.~/.profile
            6.~/.bashrc
        b.说明
            其中1和2是系统级别的,系统启动就会加载,其余是用户接别的
            3,4,5按照从前往后的顺序读取,如果3文件存在,则后面的几个文件就会被忽略不读了,以此类推
            ~/.bashrc没有上述规则,它是bash shell打开的时候载入的
            建议在3中添加环境变量,以下也是以在3中添加环境变量来演示的
        c.使用.zshrc
            export PATH=$HOME/bin:/usr/local/bin:$PATH
            export PATH="/opt/homebrew/bin:$PATH"
    c.环境变量2
        a.bash_history
            用途:记录用户在 Bash 中输入的命令历史。每次你在终端中输入命令并执行后,该命令会被添加到 .bash_history 文件中。
            位置:通常位于用户的主目录下(~/.bash_history)。
            作用:方便用户查看和重复使用之前输入过的命令。
        b.bash_profile:
            用途:用于配置登录 shell 的环境。每当用户登录时(例如打开一个新的终端窗口),Bash 会读取并执行 .bash_profile 中的命令。
            位置:通常位于用户的主目录下(~/.bash_profile)。
            作用:设置环境变量、启动程序、定义别名等。适用于登录时需要执行的配置。
        c.bashrc:
            用途:用于配置非登录 shell 的环境。每当用户打开一个新的 Bash 会话(例如在终端中打开一个新的标签页),Bash 会读取并执行 .bashrc 中的命令。
            位置:通常位于用户的主目录下(~/.bashrc)。
            作用:设置环境变量、定义别名、配置 shell 提示符等。适用于每次启动 Bash 时需要执行的配置。
        d.总结
            .bash_profile 和 .bashrc 都用于配置 Bash 的环境,但 .bash_profile 主要用于登录 shell,而 .bashrc 主要用于非登录 shell。
            -------------------------------------------------------------------------------------------------
            在 macOS 上,通常 .bash_profile 会被用来加载 .bashrc,以确保登录 shell 也能执行 .bashrc 中的配置。
            可以通过在 .bash_profile 中添加以下代码来实现:
            if [ -f ~/.bashrc ]; then
                source ~/.bashrc
            fi
            -------------------------------------------------------------------------------------------------
            .bash_history 则是独立于配置文件的历史记录文件,用于记录用户的命令输入历史。

02.软件合集
    a.切换
        a.命令
            bash
            zsh
            iterm,不可用,需手动打开App
        b.显示当前终端
            echo $SHELL
    b.软件商店
        a.Homebrew
            xcode-select —-install
            /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    c.终端类型
        a.iTerm2
            brew install --cask iterm2
        b.OhMyZsh,基于zsh命令行的一个扩展工具集
            brew install zsh
            sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
            zsh --version
    d.快捷工具
        a.x-cmd
            brew install x-cmd
        b.工具包
            dstp:诊断网络
    e.Tabby打开当前路径SFTP面板
        a.先连接到被远程的linux
            cd ~
            sudo -i
        b.vi ~/.bash_profile
            export PS1="$PS1\[\e]1337;CurrentDir="'$(pwd)\a\]'
        c.vi ~/.zshrc
            precmd () { echo -n "\x1b]1337;CurrentDir=$(pwd)\x07" }
        d.vi ~/.config/fish/config.fish
            function __tabby_working_directory_reporting --on-event fish_prompt
                echo -en "\e]1337;CurrentDir=$PWD\x7"
            end
        e.使用
            可以直接点击右键 打开SFTP面板
            也可以点击右上角的 SFTP

03.配置文件
    a.~/.bash_profile
        # 基础 PATH - 确保基本命令可用
        export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"

        # ps
        export PS1="\W$ "

        # system
        alias cls='clear'
        alias ll='ls -l'
        alias la='ls -a'
        alias vi='vim'
        alias grep="grep --color=auto"
        alias bs="chsh -s /bin/bash"
        alias zs="chsh -s /bin/zsh"
        alias ss='exec $SHELL'
        alias stamp="date +"%Y%m%d_%H%M%S""

        # 终端代理 (Surge) - 自动检测
        _surge_proxy_init() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          if (echo >/dev/tcp/127.0.0.1/6152) 2>/dev/null; then
            export https_proxy="http://${ip}:6152"
            export http_proxy="http://${ip}:6152"
            export all_proxy="socks5://${ip}:6153"
            echo "[Proxy] Surge detected ✓"
          else
            unset https_proxy http_proxy all_proxy
            echo "[Proxy] Surge not running, proxy disabled"
          fi
        }
        _surge_proxy_init

        # 代理快捷命令
        proxy_status() {
          echo "--- Env Vars ---"
          echo "http_proxy:   ${http_proxy:-<unset>}"
          echo "https_proxy:  ${https_proxy:-<unset>}"
          echo "all_proxy:    ${all_proxy:-<unset>}"
          echo "--- Port 6152 ---"
          if (echo >/dev/tcp/127.0.0.1/6152) 2>/dev/null; then
            echo "Surge: LISTENING ✓"
          else
            echo "Surge: NOT running"
          fi
        }
        proxy_reload() { _surge_proxy_init; }
        proxy_enable() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          export https_proxy="http://${ip}:6152"
          export http_proxy="http://${ip}:6152"
          export all_proxy="socks5://${ip}:6153"
          echo "[Proxy] Enabled: ${ip}:6152"
        }
        proxy_disable() {
          unset https_proxy http_proxy all_proxy
          echo "[Proxy] Disabled"
        }

        #############################################################################################

        # homebrew
        export HOMEBREW_NO_AUTO_UPDATE=1
        export HOMEBREW_AUTO_UPDATE_SECS=86400
        export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
        export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
        export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
        export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
        export HOMEBREW_PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
        export PATH="/opt/homebrew/bin:$PATH"
        export PATH="/opt/homebrew/sbin:$PATH"

        # java
        export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home"
        export JRE_HOME="$JAVA_HOME/jre"
        export CLASS_PATH=".:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
        export PATH="$JAVA_HOME/bin:$PATH"

        # nvm
        export NVM_DIR="$HOME/.nvm"
        [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
        [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"

        # rust
        CARGO_HOME="$HOME/.cargo"
        RUSTUP_HOME="$HOME/.rustup"
        PATH="$CARGO_HOME/bin:$PATH"

        # pyenv
        alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
        export PYENV_ROOT="$HOME/.pyenv"
        [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
        eval "$(pyenv init - bash)"

        # mysql、redis、mongodb、postgresql、kafka、rabbitmq
        # export PATH="/usr/local/mysql/bin:$PATH"
        # export PATH="/usr/local/mysql/support-files:$PATH"
        # export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
        # export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
        export PATH="/opt/homebrew/opt/redis/bin:$PATH"
        export PATH="/opt/homebrew/opt/mongodb-community/bin:$PATH"
        export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
        export PATH="/opt/homebrew/opt/kafka/bin:$PATH"
        export PATH="/opt/homebrew/opt/rabbitmq/sbin:$PATH"

        # uv、windsurf、toolbox
        export PATH="$HOME/.local/bin:$PATH"
        export PATH="/Users/troyesivens/.codeium/windsurf/bin:$PATH"
        export PATH="/Users/troyesivens/Library/Application Support/JetBrains/Toolbox/scripts:$PATH"

        # nacos
        alias start-nacos='cd /opt/homebrew/opt/nacos/bin && sh startup.sh -m standalone'
        alias stop-nacos='cd /opt/homebrew/opt/nacos/bin && sh shutdown.sh'
        export PATH="/opt/homebrew/opt/nacos/bin:$PATH"

        # minio
        alias start-minio='minio server /opt/homebrew/var/minio --address 127.0.0.1:9000 --console-address 127.0.0.1:9001 > /dev/null 2>&1 & echo "MinIO started."'
        alias stop-minio='pkill -f "minio server /opt/homebrew/var/minio" && echo "MinIO stopped."'

        #############################################################################################
        
        # cc-connect
        alias start-cc='cc-connect -config ~/.cc-connect/config.toml > /dev/null 2>&1 & echo "cc-connect started."'
        alias stop-cc='pkill -f "cc-connect" && echo "cc-connect stopped."'
        alias restart-cc='pkill -f "cc-connect"; sleep 1; cc-connect -config ~/.cc-connect/config.toml > /dev/null 2>&1 & echo "cc-connect restarted."'
        alias status-cc='ps aux | grep "cc-connect" | grep -v grep'
        alias logs-cc='tail -f ~/Library/Logs/cc-connect/cc-connect.log'

        # happy-coder
        alias start-happy='happy daemon start'
        alias stop-happy='happy daemon stop'
        alias restart-happy='happy daemon stop && sleep 1 && happy daemon start'
        alias status-happy='happy daemon status'
        alias logs-happy='tail -f ~/Library/Logs/happy-coder/daemon.log'

        # telegram-bridge
        alias start-tg='cd /Users/troyesivens/Documents/software_xare/gemini-valut/telegram-bridge && ./run.sh > /dev/null 2>&1 & echo "telegram-bridge started."'
        alias stop-tg='pkill -f "node.*telegram-bridge" && echo "telegram-bridge stopped."'
        alias restart-tg='pkill -f "node.*telegram-bridge"; sleep 1; cd /Users/troyesivens/Documents/software_xare/gemini-valut/telegram-bridge && ./run.sh > /dev/null 2>&1 & echo "telegram-bridge restarted."'
        alias status-tg='ps aux | grep "telegram-bridge" | grep -v grep'
        alias logs-tg='tail -f ~/Library/Logs/telegram-bridge/bridge.log'

        # codeman (使用 Node.js v22)
        alias start-codeman='PATH="/Users/troyesivens/.nvm/versions/node/v22.19.0/bin:$PATH" codeman web > /dev/null 2>&1 & echo "Codeman started at http://localhost:3000"'
        alias stop-codeman='pkill -f "node.*codeman" && echo "Codeman stopped."'
        alias restart-codeman='pkill -f "node.*codeman"; sleep 1; PATH="/Users/troyesivens/.nvm/versions/node/v22.19.0/bin:$PATH" codeman web > /dev/null 2>&1 & echo "Codeman restarted."'
        alias status-codeman='ps aux | grep "codeman" | grep -v grep'
        alias logs-codeman='tail -f ~/.codeman/logs/codeman.log 2>/dev/null || echo "No logs found"'

        # ccbot
        alias start-ccbot='ccbot > /dev/null 2>&1 & echo "ccbot started."'
        alias stop-ccbot='pkill -f "ccbot" && echo "ccbot stopped."'
        alias restart-ccbot='pkill -f "ccbot"; sleep 1; ccbot > /dev/null 2>&1 & echo "ccbot restarted."'
        alias status-ccbot='ps aux | grep "ccbot" | grep -v grep'
        alias logs-ccbot='tail -f ~/.ccbot/ccbot.log 2>/dev/null || echo "No logs found"'

        #############################################################################################

        # ai path
        export PATH="/Users/troyesivens/.nvm/versions/node/v20.10.0/bin:$PATH"

        # openai codex

        # claude code
        # export ANTHROPIC_BASE_URL="https://anyrouter.top"
        # export ANTHROPIC_API_KEY="sk-kHEqxGkdOfWagJeP9WsfAToLpUOh3C8blJDelYvSb5WeJKuO"
        # export ANTHROPIC_AUTH_TOKEN="sk-kHEqxGkdOfWagJeP9WsfAToLpUOh3C8blJDelYvSb5WeJKuO"

        # claude code
        # export ANTHROPIC_BASE_URL="https://claude-code.pseudoyu.com/api"
        # export ANTHROPIC_API_KEY="cr_48266c79ca4091247a6ac139f6c697b3435528526b3a8bf955113a9878461657"
        # export ANTHROPIC_AUTH_TOKEN="cr_48266c79ca4091247a6ac139f6c697b3435528526b3a8bf955113a9878461657"

        # gemini code
        # export GOOGLE_GEMINI_BASE_URL="https://zenmux.ai/api/vertex-ai"
        # export GEMINI_API_KEY="sk-ss-v1-7e2c63e1b09c724cf1d2ea945d9e8c459a353d9e29cad4cc0166dd5380bdd774"
        # export GEMINI_MODEL="google/gemini-3-pro-preview"

        # memory
        export MEMORY_FILE_PATH="/Users/troyesivens/mcp_memory.txt"

        # ohmyzsh
        export ZSH="$HOME/.oh-my-zsh"
        export ZSH_CUSTOM="$HOME/.oh-my-zsh"

        #############################################################################################

        # docker
        if [ -n "$ZSH_VERSION" ]; then
          # docker
          fpath=(/Users/troyesivens/.docker/completions $fpath)
          autoload -Uz compinit
          compinit
        fi

        # thefuck
        eval $(thefuck --alias)
        eval $(thefuck --alias FUCK)

        # x-cmd
        [ ! -f "$HOME/.x-cmd.root/X" ] || . "$HOME/.x-cmd.root/X"

        # golang
        [ -s "${HOME}/.g/env" ] && \. "${HOME}/.g/env"

        # autojump
        [ -f /opt/homebrew/etc/profile.d/autojump.sh ] && . /opt/homebrew/etc/profile.d/autojump.sh

        # forgit
        [ -f $HOMEBREW_PREFIX/share/forgit/forgit.plugin.sh ] && source $HOMEBREW_PREFIX/share/forgit/forgit.plugin.sh

        # refresh
        . "$HOME/.local/bin/env"


        [ ! -f "$HOME/.x-cmd.root/X" ] || . "$HOME/.x-cmd.root/X" # boot up x-cmd.
    b.~/.zshrc
        # 基础 PATH - 确保基本命令可用
        export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"

        # system
        alias cls='clear'
        alias bs="chsh -s /bin/bash"
        alias zs="chsh -s /bin/zsh"
        alias ss='exec $SHELL'
        alias stamp="date +"%Y%m%d_%H%M%S""

        # 终端代理 (Surge) - 自动检测
        _surge_proxy_init() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          if zmodload zsh/net/tcp 2>/dev/null && ztcp 127.0.0.1 6152 2>/dev/null; then
            ztcp -c $REPLY 2>/dev/null
            export https_proxy="http://${ip}:6152"
            export http_proxy="http://${ip}:6152"
            export all_proxy="socks5://${ip}:6153"
            echo "[Proxy] Surge detected ✓"
          else
            unset https_proxy http_proxy all_proxy
            echo "[Proxy] Surge not running, proxy disabled"
          fi
        }
        _surge_proxy_init

        # 代理快捷命令
        proxy_status() {
          echo "--- Env Vars ---"
          echo "http_proxy:   ${http_proxy:-<unset>}"
          echo "https_proxy:  ${https_proxy:-<unset>}"
          echo "all_proxy:    ${all_proxy:-<unset>}"
          echo "--- Port 6152 ---"
          if zmodload zsh/net/tcp 2>/dev/null && ztcp 127.0.0.1 6152 2>/dev/null; then
            ztcp -c $REPLY 2>/dev/null
            echo "Surge: LISTENING ✓"
          else
            echo "Surge: NOT running"
          fi
        }
        proxy_reload() { _surge_proxy_init; }
        proxy_enable() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          export https_proxy="http://${ip}:6152"
          export http_proxy="http://${ip}:6152"
          export all_proxy="socks5://${ip}:6153"
          echo "[Proxy] Enabled: ${ip}:6152"
        }
        proxy_disable() {
          unset https_proxy http_proxy all_proxy
          echo "[Proxy] Disabled"
        }

        #############################################################################################

        # homebrew
        export HOMEBREW_NO_AUTO_UPDATE=1
        export HOMEBREW_AUTO_UPDATE_SECS=86400
        export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
        export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
        export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
        export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
        export HOMEBREW_PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
        export PATH="/opt/homebrew/bin:$PATH"
        export PATH="/opt/homebrew/sbin:$PATH"

        # java
        export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home"
        export JRE_HOME="$JAVA_HOME/jre"
        export CLASS_PATH=".:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
        export PATH="$JAVA_HOME/bin:$PATH"

        # nvm
        export NVM_DIR="$HOME/.nvm"
        [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
        [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"

        # rust
        CARGO_HOME="$HOME/.cargo"
        RUSTUP_HOME="$HOME/.rustup"
        PATH="$CARGO_HOME/bin:$PATH"

        # pyenv
        export PYENV_ROOT="$HOME/.pyenv"
        if [[ -d $PYENV_ROOT/bin ]]; then
          export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
          eval "$(pyenv init - zsh)"
          alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
        fi

        # mysql、redis、mongodb、postgresql、kafka、rabbitmq
        # export PATH="/usr/local/mysql/bin:$PATH"
        # export PATH="/usr/local/mysql/support-files:$PATH"
        # export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
        # export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
        export PATH="/opt/homebrew/opt/redis/bin:$PATH"
        export PATH="/opt/homebrew/opt/mongodb-community/bin:$PATH"
        export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
        export PATH="/opt/homebrew/opt/kafka/bin:$PATH"
        export PATH="/opt/homebrew/opt/rabbitmq/sbin:$PATH"

        # uv、windsurf、toolbox
        export PATH="$HOME/.local/bin:$PATH"
        export PATH="/Users/troyesivens/.codeium/windsurf/bin:$PATH"
        export PATH="/Users/troyesivens/Library/Application Support/JetBrains/Toolbox/scripts:$PATH"

        # nacos (launchd 管理)
        # 用法: nacos start|stop|restart|status|logs
        nacos() {
            local plist="$HOME/Library/LaunchAgents/com.nacos.server.plist"
            local label="com.nacos.server"
            local port=8848
            case "$1" in
                start)
                    launchctl load "$plist" 2>/dev/null && echo "Nacos started." || echo "Nacos already running or failed to start."
                    ;;
                stop)
                    launchctl unload "$plist" 2>/dev/null && echo "Nacos stopped." || echo "Nacos not running."
                    ;;
                restart)
                    launchctl unload "$plist" 2>/dev/null
                    sleep 2
                    launchctl load "$plist" && echo "Nacos restarted."
                    ;;
                status)
                    local pid=$(launchctl list | grep "$label" | awk '{print $1}')
                    if [[ "$pid" =~ ^[0-9]+$ ]]; then
                        echo "Nacos is running (PID: $pid, Port: $port)"
                    else
                        echo "Nacos is not running."
                    fi
                    ;;
                logs)
                    tail -100f /opt/homebrew/opt/nacos/logs/nacos.log
                    ;;
                *)
                    echo "Usage: nacos {start|stop|restart|status|logs}"
                    ;;
            esac
        }

        # minio
        alias start-minio='minio server /opt/homebrew/var/minio --address 127.0.0.1:9000 --console-address 127.0.0.1:9001 > /dev/null 2>&1 & echo "MinIO started."'
        alias stop-minio='pkill -f "minio server /opt/homebrew/var/minio" && echo "MinIO stopped."'

        #############################################################################################

        # cc-connect
        alias start-cc='cc-connect -config ~/.cc-connect/config.toml > /dev/null 2>&1 & echo "cc-connect started."'
        alias stop-cc='pkill -f "cc-connect" && echo "cc-connect stopped."'
        alias restart-cc='pkill -f "cc-connect"; sleep 1; cc-connect -config ~/.cc-connect/config.toml > /dev/null 2>&1 & echo "cc-connect restarted."'
        alias status-cc='ps aux | grep "cc-connect" | grep -v grep'
        alias logs-cc='tail -f ~/Library/Logs/cc-connect/cc-connect.log'

        # happy-coder
        alias start-happy='happy daemon start'
        alias stop-happy='happy daemon stop'
        alias restart-happy='happy daemon stop && sleep 1 && happy daemon start'
        alias status-happy='happy daemon status'
        alias logs-happy='tail -f ~/Library/Logs/happy-coder/daemon.log'

        # telegram-bridge
        alias start-tg='cd /Users/troyesivens/Documents/software_xare/gemini-valut/telegram-bridge && ./run.sh > /dev/null 2>&1 & echo "telegram-bridge started."'
        alias stop-tg='pkill -f "node.*telegram-bridge" && echo "telegram-bridge stopped."'
        alias restart-tg='pkill -f "node.*telegram-bridge"; sleep 1; cd /Users/troyesivens/Documents/software_xare/gemini-valut/telegram-bridge && ./run.sh > /dev/null 2>&1 & echo "telegram-bridge restarted."'
        alias status-tg='ps aux | grep "telegram-bridge" | grep -v grep'
        alias logs-tg='tail -f ~/Library/Logs/telegram-bridge/bridge.log'

        # codeman (使用 Node.js v22)
        alias start-codeman='PATH="/Users/troyesivens/.nvm/versions/node/v22.19.0/bin:$PATH" codeman web > /dev/null 2>&1 & echo "Codeman started at http://localhost:3000"'
        alias stop-codeman='pkill -f "node.*codeman" && echo "Codeman stopped."'
        alias restart-codeman='pkill -f "node.*codeman"; sleep 1; PATH="/Users/troyesivens/.nvm/versions/node/v22.19.0/bin:$PATH" codeman web > /dev/null 2>&1 & echo "Codeman restarted."'
        alias status-codeman='ps aux | grep "codeman" | grep -v grep'
        alias logs-codeman='tail -f ~/.codeman/logs/codeman.log 2>/dev/null || echo "No logs found"'

        # ccbot
        alias start-ccbot='ccbot > /dev/null 2>&1 & echo "ccbot started."'
        alias stop-ccbot='pkill -f "ccbot" && echo "ccbot stopped."'
        alias restart-ccbot='pkill -f "ccbot"; sleep 1; ccbot > /dev/null 2>&1 & echo "ccbot restarted."'
        alias status-ccbot='ps aux | grep "ccbot" | grep -v grep'
        alias logs-ccbot='tail -f ~/.ccbot/ccbot.log 2>/dev/null || echo "No logs found"'

        #############################################################################################

        # ai path
        export PATH="/Users/troyesivens/.nvm/versions/node/v20.10.0/bin:$PATH"

        # openai codex

        # gemini (claude-octopus)
        # export GOOGLE_GEMINI_BASE_URL="https://zenmux.ai/api/vertex-ai"
        # export GEMINI_API_KEY="sk-ss-v1-7e2c63e1b09c724cf1d2ea945d9e8c459a353d9e29cad4cc0166dd5380bdd774"
        # export GEMINI_MODEL="google/gemini-3-pro-preview"

        # claude code
        # export ANTHROPIC_BASE_URL="https://anyrouter.top"
        # export ANTHROPIC_API_KEY="sk-kHEqxGkdOfWagJeP9WsfAToLpUOh3C8blJDelYvSb5WeJKuO"
        # export ANTHROPIC_AUTH_TOKEN="sk-kHEqxGkdOfWagJeP9WsfAToLpUOh3C8blJDelYvSb5WeJKuO"

        # claude code
        # export ANTHROPIC_BASE_URL="https://claude-code.pseudoyu.com/api"
        # export ANTHROPIC_API_KEY="cr_48266c79ca4091247a6ac139f6c697b3435528526b3a8bf955113a9878461657"
        # export ANTHROPIC_AUTH_TOKEN="cr_48266c79ca4091247a6ac139f6c697b3435528526b3a8bf955113a9878461657"

        # gemini code
        # export CODE_ASSIST_ENDPOINT="https://claude-code.pseudoyu.com/gemini"
        # export GOOGLE_CLOUD_ACCESS_TOKEN="cr_48266c79ca4091247a6ac139f6c697b3435528526b3a8bf955113a9878461657"
        # export GOOGLE_GENAI_USE_GCA="true"

        # memory
        export MEMORY_FILE_PATH="/Users/troyesivens/mcp_memory.txt"

        # ohmyzsh
        export ZSH="$HOME/.oh-my-zsh"
        export ZSH_CUSTOM="$HOME/.oh-my-zsh"
        ZSH_THEME="powerlevel10k/powerlevel10k"
        plugins=(
          git
          z
          web-search
          zsh-autosuggestions
          zsh-syntax-highlighting
        )
        source $ZSH/oh-my-zsh.sh

        #############################################################################################

        # docker
        fpath=(/Users/troyesivens/.docker/completions $fpath)
        autoload -Uz compinit
        compinit

        # thefuck
        if command -v thefuck &> /dev/null; then
          eval $(thefuck --alias)
          eval $(thefuck --alias FUCK)
        fi

        # x-cmd
        [ ! -f "$HOME/.x-cmd.root/X" ] || . "$HOME/.x-cmd.root/X"

        # golang
        [ -s "${HOME}/.g/env" ] && \. "${HOME}/.g/env"

        # autojump
        [ -f /opt/homebrew/etc/profile.d/autojump.sh ] && . /opt/homebrew/etc/profile.d/autojump.sh

        # iterm2
        test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"

        # forgit
        [ -f $HOMEBREW_PREFIX/share/forgit/forgit.plugin.zsh ] && source $HOMEBREW_PREFIX/share/forgit/forgit.plugin.zsh

        # p10k
        [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

        # refresh
        . "$HOME/.local/bin/env"

        [[ "$TERM_PROGRAM" == "kiro" ]] && . "$(kiro --locate-shell-integration-path zsh)"

        # Added by CodeBuddy
        export PATH="/Users/troyesivens/.codebuddy/bin:$PATH"
        if [[ "$TERM_PROGRAM" == "codebuddy" ]]; then
          if command -v buddy &>/dev/null; then
            . "$(buddy --locate-shell-integration-path zsh)"
          fi
        fi

        [ ! -f "$HOME/.x-cmd.root/X" ] || . "$HOME/.x-cmd.root/X" # boot up x-cmd.

        # Added by Windsurf
        export PATH="/Users/troyesivens/.codeium/windsurf/bin:$PATH"

        # bun completions
        [ -s "/Users/troyesivens/.bun/_bun" ] && source "/Users/troyesivens/.bun/_bun"

        # bun
        export BUN_INSTALL="$HOME/.bun"
        export PATH="$BUN_INSTALL/bin:$PATH"

        # bun
        export BUN_INSTALL="$HOME/.bun"
        export PATH="$BUN_INSTALL/bin:$PATH"
        # Added by Antigravity
        export PATH="/Users/troyesivens/.antigravity/antigravity/bin:$PATH"

        # opencode
        export PATH=/Users/troyesivens/.opencode/bin:$PATH
    c.~/.zprofile
        略
    d.~/.config/starship.toml
        # 根据 schema 提供自动补全
        "$schema" = 'https://starship.rs/config-schema.json'

        # 在提示符之间插入空行
        add_newline = true

        # 将提示符中的 '❯' 替换为 '➜'
        [character] # 此组件名称为 'character'
        success_symbol = '[➜](bold green)' # 将 'success_symbol' 字段设置成颜色为 'bold green' 的 '➜'

        # 禁用 'package' 组件,将其隐藏
        [package]
        disabled = true

04.自动代理
    a.info
        # 1. 查看当前代理状态
        proxy_status
        # 2. 查看本机 IP
        ipconfig getifaddr en0 || ipconfig getifaddr en1
        # 3. 测试代理是否生效
        curl -I --proxy http://127.0.0.1:6152 https://www.google.com
        # 4. 新开终端后查看环境变量
        echo $https_proxy
        -----------------------------------------------------------------------------------------------------
        1.启动自动检测逻辑
        .zshrc 用 ztcp(zsh 原生,无 fork)
        .bash_profile 用 /dev/tcp(bash 内置,无 fork)
        可连 6152 → 用 LOCAL_IP 动态 IP export 三个变量,打印 [Proxy] Surge detected ✓
        不可连 → unset 三个变量,打印 [Proxy] Surge not running, proxy disabled
        -----------------------------------------------------------------------------------------------------
        2.四个手动命令
        命令	功能
        proxy_status	显示当前环境变量值 + 实时检测 6152 是否在监听
        proxy_reload	当前 session 重新跑一次检测,不用重开终端
        proxy_enable	强制设代理变量(无视检测结果)
        proxy_disable	强制 unset 三个变量
    b.refresh
        # 刷新 zshrc
        source ~/.zshrc
        # 刷新 bash_profile
        source ~/.bash_profile
        # 自动判断 shell 类型
        alias ss='exec $SHELL'
        # 使用 && 来刷新 Shell
        alias ss="source ~/.zshrc && source ~/.bash_profile"
        -----------------------------------------------------------------------------------------------------
        # command
        alias proxy_on='~/command/proxy_on.sh'
        alias proxy_off='~/command/proxy_off.sh'
        alias proxy_info='~/command/proxy_info.sh'
        -----------------------------------------------------------------------------------------------------
        # 重载当前 session(不用重开终端)
        source ~/.zshrc
        # 查看状态(环境变量 + 端口实时检测)
        proxy_status
        # Surge 关了但需要临时开代理
        proxy_enable
        # 连国企 WiFi 前,强制关闭
        proxy_disable
        # Surge 开了,当前 session 重新检测
        proxy_reload
        -----------------------------------------------------------------------------------------------------
        20260325,测试
        1.先关闭surge,然后替代proxy_disable来操作
        2.使用ss后,iTerm新开窗口,显示[Proxy] Surge not running, proxy disabled
        3.经测试,此时的vscode里面的claudecode扩展,不能直接对话,还是必须要重启vscode才能生效
    c.zshrc
        # 终端代理 (Surge) - 自动检测
        _surge_proxy_init() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          if zmodload zsh/net/tcp 2>/dev/null && ztcp 127.0.0.1 6152 2>/dev/null; then
            ztcp -c $REPLY 2>/dev/null
            export https_proxy="http://${ip}:6152"
            export http_proxy="http://${ip}:6152"
            export all_proxy="socks5://${ip}:6153"
            echo "[Proxy] Surge detected ✓"
          else
            unset https_proxy http_proxy all_proxy
            echo "[Proxy] Surge not running, proxy disabled"
          fi
        }
        _surge_proxy_init
        
        # 代理快捷命令
        proxy_status() {
          echo "--- Env Vars ---"
          echo "http_proxy:   ${http_proxy:-<unset>}"
          echo "https_proxy:  ${https_proxy:-<unset>}"
          echo "all_proxy:    ${all_proxy:-<unset>}"
          echo "--- Port 6152 ---"
          if zmodload zsh/net/tcp 2>/dev/null && ztcp 127.0.0.1 6152 2>/dev/null; then
            ztcp -c $REPLY 2>/dev/null
            echo "Surge: LISTENING ✓"
          else
            echo "Surge: NOT running"
          fi
        }
        proxy_reload() { _surge_proxy_init; }
        proxy_enable() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          export https_proxy="http://${ip}:6152"
          export http_proxy="http://${ip}:6152"
          export all_proxy="socks5://${ip}:6153"
          echo "[Proxy] Enabled: ${ip}:6152"
        }
        proxy_disable() {
          unset https_proxy http_proxy all_proxy
          echo "[Proxy] Disabled"
        }
    d.bash_profile
        # 终端代理 (Surge) - 自动检测
        _surge_proxy_init() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          if (echo >/dev/tcp/127.0.0.1/6152) 2>/dev/null; then
            export https_proxy="http://${ip}:6152"
            export http_proxy="http://${ip}:6152"
            export all_proxy="socks5://${ip}:6153"
            echo "[Proxy] Surge detected ✓"
          else
            unset https_proxy http_proxy all_proxy
            echo "[Proxy] Surge not running, proxy disabled"
          fi
        }
        _surge_proxy_init
        
        # 代理快捷命令
        proxy_status() {
          echo "--- Env Vars ---"
          echo "http_proxy:   ${http_proxy:-<unset>}"
          echo "https_proxy:  ${https_proxy:-<unset>}"
          echo "all_proxy:    ${all_proxy:-<unset>}"
          echo "--- Port 6152 ---"
          if (echo >/dev/tcp/127.0.0.1/6152) 2>/dev/null; then
            echo "Surge: LISTENING ✓"
          else
            echo "Surge: NOT running"
          fi
        }
        proxy_reload() { _surge_proxy_init; }
        proxy_enable() {
          local ip=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en2 2>/dev/null || echo "127.0.0.1")
          export https_proxy="http://${ip}:6152"
          export http_proxy="http://${ip}:6152"
          export all_proxy="socks5://${ip}:6153"
          echo "[Proxy] Enabled: ${ip}:6152"
        }
        proxy_disable() {
          unset https_proxy http_proxy all_proxy
          echo "[Proxy] Disabled"
        }
    e.绕过代理
        我看到问题了!错误页面显示 "Surge Mac/6.4.3" - 这说明你的网络使用了 Surge 代理,它阻止了对 localhost 的连接。
        -----------------------------------------------------------------------------------------------------
        这不是服务问题,而是网络代理配置问题。你有两个解决方案:
        方案 1:在 Surge 中绕过 localhost
        打开 Surge → 配置 → 绕过规则
        添加 localhost 或 127.0.0.1 到绕过列表
        -----------------------------------------------------------------------------------------------------
        方案 2:直接用浏览器打开
        浏览器可能绕过了代理
        直接访问 http://localhost:5178
        -----------------------------------------------------------------------------------------------------
        问题是 Surge 代理阻止了 localhost 连接。请:
        临时关闭 Surge 代理 或
        在 Surge 中添加 localhost 绕过规则:
        Surge → 偏好设置 → 网络 → 绕过代理设置
        添加 localhost, 127.0.0.1
    f.刷新代理
        ss(exec $SHELL)会用新 shell 实例替换当前进程,自动重新 source .zshrc,代理检测会重新跑一次。
        -----------------------------------------------------------------------------------------------------
        不同点:
        命令             行为
        ss              替换整个 shell 进程,重载所有配置(重量级)
        proxy_reload    只重跑代理检测函数,其他配置不动(轻量级)
        -----------------------------------------------------------------------------------------------------
        所以:
        Surge 刚开/关,想立刻更新代理状态 → 用 proxy_reload,更快
        想完整刷新整个终端环境 → 用 ss,也能顺带更新代理
        两个都能用,proxy_reload 是专门针对代理场景的轻量版。

1.2 nginx

01.常用信息1
    a.安装
        brew install nginx
        brew info nginx
    b.信息
        nginx -t
        nginx -s reload
    c.命令
        brew services start nginx
        brew services stop nginx
        brew services restart nginx
        brew services reload nginx
    d.配置
        /opt/homebrew/opt/nginx
        /opt/homebrew/Cellar/nginx/
        /opt/homebrew/etc/nginx/nginx.conf
    e.配置文件
        root       /opt/homebrew/var/www/jeecg;
        root       /opt/homebrew/var/www/pisces;
        pid        /opt/homebrew/var/run/nginx.pid;
        error_log  /opt/homebrew/var/log/nginx/error.log;
        access_log /opt/homebrew/var/log/nginx/access.log main;

02.常用信息2
    a.plist
        vi /opt/homebrew/Cellar/nginx/1.27.5/homebrew.mxcl.nginx.plist
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
        <dict>
            <key>Label</key>
            <string>homebrew.mxcl.nginx</string>
            <key>LimitLoadToSessionType</key>
            <array>
                <string>Aqua</string>
                <string>Background</string>
                <string>LoginWindow</string>
                <string>StandardIO</string>
                <string>System</string>
            </array>
            <key>ProgramArguments</key>
            <array>
                <string>/opt/homebrew/opt/nginx/bin/nginx</string>
                <string>-g</string>
                <string>daemon off;</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
            <key>WorkingDirectory</key>
            <string>/opt/homebrew</string>
        </dict>
        </plist>
    b.默认
        www:/opt/homebrew/var/www
        dist:/opt/homebrew/etc/nginx/servers/
        配置:/opt/homebrew/etc/nginx/nginx.conf
    c./opt/homebrew/etc/nginx/nginx.conf
        # Homebrew 安装的 Nginx 推荐配置
        # user nobody;  # 非 root 用户运行时可省略

        worker_processes  1;

        pid /opt/homebrew/var/run/nginx.pid;

        events {
            worker_connections  1024;
        }

        http {
            include       mime.types;
            default_type  application/octet-stream;

            # 日志格式
            log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for" '
                              '"$proxy_host" "$upstream_addr"';

            # 日志路径(确保目录存在)
            access_log  /opt/homebrew/var/log/nginx/access.log  main;
            error_log   /opt/homebrew/var/log/nginx/error.log;

            sendfile        on;
            #tcp_nopush     on;

            keepalive_timeout  65;

            # gzip 压缩配置
            gzip  on;
            gzip_http_version 1.1;
            gzip_comp_level 4;
            gzip_min_length 1000;
            gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss;

            server {
                listen       81;
                server_name  localhost;

                # pisces前端项目 - 静态资源服务
                location / {
                    root   /opt/homebrew/var/www/pisces;
                    index  index.html index.htm;
                    try_files $uri $uri/ /index.html;
                }

                # 代码生成器服务配置
                # /piscesboot/online/* -> http://localhost:9984/pisces-code/*
                location ^~ /piscesboot/online {
                    proxy_pass   http://localhost:9984;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    rewrite ^/piscesboot/(.*)$ /pisces-code/$1 break;
                }

                # 主服务配置
                location /piscesboot {
                    proxy_pass   http://localhost:9994/pisces-boot;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                # 上传服务配置
                location /upload {
                    proxy_pass   http://localhost:3300;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   /opt/homebrew/var/www;
                }
            }

            server {
                listen       82;
                server_name  localhost;

                # pisces前端项目 - 静态资源服务
                location / {
                    root   /opt/homebrew/var/www/pisces-cloud;
                    index  index.html index.htm;
                    try_files $uri $uri/ /index.html;  # 处理vue路由
                }

                # 代码生成器服务配置
                # 对应环境变量:VITE_GLOB_ONLINE_URL=http://localhost:9984/pisces-code
                # 用途:处理所有以/piscesboot/online开头的请求
                # 示例:/piscesboot/online/cgform/head/list -> http://localhost:9984/pisces-code/cgform/head/list
                # location ^~ /piscesboot/online {
                #     proxy_pass   http://localhost:9984;  # 修改为基础URL
                #     proxy_set_header Host $host;
                #     proxy_set_header X-Real-IP $remote_addr;
                #     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #     rewrite ^/piscesboot/(.*) /pisces-code/$1 break;  # 修改rewrite规则,保持路径其余部分不变
                # }

                # 主服务配置
                # 对应环境变量:VITE_GLOB_DOMAIN_URL=http://localhost:9994/pisces-boot
                # 用途:处理除/online外的所有/piscesboot请求
                location /piscesboot {
                    proxy_pass   http://localhost:9999;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    rewrite ^/piscesboot/(.*) /$1 break;
                }

                # # 报表服务配置
                # # 用途:将 /jmreport 重定向到完整的报表服务URL
                # # 对应环境变量:VITE_GLOB_REPORT_URL=http://localhost:9974/pisces-jimu
                # # 用途:处理报表相关请求,前端通过window._CONFIG['reportURL']直接访问
                # # 示例:http://127.0.0.1/jmreport -> http://localhost:9974/pisces-jimu/jmreport/list
                # location /jmreport {
                #     proxy_pass   http://localhost:9974/pisces-jimu/jmreport;  # 移除/list
                #     proxy_set_header Host $host;
                #     proxy_set_header X-Real-IP $remote_addr;
                #     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #     rewrite ^/jmreport$ /jmreport/list permanent;  # 添加重定向规则
                # }

                # 上传服务配置
                # 对应环境变量:VITE_GLOB_UPLOAD_URL=http://localhost:3300
                # 用途:处理文件上传请求
                location /upload {
                    proxy_pass   http://localhost:3300;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   /opt/homebrew/var/www;
                }
            }

            server {
                listen       83;
                server_name  localhost;

                # pisces前端项目 - 静态资源服务
                location / {
                    root   /opt/homebrew/var/www/pisces;
                    index  index.html index.htm;
                    try_files $uri $uri/ /index.html;
                }

                # 代码生成器服务配置
                # /piscesboot/online/* -> http://localhost:9984/pisces-code/*
                location ^~ /piscesboot/online {
                    proxy_pass   http://localhost:9984;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    rewrite ^/piscesboot/(.*)$ /pisces-code/$1 break;
                }

                # 主服务配置
                location /piscesboot {
                    proxy_pass   http://localhost:9994/pisces-boot;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                # 上传服务配置
                location /upload {
                    proxy_pass   http://localhost:3300;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   /opt/homebrew/var/www;
                }
            }

            server {
                listen       84;
                server_name  localhost;

                # jeecg前端项目 - 静态资源服务
                location / {
                    root   /opt/homebrew/var/www/jeecg;
                    index  index.html index.htm;
                    try_files $uri $uri/ /index.html;
                }

                # 主服务配置
                location /jeecg-boot {
                    proxy_pass   http://localhost:9994/jeecg-boot;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                # 上传服务配置
                location /upload {
                    proxy_pass   http://localhost:3300;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   /opt/homebrew/var/www;
                }
            }
        }

1.3 proxy

01.代理设置
    a.Windows
        a.git
            git config --global http.proxy 'http://127.0.0.1:7890'
            git config --global https.proxy 'http://127.0.0.1:7890'
        b.cmd
            setx -m http_proxy "http://127.0.0.1:7890" && setx -m https_proxy "http://127.0.0.1:7890"
        c.vscode
            "http.proxy": "http://127.0.0.1:7890"
        d.jetbrains
            HTTP:127.0.0.1、7890、SOCKS:127.0.0.1、7891
    b.Linux(LAN / TUN / TAP)(二选一)
        a.~/.profile
            echo "export ftp_proxy=http://192.168.2.2:7890" >> ~/.profile && source ~/.profile
            echo "export http_proxy=http://192.168.2.2:7890" >> ~/.profile && source ~/.profile
            echo "export https_proxy=http://192.168.2.2:7890" >> ~/.profile && source ~/.profile
        b.~/.bashrc
            echo "export ftp_proxy=http://192.168.2.2:7890" >> ~/.bashrc && source ~/.bashrc
            echo "export http_proxy=http://192.168.2.2:7890" >> ~/.bashrc && source ~/.bashrc
            echo "export https_proxy=http://192.168.2.2:7890" >> ~/.bashrc && source ~/.bashrc
    c.系统代理
        a.位置
            WIN10 -> 网络和Internet -> 代理 -> 手动设置代理
            WIN07 -> 控制面板 -> 网络和Internet -> Internet选项 -> 连接标签页 -> 局域网设置 -> 取消选中“为LAN使用代理服务器”的复选框
        b.开启
            reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f
        c.关闭
            reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f

02.开启代理
    a.网络设置
        1.打开系统设置
        2.网络 -> 点击当前连接的WiFi或以太网
        3.代理 -> 手动代理 -> 127.0.0.1:7890,适用于HTTP/HTTPS/SOCKS5代理
        4.勾选 -> 排除本地网络地址(可选),防止代理影响局域网设备访问
        5.应用
    b.Terminal代理
        1.设置HTTP/HTTPS代理
        sudo networksetup -setwebproxy Wi-Fi 127.0.0.1 7897
        sudo networksetup -setsecurewebproxy Wi-Fi 127.0.0.1 7897
        -----------------------------------------------------------------------------------------------------
        2.设置SOCKS5代理
        sudo networksetup -setsocksfirewallproxy Wi-Fi 127.0.0.1 7897
        -----------------------------------------------------------------------------------------------------
        3.关闭代理
        sudo networksetup -setwebproxystate Wi-Fi off
        sudo networksetup -setsecurewebproxystate Wi-Fi off
        sudo networksetup -setsocksfirewallproxystate Wi-Fi off
        sudo networksetup -setproxybypassdomains Wi-Fi ""
    c.Clash Verge Rev
        系统代理 -> 代理模式 -> Rule/Global/Direct
        DNS覆写 -> 默认域名服务器:8.8.8.8, 223.6.6.6, 119.29.29.29
        DNS覆写 -> 域名服务器:8.8.8.8, 223.6.6.6, https://doh.pub/dns-query, https://dns.alidns.com/dns-query
    d.Surge V5
        export https_proxy=http://127.0.0.1:6152;export http_proxy=http://127.0.0.1:6152;export all_proxy=socks5://127.0.0.1:6153
        URL Rewrite开,https:\/\/backend.raycast.com https://fuck-raycast.seefs.me header,mitm这个域名
        聚合需发订阅地址和SS协议,https://rule.pingxi241030.tech/get-artifact/YSurgeConfig.conf?access_token=ZDFGBGRGGHRGHRHRHRTRT
        surge打开,查看解密,然后将Surge Generated CA 17016F9F,将证书安装到系统,可以看到CA证书已被系统信任
        然后打开raycast看看你的用户名,如果是seefs那就表示生效了,ai对话也是通往我的模型,默认不同步本地数据
        先去掉代理登录,先登录自己的吗?这个软件逻辑就是这样,没登录直接不请求接口
        -----------------------------------------------------------------------------------------------------
        描述一下Task和Job的区别,并且写到outline给我地址
        这个是ai去做的不是固定文本,这个没有执行工具调用是模型的问题,这个模型比较弱智
        -----------------------------------------------------------------------------------------------------
        不过你用艾特调用的工具那就是你本地的,如果你装了这个插件的话,对话框艾特,
        不过装插件前你得先关代理,装完再打开,因为我没写这些接口的转发,关代理的话关重写就可以
        -----------------------------------------------------------------------------------------------------
        你可以存到你的本地的工具里的,这个支持ai extension
        转发也是转发到我的outline,这个是我自用就没写多用户,也不是非outline不可,你可以用apple notes或者notion
        我这个只有工具调用,你要求创建笔记才会存储到我的outline,还有一个地方是日志里有,不过日志一般没人看还是定期删除的

03.检查代理
    a.检查 macOS 系统代理
        scutil --proxy
        networksetup -getwebproxy Wi-Fi
        networksetup -getsecurewebproxy Wi-Fi
        networksetup -getsocksfirewallproxy Wi-Fi
        networksetup -getproxybypassdomains Wi-Fi
        -----------------------------------------------------------------------------------------------------
        如果返回 Enabled: Yes,说明代理已生效
        如果返回 Enabled: No,说明代理未生效
    b.使用 curl 测试代理
        curl -I --proxy http://127.0.0.1:7897 https://www.google.com
        -----------------------------------------------------------------------------------------------------
        如果返回 HTTP 200 OK,说明代理已生效
        如果超时或失败,可能是代理未生效或被拦截
    c.检查外网 IP
        curl ifconfig.me
        -----------------------------------------------------------------------------------------------------
        如果 IP 变成代理服务器的 IP,说明代理已生效
        如果 IP 仍是本机 IP,说明代理未生效
    d.检查 DNS 解析
        nslookup google.com 8.8.8.8
        -----------------------------------------------------------------------------------------------------
        如果能解析 IP,说明 DNS 正常
        如果失败,可能是 DNS 被干扰,手动设置:sudo networksetup -setdnsservers Wi-Fi 8.8.8.8 1.1.1.1
    e.检查 Clash 代理端口是否正常
        lsof -i :7897
        -----------------------------------------------------------------------------------------------------
        如果 Clash 监听了 127.0.0.1:7890,说明代理正常运行
        如果无输出,说明 Clash 未启动或端口未监听

04.解决方案
    a.分类1
        问题:curl -I https://www.google.com 超时
        原因:代理未正确设置
        解决:确保 Clash 运行并打开 System Proxy
    b.分类2
        问题:ping google.com 超时
        原因:ping 走 ICMP,不走代理
        解决:使用 curl 或 tracert 代替 ping
    c.分类3
        问题:curl ifconfig.me 显示本机 IP
        原因:代理未生效
        解决:重新启用 System Proxy 或手动设置
    d.分类4
        问题:networksetup -getwebproxy Wi-Fi 显示 Disabled
        原因:代理未开启
        解决:手动启用:sudo networksetup -setwebproxy Wi-Fi 127.0.0.1 7890
    e.分类5
        问题:Clash 规则模式无法访问外网
        原因:规则错误
        解决:设为 Global 模式,测试代理是否可用

05.相关脚本
    a.proxy_on.sh
        sudo networksetup -setwebproxy Wi-Fi 127.0.0.1 7897
        sudo networksetup -setsecurewebproxy Wi-Fi 127.0.0.1 7897
        sudo networksetup -setsocksfirewallproxy Wi-Fi 127.0.0.1 7897
        sudo networksetup -setproxybypassdomains Wi-Fi "127.0.0.1" "192.168.0.0/16" "10.0.0.0/8" "172.16.0.0/12" "172.29.0.0/16" "localhost" "*.local" "*.crashlytics.com" "<local>"
    b.proxy_off.sh
        sudo networksetup -setwebproxystate Wi-Fi off
        sudo networksetup -setsecurewebproxystate Wi-Fi off
        sudo networksetup -setsocksfirewallproxystate Wi-Fi off
        sudo networksetup -setproxybypassdomains Wi-Fi ""
        sudo networksetup -setproxybypassdomains Wi-Fi "127.0.0.1" "192.168.0.0/16" "10.0.0.0/8" "172.16.0.0/12" "172.29.0.0/16" "localhost" "*.local" "*.crashlytics.com" "<local>"
    c.proxy_info.sh
        scutil --proxy
        networksetup -getwebproxy Wi-Fi
        networksetup -getsecurewebproxy Wi-Fi
        networksetup -getsocksfirewallproxy Wi-Fi
        networksetup -getproxybypassdomains Wi-Fi

1.4 iterm2

01.基础设置
    a.安装
        https://iterm2.com/downloads/stable/latest
        https://iterm2.com/ai-plugin.html
    b.快捷键
        默认:鼠标选择复制
        -----------------------------------------------------------------------------------------------------
        Ctrl + N:新建窗口,New Window
        Ctrl + W:关闭窗口,Close
        Ctrl + T:新建标签页,New Tab
        Ctrl + D:水平分屏,Split Vertically with Current Profile
        Ctrl + Shift + D:垂直分屏,Split Horizontally with Current Profile
        Ctrl + Shift + I:切换同一个窗口内对多个标签页同时输入命令,Broadcast Input to All Panes in All Tabs
        -----------------------------------------------------------------------------------------------------
        Ctrl + C / WIN + C:这是终止当前正在运行的命令的标准快捷键。按下这个组合键会发送一个中断信号(SIGINT)给正在运行的进程,通常会停止该进程的执行。
        Ctrl + Z / WIN + Z:这会将当前进程挂起并将其置于后台。虽然这不会终止进程,但会停止其输出。你可以使用 fg 命令将其恢复到前台,或者使用 kill 命令终止它。
    c.默认终端
        Make Terminal Default Term
    d.General
        Closing -> Confirm closing multiple sessions -> 取消勾选
        Closing -> Confirm "Quit iTerm2(%Q)" -> 取消勾选
    e.Appearance
        General -> Theme:Minimal
    f.Profiles
        Colors -> Color PresetL:Snazzy
        Text -> Font:FiraCode Nerd Font/Hack Nerd Font、14px
        Window -> New windows:120、columns by:40 rows
        Window -> New windows:108、columns by:33 rows,20260302
    g.其他设置
        主题:Minimal
        颜色方案:Snazzy,https://github.com/sindresorhus/iterm2-snazzy
        字体:Fira Code Nerd Font,https://www.nerdfonts.com/font-downloads
        主题库:https://github.com/mbadolato/iTerm2-Color-Schemes.git

02.starship美化
    a.介绍
        a.安装
            curl -sS https://starship.rs/install.sh | sh
        b.~/.zshrc或~/.bashrc追加内容
            eval "$(starship init zsh)"
        c.配置 Starship
            打开一个新的 Shell 实例,你应该就能看到漂亮的 Shell 新提示符了
    b.配置色彩
        a.方式1
            终端模拟器:iTerm2,https://iterm2.com
            主题:Minimal
            颜色方案:Snazzy,https://github.com/sindresorhus/iterm2-snazzy
            字体:Fira Code Nerd Font,https://www.nerdfonts.com/font-downloads
            主题库:https://github.com/mbadolato/iTerm2-Color-Schemes.git
        b.方式2
            Shell:Fish Shell,https://fishshell.com
            fish 配置:matchai's Dotfiles,https://github.com/matchai/dotfiles/blob/b6c6a701d0af8d145a8370288c00bb9f0648b5c2/.config/fish/config.fish
            提示符工具:Starship,https://starship.rs/
    c.配置文件
        a.位置
            mkdir -p ~/.config && touch ~/.config/starship.toml
        b.内容
            # 根据 schema 提供自动补全
            "$schema" = 'https://starship.rs/config-schema.json'

            # 在提示符之间插入空行
            add_newline = true

            # 将提示符中的 '❯' 替换为 '➜'
            [character] # 此组件名称为 'character'
            success_symbol = '[➜](bold green)' # 将 'success_symbol' 字段设置成颜色为 'bold green' 的 '➜'

            # 禁用 'package' 组件,将其隐藏
            [package]
            disabled = true

1.5 terminal

01.bash设置
    a.安装
        无
    b.快捷键
        Ratcast -> Ctrl + Win + R
    c.通用
        启动时,打开:使用描述文件新建窗口(Snazzy)
        Shell的打开放松:默认登录Shell / 命令(/bin/zsh)
        新窗口打开方式:默认
        新标签页打开方式:默认
    d.描述文件:Snazzy
        文本 -> 字体:Hack Nerd Font
        文本 -> 字体:FiraCode Nerd Font
        窗口 -> 列数120、行数36

02.oh-my-zsh
    a.基础设置
        a.安装
            sudo curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
        b.主题修改:
            打开~/.zshrc文件,配置项 ZSH_THEME 即为 oh-my-zsh 的主题配置,oh-my-zsh 的 GitHub Wiki 页面提供了主题列表
            当设置为 ZSH_THEME=random 时,每次打开终端都会使用一种随机的主题
            zsh的默认主题为robbyrussell,用了一段时间发现并不是那么好用,推荐ys主题
        c.默认插件
            a.快速访问目录,自带直接添加
                z
            b.终端中直接进行网页搜索,自带
                web-search
            c.压缩直接用x就可以完成,自带
                extract
            d.对目录进行映射,自带
                wd
            e.按两下ESC在命令开头增加sudo命令,自带
                sudo
            f.Base64 编码,自带
                encode64
            g.url编码工具,有urlencode和urldecode,自带
                urltools
        d.查看当前Shell
            cat /etc/shells
        e.测试
            zsh --version
        f.卸载
            uninstall_oh_my_zsh
            Are you sure you want to remove Oh My Zsh? [y/N]  Y
    b.自定义插件
        a.查看
            cd ~/.oh-my-zsh/plugins
            ls
            -------------------------------------------------------------------------------------------------
            更多插件:https://github.com/unixorn/awesome-zsh-plugins
        b.下载插件
            a.autojump,根据输入的关键词,直接跳到路径下去,关键词是路径其中一段即可
                brew install autojump
                cd 绝对路径
                j 路径关键词
                ---------------------------------------------------------------------------------------------
                历史记录:autojump --stat
                清除记录:autojump --purge
                环境变量:[ -f /opt/homebrew/etc/profile.d/autojump.sh ] && . /opt/homebrew/etc/profile.d/autojump.sh
            b.zsh-syntax-highlighting,代码高亮插件
                git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
            c.zsh-autosuggestions,历史命令智能提示插件
                git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
        c.配置
            a.打开
                vi ~/.zshrc
            b.操作
                plugins=(
                    git
                    z
                    web-search
                    zsh-autosuggestions
                    zsh-syntax-highlighting
                )
        d.配置
            a.修改默认终端打开是zsh
                chsh -s /bin/zsh
            b.路径大小写忽略
                zsh上的路径默认是对大小写不敏感的
                这样的好处是很多时候输入路径忘记了某一个文件夹是大写,zsh会自动将你输入的小写改为大写
                「tab」的提示功能也是一样,会提示无论大写还是小写,这样极大减少了输错路径的概率
    c.自定义主题
        a.查看默认主题
            cd ~/.oh-my-zsh/themes
            ls
            -------------------------------------------------------------------------------------------------
            powerlevel9k
            powerlevel10k
        b.powerlevel9k
            a.下载
                git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
            b.启用
                open ~/.zshrc
                ZSH_THEME="powerlevel9k/powerlevel9k"
                source ~/.zhrc
        c.Powerlevel10k
            a.说明
                由于 Powerlevel9k ( 已经被弃用 ) 升级到 Powerlevel10k
                Powerlevel10k 主题可以用于 zsh, oh-my-zsh, Prezto, Antigen 等等。
                Powerlevel10k 依托于 zsh, oh-my-zsh, Prezto, Antigen。
                这里我们直接使用 oh-my-zsh。
            b.下载
                git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
                git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
            c.启用
                open ~/.zshrc
                ZSH_THEME="powerlevel10k/powerlevel10k"
                source ~/.zhrc
            d.安装 Hack Nerd 字体库
                https://github.com/ryanoasis/nerd-fonts
                ---------------------------------------------------------------------------------------------
                Mac OC 系统终端 -> 偏好设置 -> 字体 -> 修改成 Hack Nerd Font
                iTerm -> Preferences -> Profiles -> Text -> font -> 修改成 Hack Nerd Font
    d.默认配置
        a.位置
            vi ~/.zshrc
        b.原版-英文
            # If you come from bash you might have to change your $PATH.
            # export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH

            # Path to your Oh My Zsh installation.
            export ZSH="$HOME/.oh-my-zsh"

            # Set name of the theme to load --- if set to "random", it will
            # load a random theme each time Oh My Zsh is loaded, in which case,
            # to know which specific one was loaded, run: echo $RANDOM_THEME
            # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
            ZSH_THEME="robbyrussell"

            # Set list of themes to pick from when loading at random
            # Setting this variable when ZSH_THEME=random will cause zsh to load
            # a theme from this variable instead of looking in $ZSH/themes/
            # If set to an empty array, this variable will have no effect.
            # ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

            # Uncomment the following line to use case-sensitive completion.
            # CASE_SENSITIVE="true"

            # Uncomment the following line to use hyphen-insensitive completion.
            # Case-sensitive completion must be off. _ and - will be interchangeable.
            # HYPHEN_INSENSITIVE="true"

            # Uncomment one of the following lines to change the auto-update behavior
            # zstyle ':omz:update' mode disabled  # disable automatic updates
            # zstyle ':omz:update' mode auto      # update automatically without asking
            # zstyle ':omz:update' mode reminder  # just remind me to update when it's time

            # Uncomment the following line to change how often to auto-update (in days).
            # zstyle ':omz:update' frequency 13

            # Uncomment the following line if pasting URLs and other text is messed up.
            # DISABLE_MAGIC_FUNCTIONS="true"

            # Uncomment the following line to disable colors in ls.
            # DISABLE_LS_COLORS="true"

            # Uncomment the following line to disable auto-setting terminal title.
            # DISABLE_AUTO_TITLE="true"

            # Uncomment the following line to enable command auto-correction.
            # ENABLE_CORRECTION="true"

            # Uncomment the following line to display red dots whilst waiting for completion.
            # You can also set it to another string to have that shown instead of the default red dots.
            # e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
            # Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
            # COMPLETION_WAITING_DOTS="true"

            # Uncomment the following line if you want to disable marking untracked files
            # under VCS as dirty. This makes repository status check for large repositories
            # much, much faster.
            # DISABLE_UNTRACKED_FILES_DIRTY="true"

            # Uncomment the following line if you want to change the command execution time
            # stamp shown in the history command output.
            # You can set one of the optional three formats:
            # "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
            # or set a custom format using the strftime function format specifications,
            # see 'man strftime' for details.
            # HIST_STAMPS="mm/dd/yyyy"

            # Would you like to use another custom folder than $ZSH/custom?
            # ZSH_CUSTOM=/path/to/new-custom-folder

            # Which plugins would you like to load?
            # Standard plugins can be found in $ZSH/plugins/
            # Custom plugins may be added to $ZSH_CUSTOM/plugins/
            # Example format: plugins=(rails git textmate ruby lighthouse)
            # Add wisely, as too many plugins slow down shell startup.
            plugins=(
                git
                z
                web-search
                zsh-autosuggestions
                zsh-syntax-highlighting
            )

            source $ZSH/oh-my-zsh.sh

            # User configuration

            # export MANPATH="/usr/local/man:$MANPATH"

            # You may need to manually set your language environment
            # export LANG=en_US.UTF-8

            # Preferred editor for local and remote sessions
            # if [[ -n $SSH_CONNECTION ]]; then
            #   export EDITOR='vim'
            # else
            #   export EDITOR='nvim'
            # fi

            # Compilation flags
            # export ARCHFLAGS="-arch $(uname -m)"

            # Set personal aliases, overriding those provided by Oh My Zsh libs,
            # plugins, and themes. Aliases can be placed here, though Oh My Zsh
            # users are encouraged to define aliases within a top-level file in
            # the $ZSH_CUSTOM folder, with .zsh extension. Examples:
            # - $ZSH_CUSTOM/aliases.zsh
            # - $ZSH_CUSTOM/macos.zsh
            # For a full list of active aliases, run `alias`.
            #
            # Example aliases
            # alias zshconfig="mate ~/.zshrc"
            # alias ohmyzsh="mate ~/.oh-my-zsh"
        c.原版-中文
            # 如果您来自 bash,可能需要更改您的 $PATH。
            # export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH

            # Oh My Zsh 安装路径。
            export ZSH="$HOME/.oh-my-zsh"

            # 设置要加载的主题名称 --- 如果设置为 "random",则每次加载 Oh My Zsh 时都会加载一个随机主题。
            # 查看 https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
            ZSH_THEME="robbyrussell"

            # 设置在随机加载时从中选择的主题列表
            # ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

            # 取消以下行的注释以使用大小写敏感的补全。
            # CASE_SENSITIVE="true"

            # 取消以下行的注释以使用连字符不敏感的补全。
            # HYPHEN_INSENSITIVE="true"

            # 取消以下行的注释以更改自动更新行为
            # zstyle ':omz:update' mode disabled  # 禁用自动更新
            # zstyle ':omz:update' mode auto      # 无需询问自动更新
            # zstyle ':omz:update' mode reminder  # 到时间时只提醒我更新

            # 取消以下行的注释以更改自动更新的频率(以天为单位)。
            # zstyle ':omz:update' frequency 13

            # 取消以下行的注释如果粘贴 URL 和其他文本出现混乱。
            # DISABLE_MAGIC_FUNCTIONS="true"

            # 取消以下行的注释以禁用 ls 中的颜色。
            # DISABLE_LS_COLORS="true"

            # 取消以下行的注释以禁用自动设置终端标题。
            # DISABLE_AUTO_TITLE="true"

            # 取消以下行的注释以启用命令自动纠正。
            # ENABLE_CORRECTION="true"

            # 取消以下行的注释以在等待补全时显示红色点。
            # COMPLETION_WAITING_DOTS="true"

            # 取消以下行的注释如果您想禁用将 VCS 下的未跟踪文件标记为脏。
            # DISABLE_UNTRACKED_FILES_DIRTY="true"

            # 取消以下行的注释如果您想更改历史命令输出中显示的命令执行时间戳。
            # HIST_STAMPS="mm/dd/yyyy"

            # 您想使用 $ZSH/custom 之外的另一个自定义文件夹吗?
            # ZSH_CUSTOM=/path/to/new-custom-folder

            # 您想加载哪些插件?
            # 标准插件可以在 $ZSH/plugins/ 中找到
            # 自定义插件可以添加到 $ZSH_CUSTOM/plugins/
            plugins=(
              git
              z
              web-search
              zsh-autosuggestions
              zsh-syntax-highlighting
            )

            source $ZSH/oh-my-zsh.sh

            # 用户配置

            # export MANPATH="/usr/local/man:$MANPATH"

            # 您可能需要手动设置您的语言环境
            # export LANG=en_US.UTF-8

            # 本地和远程会话的首选编辑器
            # if [[ -n $SSH_CONNECTION ]]; then
            #   export EDITOR='vim'
            # else
            #   export EDITOR='nvim'
            # fi

            # 编译标志
            # export ARCHFLAGS="-arch $(uname -m)"

            # 设置个人别名,覆盖由 Oh My Zsh 库、插件和主题提供的别名。
            # 示例别名
            # alias zshconfig="mate ~/.zshrc"
            # alias ohmyzsh="mate ~/.oh-my-zsh"

1.6 dispose1

01.常用信息1
    a.分类1
        a.topit
            brew install lihaoyun6/tap/topit
        b.latest
            brew install --cask latest
        c.jd-gui
            brew install --cask jd-gui
            /Applications/JD-GUI.app/Contents/Info.plist -> 将JVMVersion中的【1.8+】改为【1.8】
        d.ui-tars
            brew install --cask ui-tars
    b.分类2
        a.slides:基于终端的演示工具
            x install slides
        b.fanyi:中英文翻译工具
            x install fanyi
        c.tgt:telegram终端UI
            cargo install tgt
            https://github.com/FedericoBruzzone/tgt
        d.smartcat:终端LLM
            cargo install smartcat

02.常用信息2
    a.分类1
        a.git:官方工具
            brew install gh
            brew upgrade gh
            gh auth login
        b.gitnr:从模板搜索和生成.gitignore文件
            cargo install gitnr
            gitnr search
        c.thefuck:纠正控制台命令中的错误,非常强大
            brew install thefuck
        d.kondo:专用于清理软件项目中的非必需文件
            brew install kondo
            kondo
        e.lazynpm:懒人npm配置
            brew install lazynpm
    b.分类2
        a.forgit:懒人git配置
            brew install forgit
        b.Koji:Git提交注释
            brew install Koji
        c.Tig:提交记录
            brew install Tig
        d.gfold:多Git仓库管理
            x install gfold
        e.vignore:忽略规则可视化
            pip3 install vignore
            vignore
        f.bit:git补全
            x install bit
            x bit --version
        g.serie:git提交图形界面
            x install serie

03.常用信息3
    a.分类1
        a.fd:替代find
            brew install fd
        b.cd:使用 Posix shell、awk 和 find 实现的增强版 cd 命令
            x install cd
        c.Rexi:终端regx
            x install rexi
        d.sqly:对CSV、TSV、LTSV、JSON、Excel 执行 SQL 查询
            x install sqly
    b.分类2
        a.tree:目录结构
            brew install tree
            # 查看目录
            tree -a
            # 忽略某个文件夹(注意要带引号,支持正则表达式)
            tree -a -I "foldername"
            # 列出目录,忽略.git文件夹,输出到tree.md
            tree -a -I ".git" >> tree.md
            # 显示文件夹的层级(n表示层级数)
            tree -L n
        b.tre:目录结构
            brew install tre-command
            tre
        c.tere:告别cd+ls的低效循环
            brew install tere
        d.broot:交互式目录树文件管理器
            cargo install --locked broot
    c.分类3
        a.Amp:基于Rust开发的文本编辑器
            x install amp
        b.Sig:交互式grep
            cargo install sigrs
        c.clipboard:终端剪贴板
            x install clipboard
        d.dua:给定目录的磁盘空间使用情况的工具
            x install dua
        e.rg:以递归的方式在当前目录中搜索与 regex 模式匹配的文本
            x install rg
        f.dust:分析磁盘空间使用情况
            x install dust

04.常用信息4
    a.分类1
        a.pingnoo
            brew install --cask pingnoo
            https://www.pingnoo.com/#downloads
        b.somo:替代netstat
            cargo install somo
        c.procs:ps替代品
            x install procs
        d.pgtree:进程层级树状
            pip install pgtree
        e.gtop:实时监控系统资源
            x install gtop
        f.netop:终端流量监控工具
            x install netop
        g.btop:实时监控系统资源
            x install btop
        h.httplab:交互式界面
            https://github.com/qustavo/httplab
    b.分类2
        a.macmon:苹果处理器性能监测工具
            x install macmon
        b.nexttrace、tracexec
            网络流量检测工具
        c.pik:进程管理器
            cargo install pik
        d.tufw:可视化防火墙管理
            sudo apt install tufw_0.1.0_linux_amd64.deb
    c.分类3
        a.ThisSeanZhang/landscape:linux变路由器
            mkdir -p ~/.landscape-router
            ./landscape-webserver
        b.x-dns:管理域名系统DNS配置
            # 查看当前的 DNS 配置信息
            x dns
            # 查看当前的 DNS 配置信息
            x dns current
            # 列举可使用的域名地址
            x dns ls
            # 刷新当前系统中的DNS缓存
            x dns refresh
        c.dug:域名在全球各地的生效情况
            x install dug
        d.mosh:适用于不稳定网络,SSH替代品
            x install mosh

05.常用信息5
    a.分类1
        a.ctop:docker容器类似top命令的性能监控工具
            x env use ctop
        b.dolphie:MySQL/MariaDB/ProxySQL
            brew install dolphie
        c.scoop-i18n:scoop汉化
            https://github.com/abgox/scoop-i18n
        d.VibeTunnel:一款将本地终端会话代理到任意现代浏览器中的工具
            brew install --cask vibetunnel
            https://github.com/amantus-ai/vibetunnel/releases
    b.分类2
        a.atac:Postman命令行版本
            x install atac
        b.genact:系统活动模拟器,摸鱼伴侣
            x env use genact
            genact
    c.分类3
        a.macchina:系统信息查看工具
            x env use macchina
            macchina
        b.mac:集成了用户需要的各种实用功能
            # 使用指纹( touchid ) 进行 sudo 验证, 失败时将重启密码验证
            x mac tidsudo enable
            # 显示系统信息
            x mac info
            # 获取电池信息
            x mac b
            # 将输出音量调整为 24%
            x mac vol set 24
            # 测试网络质量
            x mac net test
        c.PSCompletions:PowerShell 命令补全管理器
            # 普通安装
            Install-Module PSCompletions
            # 静默安装
            Install-Module PSCompletions -Repository PSGallery -Force

1.7 dispose2

00.package
    a.x-cmd
        a.更新
            x upgrade
        b.install
            x install --ls|ls
            x install --update|update|-u
        c.uninstall
            # 列出通过 Brew, APT, Scoop, Winget 等多个包管理器安装的软件
            x uninstall ls
            # 卸载 brew 安装的 bat
            x uninstall rm brew bat
            # 直接卸载指定的包,例如 x uninstall rm brew git
            x uninstall rm <管理器> <包名>
    b.brew
        a.查看
            brew list                                                          --所有的软件,包括Formulae和Cask
            brew list --formulae                                               --所有已安装的Formulae
            brew list --cask                                                   --所有已安装的Casks
            brew list --versions --cask                                        --所有已安装的Casks,以及版本号
            brew list --versions openssl                                       --所有已安装的Casks,以及版本号
            brew list <package-name>                                           --列举某个Formulate或Cask的详细路径
            brew uninstall <包名>                                               --卸载某个包
        b.tap安装
            brew tap                                                           --列出本地资源仓库,其中 homebrew 是默认仓库,其它都是第三方仓库
            brew tap <user/repo>                                               --添加第三方仓库,命名的规则按照 github 来定的
            brew untap <user/repo>                                             --删除仓库
            brew deps <formula>                                                --查看指定软件依赖于哪些软件
            brew uses <formula>                                                --查看指定软件被哪些软件所依赖
            -------------------------------------------------------------------
            brew tap elastic/tap                                               --This tap is for products in the Elastic stack.
            brew tap beeftornado/rmtree                                        --用于递归地卸载一个 Homebrew 包及其所有依赖项,brew rmtree可以帮助你清理不再需要的依赖项
            brew rmtree nginx                                                  --rmtree 是一个由 beeftornado/rmtree tap 提供的工具,清理依赖项
            brew prune                                                         --清理无效的关联,且清理与之相关的位于/Applications和~/Applications中的无用App链接
            brew cleanup                                                       --删除那些已经卸载的软件包的残留文件,以及旧版本的软件包
    c.npm/yarn/pnpm
        a.全局
            npm list -g --depth=0
            yarn global list
            pnpm list -g --depth=0                                             --g代表global,depth=0只显示顶层包,不显示它们的依赖项
            -------------------------------------------------------------------------------------------------
            npm uninstall -g <包名>                                             --卸载一个全局安装的 Node.js 工具
            yarn global remove <包名>                                           --卸载一个全局安装的 Node.js 工具
            pnpm remove -g <包名>                                               --卸载一个全局安装的 Node.js 工具
        b.项目
            npm list
            yarn list
            pnpm list
            -------------------------------------------------------------------------------------------------
            npm uninstall <包名>                                                --在项目目录中,卸载一个本地包并更新 package.json
            yarn remove <包名>                                                  --在项目目录中,卸载一个本地包并更新 package.json
            pnpm remove <包名>                                                  --在项目目录中,卸载一个本地包并更新 package.json
    d.cargo
        a.查看
            cargo install --list
        b.卸载
            cargo uninstall <包名>                                              --卸载一个通过 cargo install 安装的二进制包

01.x-cmd
    a.分类1
        eget:预构建二进制文件的命令行工具
    b.分类2
        pnpm、yarn:前端构建工具
    c.分类3
        ducker:类似K9S,管理docker容器
    d.中国农历:ccal
        # 使用 fzf 交互式查看日历,可快速跳转到指定日期或节日
        x ccal fz
        # 交互式查看每月的节气、放假、调休上班日期
        x ccal fzm
        # 交互式查看每年的传统节日日期、生肖、闰月
        x ccal fzy
        # 查看指定日期的详细日历信息(包括农历、值星、宜忌等),默认为当日
        x ccal info
    e.speckit
        # 在当前目录初始化(交互式选择AI)
        x speckit init
        # 初始化my-project目录并指定AI为claude
        x speckit init my-project --ai claude
        # 配置DeepSeekAPIKey,并启动claude-code接入DeepSeek模型
        x deepseek--cfg apikey="your_api_key"
        x claude ds
        # 已安装x-cmd的用户则可通过upgrade指令更新至beta版本
        x upgrade beta

02.nexttrace
    a.安装
        brew tap xgadget-lab/nexttrace
        brew install nexttrace
    b.使用
        nexttrace https://valut.halavah.us

03.forgit:懒人git配置 / Koji:Git提交注释
    a.安装
        brew install forgit
    b.分类1
        ga                                                                  --git add 选择器
        glo                                                                 --git log 查看器
        gi                                                                  --.gitignore 生成器
        gd                                                                  --git diff 查看器
        gcb                                                                 --git checkout <branch>
        gs                                                                  --git stash
    c.分类2
        grh                                                                 --reset HEAD
        gcf                                                                 --checkout file
        gbd                                                                 --branch delete
        gct                                                                 --checkout tag
        gco                                                                 --checkout commit
        grc                                                                 --revert commit
        gclean                                                              --clean
        gsp                                                                 --stash push
        gcp                                                                 --cherry-pick
        grb                                                                 --rebase
        gbl                                                                 --blame
        gfu                                                                 --fixup

04.Tig:提交记录
    a.安装
        brew install Tig
        q                                                                   --退出
        h                                                                   --帮助
    b.分类1
        m                                                                   --view-mainShow main view
        d                                                                   --view-diffShow diff view
        l                                                                   --view-logShow log view
        L                                                                   --view-reflogShow reflog view
        t                                                                   --view-treeShow tree view
        f                                                                   --view-blobShow blob view
        b                                                                   --view-blameShow blame view
    c.分类2
        r                                                                   --view-refsShow refs view
        S                                                                   --view-statusShow status view
        c                                                                   --view-stageShow stage view
        y                                                                   --view-stashShow stash view
        g                                                                   --view-grepShow grep view
        p                                                                   --view-pagerShow pager view
        h                                                                   --view-helpShow help view

05.lazynpm:懒人npm配置
    a.地址
        https://github.com/jesseduffield/lazynpm/blob/master/README.md
    b.安装
        brew install jesseduffield/lazynpm/lazynpm
    c.使用
        lazynpm

06.pik:进程管理器
    a.安装
        cargo install pik
    b.使用
        pik
        pik firefox
        pik /usr/bin
        pik -scope
        pik ~scope
        pik :8080

07.surgio:订阅
    a.安装
        # 安装
        npm init surgio-store surgio
        # 或 使用国内镜像安装
        npm init surgio-store surgio --use-cnpm
        # 来到仓库目录
        cd my-rule-store
    b.使用
        npx surgio generate

08.mole
    a.安装
        brew install tw93/tap/mole
    b.使用
        mo                      # 交互式菜单
        mo clean                # 系统清理
        mo clean --dry-run      # 预览模式
        mo clean --whitelist    # 管理受保护的缓存
        mo uninstall            # 卸载应用
        mo analyze              # 磁盘分析器
        mo update               # 更新Mole
        mo remove               # 从系统中移除Mole
        mo --help               # 显示帮助
        mo --version            # 显示已安装版本

1.8 natpierce

01.说明
    a.虚拟组网
        01.必须2个Wifi连接2个机器
        02.检测端口开启,是不是宿主共存
        03.LAN是局域网连接,TUN是虚拟网卡,ENV是环境变量
        04.TUN(虚拟网卡)模式接管系统所有流量,启用时无须打开系统代理
    b.局域网
        01.P->服务器->P:tailscale
        02.P2P:natpierce、sunshine(admin、123456)、Moonlight
        03.暴露公网固定IP:ddnsto(域名映射、WebDAV、Aria2、SSH、RDP)
        04.暴露公网固定IP:SakuraFrp(HTTP、TCP、UDP)
        注意:Godetia不能使用香港节点访问哔哩哔哩,因为不支持解锁的服务器
        注意:Mac电脑,todesk与docker(natpierce)进行冲突,只能开启1个
    c.远程办公
        01.对拷线
        02.双屏幕
        03.鼠标+键盘双模式
        04.HDMI,KMVM切换器
        05.synergy(Cpas不可用)
        06.caddy+NaïveProxy+懒猫微服
        07.rustdesk/teamviewer/uu远程
        08.sun/todesk/ddnsto(RDP)/SakuraFrp
        09.tailscale+derp中转,走中转不算打洞
        10.cloudplayplus+turn协议,走中转不算打洞
    d.相关协议
        6379端口:这是Redis数据库的默认端口,使用的是Redis协议
        3306端口:这是MySQL数据库的默认端口,使用的是MySQL协议
        8080端口:通常用于HTTP协议,Java开发中,Tomcat服务器默认使用8080端口来处理HTTP请求

02.natpierce
    a.所有网络接口和端口都与主机共享
        docker run -it --name natpierce --restart=always --privileged=true --net=host -d natpierce/natpierce:latest
        docker run -it --name natpierce --restart=always --privileged=true --net=host -d natpierce/natpierce:latest /app/natpierce -p 33272
    b.所有网络接口和端口进行一对一映射
        docker run -it --name natpierce --restart=always --privileged=true \
        -p 55353:5353/udp \
        -p 47998-48010:47998-48010/udp \
        -p 47984:47984/tcp \
        -p 47989:47989/tcp \
        -p 48010:48010/tcp \
        -p 33272:33272 \
        -d natpierce/natpierce:latest
    c.说明
        # 检查容器
        docker ps -a
        # 检查日志
        docker logs natpierce
        # 停止
        docker stop natpierce
        # 启动
        docker start natpierce
    d.网址
        http://localhost:33272/

03.cloudplayplus
    a.连接
        网址:https://www.cloudplayplus.com/
        账号:troyekk
        密码:ZXCVbnmxxxxxxxx
        邮箱:[email protected]
        -----------------------------------------------------------------------------------------------------
        服务器地址:turn:turn.kafuchino.online:3478
        服务器用户名:troyekk
        服务器密码:xxxxxxx
    b.键鼠配置-win
        反转鼠标滚轮 -> 开启
        远程鼠标隐藏时,自动锁定本地鼠标(第一人称游戏建议开启) -> 开启
        显示远程鼠标(仅使用不支持硬件加速的windows设备)-> 关闭
        (MacOS)交换command和control -> 关闭
        使用触摸而不是鼠标消息(触摸设备控制windows) -> 开启
    c.键鼠配置-mac
        反转鼠标滚轮 -> 开启
        远程鼠标隐藏时,自动锁定本地鼠标(第一人称游戏建议开启) -> 开启
        显示远程鼠标(仅使用不支持硬件加速的windows设备)-> 关闭
        (MacOS)交换command和control -> 关闭
        使用触摸而不是鼠标消息(触摸设备控制windows) -> 开启

04.MacBook当作Win电脑副屏显示器
    a.软件
        MacBook:夜神模拟器、SpaceDesk客户端
        Windows:SpaceDesk服务端
    b.说明
        两台电脑需要处于同一局域网下,较新版本的的MacOS启动夜神模拟器可能需要做一些配置,按照官网提示配置即可
        1.MacBook安装夜神模拟器
        2.在模拟器上安装SpaceDesk客户端
        3.在windows电脑上安装SpaceDesk服务端
        4.MacBook夜神模拟器上的SpaceDesk通过ip连接windows进行屏幕拓展
        Tips:效果一般,mac做副屏幕看个资料还行,聊胜于无
        网上其他方案不靠谱,大多是mac远程控制windows,或者是硬件方案

05.防火墙
    a.win10
        a.开放端口(PowerShell)
            netsh advfirewall firewall add rule name="GameStream UDP" dir=in protocol=udp localport=5353,47998-48010 action=allow
            netsh advfirewall firewall add rule name="GameStream TCP" dir=in protocol=tcp localport=47984,47989,48010 action=allow
        b.删除端口
            netsh advfirewall firewall delete rule name="GameStream UDP"
            netsh advfirewall firewall delete rule name="GameStream TCP"
    b.mac
        a.防火墙
            WIFI -> 防火墙 -> 开启/关闭
        b.pfctl
            sudo pfctl -f /etc/pf.conf
            sudo pfctl -e
    c.查看端口
        # 进入容器
        docker exec -it natpierce /bin/sh
        # 检查端口
        netstat -tuln | grep 33272
    d.检查端口
        ~ ❯ lsof -i TCP:33272                                                                             system 08:59:17 上午
        COMMAND    PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
        Google    1368 troyesivens   26u  IPv6 0xbf9a06bcda075f03      0t0  TCP localhost:54167->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   29u  IPv6 0x5d906c6d168d6a1e      0t0  TCP localhost:54168->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   33u  IPv6  0x27bbefedbc9cb4d      0t0  TCP localhost:54169->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   35u  IPv6 0xfaf0b5da6ff745b7      0t0  TCP localhost:54178->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   37u  IPv6 0xe151a711723dcae5      0t0  TCP localhost:54175->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   39u  IPv6 0x2c2e16d69356897b      0t0  TCP localhost:54176->localhost:33272 (ESTABLISHED)
        Google    1368 troyesivens   41u  IPv6 0xa8b88c7733f6c046      0t0  TCP localhost:54177->localhost:33272 (ESTABLISHED)
        com.docke 6382 troyesivens   62u  IPv6 0xf7aea63121db7eb3      0t0  TCP localhost:33272->localhost:54167 (ESTABLISHED)
        com.docke 6382 troyesivens   91u  IPv6  0x3f4e9bf60ccd36f      0t0  TCP localhost:33272->localhost:54175 (ESTABLISHED)
        com.docke 6382 troyesivens  100u  IPv6 0x32435b827c63ecaf      0t0  TCP localhost:33272->localhost:54176 (ESTABLISHED)
        com.docke 6382 troyesivens  101u  IPv6 0x3e8abb0b188501a7      0t0  TCP localhost:33272->localhost:54168 (ESTABLISHED)
        com.docke 6382 troyesivens  106u  IPv6 0x5c9b4f8a5b8b8721      0t0  TCP localhost:33272->localhost:54169 (ESTABLISHED)
        com.docke 6382 troyesivens  122u  IPv6 0x8a4ad8d8e47a678d      0t0  TCP localhost:33272->localhost:54177 (ESTABLISHED)
        com.docke 6382 troyesivens  124u  IPv6 0x4149949d98820e79      0t0  TCP localhost:33272->localhost:54178 (ESTABLISHED)
        com.docke 6382 troyesivens  133u  IPv6 0x56cc4a51472f9466      0t0  TCP *:33272 (LISTEN)

06.添加DNS服务器
    a.说明
        a.WiFi / 以太网
            DNS:172.16.10.130
            -------------------------------------------------------------------------------------------------
            阿里云:223.5.5.5
            阿里云:223.6.6.6
            -------------------------------------------------------------------------------------------------
            腾讯云:119.29.29.29
            腾讯云:182.254.116.116
            -------------------------------------------------------------------------------------------------
            百度云:180.76.76.76
            -------------------------------------------------------------------------------------------------
            114DNS:114.114.114.114
            114DNS:114.114.115.115
            -------------------------------------------------------------------------------------------------
            Google:8.8.8.8
            Google:8.8.4.4
            -------------------------------------------------------------------------------------------------
            Cloudflare:1.1.1.1
            Cloudflare:1.0.0.1
            -------------------------------------------------------------------------------------------------
            OpenDNS:208.67.222.222
            OpenDNS:208.67.220.220
            -------------------------------------------------------------------------------------------------
            Quad9DNS:9.9.9.9
            Quad9DNS:149.112.112.112
        b.clash win
            TUN模式 -> 添加DNS映射 -> 172.16.10.130
            无线网卡 -> IPv4配置指定的DNS映射 -> 172.16.10.130
        c.clash verge
            WiFi -> 添加DNS映射 -> 172.16.10.130、223.5.5.5、223.6.6.6
            模式 -> TUN(虚拟网卡)模式接管系统所有流量,启用时无须打开系统代理
            全局扩展脚本 -> ...
            http端口:7897
            socks5端口:7897
            DNS覆写:关闭
        d.surge v5
            WiFi -> 添加DNS映射 -> 172.16.10.130、223.5.5.5、223.6.6.6
            模式 -> 系统代理(仅开启,可以访问内网git),增强模式(部分应用可能不遵循系统代理设置,使用增强模式可以让所有应用由Surge处理)
            DNS -> 添加DNS映射 -> *.myslayers.cn、172.16.10.130
            DNS -> 添加DNS映射 -> git.myslayers.cn、172.16.10.130
            DNS -> 添加DNS映射 -> *.ts.net、100.100.100.100
            http端口:6152
            socks5端口:6153
    b.win
        a.SwitchyOmega
            a.代理服务器
                代理协议:HTTP
                代理服务器:127.0.0.1
                代理端口:7890
            b.不代理的地址列表
                127.0.0.1
                ::1
                localhost
                *.myslayers.cn
                git.myslayers.cn
                e.myslayers.cn
        b.Clash
            a.yml
                - DOMAIN-SUFFIX,myslayers.cn,DIRECT
                - DOMAIN-SUFFIX,126.com,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,126.net,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,127.net,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,163.com,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,music.163.com,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,ximalaya.com,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,jd.com,🅱 哔哩哔哩
                - DOMAIN-KEYWORD,taobao,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,duokan.com,🅱 哔哩哔哩
                - DOMAIN-SUFFIX,bilibili.com,🅱 哔哩哔哩
            b.tun
                IPv4 DNS服务器:172.16.10.130
        c.查看DNS服务器上的域名
            dig @176.16.10.130 git.myslayers.cn
            nslookup git.myslayers.cn 176.16.10.130
    c.mac
        a.WiFi
            DNS:172.16.10.130、223.5.5.5、223.6.6.6
            代理:自动发现代理 -> 关闭,自动配置代理 -> 关闭
        b.chrome
            关闭SwitchyOmega
            TUN虚拟网卡、ENV系统代理,只开1个即可
            /Users/troyesivens/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/profiles
        c.全局扩展配置
            # Profile Enhancement Merge Template for Clash Verge

            profile:
              store-selected: true

            # 追加多个监听端口
            listeners:
              - name: Edge-Mixed
                type: mixed
                port: 50010
                listen: 127.0.0.1
                udp: true
              - name: Google-Mixed
                type: mixed
                port: 50020
                listen: 127.0.0.1
                udp: true
              - name: TG-Mixed
                type: mixed
                port: 50030
                sniff: true
                listen: 0.0.0.0
                udp: true
            # # 只增量修改 DNS,不覆盖订阅规则的 DNS
            # dns:
            #   nameserver-policy:
            #     "+.myslayers.cn": 172.16.10.130#DIRECT
            #     "git.myslayers.cn": 172.16.10.130#DIRECT
            #     "e.myslayers.cn": 172.16.10.130#DIRECT
            #     "cerios.myslayers.cn": 172.16.10.130#DIRECT
        d.全局扩展脚本
            // 策略模式:抽象策略类
            class ModifierStrategy {
              apply(config) {
                throw new Error("apply() 必须在子类中实现");
              }
            }

            // DnsModifier (默认DNS服务器)
            class DnsModifier extends ModifierStrategy {
              apply(config) {
                if (!config.dns) config.dns = {};
                // 初始化 default-nameserver (如果不存在或不是数组)
                if (config.dns["default-nameserver"] === undefined || config.dns["default-nameserver"] === null) {
                  config.dns["default-nameserver"] = [];
                } else if (!Array.isArray(config.dns["default-nameserver"])) {
                  // 如果存在但不是数组 (例如 {} 或字符串), 重置为空数组。
                  config.dns["default-nameserver"] = [];
                }

                // 优先使用可靠的公共DNS服务器。
                const publicDnsToPrepend = ["223.6.6.6", "119.29.29.29", "223.5.5.5"];

                // 将这些公共DNS服务器前置。
                [...publicDnsToPrepend].reverse().forEach(dns => {
                  const currentIndex = config.dns["default-nameserver"].indexOf(dns);
                  if (currentIndex > -1) {
                    config.dns["default-nameserver"].splice(currentIndex, 1);
                  }
                  config.dns["default-nameserver"].unshift(dns);
                });
              }
            }

            // NameserverPolicyModifier (DNS服务器策略修改器)
            // 作用:这个修改器主要用来配置 Clash 的 dns.nameserver-policy 部分。
            // 功能:它允许您为特定的域名或域名模式(如 +.example.com 表示 example.com 及其所有子域名)指定使用特定的 DNS 服务器进行解析。
            // 示例:
            //   "openai.newbotai.cn": "223.6.6.6#DIRECT" 表示 openai.newbotai.cn 这个域名将通过 DNS 服务器 223.6.6.6 进行解析,并且解析结果会尝试直接连接(#DIRECT)。
            //   "+.myslayers.cn": "172.16.10.130#DIRECT" 表示 myslayers.cn 及其所有子域名都会通过内网 DNS 172.16.10.130 解析。
            // 用途:
            //   确保内部域名使用内部 DNS 解析。
            //   为特定服务(如流媒体、某些网站)指定专门的、可能解析更优的 DNS (如 DoH/DoT 服务器)。
            //   解决 DNS 污染问题,为被污染的域名指定一个可靠的 DNS。
            class NameserverPolicyModifier extends ModifierStrategy {
              apply(config) {
                if (!config.dns) config.dns = {};
                if (!config.dns["nameserver-policy"]) config.dns["nameserver-policy"] = {};

                const newPolicies = new Map([
                  // 内网
                  ["+.myslayers.cn", "172.16.10.130#DIRECT"],
                  ["git.myslayers.cn", "172.16.10.130#DIRECT"],
                  ["e.myslayers.cn", "172.16.10.130#DIRECT"],
                  ["cerios.myslayers.cn", "172.16.10.130#DIRECT"],
                  ["+.21tb.com", "172.16.10.130#DIRECT"],
                  // 外网
                  ["+.seefs.me", "223.6.6.6#DIRECT"],
                  ["+.halavah.us", "223.6.6.6#DIRECT"],
                  ["+.newbotai.cn", "223.6.6.6#DIRECT"],
                  ["+.xiaohumini.site", "223.6.6.6#DIRECT"],
                  // 流媒体
                  // ["+.bilibili.com", "https://dns.alidns.com/dns-query#DIRECT"],
                  // ["+.bilivideo.*", "https://dns.alidns.com/dns-query#DIRECT"],
                  // 广告
                  // ["*.akamaized.net", "https://dns.alidns.com/dns-query#DIRECT"],
                  // 工具
                  ["+.cursor.sh", "223.6.6.6#DIRECT"],
                  ["+.cursor.cn", "223.6.6.6#DIRECT"],
                  ["+.cursor.com", "223.6.6.6#DIRECT"],
                  ["+.cursorapi.com", "223.6.6.6#DIRECT"],
                ]);

                // 合并规则,新规则优先
                const existingPolicies = new Map(Object.entries(config.dns["nameserver-policy"]));
                const mergedPolicies = new Map([...newPolicies, ...existingPolicies]);

                config.dns["nameserver-policy"] = Object.fromEntries(mergedPolicies);
              }
            }

            // RulesModifier (规则修改器)
            // 作用:这个修改器用来配置 Clash 的 rules 部分。
            // 功能:Clash 的 rules 是一系列按顺序匹配的规则,用于判断网络请求应该走哪个策略(例如:DIRECT 直连,PROXY 代理,REJECT 拒绝等)。规则可以基于域名、IP、进程名等多种条件。
            // 示例:
            //   "DOMAIN-SUFFIX,myslayers.cn,DIRECT" 表示所有以 myslayers.cn 结尾的域名都走 DIRECT (直连) 策略。
            //   "PROCESS-NAME,Thunder.exe,DIRECT" 表示名为 Thunder.exe 的进程发出的所有网络请求都走 DIRECT 策略。
            //   "DOMAIN-KEYWORD,akamaized,DIRECT" 表示域名中包含关键词 akamaized 的请求走 DIRECT。
            // 用途:
            //   实现分流:哪些网站走代理,哪些直连,哪些被拒绝。
            //   广告屏蔽(通过将广告域名指向 REJECT)。
            //   按应用程序分流。
            class RulesModifier extends ModifierStrategy {
              apply(config) {
                if (!config.rules) config.rules = [];

                const rules = [
                  // 内网
                  "DOMAIN,e.myslayers.cn,DIRECT",
                  "DOMAIN,git.myslayers.cn,DIRECT",
                  "DOMAIN,cerios.myslayers.cn,DIRECT",
                  "DOMAIN-SUFFIX,myslayers.cn,DIRECT",
                  "DOMAIN-SUFFIX,21tb.com,DIRECT",
                  // 外网
                  "DOMAIN-SUFFIX,seefs.me,DIRECT",
                  "DOMAIN-SUFFIX,halavah.us,DIRECT",
                  "DOMAIN-SUFFIX,newbotai.cn,DIRECT",
                  "DOMAIN-SUFFIX,xiaohumini.site,DIRECT",
                  "PROCESS-NAME,Thunder.exe,DIRECT",
                  "PROCESS-NAME,transmission-qt.exe,DIRECT",
                  // 流媒体
                  // "DOMAIN-SUFFIX,bilibili.com,DIRECT",
                  // "DOMAIN-SUFFIX,bilivideo.com,DIRECT",
                  // "DOMAIN-SUFFIX,bilivideo.cn,DIRECT",
                  // 广告
                  // "DOMAIN-KEYWORD,akamaized,DIRECT",
                  // 工具
                  "DOMAIN-SUFFIX,cursor.sh,DIRECT",
                  "DOMAIN-SUFFIX,cursor.cn,DIRECT",
                  "DOMAIN-SUFFIX,cursor.com,DIRECT",
                  "DOMAIN-SUFFIX,cursorapi.com,DIRECT",
                ];

                // 将规则添加到列表开头(如果不存在)
                rules.forEach(rule => {
                  if (!config.rules.includes(rule)) {
                    config.rules.unshift(rule);
                  }
                });
              }
            }

            // FakeIpFilterModifier (Fake-IP 过滤器修改器)
            // 作用:这个修改器用来配置 Clash 的 dns.fake-ip-filter 部分。
            // 功能:当 Clash 的 dns.enhanced-mode 设置为 fake-ip 时,Clash 会为远端服务器的域名分配一个本地的 Fake IP 地址 (通常在 198.18.0.0/16 网段)。fake-ip-filter 用于指定哪些域名 不应该使用 Fake IP,而是应该尝试由真实的 DNS 服务器解析得到实际 IP。
            // 示例:
            //   "+.myslayers.cn" 表示 myslayers.cn 及其所有子域名不使用 Fake IP,而是会进行标准 DNS 解析。
            // 用途:
            //   主要用于解决 Fake IP模式下某些服务(特别是内网服务或一些对 IP 地址有特殊校验的服务)不兼容的问题。如果一个服务无法通过 Fake IP 正常工作,可以将其域名加入到 fake-ip-filter 中,使其回退到传统 DNS 解析方式。
            //   对于一些 P2P 应用或者需要真实 IP 进行通信的场景也可能需要配置。
            class FakeIpFilterModifier extends ModifierStrategy {
              apply(config) {
                if (!config.dns) config.dns = {};
                if (!config.dns["fake-ip-filter"]) config.dns["fake-ip-filter"] = [];

                const filters = [
                  // 内网
                  "+.myslayers.cn",
                  "+.21tb.com",
                  // 外网
                  "+.seefs.me",
                  "+.halavah.us",
                  "+.newbotai.cn",
                  "+.xiaohumini.site",
                  // 流媒体
                  // "+.bilibili.com",
                  // "+.bilivideo.cn",
                  // "+.bilivideo.com",
                  // "+.bilivideo.*",
                  // 广告
                  // "*.akamaized.net",
                  // 工具
                  "+.cursor.sh",
                  "+.cursor.cn",
                  "+.cursor.com",
                  "+.cursorapi.com",
                ];
                // 将域名添加到列表开头(如果不存在)
                filters.forEach(domain => {
                  if (!config.dns["fake-ip-filter"].includes(domain)) {
                    config.dns["fake-ip-filter"].unshift(domain);
                  }
                });
              }
            }

            // ListenersModifier (监听端口扩展)
            class ListenersModifier extends ModifierStrategy {
              constructor(startPort, endPort) {
                super();
                this.startPort = startPort;
                this.endPort = endPort;
              }

              apply(config) {
                if (!config.listeners) {
                  config.listeners = [];
                }

                const existingPorts = new Set(config.listeners.map(listener => listener.port));

                // 动态添加端口
                for (let port = this.startPort; port <= this.endPort; port += 10) {
                  if (!existingPorts.has(port)) {
                    config.listeners.push({
                      name: `Browser-Mixed-${port}`,
                      type: "mixed",
                      port: port,
                      udp: true
                    });
                  }
                }
              }
            }

            // 配置修改器 (上下文)
            class ConfigModifier {
              constructor(config) {
                this.config = config;
                this.strategies = [];
              }

              addStrategy(strategy) {
                this.strategies.push(strategy);
              }

              applyStrategies() {
                this.strategies.forEach(strategy => strategy.apply(this.config));
              }

              getConfig() {
                return this.config;
              }
            }

            // 主函数
            function main(config, profileName) {
              const modifier = new ConfigModifier(config);

              // 添加策略
              modifier.addStrategy(new DnsModifier());
              modifier.addStrategy(new NameserverPolicyModifier());
              modifier.addStrategy(new RulesModifier());
              modifier.addStrategy(new FakeIpFilterModifier());
              modifier.addStrategy(new ListenersModifier(50050, 50100));

              // 执行所有策略
              modifier.applyStrategies();

              return modifier.getConfig();
            }

07.SwitchyOmega+Clash跳过防火墙
    a.SwitchyOmega
        情景模式:proxy
        代理服务器:127.0.0.1、7890
        不代理的地址列表:127.0.0.1
                         ::1
                         localhost
                         *.myslayers.cn
                         git.myslayers.cn
                         e.myslayers.cn
    b.Clash
        策略组:哗哩哗哩 -> 香港01
        -----------------------------------------------------------------------------------------------------
        1721013384645.yml
        - 'DOMAIN-SUFFIX,126.com,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,126.net,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,127.net,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,163.com,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,music.163.com,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,bilibili.com,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,ximalaya.com,🅱 哔哩哔哩'
        - 'DOMAIN-KEYWORD,taobao,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,jd.com,🅱 哔哩哔哩'
        - 'DOMAIN-SUFFIX,myslayers.cn,DIRECT'
        -----------------------------------------------------------------------------------------------------
        TUN Mode Settings
        DNS Servers:172.16.10.130
        网络和Internet -> WLAN (JGJT) -> 属性:IPv4地址(10.70.20.179)、IPv4 DNS服务器(172.16.10.130)
    c.Host(废弃,不修改HOST,使用自定义DNS服务器)
        ping myslayers.cn
        nslookup myslayers.cn
        -----------------------------------------------------------------------------------------------------
        198.18.0.47 myslayers.cn
        198.18.0.47 git.myslayers.cn
        198.18.0.47 e.myslayers.cn
        -----------------------------------------------------------------------------------------------------
        124.164.237.162 myslayers.cn
        124.164.237.162 git.myslayers.cn
        124.164.237.162 e.myslayers.cn
        -----------------------------------------------------------------------------------------------------
        0.0.0.0   dl.pstmn.io
        127.0.0.1 dbeaver.com
        127.0.0.1 activate.navicat.com
        127.0.0.1 localhost
        127.0.0.1 license.sublimehq.com
        127.0.0.1 www.sublimetext.com
        192.168.2.2   bigdata
        192.168.2.128 bigdata01
        192.168.2.129 bigdata02
        192.168.2.130 bigdata03
        192.168.2.131 bigdata04
        192.168.2.132 bigdata05
        192.168.2.138 debain01
        192.168.185.150 master
        192.168.185.151 slave1
        192.168.185.152 slave2

        # Added by Docker Desktop
        10.168.1.167 host.docker.internal
        10.168.1.167 gateway.docker.internal
        # To allow the same kube context to work on the host and the container:
        127.0.0.1 kubernetes.docker.internal
        # End of section

        127.0.0.1 jeecg-boot-redis
        127.0.0.1 jeecg-boot-mysql
        127.0.0.1 jeecg-boot-nacos
        127.0.0.1 jeecg-boot-gateway
        127.0.0.1 jeecg-boot-system
        127.0.0.1 jeecg-boot-sentinel
        127.0.0.1 jeecg-boot-xxljob
        127.0.0.1 jeecg-boot-rabbitmq

1.9 homebrew

01.常见配置
    a.说明
        a.概念
            Homebrew 是 macOS 和 Linux 上非常流行的开源包管理器,可以理解为一个命令行版本的应用商店。
            它是相对安全的,如果你知道自己正在下载什么。起码目前 Homebrew 上不存在恶意包(All Formulae)。
        b.术语
            macmini$ brew list
            ==> Formulae
            ncurses     pcre2       starship    zsh
            ==> Casks
            iterm2
            -------------------------------------------------------------------------------------------------
            formul   表示安装包的描述文件。复数为 formulae
            cask     装酒的器具,表示具有 GUI 界面的原生应用
            keg      表示某个包某个版本的安装目录,比如 /usr/local/Cellar/foo/0.1
            Cellar   存放酒的地方,表示包的安装目录,比如 /usr/local/Cellar
            Caskroom 表示类型为 Cask 的包的安装目录,比如:/usr/local/Caskroom
            tap      表示包的来源,也就是镜像源
            bottle   表示预先编译好的包,下载好直接使用
            -------------------------------------------------------------------------------------------------
            Formulae:这是 Homebrew 的核心部分,用于安装命令行工具和库。通常是开源软件,通过编译源代码来安装。
            Casks:用于安装 macOS 应用程序,通常是图形用户界面的应用程序。Homebrew Cask 允许用户安装 .app 文件、字体、插件等。
            Taps:Taps 是用户或组织创建的自定义软件包库,可以包含 Formulae 和 Casks。用户可以通过 brew tap <user/repo> 来添加额外的软件包来源。
            Services:Homebrew Services 提供了一种管理后台服务的方式,可以通过 brew services 命令来启动、停止和管理服务。
        c.组成
            brew                     Homebrew 源代码仓库
            homebrew-core            Homebrew Core 仓库
            homebrew-cask            Homebrew Cask 仓库,提供 macOS 应用和大型二进制文件的安装
            homebrew-bottles         Homebrew 预编译二进制软件包与软件包元数据文件
            homebrew-cask-versions   Homebrew Cask 其他版本 (alternative versions) 软件仓库,提供使用人数多的、需要的版本不在 Cask 仓库中的应用。
            homebrew-services        与 brew services 有关的文件,用于在 macOS (launchctl) 与 Linux (systemctl) 上管理 brew 安装的服务。
    b.组件
        a.概念
            Homebrew直译“家酿啤酒”,之所以取这么“个性化”的名字据说是因为当初作者并没有预料到它之后会如此流行,
            想要更改的时候已经来不及。不仅名字,它使用的术语也不是常见的package之类,而真的是一堆很形象的“酿酒”词。
        b.prefix
            前面提过是Homebrew的安装目录,通过brew安装的包都不会超出这个目录。
            包会被安装到[prefix]/Cellar/中然后通过symlink软链接将其可执行文件和其它必要文件映射到[prefix]/里,
            因为可执行文件所在的[prefix]/bin/本身是环境变量$PATH的一部分,所以这个包也就能被外部使用。
        c.formulae
            直译“酿酒配方”,是安装时要从上游源码编译的包定义,现场酿酒。
            这些包定义是通过一个GitHub仓库来管理的:https://github.com/homebrew/homebrew-core
            每个包都对应其中一个记录其属性的Ruby文件,通过brew安装要先从此仓库pull下来整个包列表所以会特别慢。
            即然包列表就是一个git仓库,那么如果要上传自己的包到Homebrew就只需把自定义包文件push到这个仓库里即可,
            这也是Homebrew和其它包管理器很不一样的地方。
        d.cask
            直译“酒桶”,是macOS使用的原生包定义,和formulae一样也是通过GitHub仓库管理:
            https://github.com/homebrew/homebrew-cask.git
        e.bottle
            直译“酒瓶”,是预编译好的二进制包,酿好的酒。
            这些包都被托管在GitHub Packages上:https://github.com/Homebrew/homebrew-core/packages
        f.cellar
            直译“酒窖”,是包的安装目录,也就是藏酒的地方:
            [prefix]/Cellar/
        g.keg
            直译“装酒的小桶”,无论是现酿的酒formulae还是酿好的酒bottle,
            都要被pour倾倒到小酒桶keg放入地窖cellar储存,其实是指定包的指定版本的目录。
            # 指定包的指定版本的目录
            [prefix]/Cellar/kotlin/1.9.20/
        h.keg-only
            使用Homebrew可能会经常看到keg-only这个词,意思是酒仅仅是被储存在酒窖里,
            并不能被外界使用,brew安装的第二步将其可执行文件symlink软链接到[prefix]/bin/中并没有进行。
            原因是里面已经有同名文件,比如macOS自带的git也会软链接到这里。
            如果想使用brew安装的新版本git,需要按照提示执行brew link,
            但是建议在执行覆盖前先--dry-run检查一下可能会被影响的文件。
            -------------------------------------------------------------------------------------------------
            # 检查并输出会被影响的文件
            brew link --overwrite --dry-run git
            # 将git链接到[prefix]的对应目录,覆盖已有文件
            brew link --overwrite git
            -------------------------------------------------------------------------------------------------
            对于一些不能使用软链接覆盖的包比如openjdk,可以通过手动将其路径添加进环境变量的方式解决。
            brew info openjdk

            ==> openjdk: stable 21.0.1 (bottled) [keg-only]
            Development kit for the Java programming language
            https://openjdk.java.net/
            /usr/local/Cellar/openjdk/21.0.1 (600 files, 331.4MB)
              Poured from bottle using the formulae.brew.sh API on 2023-11-13 at 01:24:39
            From: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git/Formula/o/openjdk.rb
            License: GPL-2.0-only with Classpath-exception-2.0
            ==> Dependencies
            Build: autoconf ✔, pkg-config ✔
            Required: giflib ✔, harfbuzz ✔, jpeg-turbo ✔, libpng ✔, little-cms2 ✔
            ==> Requirements
            Build: Xcode (on macOS) ✔
            Required: macOS >= 10.15 (or Linux) ✔
            ==> Caveats
            For the system Java wrappers to find this JDK, symlink it with
              sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

            openjdk is keg-only, which means it was not symlinked into /usr/local,
            because macOS provides similar software and installing this software in
            parallel can cause all kinds of trouble.

            If you need to have openjdk first in your PATH, run:
              echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc

            For compilers to find openjdk you may need to set:
              export CPPFLAGS="-I/usr/local/opt/openjdk/include"
        i.rack
            直译“装着很多小酒桶的支架”,其实是指定包的目录,它会包含很多版本keg。
            -------------------------------------------------------------------------------------------------
            # rack
            [prefix]/Cellar/kotlin/
            # kegs
            [prefix]/Cellar/kotlin/1.9.20/
            [prefix]/Cellar/kotlin/1.9.21/
        j.tap
            直译“阀门”,比如formulae和bottle的来源:
            https://github.com/homebrew/homebrew-core
            https://github.com/Homebrew/homebrew-core/packages
            修改镜像源正是通过brew tap来实现的
            -------------------------------------------------------------------------------------------------
            homebrew/cask:提供大量的 macOS 应用程序安装包,可以通过 Homebrew 安装 GUI 应用。不需要额外安装,内置命令
            homebrew/cask-versions:提供不同版本的 cask 应用程序,例如早期版本的浏览器或开发工具。不需要额外安装,内置命令
            homebrew/services:允许你轻松管理 macOS 上的后台服务,可以启动、停止和重启服务。不需要额外安装,内置命令
            homebrew/livecheck:提供一个命令来检查已安装的 Homebrew 软件包是否有更新。不需要额外安装,内置命令
            homebrew/bundle:允许你使用一个 Brewfile 来管理和安装一组 Homebrew 软件包,类似于 Gemfile 或 requirements.txt
            homebrew/science(已弃用):曾经提供科学计算相关的软件包
            homebrew/games:提供一些经典游戏和游戏相关的工具
            homebrew/php(已弃用):曾经提供 PHP 相关的工具和扩展
    c.环境
        a.默认安装位置
            Linux:/home/linuxbrew/.linuxbrew
            -------------------------------------------------------------------------------------------------
            macOS Intel: /usr/local
            1.Homebrew 将 git 下载至 /usr/local/Cellar/git/<version>/ 目录下,其二进制文件在 /usr/local/Cellar/git/<version>/bin/git。
            2.Homebrew 为 /usr/local/Cellar/git/<version>/bin/git 创建了一个软链文件至 /usr/local/bin 里。
            -------------------------------------------------------------------------------------------------
            macOS ARM: /opt/homebrew
            macOS ARM 的路径对应是:
            /opt/homebrew/Cellar/git/<version>/
            /opt/homebrew/Cellar/git/<version>/bin/git
            /opt/homebrew/bin。
            这也是 macOS ARM 要将 /opt/homebrew/bin 添加到 PATH 环境变量的原因。
            -------------------------------------------------------------------------------------------------
            当执行 brew uninstall 时,会将 /usr/local/Cellar 下对应包目录删除,对应的链接关系也会移除。
            当执行 brew cleanup 时,会将 /usr/local/Cellar 所有包里的旧版本,只保留最新版本。
        b.Homebrew Cask区别
            包分为命令行工具、GUI 应用两类:
            GUI 应用,加上 --cask 参数
            需强制卸载,加上 --force 参数
            -------------------------------------------------------------------------------------------------
            使用 brew search 命令可以看到「Formulae」和「Casks」两类:
            Formulae:一般是那些命令行工具、开发库、字体、插件等不含 GUI 界面的软件
            Casks:是指那些含有 GUI 图形化界面的软件,比如 Chrome、FireFox 等
            -------------------------------------------------------------------------------------------------
            $ brew search google

            ==> Formulae
            aws-google-auth                          google-sparsehash
            google-authenticator-libpam              google-sql-tool
            google-benchmark                         googler
            google-go                                googletest
            google-java-format

            ==> Casks
            google-ads-editor
            google-analytics-opt-out
            google-backup-and-sync
            ...
    d.镜像
        a.目录
            Homebrew的配置分成三个目录,分别是
            1.brew(brew --repo)
            2.homebrew/core(brew --repo homebrew/core)
            3.homebrew/cask(brew --repo homebrew/cask)
            4./opt/homebrew/Cellar/tomcat@9/9.0.104/libexec
        b.方式1:查看源
            # 切换当前工作目录到 Homebrew 的仓库目录
            $ cd "$(brew --repo)"
            # 显示当前工作目录的路径
            $ pwd
            # 查看当前 Git 仓库所配置的远程仓库的详细信息
            $ git remote -v
        c.方式2:查看源
            $ git remote get-url origin
            git -C "$(brew --repo)" remote get-url origin
            git -C "$(brew --repo homebrew/core)" remote get-url origin
            git -C "$(brew --repo homebrew/cask)" remote get-url origin
        d.修改源
            $ git -C "$(brew --repo)" remote set-url origin 'https://github.com/Homebrew/brew.git'
            $ git -C "$(brew --repo homebrew/core)" remote set-url origin 'https://github.com/Homebrew/homebrew-core.git'
            $ git -C "$(brew --repo homebrew/cask)" remote set-url origin 'https://github.com/Homebrew/homebrew-cask.git'
            $ brew update

02.安装说明
    a.在线安装
        a.镜像源
            # zsh设置环境变量(适用zsh用户)
            echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/brew"' >> ~/.zshrc
            echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/homebrew-core"' >> ~/.zshrc
            echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
            source ~/.zshrc
            # zsh设置环境变量(适用zsh用户)
            echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/brew"' >> ~/.bash_profile
            echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/homebrew-core"' >> ~/.bash_profile
            echo 'export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.aliyun.com/homebrew/homebrew-bottles"' >> ~/.bash_profile
            source ~/.bash_profile
        b.命令
            # 安装
            /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
            # 卸载
            /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
        c.镜像生效
            # 安装过程中会看到以下提示,说明配置的镜像生效了
            ==> HOMEBREW_BREW_GIT_REMOTE is set to a non-default URL:
            https://mirrors.aliyun.com/homebrew/brew.git will be used as the Homebrew/brew Git remote.
            ==> HOMEBREW_CORE_GIT_REMOTE is set to a non-default URL:
            https://mirrors.aliyun.com/homebrew/homebrew-cask.git will be used as the Homebrew/homebrew-core Git remote.
        d.检查是否安装
            brew -v                                                            --版本信息
            brew --repo                                                        --安装路径
    b.手动安装
        a.下载
            https://github.com/Homebrew/brew/releases/tag/4.1.4
        b.安装
            双击运行下载好安装包,直接点继续同意安装协议,然后继续或者下一步即可,安装完成,关闭即可
        c.环境变量
            echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.bash_profile
            source ~/.bash_profile
            echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
            source ~/.zshrc
        d.检查是否安装
            brew -v                                                            --版本信息
            brew --repo                                                        --安装路径
    c.能否直接拷贝旧系统的 brew 目录
        a.不推荐直接拷贝
            Homebrew 的很多包有硬编码路径
            依赖关系可能不兼容
            可能导致奇怪的错误
        b.推荐方式
            在旧系统运行 brew bundle dump --file=~/Brewfile 导出包列表
            把 Brewfile 拷贝到新系统
            运行 brew bundle install --file=~/Brewfile 批量安装

03.常见命令
    a.命令1
        a.基础
            brew search mysql                                                  --搜索软件
            brew search /^mysql$/                                              --搜索软件
            -------------------------------------------------------------------
            brew install mysql                                                 --安装默认版本
            brew install [email protected]                                             --安装指定版本
            brew install --cask firefox                                        --安装桌面软件
        b.查看
            brew list                                                          --所有的软件,包括Formulae和Cask
            brew list --formulae                                               --所有已安装的Formulae
            brew list --cask                                                   --所有已安装的Casks
            brew list --versions --cask                                        --所有已安装的Casks,以及版本号
            brew list --versions openssl                                       --所有已安装的Casks,以及版本号
            brew list <package-name>                                           --列举某个Formulate或Cask的详细路径
            -------------------------------------------------------------------
            brew services list                                                 --查看所有服务
            brew services info mysql                                           --查看指定服务
            brew services run mysql                                            --启动服务,仅启动不注册
            brew services start mysql                                          --启动服务,并注册,默认启动时自动运行
            brew services stop mysql                                           --停用服务,并取消注册
            brew services restart mysql                                        --重启服务,并注册
            brew services remove mysql                                         --移除服务
            brew services cleanup                                              --移除所有未使用服务
        c.包管理
            brew pin <package-name>                                            --锁定不想更新的包
            brew unpin <package-name>                                          --取消锁定指定包
            -------------------------------------------------------------------
            brew outdated                                                      --列出可更新的包
            brew outdated --cask                                               --查看过期的cask软件
            -------------------------------------------------------------------
            brew cleanup                                                       --清理所有旧版本的包
            brew cleanup <package-name>                                        --清理指定的旧版本包
            brew cleanup -n                                                    --查看可清理的旧版本包
            -------------------------------------------------------------------
            brew deps logseq                                                   --查看软件logseq的依赖关系
            brew deps --installed --tree                                       --查看已安装包的依赖
            -------------------------------------------------------------------
            brew info <package>                                                --显示某个包信息
            brew info                                                          --显示安装的软件数量、文件数量以及占用空间
    b.命令2
        a.安装
            brew info mysql                                                    --查看软件信息
            brew list mysql                                                    --查看软件安装路径
            brew update                                                        --更新源
            brew upgrade                                                       --升级所有软件
            brew upgrade wget                                                  --升级指定软件
            -------------------------------------------------------------------
            brew install nginx                                                 --安装nginx
            brew reinstall nginx                                               --重新安装nginx
            brew uninstall nginx                                               --卸载nginx
            brew uninstall -f nginx                                            --强制卸载nginx,可能会导致其他软件不可用
        b.cask安装
            brew cask install <formula>                                        --安装指定图形界面软件
            brew cask uninstall <formula>                                      --卸载软件
            brew cask uninstall --force <formula>                              --卸载软件,带参数
            brew cask search text                                              --搜索软件
            brew cask list                                                     --列出所有通过 cask 安装的软件
            -------------------------------------------------------------------
            brew cask install google-chrome                                    --安装chrome
            brew cask install launchrocket                                     --安装LaunchRocket
        c.tap安装
            brew tap                                                           --列出本地资源仓库,其中 homebrew 是默认仓库,其它都是第三方仓库
            brew tap <user/repo>                                               --添加第三方仓库,命名的规则按照 github 来定的
            brew untap <user/repo>                                             --删除仓库
            brew deps <formula>                                                --查看指定软件依赖于哪些软件
            brew uses <formula>                                                --查看指定软件被哪些软件所依赖
            -------------------------------------------------------------------
            brew tap elastic/tap                                               --This tap is for products in the Elastic stack.
            brew tap beeftornado/rmtree                                        --用于递归地卸载一个 Homebrew 包及其所有依赖项,brew rmtree可以帮助你清理不再需要的依赖项
            brew rmtree nginx                                                  --rmtree 是一个由 beeftornado/rmtree tap 提供的工具,清理依赖项
            brew prune                                                         --清理无效的关联,且清理与之相关的位于/Applications和~/Applications中的无用App链接
            brew cleanup                                                       --删除那些已经卸载的软件包的残留文件,以及旧版本的软件包
    c.命令3
        a.其他1
            brew doctor                                                        --检查Homebrew
            brew update                                                        --更新Homebrew
        b.其他2
            brew --repo                                                        --本地的Git仓库
            brew --cache                                                       --缓存路径
            brew --prefix                                                      --安装路径
            brew --cellar                                                      --Cellar路径
            brew --caskroom                                                    --Caskroom路径
        c.其他3
            brew conifg                                                        --查看当前配置
            brew doctor                                                        --检查当前配置是否合理,或者某些包存在的问题
    d.launchctl、brew service
        a.launchctl自启服务
            launchctl list | grep mysql
            -------------------------------------------------------------------
            ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
            launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
        b.brew service 简化 lauchctl
            brew services list                                                 --查看所有服务
            brew services info mysql                                           --查看指定服务
            brew services run mysql                                            --启动服务,仅启动不注册
            brew services start mysql                                          --启动服务,并注册
            brew services stop mysql                                           --停用服务,并取消注册
            brew services restart mysql                                        --重启服务,并注册
            brew services remove mysql                                         --移除服务
            brew services cleanup                                              --移除所有未使用服务
    e.launchctl配置
        a.配置目录
            # 开机自启,需要sudo
            /Library/LaunchDaemons
            # 用户登录后自启
            ~/Library/LaunchAgents
        b.以 homebrew.mxcl.kafka.plist 为例
            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
            <plist version="1.0">
              <dict>
                <key>Label</key>
                <string>homebrew.mxcl.kafka</string>
                <key>WorkingDirectory</key>
                <string>/usr/local</string>
                <key>ProgramArguments</key>
                <array>
                  <string>/usr/local/opt/kafka/bin/kafka-server-start</string>
                  <string>/usr/local/etc/kafka/server.properties</string>
                </array>
                <key>RunAtLoad</key>
                <true/>
                <key>KeepAlive</key>
                <true/>
                <key>StandardErrorPath</key>
                <string>/usr/local/var/log/kafka/kafka_output.log</string>
                <key>StandardOutPath</key>
                <string>/usr/local/var/log/kafka/kafka_output.log</string>
              </dict>
            </plist>
        c.说明
            在这里可以找到服务路径、启动参数、日志路径等

04.镜像源
    a.清华
        a.地址
            https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/
        b.说明
            该镜像是 Homebrew / Linuxbrew 源程序以及 formula / cask 索引的镜像(即 brew update 时所更新内容)
            镜像站同时提供相应的二进制预编译包的镜像
            镜像站提供了 https://github.com/Homebrew 组织下的以下 repo:brew, homebrew-core, homebrew-cask, homebrew-command-not-found, install
            -------------------------------------------------------------------------------------------------
            自 brew 4.0.0 (2023 年 2 月 16 日) 起,HOMEBREW_INSTALL_FROM_API 会成为默认行为,无需设置。
            大部分用户无需再克隆 homebrew-core 仓库,故无需设置 HOMEBREW_CORE_GIT_REMOTE 环境变量;
            但若需要运行 brew 的开发命令或者 brew 安装在非官方支持的默认 prefix 位置,
            则仍需设置 HOMEBREW_CORE_GIT_REMOTE 环境变量。如果不想通过 API 安装,
            可以设置 HOMEBREW_NO_INSTALL_FROM_API=1。
            -------------------------------------------------------------------------------------------------
            目前,homebrew-cask-{drivers,versions,fonts} 已被弃用,所有 cask 合并至 homebrew-cask 仓库。
            本帮助内已移除克隆这些仓库的命令。已克隆用户(brew tap 查看)可使用 brew untap 移除废弃的仓库。
    b.配置
        a.安装
            # 清华镜像源
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors4.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors4.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
            export HOMEBREW_INSTALL_FROM_API=1

            # 从镜像下载安装脚本并安装 Homebrew / Linuxbrew
            git clone --depth=1 https://mirrors4.tuna.tsinghua.edu.cn/git/homebrew/install.git brew-install
            /bin/bash brew-install/install.sh
            rm -rf brew-install

            # 也可从 GitHub 获取官方安装脚本安装 Homebrew / Linuxbrew
            /bin/bash -c "$(curl -fsSL https://github.com/Homebrew/install/raw/master/install.sh)"
        b.替换现有仓库上游
            # 长期替换bash
            echo 'export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"' >> ~/.bash_profile
            echo 'export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"' >> ~/.bash_profile
            export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
            -------------------------------------------------------------------------------------------------
            # 手动设置
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"

            # 注:自 brew 4.0 起,大部分 Homebrew 用户无需设置 homebrew/core 和 homebrew/cask 镜像,只需设置 HOMEBREW_API_DOMAIN 即可。
            # 如果需要使用 Homebrew 的开发命令 (如 `brew cat <formula>`),则仍然需要设置 homebrew/core 和 homebrew/cask 镜像。
            # 请按需执行如下两行命令:
            brew tap --custom-remote --force-auto-update homebrew/core https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
            brew tap --custom-remote --force-auto-update homebrew/cask https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git

            # 除 homebrew/core 和 homebrew/cask 仓库外的 tap 仓库仍然需要设置镜像
            brew tap --custom-remote --force-auto-update homebrew/command-not-found https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-command-not-found.git
            brew update

            # 或使用下面的几行命令自动设置
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
            for tap in core cask command-not-found; do
                brew tap --custom-remote --force-auto-update "homebrew/${tap}" "https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-${tap}.git"
            done
            brew update
        c.复原仓库上游
            # brew 程序本身,Homebrew / Linuxbrew 相同
            unset HOMEBREW_API_DOMAIN
            unset HOMEBREW_BREW_GIT_REMOTE
            git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew

            # 以下针对 macOS 系统上的 Homebrew
            unset HOMEBREW_CORE_GIT_REMOTE
            BREW_TAPS="$(BREW_TAPS="$(brew tap 2>/dev/null)"; echo -n "${BREW_TAPS//$'\n'/:}")"
            for tap in core cask command-not-found; do
                if [[ ":${BREW_TAPS}:" == *":homebrew/${tap}:"* ]]; then  # 只复原已安装的 Tap
                    brew tap --custom-remote "homebrew/${tap}" "https://github.com/Homebrew/homebrew-${tap}"
                fi
            done

            # 重新拉取远程
            brew update
    c.配置
        a.如果使用 4.x 最新的 JSON API 安装方式(推荐)
            echo '
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
            export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/bottles"
            ' >> ~/.zshrc
        b.如果使用 4.0 之前版本,或者使用 4.x 但又想用此前的安装方式,ustc
            export HOMEBREW_NO_INSTALL_FROM_API=1
            export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/bottles"
            export HOMEBREW_CASK_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-cask.git"
        c.如果使用 4.0 之前版本,或者使用 4.x 但又想用此前的安装方式,tsinghua
            # brew关闭更新,自动执行频率为24h
            export HOMEBREW_NO_AUTO_UPDATE=1
            export HOMEBREW_AUTO_UPDATE_SECS=86400
            # brew大陆镜像
            export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
            export HOMEBREW_PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
    d.配置
        a.地址
            https://mudan.me/post/original/2023/11/17/%E4%B8%BAmacOS%E7%9A%84Homebrew%E9%85%8D%E7%BD%AE%E5%A4%A7%E9%99%86%E9%95%9C%E5%83%8F%E6%BA%90.html
        b.zshrc
            export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
            export HOMEBREW_PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
        c.使用brew tap进一步修改源地址
            # 20250505,经过配置前后brew config对比,二者一致,故而无需配置
            # 注:自 brew 4.0 起,大部分 Homebrew 用户无需设置 homebrew/core 和 homebrew/cask 镜像,只需设置 HOMEBREW_API_DOMAIN 即可。
            # 如果需要使用 Homebrew 的开发命令 (如 `brew cat <formula>`),则仍然需要设置 homebrew/core 和 homebrew/cask 镜像。
            # 请按需执行如下两行命令:
            brew tap --custom-remote --force-auto-update homebrew/core https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
            brew tap --custom-remote --force-auto-update homebrew/cask https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
            # 除 homebrew/core 和 homebrew/cask 仓库外的 tap 仓库仍然需要设置镜像
            brew tap --custom-remote --force-auto-update homebrew/cask-fonts https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git
            brew tap --custom-remote --force-auto-update homebrew/cask-versions https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-versions.git
            brew tap --custom-remote --force-auto-update homebrew/command-not-found https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-command-not-found.git
            brew tap --custom-remote --force-auto-update homebrew/services https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-services.git
        d.更新
            brew update
    e.最终配置,20250505
        a.配置
            # brew关闭更新,自动执行频率为24h
            export HOMEBREW_NO_AUTO_UPDATE=1
            export HOMEBREW_AUTO_UPDATE_SECS=86400
            # brew大陆镜像
            export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
            export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
            export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
            export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
            export HOMEBREW_PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
        b.命令
            brew config
        c.输出
            ~$ brew config
            HOMEBREW_VERSION: 4.5.0-90-g7617ac1
            ORIGIN: https://github.com/Homebrew/brew
            HEAD: 7617ac135f6e86e5ef0713048bf7db2a626cda88
            Last commit: 2 days ago
            Branch: master
            Core tap origin: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
            Core tap HEAD: 51e9eff89b5d713891da0dc9c1257b26b18f3ba1
            Core tap last commit: 20 hours ago
            Core cask tap JSON: 05 May 07:04 UTC
            HOMEBREW_PREFIX: /opt/homebrew
            HOMEBREW_API_DOMAIN: https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api
            HOMEBREW_BOTTLE_DOMAIN: https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
            HOMEBREW_BREW_GIT_REMOTE: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
            HOMEBREW_CASK_OPTS: []
            HOMEBREW_CORE_GIT_REMOTE: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
            HOMEBREW_MAKE_JOBS: 10
            HOMEBREW_NO_AUTO_UPDATE: set
            HOMEBREW_PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple
            HOMEBREW_SORBET_RUNTIME: set
            Homebrew Ruby: 3.4.3 => /opt/homebrew/Library/Homebrew/vendor/portable-ruby/3.4.3/bin/ruby
            CPU: deca-core 64-bit arm_donan
            Clang: 17.0.0 build 1700
            Git: 2.39.5 => /Library/Developer/CommandLineTools/usr/bin/git
            Curl: 8.7.1 => /usr/bin/curl
            macOS: 15.3.1-arm64
            CLT: 16.3.0.0.1.1742442376
            Xcode: 16.3
            Rosetta 2: false

2 lang1

2.1 java

01.openjdk
    a.安装
        brew search temurin
        brew install --cask temurin8
        brew install temurin11
    b.环境变量
        vi .bash_profile
        -------------------------------------------------------------------------------------------------
        # JDK8
        export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
        # JDK11
        export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home
        export PATH=$JAVA_HOME/bin:$PATH
        -------------------------------------------------------------------------------------------------
        source ~/.bash_profile
    c.验证
        java -version

02.tomcat
    a.安装
        brew search tomcat
        brew install tomcat@9
    b.位置
        open /opt/homebrew/Cellar/tomcat@9/9.0.104
    c.验证
        brew services start tomcat@9
        访问:http://localhost:8080

03.maven
    a.安装
        brew search maven
        brew install maven
    b.位置
        cat /opt/homebrew/Cellar/maven/3.9.9/libexec/conf/settings.xml
    b.验证
        mvn -v
        Apache Maven 3.9.9

04.other
    a.arthas
        Java诊断工具,提供了实时监控和调试功能
    b.seata
        分布式事务
    c.zipkin
        分布式追踪
    d.sentinel
        流量控制组件
    e.skywalking
        分布式追踪和日志分析

2.2 rust

01.安装
    brew install rust
    brew info rustup
    ---------------------------------------------------------------------------------------------------------
    rustc --version
    cargo --version

02.命令
    rustup update                                                                         --更新
    rustup self uninstall                                                                 --卸载rust、rustup
    ---------------------------------------------------------------------------------------------------------
    cargo new 项目名称                                                                     --创建新项目
    cargo build                                                                           --编译
    cargo run                                                                             --编译并运行
    cargo clean                                                                           --清理临时文件

03.测试
    rustup update                                                                         --升级
    rustup self uninstall                                                                 --卸载
    rustc --version                                                                       --Rust编译器的版本号
    cargo --version                                                                       --Cargo工具的版本号

2.3 node

01.nvm
    a.安装
        brew search nvm
        brew install nvm
    b.环境变量
        export NVM_DIR="$HOME/.nvm"
          [ -s "/usr/local/opt/nvm/nvm.sh" ] && \. "/usr/local/opt/nvm/nvm.sh"
          [ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/usr/local/opt/nvm/etc/bash_completion.d/nvm"
    c.版本
        nvm install 14.16.1
        nvm install 20.10.0
        nvm install 22.19.0
    d.验证
        nvm -v
        node -v

02.npm工具
    a.安装
        npm install -g pnpm
        npm install -g yarn
        npm install -g vite
        npm install -g express express-generator
        npm install -g @nestjs/cli
        npm install -g koa-generator
        npm install -g typescript ts-node
        npm install -g create-react-app
        npm install -g create-next-app
        npm install -g @angular/cli
        npm install -g @tauri-apps/cli
    b.验证
        yarn --version
        pnpm --version
        vite -v
        express --version
        nest --version
        koa --version
        tsc --version
        rimraf --version
        create-react-app -V
        create-next-app -V
        ng v
        tauri -V
    c.镜像
        npm config set registry https://registry.npmmirror.com
        npm config get registry

2.4 python

01.uv,开启TUN模式
    a.安装
        curl -LsSf https://astral.sh/uv/install.sh | sh
    b.验证
        uv help
        uv --version
        uvx --version
    c.使用
        uv sync
        uv run server.py

02.pyenv_mac,开启TUN模式,镜像源为https://www.python.org/ftp/python
    a.说明
        brew install openssl readline ncurses zlib
        brew install pyenv
    b.bash
        alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
        export PYENV_ROOT="$HOME/.pyenv"
        [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
        eval "$(pyenv init - bash)"
    c.zsh
        alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
        export PYENV_ROOT="$HOME/.pyenv"
        [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
        eval "$(pyenv init - zsh)"
    d.版本
        brew install tcl-tk                                                        --解决报错:import _tkinter
        pyenv install 3.9.6                                                        --安装一个版本
        pyenv install 3.11.2                                                       --安装一个版本
    e.切换
        shell > local> global                                                      --优先级顺序
        pyenv versions                                                             --查看安装的所有python版本
        pyenv version                                                              --查看使用的python版本及其路径
        pyenv global 3.9.6                                                         --设置全局默认的Python版本
        pyenv global 3.11.2                                                        --设置全局默认的Python版本
        pyenv local 3.9.6                                                          --在当前目录下设置默认的Python版本
        pyenv shell 3.9.6                                                          --设置临时的shell环境中使用的Python版本
    f.M4芯片
        Python 3.9.1:第一个官方支持 Apple Silicon 的版本。它提供了对 M1 芯片的原生支持
        Python 3.8.x:虽然可以在 M1 芯片上运行,但它们通常需要通过 Rosetta 2 进行翻译,以支持 x86 架构
    g.永久更改镜像源(~/pip/pip.ini)
        [global]
        index-url = https://mirrors.aliyun.com/pypi/simple/

2.5 golang

01.g
    a.安装
        # 建议安装前清空`GOROOT`、`GOBIN`等环境变量
        $ curl -sSL https://raw.githubusercontent.com/voidint/g/master/install.sh | bash
        $ echo "unalias g" >> ~/.bashrc # 可选。若其他程序(如'git')使用了'g'作为别名。
        $ source "$HOME/.g/env"
    b.安装目标go版本
        g install 1.21.12
        g install 1.22.5
        g install 1.23.9
    c.查询已安装的 go 版本
        $ \g ls
        * 1.21.12
          1.22.5
        -----------------------------------------------------------------------------------------------------
        $ go version
        go version go1.22.5 windows/amd64
    d.切换到另一个已安装的 go 版本
        $ g use 1.21.12
        $ g use 1.22.5
        go version go1.22.5 windows/amd64
    e.卸载一个已安装的 go 版本
        $ g uninstall 1.21.12
        Uninstalled go1.21.12

02.luaRocks
    a.安装
        brew search luarocks
        brew install luarocks
    b.验证
        lua -v

03.gopls包管理器
    a.安装
        go install golang.org/x/tools/gopls@latest
    b.验证
        gopls version

3 lang2

3.1 box

00.软件说明
    a.ollama
        a.说明
            最简单易用,命令行友好,API 标准化,社区活跃
        b.命令
            brew install ollama
            ollama pull qwen3-vl:8b
            ollama serve
        c.对比
            方式       安装                           位置特点                          安装步骤
            Homebrew  /opt/homebrew/Cellar/ollama    CLI 为主,无 GUI                  brew install ollama 
            App 版本   /Applications/Ollama.app       带菜单栏图标,自动启动,更友好        https://ollama.com/download/Ollama-darwin.zip
    b.LM Studio
        a.说明
            提供的模型数量远远超过Ollama,LM Studio提供的功能比Ollama全很多
        b.命令
            brew install --cask lm-studio
        c.特性
            LM Studio 支持 Tailscale 管理
    c.QWEN-3.5-9B
        a.说明
            Qwen3.5-9B ToolHub — 本地全能 AI 助手
            基于 Qwen3.5-9B 多模态大模型的本地一体化部署方案。
            开箱即用,无需云端 API、无需联网授权,所有推理均在本机 GPU 完成。
        b.命令
            https://github.com/chixi4/Qwen3.5-9B-ToolHub

01.模型规格
    a.硬盘空间确认
        项目                   数值
        总容量                 926 GB
        已使用                 10 GB
        可用空间               657 GB
    b.模型空间估算
        模型                   大小(约)
        qwen2.5:14b           ~9 GB
        llama3.2              ~2 GB
        llama3.1:8b           ~4.5 GB
        mistral:7b            ~4 GB
        gemma2:9b             ~5.5 GB
        qwen2.5:7b            ~4.5 GB
        deepseek-coder:6.7b   ~4 GB
        yi:6b                 ~3.5 GB
        全部合计               ~37 GB
    c.模型特点对比
        -----------------------------------------------------------------------------------------------------------
        模型                 大小       参数量   语言优势      特点描述                    推荐度
        -----------------------------------------------------------------------------------------------------------
        qwen2.5:14b          ~9 GB     14B      中文⭐⭐⭐     阿里最新,中文综合能力最强             ⭐⭐⭐⭐⭐
        llama3.2             ~2 GB     3B       英文⭐⭐⭐     Meta 最新,速度快,英文优秀           ⭐⭐⭐⭐
        deepseek-coder:6.7b  ~4 GB     6.7B     代码⭐⭐⭐     DeepSeek 出品,编程专用              ⭐⭐⭐⭐
        qwen2.5:7b           ~4.5 GB   7B       中文⭐⭐       中文快速响应,与 14B 功能重复         ⭐⭐
        llama3.1:8b          ~4.5 GB   8B       英文⭐⭐       Meta 经典版与 3.2 功能重复           ⭐⭐
        mistral:7b           ~4 GB     7B       英文⭐⭐       欧洲开源,效率高,与 llama 重复        ⭐⭐
        gemma2:9b            ~5.5 GB   9B       英文⭐⭐       Google 出品与 mistral 定位类似       ⭐
        yi:6b               ~3.5 GB    6B       中文⭐⭐       零一万物与 qwen 重复                 ⭐
    d.本地 Text Embedding 方案
        项目           说明
        功能           把文本转换成数字向量(如 [0.1, -0.3, 0.5, ...])
        用途           语义搜索、RAG、文本相似度、聚类分析
        与 LLM 区别    LLM 生成文本,Embedding 生成向量表示
        -----------------------------------------------------------------------------------------------------
        模型                 大小                 是否支持      状态
        nomic-embed-text    轻量高效,中文支持一般   ✅ 支持
        mxbai-embed-large   英文优秀,质量高        ✅ 支持      ✅ 已安装
        all-minilm          极轻量,速度快          ✅ 支持
        bge-m3              中文最强,BGE 系列      ✅ 支持      ✅ 已安装

02.本地模型
    a.机器配置
        机型:Mac mini (M4 芯片)
        CPU:Apple M4,10 核(4 性能核 + 6 能效核)
        GPU:Apple M4,10 核,统一内存架构
        内存:16 GB(CPU/GPU 共享)
        评价:配置优秀!可流畅运行 7B-14B 参数量模型,量化后可跑 32B
    b.轻量级(1B-3B)
        内存占用 < 2GB,速度极快
        国外模型:
        ollama pull phi3:mini --微软 Phi-3 Mini 3.8B,小巧强悍
        ollama pull gemma2:2b --Google Gemma 2 2B,轻量好用
        ollama pull tinyllama --TinyLlama 1.1B,速度最快
        国内模型:
        ollama pull qwen2.5:1.5b --阿里通义千问 1.5B,中文友好
        ollama pull qwen2.5:0.5b --阿里通义千问 0.5B,极致轻量
        适用场景:快速问答、简单任务、后台常驻服务
    c.标准级(7B-8B)
        内存占用 4-6GB,推荐日常使用 ⭐推荐
        国外模型:
        ollama pull llama3.2 --Meta Llama 3.2 3B,综合最强,推荐!
        ollama pull llama3.1:8b --Meta Llama 3.1 8B,经典稳定
        ollama pull mistral:7b --Mistral 7B,欧洲开源,效率高
        ollama pull gemma2:9b --Google Gemma 2 9B,质量不错
        国内模型:
        ollama pull qwen2.5:7b --阿里通义千问 7B,中文最佳,推荐!
        ollama pull deepseek-coder:6.7b --DeepSeek 代码模型,编程强
        ollama pull yi:6b --零一万物 Yi 6B,中文不错
        适用场景:日常对话、文档写作、代码辅助、知识问答
    d.进阶级(14B-14B)
        内存占用 8-10GB,质量更高
        国外模型:
        ollama pull llama3.1:13b --Meta Llama 3.1 13B,推理更强
        ollama pull mistral-nemo:12b --Mistral Nemo 12B,最新版本
        ollama pull command-r:35b --Cohere Command R,擅长 RAG(需量化)
        国内模型:
        ollama pull qwen2.5:14b --阿里通义千问 14B,中文顶级
        ollama pull deepseek-r1:14b --DeepSeek R1 14B,推理能力极强,推荐!
        ollama pull glm4:9b --智谱 GLM-4 9B,中文对话优秀
        适用场景:复杂推理、长文本处理、专业写作、代码生成
    e.挑战级(32B+)
        需要量化,内存占用 12-16GB,接近极限
        国外模型:
        ollama pull llama3.3:70b-q4_K_M --Llama 3.3 70B 量化版,16GB 勉强可跑
        ollama pull mixtral:8x7b-q4_K_M --Mixtral 8x7B MoE 量化版
        国内模型:
        ollama pull qwen2.5:32b-q4_K_M --通义千问 32B 量化版,中文顶级
        ollama pull deepseek-r1:32b-q4_K_M --DeepSeek R1 32B 量化版,推理最强
        适用场景:高质量输出、复杂任务、专业领域
        注意:16GB 内存跑 32B+ 比较吃力,建议使用 q4_K_M 或更大量化

03.注意事项
    a.量化说明
        模型后缀         大小        精度        说明
        :latest          100%       FP16       原始精度,最大
        :q8_0            ~70%       8bit       高精度量化
        :q6_K            ~60%       6bit       平衡选择
        :q5_K_M          ~55%       5bit       推荐量化,质量损失小
        :q4_K_M          ~45%       4bit       常用量化,性价比高 ⭐
        :q3_K_M          ~35%       3bit       极限量化,质量损失明显
        :q2_K            ~25%       2bit       最小,质量较差
        示例:
        ollama pull llama3.2:latest --原始版(较大)
        ollama pull llama3.2:q4_K_M --4bit 量化版(推荐)
    b.推荐组合(针对M4 16GB)
        日常必装:
        ollama pull llama3.2 --英文/通用,速度快
        ollama pull qwen2.5:7b --中文对话,日常使用
        ollama pull deepseek-r1:14b --复杂推理,思考任务
        按需安装:
        ollama pull deepseek-coder:6.7b --写代码时用
        ollama pull qwen2.5:14b --需要更高质量中文输出时
    c.快速测试命令
        下载并测试:
        ollama pull qwen2.5:7b && ollama run qwen2.5:7b "你好,请自我介绍"
        查看占用:
        ollama list --查看已下载模型大小
    d.常见问题
        a.16GB内存能跑多大的模型?
            建议 14B 以下原生运行,32B 需要量化,70B 非常勉强
        b.中英文选哪个?
            中文选 Qwen2.5 或 DeepSeek,英文选 Llama3.2 或 Mistral
        c.代码生成选哪个?
            DeepSeek-Coder 或 Qwen2.5-Coder
        d.推理思考选哪个?
            DeepSeek-R1 系列最强
        e.如何节省空间?
            使用量化版本 q4_K_M,删除不用的模型 ollama rm xxx

3.2 studio

01.基本说明
    a.安装
        brew install --cask lm-studio                            --安装
    b.启动
        open -a "LM Studio"                                      --启动应用
        或直接在 Applications 中双击打开

02.操作说明
    a.左侧边栏
        Discover      --搜索/下载模型(支持 HuggingFace)
        Chat          --对话界面
        My Models     --本地模型管理
        Settings      --设置
    b.顶部栏
        模型选择器       --选择当前使用的模型
        GPU 设置         --GPU Offload 滑块调整
    c.对话界面
        System Prompt    --系统提示词(可选)
        输入框           --输入问题并发送
        参数调整         --Temperature、Top P、Max Tokens 等

03.常用设置
    a.设置
        GPU Offload       --GPU 加速程度(Max=全部用 GPU)
        Context Length    --上下文长度
        Temperature       --创意度(0-2,越高越随机)
        Top P             --采样范围
        Max Tokens        --最大生成长度
    b.模型存储路径
        ~/.lmstudio/models     --默认路径
        可在 Settings 中修改

04.API服务
    a.说明
        LM Studio 可启动本地 API 服务器(兼容 OpenAI API)
        1. 加载模型
        2. 点击顶部 "Start Server"
        3. 默认端口:1234
    b.说明
        curl http://localhost:1234/v1/chat/completions -d '{
          "model": "local-model",
          "messages": [{"role": "user", "content": "你好"}]
        }'

3.3 ollama

01.环境变量
    a.临时配置
        export OLLAMA_MODELS=/path/to/models                     --模型存储路径(默认 ~/.ollama/models)
        export OLLAMA_HOST=0.0.0.0:11434                         --API 监听地址(默认 127.0.0.1:11434)
        export OLLAMA_ORIGINS="*"                                --允许跨域请求
        export OLLAMA_GPU_LAYERS=1                               --GPU 加速层数
        export OLLAMA_FLASH_ATTENTION=1                          --启用 Flash Attention
    b.永久配置
        launchctl setenv OLLAMA_MODELS "/path/to/models"
        或写入 ~/.zshrc 文件

02.常见命令
    a.测试/版本
        ollama --version                                         --查看版本
        ollama -v                                                --查看版本(简写)
    b.服务管理
        ollama serve                                             --启动服务(前台运行)
        brew services start ollama                               --启动服务(后台运行,macOS)
        brew services stop ollama                                --停止服务
        brew services restart ollama                             --重启服务
        brew services info ollama                                --查看服务状态

03.模型管理
    a.分类1
        ollama pull llama3.2                                     --下载模型
        ollama pull llama3.2:latest                              --下载指定版本
        ollama pull llama3.2:70b                                 --下载指定参数量版本
        ollama push mymodel                                      --上传模型到仓库
    b.分类2
        ollama list                                              --列出已下载模型
        ollama ls                                                --列出已下载模型(简写)
        ollama show llama3.2                                     --查看模型详情
        ollama show llama3.2 --modelfile                         --查看模型配置文件
    c.分类3
        ollama rm llama3.2                                       --删除模型
        ollama cp llama3.2 my-llama                              --复制/重命名模型
        ollama pull llama3.2                                     --更新模型(重新拉取即可)

04.运行对话
    a.分类1
        ollama run llama3.2                                      --运行模型(进入对话模式)
        ollama run llama3.2 "你好"                               --单次问答(不进入对话)
        ollama run llama3.2 --verbose                            --运行并显示详细信息
    b.分类2
        对话模式内命令:
        /set parameter temperature 0.7                           --设置参数
        /set system "你是一个助手"                               --设置系统提示词
        /show info                                               --显示当前模型信息
        /show parameters                                          --显示参数
        /clear                                                   --清除对话
        /bye                                                     --退出对话
        /help                                                    --帮助

05.模型创建/自定义
    a.模型创建
        ollama create mymodel -f Modelfile                       --从 Modelfile 创建模型
        ollama create mymodel --from llama3.2                    --基于现有模型创建
    b.自定义
        Modelfile 示例:
        FROM llama3.2
        PARAMETER temperature 0.7
        PARAMETER top_p 0.9
        SYSTEM 你是一个有帮助的AI助手。

06.API调用
    a.说明1
        curl http://localhost:11434/api/generate -d '{
          "model": "llama3.2",
          "prompt": "你好"
        }'
    b.说明2
        curl http://localhost:11434/api/chat -d '{
          "model": "llama3.2",
          "messages": [{"role": "user", "content": "你好"}]
        }'
    c.说明3
        curl http://localhost:11434/api/tags                      --列出所有模型
        curl http://localhost:11434/api/show -d '{"name": "llama3.2"}'  --查看模型详情
    d.OpenAI 兼容 API
        curl http://localhost:11434/v1/chat/completions -d '{
          "model": "llama3.2",
          "messages": [{"role": "user", "content": "你好"}]
        }'

07.其他说明
    a.常用模型
        ollama pull llama3.2                                     --Meta Llama 3.2(推荐,轻量)
        ollama pull llama3.3                                     --Meta Llama 3.3(最新)
        ollama pull qwen2.5                                      --阿里通义千问(中文优秀)
        ollama pull deepseek-r1                                  --DeepSeek R1(推理强)
        ollama pull mistral                                      --Mistral(欧洲开源)
        ollama pull codellama                                    --Code Llama(代码专用)
        ollama pull gemma2                                       --Google Gemma 2
        ollama pull phi3                                         --微软 Phi-3(轻量)
    b.常用技巧
        OLLAMA_FLASH_ATTENTION=1 ollama serve                    --启用 Flash Attention 加速
        OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve                   --使用 8bit KV 缓存节省内存
    c.查看日志
        ~/.ollama/logs/server.log                                --服务日志位置

08.ollama-launch-claude
    a.说明
        Claude Code 可以 100% 本地免费运行(零 API 费用、无限使用、完全私密)!
        只需:安装 Ollama(最新版)、安装 Claude Code CLI
    b.运行
        ollama launch claude (自动处理大部分配置) 
        ollama launch claude --model qwen3-coder(推荐编码模型)
    c.说明
        界面和工具调用完全一样,但使用的是开源模型(非 Anthropic 原版 Claude),能力取决于所选模型和硬件,适合隐私优先或不想付 API 费的用户!

09.Apple Silicon上本地AI
    a.说明
        本地AI时代,Mac终于站上C位!MacBook用户快去更新Ollama 0.19,感受“丝滑”吧~
        Ollama正式接入Apple的MLX机器学习框架,在M5/M5 Pro/M5 Max芯片上实现史诗级加速!
        实测Qwen3.5-35B-A3B模型(NVFP4量化):预填充速度高达1851 token/s、解码速度达134 token/s
    b.说明1
        个人助理OpenClaw响应瞬间到位,
        Claude Code、OpenCode等编码代理写代码如丝般顺滑,再也不用等半天!本地跑大模型,终于从“能用”变成“真香”。
    c.说明2
        NVFP4格式支持:精度几乎不丢,内存占用大幅降低,生产环境一致性拉满。
        缓存大升级:跨对话复用、智能检查点、智能剔除,agentic任务(多轮工具调用)内存更省、响应更快,尤其适合Claude Code这种分支频繁的场景。
    d.说明3
        Mac用户只需32GB+统一内存即可爽玩(16GB暂不支持大模型,期待后续优化)。
        更新后,消费级硬件与云端推理的差距进一步缩小——隐私保护、无限调用、无额外账单,开发者生产力直接起飞!
    e.操作命令
        1.ollama run qwen3.5:35b-a3b-coding-nvfp4
        2.或直接启动Claude Code / OpenClaw

3.4 milvus

00.汇总
    a.分类1
        Attu 可视化管理                      通过 http://localhost:3000 使用 Attu Web UI 管理 Milvus
        RESTful 接口调用                     通过 localhost:9091 调用 Milvus REST API
        gRPC 连接与操作                      通过 localhost:19530 使用 SDK 连接 Milvus 向量数据库
        MinIO 存储管理                       通过 http://localhost:9001 管理 Milvus 底层存储
    b.分类2
        内容                                说明
        启动服务                            docker-compose -f docker-compose.milvus.yml up -d
        启用 Milvus                         修改 application-dev.yml 中 milvus.enabled: true
        重启后端                            pkill -f zhgh-ai-chat-api → mvn clean package → 启动 JAR
        初始化向量                          curl -X POST http://localhost:8084/api/ai/kb/faq/embeddings/generate-all
        停止服务                            docker-compose -f docker-compose.milvus.yml down
    c.分类3
        服务                               地址
        Milvus gRPC                        localhost:19530
        Milvus REST                        localhost:9091
        Attu Web UI                        http://localhost:3000
        MinIO Console                      http://localhost:9001 (minioadmin/minioadmin)
    d.分类4
        attu                              Web管理界面
        milvus-etcd                       元数据存储
        milvus-minio                      对象存储
        milvus-standalone                 向量数据库核心
    e.分类5
        http://localhost:8098             admin、MaxKB@123.
        http://localhost:8099             admin、MaxKB@123.

00.配置
    a.架构
        将 zhgh-ai-query-prod 的向量存储从 ChromaDB 迁移到 Milvus
        ┌─────────────────────────────────────────────────────────────┐
        │                    Milvus 向量数据库集群                      │
        ├─────────────────────────────────────────────────────────────┤
        │                                                             │
        │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐  │
        │  │    etcd     │  │    MinIO    │  │  Milvus Standalone  │  │
        │  │  :2379      │  │  :9000/9001 │  │      :19530/:9091   │  │
        │  │  元数据存储  │  │  对象存储    │  │     向量数据库核心    │  │
        │  └─────────────┘  └─────────────┘  └─────────────────────┘  │
        │                                                             │
        │  ┌─────────────────────────────────────────────────────────┐│
        │  │                      Attu (可选)                         ││
        │  │                    :3000 Web 管理界面                     ││
        │  └─────────────────────────────────────────────────────────┘│
        └─────────────────────────────────────────────────────────────┘
    b.需要修改的文件
        文件                                     修改内容
        docker-compose.yml                      更新注释,移除 ChromaDB 挂载,添加 Milvus 服务依赖
        docker-compose.milvus.yml               新建 — 创建 Milvus 独立编排文件(参考 chat-prod)
        backend/requirements.txt                添加 pymilvus>=2.3.0
        backend/.env / backend/app/config.py    添加 Milvus 配置项
        backend/app/vanna_setup.py              将 ChromaDB_VectorStore 替换为 Milvus_VectorStore
    c.配置项变更
        # 当前 ChromaDB 配置
        VANNA_PERSIST_DIR=./chroma_data
        
        # 目标 Milvus 配置
        MILVUS_HOST=127.0.0.1
        MILVUS_PORT=19530
        MILUS_DATABASE=default
        MILVUS_COLLECTION=zhgh_query_prod
    d.代码变更:vanna_setup.py
        # 当前 ChromaDB 方案
        from vanna.chromadb import ChromaDB_VectorStore
        class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):
            ChromaDB_VectorStore.__init__(self, config={'path': settings.VANNA_PERSIST_DIR})
        
        # 目标 Milvus 方案
        from vanna.milvus import Milvus_VectorStore
        class MyVanna(Milvus_VectorStore, OpenAI_Chat):
            Milvus_VectorStore.__init__(self, config={
                'host': settings.MILVUS_HOST,
                'port': settings.MILVUS_PORT,
                'database': settings.MILVUS_DATABASE,
                'collection_name': settings.MILVUS_COLLECTION
            })
    e.端口规划
        服务              端口             说明
        Milvus gRPC      19530            向量数据库连接
        Milvus REST      9091             健康检查
        MinIO API        9000             对象存储
        MinIO Console    9001             管理界面
        Attu             3000             Milvus Web UI
    f.端口对比
        服务             zhgh-ai-local     course-milvus
        Milvus          19530             19531
        etcd            2379 (内部)        2380
        MinIO API       9000              9002
        MinIO Console   9001              9003
        Attu            3005              3006

01.Attu 可视化管理
    a.说明
        通过 http://localhost:3000 使用 Attu Web UI 管理 Milvus
    b.Attu 简介
        a.什么是 Attu
            a.说明
                Attu 是 Milvus 官方提供的开源可视化管理工具,提供:
            b.Collection 管理: 创建、查看、删除 Collection
            c.数据浏览: 查看和编辑向量数据
            d.向量搜索: 可视化执行向量相似度搜索
            e.Schema 设计: 可视化定义字段和索引
        b.访问信息
            a.表格数据
                项目    值
                地址    http://localhost:3000
                依赖    Milvus 服务正常运行
                认证    无(开发环境默认)
            b.说明
                ---
    c.首次登录
        a.连接 Milvus
            a.说明
                1.浏览器打开 http://localhost:3000
                2.在连接页面输入:
            b.表格数据
                字段              值
                Milvus Address    localhost:19530
                Database          default
                Authentication    无需填写(开发环境)
            c.说明
                3.点击 Connect 按钮
        b.主界面概览
            a.说明
                连接成功后,左侧导航栏包含:
            b.表格数据
                菜单           功能
                Overview       概览仪表盘
                Collections    Collection 管理
                Query          数据查询
                Search         向量搜索
                Users          用户管理(需认证)
            c.说明
                ---
    d.Collection 管理
        a.查看所有 Collection
            a.说明
                1.点击左侧 Collections 菜单
                2.显示当前所有 Collection 列表
                列表信息:
            b.表格数据
                列              说明
                Name            Collection 名称
                Description     描述
                Entity Count    数据量
                Created Time    创建时间
        b.创建 Collection
            a.说明
                1.点击右上角 Create Collection 按钮
                2.填写基本信息:
            b.表格数据
                字段               示例值
                Collection Name    faq_vectors
                Description        FAQ问答向量集合
            c.说明
                3.添加字段:
            d.表格数据
                字段名       类型           主键    自动ID    长度/维度
                id           VarChar        ✅      ❌        64
                content      VarChar        ❌      -         2000
                embedding    FloatVector    ❌      -         1024
            e.说明
                4.选择度量类型:
                5.点击 Create 完成
            f.COSINE: 余弦相似度(推荐)
            g.L2: 欧氏距离
            h.IP: 内积
        c.查看 Collection 详情
            a.说明
                1.点击 Collection 名称进入详情页
                2.查看以下信息:
            b.表格数据
                Tab           内容
                Schema        字段定义、索引信息
                Data          数据预览
                Segments      数据段分布
                Properties    Collection 属性
        d.删除 Collection
            1.在 Collection 列表页,点击行末的 删除图标
            2.确认删除操作
            > ⚠️ 警告: 删除操作不可恢复!
            ---
    e.数据操作
        a.插入数据
            a.说明
                1.进入 Collection 详情页
                2.点击 Data 标签
                3.点击 Insert 按钮
                4.选择插入方式:
                方式一:手动输入 JSON
            b.代码示例
                ---
                [
                    {
                    "id": "faq001",
                    "content": "什么是向量数据库?",
                    "embedding": [0.1, 0.2, 0.3, "...(1024维)"]
                    }
                ]
                ---
            c.说明
                方式二:上传 JSON 文件
            d.代码示例
                ---
                [
                    {
                    "id": "faq001",
                    "content": "什么是向量数据库?",
                    "embedding": [0.1, 0.2, "..."]
                    },
                    {
                    "id": "faq002",
                    "content": "如何使用 Milvus?",
                    "embedding": [0.4, 0.5, "..."]
                    }
                ]
                ---
            e.说明
                5.点击 Confirm 完成插入
        b.查看数据
            1.进入 Collection 详情页
            2.点击 Data 标签
            3.表格显示所有字段数据
            4.支持分页浏览
        c.删除数据
            1.在数据表格中,勾选要删除的行
            2.点击 Delete 按钮
            3.确认删除
            ---
    f.向量搜索
        a.执行向量搜索
            a.说明
                1.点击左侧 Search 菜单
                2.选择目标 Collection
                3.选择搜索字段(向量字段)
                4.输入查询向量:
                方式一:手动输入
            b.代码示例
                ---
                [0.1, 0.2, 0.3, 0.4, ...(1024个浮点数)]
                ---
            c.说明
                方式二:随机生成
                5.设置搜索参数:
            d.表格数据
                参数           说明        推荐值
                Top K          返回数量    5-20
                Metric Type    度量类型    COSINE
                nprobe         搜索精度    32
            e.说明
                6.选择返回字段(Output Fields)
                7.点击 Search 执行搜索
            f.点击 Generate Random 按钮
        b.查看搜索结果
            a.说明
                搜索结果以表格形式展示:
            b.表格数据
                列                说明
                ID                匹配的向量 ID
                Distance/Score    相似度分数
                其他字段          根据 Output Fields 显示
        c.高级过滤
            a.说明
                支持使用表达式过滤:
            b.代码示例
                ---
                // 按 ID 过滤
                id in ["faq001", "faq002"]
                // 按数值范围过滤
                score > 0.8
                // 组合条件
                id in ["faq001"] && score > 0.5
                ---
            c.说明
                ---
    g.Schema 管理
        a.查看字段定义
            a.说明
                1.进入 Collection 详情页
                2.点击 Schema 标签
                3.查看所有字段:
            b.表格数据
                信息           说明
                Field Name     字段名
                Field Type     数据类型
                Primary Key    是否主键
                Auto ID        是否自动生成
                Dimension      向量维度(仅向量字段)
                Max Length     最大长度(仅 VarChar)
        b.查看索引
            a.说明
                在 Schema 页面下方显示索引信息:
            b.表格数据
                信息           说明
                Field Name     索引字段
                Index Type     索引类型(IVF_FLAT/HNSW 等)
                Metric Type    度量类型
                Parameters     索引参数
        c.创建索引
            a.说明
                1.点击 Create Index 按钮
                2.选择索引字段(向量字段)
                3.配置索引参数:
            b.表格数据
                参数           推荐值
                Index Type     IVF_FLAT
                Metric Type    COSINE
                nlist          128
            c.说明
                4.点击 Create
                ---
    h.Segment 管理
        a.查看 Segment
            a.说明
                1.进入 Collection 详情页
                2.点击 Segments 标签
                3.查看数据段分布:
            b.表格数据
                列            说明
                Segment ID    段 ID
                Size          数据大小
                Row Count     行数
                State         状态(Growing/Sealed)
        b.Compact 操作
            合并小的 Segment,提升查询性能:
            1.选择目标 Collection
            2.点击 Compact 按钮
            3.等待操作完成
            ---
    i.实用技巧
        a.快速测试向量搜索
            1.创建一个简单的 Collection(维度 128)
            2.插入几条随机向量数据
            3.使用随机生成向量进行搜索
            4.验证搜索功能是否正常
        b.监控数据量
            a.说明
                在 Overview 页面查看:
            b.总 Collection 数量
            c.总数据量
            d.存储使用情况
        c.导出数据
            1.进入 Collection 数据页
            2.选择要导出的数据
            3.点击 Export 导出为 JSON
            ---
    j.常见问题
        a.连接失败
            症状: 无法连接到 Milvus
            解决方案:
            1.检查 Milvus 是否运行:docker ps | grep milvus
            2.确认地址正确:localhost:19530
            3.检查端口是否可达:telnet localhost 19530
        b.Collection 加载失败
            症状: 搜索时报错 "collection not loaded"
            解决方案:
            1.进入 Collection 详情页
            2.点击 Load 按钮手动加载
            3.等待加载完成后再搜索
        c.搜索无结果
            可能原因:
            1.Collection 为空 → 先插入数据
            2.向量维度不匹配 → 检查 Schema 定义
            3.nprobe 设置过小 → 增大 nprobe 参数
        d.界面卡顿
            解决方案:
            1.数据量过大时,减少每页显示数量
            2.刷新页面
            3.重启 Attu 容器:docker restart milvus-attu
            ---
    k.快捷键
        a.表格数据
            快捷键          功能
            Ctrl/Cmd + K    全局搜索
            Ctrl/Cmd + N    新建 Collection
            Esc             关闭弹窗
        b.说明
            ---

02.RESTful 接口调用
    a.说明
        通过 localhost:9091 调用 Milvus REST API
    b.服务信息
        a.表格数据
            项目    值
            协议    HTTP/REST
            地址    http://localhost:9091
            用途    健康检查、管理接口、基础操作
        b.说明
            > 注意: Milvus 2.3.x 的 RESTful 接口功能有限,完整向量操作建议使用 gRPC + SDK。
            ---
    c.健康检查
        a.基础健康检查
            a.代码示例
                ---
                curl http://localhost:9091/healthz
                ---
            b.说明
                响应示例:
            c.代码示例
                ---
                {
                  "status": "ok"
                }
                ---
        b.详细健康状态
            a.代码示例
                ---
                curl http://localhost:9091/api/v1/health
                ---
            b.说明
                响应示例:
            c.代码示例
                ---
                {
                  "status": "ok",
                  "msg": "Milvus is healthy"
                }
                ---
            d.说明
                ---
    d.API 端点列表
        a.健康与状态
            a.表格数据
                端点              方法    说明
                /healthz          GET     基础健康检查
                /api/v1/health    GET     详细健康状态
                /metrics          GET     Prometheus 指标
        b.Collection 管理 (Milvus 2.3+)
            a.表格数据
                端点                             方法      说明
                /v1/vector/collections           GET       列出所有 Collection
                /v1/vector/collections/{name}    GET       获取 Collection 详情
                /v1/vector/collections           POST      创建 Collection
                /v1/vector/collections/{name}    DELETE    删除 Collection
        c.向量操作 (Milvus 2.3+)
            a.表格数据
                端点                 方法    说明
                /v1/vector/insert    POST    插入向量
                /v1/vector/search    POST    向量搜索
                /v1/vector/query     POST    标量查询
                /v1/vector/delete    POST    删除向量
            b.说明
                ---
    e.Collection 操作
        a.列出所有 Collection
            a.代码示例
                ---
                curl -X GET "http://localhost:9091/v1/vector/collections" \
                  -H "Content-Type: application/json"
                ---
            b.说明
                响应示例:
            c.代码示例
                ---
                {
                  "code": 200,
                  "data": [
                    {
                      "collectionName": "faq_vectors",
                      "description": "FAQ向量集合",
                      "rowCount": 1000
                    }
                  ]
                }
                ---
        b.创建 Collection
            a.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/collections" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "dimension": 1024,
                    "metricType": "COSINE",
                    "description": "演示集合"
                  }'
                ---
            b.说明
                参数说明:
            c.表格数据
                参数              类型      必填    说明
                collectionName    string    ✅      Collection 名称
                dimension         int       ✅      向量维度
                metricType        string    ❌      距离度量 (COSINE/L2/IP),默认 L2
                description       string    ❌      描述信息
        c.获取 Collection 详情
            a.代码示例
                ---
                curl -X GET "http://localhost:9091/v1/vector/collections/demo_collection" \
                  -H "Content-Type: application/json"
                ---
            b.说明
                响应示例:
            c.代码示例
                ---
                {
                  "code": 200,
                  "data": {
                    "collectionName": "demo_collection",
                    "description": "演示集合",
                    "rowCount": 0,
                    "dimension": 1024,
                    "metricType": "COSINE"
                  }
                }
                ---
        d.删除 Collection
            a.代码示例
                ---
                curl -X DELETE "http://localhost:9091/v1/vector/collections/demo_collection" \
                  -H "Content-Type: application/json"
                ---
            b.说明
                ---
    f.向量操作
        a.插入向量
            a.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/insert" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "data": [
                      {
                        "id": "doc001",
                        "vector": [0.1, 0.2, 0.3, "...(1024个浮点数)"],
                        "content": "这是一段测试文本"
                      }
                    ]
                  }'
                ---
            b.说明
                批量插入示例:
            c.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/insert" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "data": [
                      {
                        "id": "doc001",
                        "vector": [0.1, 0.2, "..."],
                        "content": "文本1"
                      },
                      {
                        "id": "doc002",
                        "vector": [0.4, 0.5, "..."],
                        "content": "文本2"
                      }
                    ]
                  }'
                ---
        b.向量搜索
            a.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/search" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "vector": [0.1, 0.2, 0.3, "...(1024个浮点数)"],
                    "limit": 5,
                    "outputFields": ["content"]
                  }'
                ---
            b.说明
                参数说明:
            c.表格数据
                参数              类型      必填    说明
                collectionName    string    ✅      Collection 名称
                vector            array     ✅      查询向量
                limit             int       ❌      返回数量,默认 10
                outputFields      array     ❌      返回的字段列表
            d.说明
                响应示例:
            e.代码示例
                ---
                {
                  "code": 200,
                  "data": [
                    {
                      "id": "doc001",
                      "distance": 0.95,
                      "content": "这是一段测试文本"
                    },
                    {
                      "id": "doc002",
                      "distance": 0.87,
                      "content": "另一段文本"
                    }
                  ]
                }
                ---
        c.标量查询
            a.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/query" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "filter": "id in [\"doc001\", \"doc002\"]",
                    "outputFields": ["id", "content"]
                  }'
                ---
        d.删除向量
            a.代码示例
                ---
                curl -X POST "http://localhost:9091/v1/vector/delete" \
                  -H "Content-Type: application/json" \
                  -d '{
                    "collectionName": "demo_collection",
                    "filter": "id in [\"doc001\"]"
                  }'
                ---
            b.说明
                ---
    g.Prometheus 监控
        a.获取监控指标
            a.代码示例
                ---
                curl http://localhost:9091/metrics
                ---
        b.关键指标
            a.表格数据
                指标名                               说明
                milvus_proxy_search_latency_sum      搜索延迟总和
                milvus_proxy_search_latency_count    搜索请求次数
                milvus_proxy_insert_latency_sum      插入延迟总和
                milvus_rootcoord_collection_num      Collection 数量
                milvus_datanode_segment_num          Segment 数量
        c.使用 jq 过滤指标
            a.代码示例
                ---
                # 查看搜索相关指标
                curl -s http://localhost:9091/metrics | grep milvus_proxy_search
                # 查看延迟指标
                curl -s http://localhost:9091/metrics | grep latency
                ---
            b.说明
                ---
    h.Python 调用示例
        a.使用 requests 库
            a.代码示例
                ---
                import requests
                import json
                BASE_URL = "http://localhost:9091"
                # 健康检查
                def health_check():
                    resp = requests.get(f"{BASE_URL}/healthz")
                    return resp.json()
                # 创建 Collection
                def create_collection(name, dimension=1024):
                    data = {
                        "collectionName": name,
                        "dimension": dimension,
                        "metricType": "COSINE",
                        "description": f"Collection {name}"
                    }
                    resp = requests.post(
                        f"{BASE_URL}/v1/vector/collections",
                        headers={"Content-Type": "application/json"},
                        data=json.dumps(data)
                    )
                    return resp.json()
                # 插入向量
                def insert_vector(collection, vec_id, vector, content):
                    data = {
                        "collectionName": collection,
                        "data": [{
                            "id": vec_id,
                            "vector": vector,
                            "content": content
                        }]
                    }
                    resp = requests.post(
                        f"{BASE_URL}/v1/vector/insert",
                        headers={"Content-Type": "application/json"},
                        data=json.dumps(data)
                    )
                    return resp.json()
                # 向量搜索
                def search_vector(collection, vector, limit=5):
                    data = {
                        "collectionName": collection,
                        "vector": vector,
                        "limit": limit,
                        "outputFields": ["content"]
                    }
                    resp = requests.post(
                        f"{BASE_URL}/v1/vector/search",
                        headers={"Content-Type": "application/json"},
                        data=json.dumps(data)
                    )
                    return resp.json()
                # 使用示例
                if __name__ == "__main__":
                    print("Health:", health_check())
                    # 创建 Collection
                    print(create_collection("test_collection", 1024))
                    # 插入测试向量
                    test_vector = [0.1] * 1024
                    print(insert_vector("test_collection", "test001", test_vector, "测试内容"))
                    # 搜索
                    results = search_vector("test_collection", test_vector)
                    print("Search results:", results)
                ---
            b.说明
                ---
    i.Postman 测试
        a.环境变量
            a.代码示例
                ---
                BASE_URL: http://localhost:9091
                ---
        b.请求集合
            a.说明
                1.健康检查
                2.创建 Collection
            b.代码示例
                ---
                {
                  "collectionName": "my_collection",
                  "dimension": 1024,
                  "metricType": "COSINE"
                }
                ---
            c.说明
                3.插入向量
            d.代码示例
                ---
                {
                  "collectionName": "my_collection",
                  "data": [
                    {
                      "id": "001",
                      "vector": [0.1, 0.2, 0.3],
                      "text": "示例文本"
                    }
                  ]
                }
                ---
            e.说明
                4.向量搜索
            f.代码示例
                ---
                {
                  "collectionName": "my_collection",
                  "vector": [0.1, 0.2, 0.3],
                  "limit": 5
                }
                ---
            g.说明
                ---
            h.Method: GET
            i.URL: {{BASE_URL}}/healthz
            j.Method: POST
            k.URL: {{BASE_URL}}/v1/vector/collections
            l.Body (raw JSON):
            m.Method: POST
            n.URL: {{BASE_URL}}/v1/vector/insert
            o.Body (raw JSON):
            p.Method: POST
            q.URL: {{BASE_URL}}/v1/vector/search
            r.Body (raw JSON):
    j.错误码说明
        a.表格数据
            状态码    说明
            200       成功
            400       请求参数错误
            404       Collection 不存在
            500       服务器内部错误
        b.说明
            错误响应格式:
        c.代码示例
            ---
            {
              "code": 400,
              "message": "Invalid parameter: dimension must be positive"
            }
            ---
        d.说明
            ---
    k.故障排查
        a.连接超时
            a.代码示例
                ---
                # 检查服务是否运行
                curl -v http://localhost:9091/healthz
                # 检查端口
                lsof -i:9091
                ---
        b.Collection 不存在
            a.代码示例
                ---
                # 先列出所有 Collection
                curl http://localhost:9091/v1/vector/collections
                # 确认名称正确后再操作
                ---
        c.向量维度错误
            a.说明
                确保插入/搜索的向量维度与 Collection 定义一致:
            b.代码示例
                ---
                # 创建时 dimension=1024
                # 则向量必须是 1024 维
                ---
            c.说明
                ---

03.gRPC 连接与操作
    a.说明
        通过 localhost:19530 使用 SDK 连接 Milvus 向量数据库
    b.连接准备
        a.服务信息
            a.表格数据
                项目    值
                协议    gRPC
                地址    localhost:19530
                依赖    Milvus 服务正常运行
        b.验证服务可用
            a.代码示例
                ---
                # 检查端口是否监听
                lsof -i:19530
                # 或使用 nc
                nc -zv localhost 19530
                ---
            b.说明
                ---
    c.Python SDK
        a.安装依赖
            a.代码示例
                ---
                pip install pymilvus==2.3.0
                ---
        b.连接 Milvus
            a.代码示例
                ---
                from pymilvus import connections, utility
                # 连接 Milvus
                connections.connect(
                    alias="default",
                    host='localhost',
                    port='19530'
                )
                # 验证连接
                print("Connected:", utility.get_server_version())
                ---
        c.创建 Collection
            a.代码示例
                ---
                from pymilvus import Collection, FieldSchema, CollectionSchema, DataType
                # 定义字段
                fields = [
                    FieldSchema(name="id", dtype=DataType.VARCHAR, max_length=64, is_primary=True, auto_id=False),
                    FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=2000),
                    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024)
                ]
                # 创建 Schema
                schema = CollectionSchema(fields=fields, description="FAQ 向量集合")
                # 创建 Collection
                collection = Collection(name="faq_vectors", schema=schema)
                print(f"Collection {collection.name} created")
                ---
        d.创建索引
            a.代码示例
                ---
                # 创建 IVF_FLAT 索引
                index_params = {
                    "metric_type": "COSINE",
                    "index_type": "IVF_FLAT",
                    "params": {"nlist": 128}
                }
                collection.create_index(
                    field_name="embedding",
                    index_params=index_params
                )
                print("Index created")
                ---
        e.插入数据
            a.代码示例
                ---
                import random
                # 准备数据
                data = [
                    ["id001", "id002", "id003"],                          # id
                    ["什么是向量数据库?", "如何使用Milvus?", "Python怎么连接?"],  # content
                    [[random.random() for _ in range(1024)] for _ in range(3)]  # embedding (模拟向量)
                ]
                # 插入数据
                result = collection.insert(data)
                print(f"Inserted {result.insert_count} rows")
                ---
        f.向量搜索
            a.代码示例
                ---
                # 加载 Collection 到内存
                collection.load()
                # 生成查询向量(模拟)
                query_vector = [random.random() for _ in range(1024)]
                # 搜索
                search_params = {"metric_type": "COSINE", "params": {"nprobe": 32}}
                results = collection.search(
                    data=[query_vector],
                    anns_field="embedding",
                    param=search_params,
                    limit=5,
                    output_fields=["content"]
                )
                # 输出结果
                for hits in results:
                    for hit in hits:
                        print(f"ID: {hit.id}, Score: {hit.distance}, Content: {hit.entity.get('content')}")
                ---
        g.查询数据
            a.代码示例
                ---
                # 标量查询(按 ID)
                results = collection.query(
                    expr='id in ["id001", "id002"]',
                    output_fields=["id", "content"]
                )
                for r in results:
                    print(r)
                ---
        h.删除数据
            a.代码示例
                ---
                # 按 ID 删除
                collection.delete(expr='id in ["id001"]')
                print("Deleted id001")
                ---
            b.说明
                ---
    d.Java SDK
        a.Maven 依赖
            a.代码示例
                ---
                <dependency>
                    <groupId>io.milvus</groupId>
                    <artifactId>milvus-sdk-java</artifactId>
                    <version>2.3.4</version>
                </dependency>
                ---
        b.连接 Milvus
            a.代码示例
                ---
                import io.milvus.client.MilvusServiceClient;
                import io.milvus.param.ConnectParam;
                MilvusServiceClient client = new MilvusServiceClient(
                    ConnectParam.newBuilder()
                        .withHost("localhost")
                        .withPort(19530)
                        .withConnectTimeout(10, TimeUnit.SECONDS)
                        .build()
                );
                ---
        c.创建 Collection
            a.代码示例
                ---
                import io.milvus.grpc.DataType;
                import io.milvus.param.collection.*;
                import io.milvus.param.R;
                // 定义字段
                FieldType idField = FieldType.newBuilder()
                    .withName("id")
                    .withDataType(DataType.VarChar)
                    .withMaxLength(64)
                    .withPrimaryKey(true)
                    .withAutoID(false)
                    .build();
                FieldType contentField = FieldType.newBuilder()
                    .withName("content")
                    .withDataType(DataType.VarChar)
                    .withMaxLength(2000)
                    .build();
                FieldType vectorField = FieldType.newBuilder()
                    .withName("embedding")
                    .withDataType(DataType.FloatVector)
                    .withDimension(1024)
                    .build();
                // 创建 Collection
                CreateCollectionParam param = CreateCollectionParam.newBuilder()
                    .withCollectionName("faq_vectors")
                    .withDescription("FAQ 向量集合")
                    .addFieldType(idField)
                    .addFieldType(contentField)
                    .addFieldType(vectorField)
                    .build();
                R<RpcStatus> result = client.createCollection(param);
                System.out.println("Created: " + result.getStatus());
                ---
        d.创建索引
            a.代码示例
                ---
                import io.milvus.param.index.CreateIndexParam;
                CreateIndexParam indexParam = CreateIndexParam.newBuilder()
                    .withCollectionName("faq_vectors")
                    .withFieldName("embedding")
                    .withIndexType(IndexType.IVF_FLAT)
                    .withMetricType(MetricType.COSINE)
                    .withExtraParam("{\"nlist\":128}")
                    .build();
                R<RpcStatus> result = client.createIndex(indexParam);
                ---
        e.插入数据
            a.代码示例
                ---
                import com.google.gson.JsonObject;
                import io.milvus.param.dml.InsertParam;
                import java.util.ArrayList;
                import java.util.List;
                List<JsonObject> rows = new ArrayList<>();
                JsonObject row = new JsonObject();
                row.addProperty("id", "id001");
                row.addProperty("content", "什么是向量数据库?");
                row.add("embedding", gson.toJsonTree(generateVector(1024)));
                rows.add(row);
                InsertParam insertParam = InsertParam.newBuilder()
                    .withCollectionName("faq_vectors")
                    .withRows(rows)
                    .build();
                R<MutateResult> result = client.insert(insertParam);
                ---
        f.向量搜索
            a.代码示例
                ---
                import io.milvus.param.dml.SearchParam;
                import io.milvus.response.SearchResultsWrapper;
                // 加载 Collection
                client.loadCollection(LoadCollectionParam.newBuilder()
                    .withCollectionName("faq_vectors")
                    .build());
                // 搜索
                List<Float> queryVector = generateVector(1024);
                SearchParam searchParam = SearchParam.newBuilder()
                    .withCollectionName("faq_vectors")
                    .withMetricType(MetricType.COSINE)
                    .withTopK(5)
                    .withVectors(Collections.singletonList(queryVector))
                    .withVectorFieldName("embedding")
                    .withParams("{\"nprobe\":32}")
                    .addOutField("content")
                    .build();
                R<SearchResults> result = client.search(searchParam);
                SearchResultsWrapper wrapper = new SearchResultsWrapper(result.getData().getResults());
                for (SearchResultsWrapper.IDScore score : wrapper.getIDScore(0)) {
                    System.out.println("ID: " + score.getStrID() + ", Score: " + score.getScore());
                }
                ---
            b.说明
                ---
    e.Go SDK
        a.安装依赖
            a.代码示例
                ---
                go get github.com/milvus-io/milvus-sdk-go/v2
                ---
        b.连接 Milvus
            a.代码示例
                ---
                package main
                import (
                    "context"
                    "fmt"
                    "github.com/milvus-io/milvus-sdk-go/v2/client"
                )
                func main() {
                    c, err := client.NewClient(context.Background(), client.Config{
                        Address: "localhost:19530",
                    })
                    if err != nil {
                        panic(err)
                    }
                    defer c.Close()
                    fmt.Println("Connected to Milvus")
                }
                ---
        c.创建 Collection
            a.代码示例
                ---
                import (
                    "github.com/milvus-io/milvus-sdk-go/v2/entity"
                )
                schema := &entity.Schema{
                    CollectionName: "faq_vectors",
                    Description:    "FAQ 向量集合",
                    Fields: []*entity.Field{
                        {
                            Name:       "id",
                            DataType:   entity.FieldTypeVarChar,
                            MaxLength:  64,
                            PrimaryKey: true,
                            AutoID:     false,
                        },
                        {
                            Name:      "content",
                            DataType:  entity.FieldTypeVarChar,
                            MaxLength: 2000,
                        },
                        {
                            Name:      "embedding",
                            DataType:  entity.FieldTypeFloatVector,
                            Dim:       1024,
                        },
                    },
                }
                err = c.CreateCollection(context.Background(), schema, 2) // 2 shards
                ---
        d.插入数据
            a.代码示例
                ---
                idColumn := entity.NewColumnVarChar("id", []string{"id001", "id002"})
                contentColumn := entity.NewColumnVarChar("content", []string{"问题1", "问题2"})
                vectorColumn := entity.NewColumnFloatVector("embedding", 1024, [][]float32{
                    generateVector(1024),
                    generateVector(1024),
                })
                err = c.Insert(context.Background(), "faq_vectors", "", idColumn, contentColumn, vectorColumn)
                ---
        e.向量搜索
            a.代码示例
                ---
                import "github.com/milvus-io/milvus-sdk-go/v2/entity/index"
                // 加载 Collection
                err = c.LoadCollection(context.Background(), "faq_vectors", false)
                // 搜索
                queryVector := generateVector(1024)
                sp, _ := entity.NewIndexIvfFlatSearchParam(32)
                results, err := c.Search(
                    context.Background(),
                    "faq_vectors",
                    []string{},
                    "",
                    []entity.Vector{entity.FloatVector(queryVector)},
                    "embedding",
                    entity.COSINE,
                    5,
                    sp,
                )
                ---
            b.说明
                ---
    f.常见操作速查
        a.Collection 管理
            a.表格数据
                操作          Python                             Java
                检查存在      utility.has_collection("name")     client.hasCollection()
                列出所有      utility.list_collections()         client.showCollections()
                删除          utility.drop_collection("name")    client.dropCollection()
                加载到内存    collection.load()                  client.loadCollection()
                释放内存      collection.release()               client.releaseCollection()
        b.索引管理
            a.表格数据
                操作        Python                       Java
                创建索引    collection.create_index()    client.createIndex()
                删除索引    collection.drop_index()      client.dropIndex()
                查看索引    collection.indexes           client.describeIndex()
        c.数据操作
            a.表格数据
                操作    Python                     Java
                插入    collection.insert(data)    client.insert()
                删除    collection.delete(expr)    client.delete()
                查询    collection.query(expr)     client.query()
                搜索    collection.search()        client.search()
            b.说明
                ---
    g.故障排查
        a.连接失败
            a.代码示例
                ---
                # 检查连接状态
                from pymilvus import connections
                try:
                    connections.connect("default", host="localhost", port="19530")
                except Exception as e:
                    print(f"连接失败: {e}")
                    # 1. 检查 Milvus 是否启动
                    # 2. 检查端口是否正确
                    # 3. 检查防火墙设置
                ---
        b.Collection 未加载
            a.代码示例
                ---
                # 搜索前必须加载
                collection.load()
                # 检查加载状态
                print(collection.num_entities)  # 实体数量
                ---
        c.向量维度不匹配
            a.代码示例
                ---
                # 确保向量维度与 Schema 定义一致
                # Schema 定义 dim=1024,则插入/搜索向量必须是 1024 维
                query_vector = [0.1] * 1024  # 正确
                # query_vector = [0.1] * 768  # 错误!会报错
                ---
            b.说明
                ---

04.MinIO 存储管理
    a.说明
        通过 http://localhost:9001 管理 Milvus 底层存储
    b.MinIO 简介
        a.MinIO 在 Milvus 中的角色
            a.说明
                Milvus 使用 MinIO 作为底层对象存储,存储:
            b.向量数据文件: Segment 数据
            c.索引文件: 向量索引
            d.日志文件: WAL 日志
        b.访问信息
            a.表格数据
                服务             地址                     凭证
                MinIO Console    http://localhost:9001    minioadmin / minioadmin
                MinIO API        http://localhost:9000    minioadmin / minioadmin
            b.说明
                ---
    c.登录 MinIO Console
        a.访问步骤
            a.说明
                1.浏览器打开 http://localhost:9001
                2.输入凭证:
                3.点击 Login 登录
            b.Username: minioadmin
            c.Password: minioadmin
        b.界面概览
            a.说明
                登录后主界面包含:
            b.表格数据
                区域          功能
                左侧边栏      Buckets(存储桶)列表
                主内容区      文件浏览器
                顶部工具栏    上传、新建文件夹、刷新等操作
                右下角        存储用量统计
            c.说明
                ---
    d.Bucket 管理
        a.查看 Milvus Bucket
            a.说明
                Milvus 默认创建的 Bucket:
            b.表格数据
                Bucket 名称    说明
                a-bucket       Milvus 默认存储桶(Docker Compose 配置)
        b.浏览 Bucket 内容
            a.说明
                1.点击左侧 Buckets
                2.点击 a-bucket 进入
                3.查看目录结构:
            b.代码示例
                ---
                a-bucket/
                ├── insert_log/
                │   └── {collection_id}/
                │       └── {partition_id}/
                │           └── {segment_id}/
                │               └── *.bin
                ├── stats_log/
                │   └── ...
                ├── delta_log/
                │   └── ...
                └── index_files/
                    └── ...
                ---
        c.目录结构说明
            a.表格数据
                目录            内容
                insert_log/     插入的向量数据
                stats_log/      统计信息
                delta_log/      增量数据(删除标记)
                index_files/    索引文件
            b.说明
                ---
    e.文件操作
        a.浏览文件
            a.说明
                1.进入 Bucket 后,点击目录逐层浏览
                2.文件列表显示:
            b.表格数据
                列               说明
                Name             文件/目录名
                Size             文件大小
                Last Modified    最后修改时间
        b.下载文件
            1.点击文件名或右侧 下载图标
            2.文件下载到本地
        c.上传文件(一般不需要)
            > ⚠️ 注意: 不建议手动上传文件到 Milvus 存储桶,可能导致数据损坏。
        d.删除文件(谨慎操作)
            > ⚠️ 警告: 直接删除 Milvus 数据文件可能导致数据丢失,建议通过 Milvus API 操作。
            ---
    f.存储监控
        a.查看存储用量
            1.登录后,右下角显示存储统计
            2.点击 Monitoring → Drive 查看详情
        b.存储指标
            a.表格数据
                指标              说明
                Total Capacity    总容量
                Used              已使用
                Available         可用空间
        c.设置配额
            1.进入 Buckets → 选择 Bucket → Manage
            2.设置 Quota 限制最大存储量
            ---
    g.mc 命令行工具
        a.安装 mc
            a.说明
                macOS:
            b.代码示例
                ---
                brew install minio/stable/mc
                ---
            c.说明
                Linux:
            d.代码示例
                ---
                wget https://dl.min.io/client/mc/release/linux-amd64/mc
                chmod +x mc
                sudo mv mc /usr/local/bin/
                ---
            e.说明
                Windows:
            f.代码示例
                ---
                winget install MinIO.Client
                ---
        b.配置别名
            a.代码示例
                ---
                mc alias set local http://localhost:9000 minioadmin minioadmin
                ---
        c.常用命令
            a.说明
                列出 Buckets:
            b.代码示例
                ---
                mc ls local
                ---
            c.说明
                查看 Bucket 内容:
            d.代码示例
                ---
                mc ls local/a-bucket
                ---
            e.说明
                递归列出所有文件:
            f.代码示例
                ---
                mc ls local/a-bucket --recursive
                ---
            g.说明
                查看存储用量:
            h.代码示例
                ---
                mc du local/a-bucket
                ---
            i.说明
                下载文件:
            j.代码示例
                ---
                mc cp local/a-bucket/path/to/file.bin ./local_file.bin
                ---
            k.说明
                查看文件信息:
            l.代码示例
                ---
                mc stat local/a-bucket/path/to/file.bin
                ---
            m.说明
                ---
    h.数据备份
        a.备份整个 Bucket
            a.代码示例
                ---
                # 镜像到本地目录
                mc mirror local/a-bucket ./milvus-backup/
                # 或镜像到另一个 MinIO
                mc mirror local/a-bucket backup-minio/milvus-backup/
                ---
        b.定时备份脚本
            a.代码示例
                ---
                #!/bin/bash
                # backup_milvus.sh
                BACKUP_DIR="/backup/milvus/$(date +%Y%m%d_%H%M%S)"
                mkdir -p $BACKUP_DIR
                mc mirror local/a-bucket $BACKUP_DIR/
                echo "Backup completed: $BACKUP_DIR"
                ---
            b.说明
                Crontab 定时任务:
            c.代码示例
                ---
                # 每天凌晨 2 点备份
                0 2 * * * /path/to/backup_milvus.sh >> /var/log/milvus_backup.log 2>&1
                ---
        c.恢复数据
            a.代码示例
                ---
                # 从备份恢复
                mc mirror ./milvus-backup/ local/a-bucket/
                ---
            b.说明
                ---
    i.性能优化
        a.查看 Cache 设置
            a.代码示例
                ---
                mc admin config get local cache
                ---
        b.设置 Cache(提升读取性能)
            a.代码示例
                ---
                mc admin config set local cache drives="/cache" enable="on"
                mc admin service restart local
                ---
        c.压缩设置
            a.代码示例
                ---
                # 查看压缩配置
                mc admin config get local compression
                # 启用压缩(适合文本数据)
                mc admin config set local compression extensions=".txt,.log,.json" mime_types="text/*,application/json"
                ---
            b.说明
                ---
    j.安全配置
        a.修改默认密码
            a.说明
                docker-compose.milvus.yml 中修改:
            b.代码示例
                ---
                milvus-minio:
                  environment:
                    MINIO_ROOT_USER: your-username
                    MINIO_ROOT_PASSWORD: your-strong-password
                ---
            c.说明
                重启后生效:
            d.代码示例
                ---
                docker-compose -f docker-compose.milvus.yml restart milvus-minio
                ---
        b.创建访问策略
            a.代码示例
                ---
                # 创建只读策略
                mc admin policy add local readonly-policy ./readonly-policy.json
                ---
            b.说明
                readonly-policy.json:
            c.代码示例
                ---
                {
                  "Version": "2012-10-17",
                  "Statement": [
                    {
                      "Effect": "Allow",
                      "Action": ["s3:GetObject", "s3:ListBucket"],
                      "Resource": ["arn:aws:s3:::a-bucket/*"]
                    }
                  ]
                }
                ---
        c.创建受限用户
            a.代码示例
                ---
                # 创建用户
                mc admin user add local readonly-user your-password
                # 应用策略
                mc admin policy set local readonly-policy user=readonly-user
                ---
            b.说明
                ---
    k.故障排查
        a.无法访问 Console
            a.说明
                检查服务状态:
            b.代码示例
                ---
                docker ps | grep minio
                docker logs milvus-minio
                ---
            c.说明
                检查端口:
            d.代码示例
                ---
                lsof -i:9001
                ---
        b.存储空间不足
            a.说明
                查看用量:
            b.代码示例
                ---
                mc du local/a-bucket
                ---
            c.说明
                清理方案:
                1.删除不需要的 Collection(通过 Milvus API)
                2.执行 Compact 操作合并 Segment
                3.扩展存储卷
        c.数据损坏
            症状: Milvus 启动失败或查询报错
            解决方案:
            1.停止 Milvus 服务
            2.从备份恢复数据
            3.重启服务
            ---
    l.监控集成
        a.Prometheus 指标
            a.说明
                MinIO 暴露 Prometheus 指标:
            b.代码示例
                ---
                curl http://localhost:9000/minio/v2/metrics/cluster
                ---
        b.关键指标
            a.表格数据
                指标                                         说明
                minio_cluster_capacity_usable_total_bytes    总容量
                minio_cluster_capacity_usable_free_bytes     可用容量
                minio_s3_requests_total                      S3 请求总数
                minio_s3_errors_total                        S3 错误总数
        c.Grafana 仪表盘
            MinIO 提供官方 Grafana 仪表盘:
            1.导入 MinIO Dashboard
            2.配置 Prometheus 数据源
            3.查看存储监控
            ---
    m.与 Milvus 的关系
        a.数据流向
            a.代码示例
                ---
                Milvus Client
                     ↓
                Milvus Server (gRPC:19530)
                     ↓
                MinIO API (S3:9000)
                     ↓
                MinIO Storage (Disk)
                ---
        b.不建议直接操作
            a.表格数据
                操作        风险                  正确方式
                删除文件    数据丢失、索引损坏    通过 Milvus API 删除
                修改文件    数据不一致            通过 Milvus API 更新
                手动上传    格式不兼容            通过 Milvus API 插入
        c.合理用途
            a.表格数据
                用途            说明
                监控存储用量    ✅ 推荐
                备份数据        ✅ 推荐
                排查问题        ✅ 推荐
                直接修改数据    ❌ 禁止
            b.说明
                ---

4 service

4.1 mysql8

01.mysql8,brew默认配置,my.cnf,3307端口
    a.安装
        brew search mysql
        brew install [email protected]
    b.配置
        cat /opt/homebrew/etc/my.cnf
        -----------------------------------------------------------------------------------------------------
        [mysqld]
        port=3307
        bind-address = 127.0.0.1
        mysqlx-bind-address = 127.0.0.1
        log-error=/opt/homebrew/var/log/mysql/mysql.log
        datadir=/opt/homebrew/var/mysql
    c.启动
        brew services list
        brew services start [email protected]
        brew services stop [email protected]
        brew services restart [email protected]
        brew rmtree [email protected]
    d.环境变量
        export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
    e.登录,默认无密码
        mysql -uroot -P 3307
    f.修改
        # 设置密码
        ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
        # 远程访问
        grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
        # 新权限
        flush privileges;
    g.登录
        mysql -uroot -P 3307 -

02.mysql8,brew修改配置,my80.cnf,3306端口
    a.配置
        a.文件
            cat /opt/homebrew/etc/my80.cnf
            -----------------------------------------------------------------------------------------------------
            [mysqld]

            port=3306

            # 数据目录
            datadir=/opt/homebrew/var/mysql80new
            socket=/opt/homebrew/var/mysql80new/mysql.sock
            # 错误日志
            log_error=/opt/homebrew/var/mysql80new/error.log

            # 默认字符集
            character-set-server=utf8mb4
            collation-server=utf8mb4_unicode_ci

            # Only allow connections from localhost
            bind-address = 127.0.0.1

            # SQL模式
            sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO
        b.文件夹
            mkdir -p /opt/homebrew/var/mysql80new && chown -R troyesivens:admin /opt/homebrew/var/mysql80new
        c.初始化数据目录
            /opt/homebrew/opt/[email protected]/bin/mysqld --initialize-insecure --user=troyesivens --basedir=/opt/homebrew/opt/[email protected] --datadir=/opt/homebrew/var/mysql80new
    b.密码重置流程
        a.步骤1: 停止所有 MySQL 进程
            pkill -f mysqld
            sleep 2
        b.步骤2: 以跳过权限表方式启动
            /opt/homebrew/opt/[email protected]/bin/mysqld_safe --defaults-file=/opt/homebrew/etc/my80.cnf --skip-grant-tables --skip-networking &
            sleep 5
        c.步骤3: 无密码登录
            /opt/homebrew/opt/[email protected]/bin/mysql -u root
        d.步骤4: 重置密码
            FLUSH PRIVILEGES;
            ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
            exit;
        e.步骤5: 重启 MySQL 服务
            pkill -f mysqld
            sleep 2
            /opt/homebrew/opt/[email protected]/bin/mysqld_safe --defaults-file=/opt/homebrew/etc/my80.cnf &
        f.步骤6: 使用新密码登录
            /opt/homebrew/opt/[email protected]/bin/mysql -u root -p
    c.brew自动启动
        a.说明
            因为 brew services restart 会从 Homebrew formula 的默认模板重新生成 ~/Library/LaunchAgents/[email protected] 文件,覆盖了你的手动修改。
            为了让你的自定义配置持久化,并且能通过 brew services 命令管理,你需要修改 Homebrew [email protected] formula 提供的那个源 .plist 文件。
            这个源文件通常位于:/opt/homebrew/opt/[email protected]/[email protected]
        b.配置文件
            code /opt/homebrew/opt/[email protected]/[email protected]
            -------------------------------------------------------------------------------------------------
            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
            <plist version="1.0">
            <dict>
                <key>KeepAlive</key>
                <true/>
                <key>Label</key>
                <string>[email protected]</string>
                <key>LimitLoadToSessionType</key>
                <array>
                    <string>Aqua</string>
                    <string>Background</string>
                    <string>LoginWindow</string>
                    <string>StandardIO</string>
                    <string>System</string>
                </array>
                <key>ProgramArguments</key>
                <array>
                    <string>/opt/homebrew/opt/[email protected]/bin/mysqld_safe</string>
                    <string>--defaults-file=/opt/homebrew/etc/my80.cnf</string>
                </array>
                <key>RunAtLoad</key>
                <true/>
                <key>WorkingDirectory</key>
                <string>/opt/homebrew/var/mysql80new</string>
            </dict>
            </plist>
        c.重新启动
            brew services restart [email protected]
    d.多版本管理建议
        a.使用不同配置文件
            # MySQL 8.0 配置
            /opt/homebrew/etc/my.cnf

            # MySQL 8.4 配置
            /opt/homebrew/etc/my80.cnf
        b.使用不同数据目录
            # MySQL 8.0
            datadir=/opt/homebrew/var/mysql

            # MySQL 8.4
            datadir=/opt/homebrew/var/mysql80new
        c.启动命令区分
            # 启动 MySQL 8.0
            brew services start [email protected]

            # 启动 MySQL 8.4
            /opt/homebrew/opt/[email protected]/bin/mysqld_safe --defaults-file=/opt/homebrew/etc/my80.cnf
        d.常用命令参考
            # 查看 MySQL 版本
            mysql -V

            # 查看 MySQL 配置文件位置
            mysql --help | grep 'Default options' -A 1

            # 查看运行中的 MySQL 进程
            ps aux | grep mysqld

            # 检查 MySQL 状态
            brew services list

            # 启动 MySQL 8.4
            /opt/homebrew/opt/[email protected]/bin/mysqld_safe --defaults-file=/opt/homebrew/etc/my80.cnf

            # 停止 MySQL
            pkill -f mysqld

03.mysql8,社区版本
    a.下载
        a.文章
            https://www.cnblogs.com/shangxiaofei/articles/18306091
        b.操作
            1.进入官网
            2.选择版本下载dmg文件
            3.运行安装包
            3.1运行安装包
            3.2允许并一路继续
            3.3第一个选项是自己设置密码,第二个选项是系统加密密码,建议第一个选项。
            3.4输入密码完成安装,【建议不要直接启动】。请注意,若直接启动,在后面输入start命令时会报错,没其他影响。
    b.配置环境变量
        a.打开
            vim ~/.bash_profile
            vim ~/.zshrc
        b.环境变量
            export PATH="/usr/local/mysql/bin:$PATH"
            export PATH="/usr/local/mysql/support-files:$PATH"
        c.刷新变量
            source ~/.bash_profile
            echo $PATH
        d.测试
            mysql -V
    c.常见命令
        a.自建配置文件
            sudo touch /etc/my2.cnf
            sudo code /etc/my2.cnf
            保存“my2.cnf"失败:权限不足。选择“以超级用户身份重试”以超级用户身份重试。
            -------------------------------------------------------------------------------------------------
            [mysqld]
            port=3306
            bind-address = 127.0.0.1
            mysqlx-bind-address = 127.0.0.1
            server-id=2
            socket=/tmp/mysql2.sock
            pid-file=/usr/local/mysql/mysql2.pid
            datadir=/usr/local/mysql/data
            -------------------------------------------------------------------------------------------------
            [mysqld]
            port=3306
            bind-address = 127.0.0.1
            mysqlx-bind-address = 127.0.0.1
            server-id=2
            socket=/tmp/mysql2.sock
        a.开启MySQL服务(需要输入电脑密码,不是数据库登录密码)
            sudo mysql.server start
            sudo mysql.server start --defaults-file=/etc/my2.cnf
            sudo mysql.server start --defaults-file=/etc/my2.cnf --debug
        b.终止MySQL服务
            sudo mysql.server stop
        c.重新启动MySQL服务
            sudo mysql.server restart
        d.查看MySQL当前服务状态
            sudo mysql.server status
    d.第一次运行
        a.登录
             mysql -u root -p
        b.修改
            ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
            flush privileges;
    e.忘记root密码时,如何重新设置root密码
        a.关闭mysql服务器
            sudo mysql.server stop
        b.以安全方式重启mysql服务器
            sudo mysqld_safe --skip-grant-tables &
        c.再开启一个命令窗口,直接登录mysql
            mysql
        d.选择mysql数据库, 我们先将 root 的密码置为空串
            //第一步:选择mysql数据库
            use mysql;
            //第二步:查看当前用户密码信息
            select Host,User,Plugin,authentication_string from user;
            //第三步:更新root用户密码为空
            update user set authentication_string = "" where user = "root";
            //第四步:然后 exit 退出数据库,并终止第一个窗口的程序执行,即在第一个窗口按下 ctrl + C后再执行如下命令
            sudo mysql.server stop
        e.重新正常启动mysql, root无密码登录
            //重启启动mysql
            sudo mysql.server start

            //输入登录root用户,这里无需输入密码,直接回车即可
            mysql -u root -p

            //设置新的root用户的密码   shangxiaofei是我设置的新密码
            alter user "root"@"localhost" identified by "shangxiaofei";
    f.完美卸载
        a.命令
            su
            sudo rm /usr/local/mysql
            sudo rm -rf /usr/local/var/mysql
            sudo rm -rf /usr/local/mysql*
            sudo rm -rf /Library/StartupItems/MySQLCOM
            sudo rm -rf /Library/PreferencePanes/My*
            -------------------------------------------------------------------------------------------------
            # 有就删除,没有就算
            sudo vim /etc/hostconfig  (removed the line MYSQLCOM=-YES-)
            -------------------------------------------------------------------------------------------------
            sudo rm -rf ~/Library/PreferencePanes/My*
            sudo rm -rf /Library/Receipts/mysql*
            sudo rm -rf /Library/Receipts/MySQL*
            sudo rm -rf /var/db/receipts/com.mysql.*
        b.检查
            /usr/local/Cellar 里的mysql文件
            /usr/local/var 里的mysql文件
            /tmp 里的mysql.sock, mysql.sock.lock, my.cnf文件
            pid文件和err文件都在/usr/local/var/mysql里确保删除了
        c.brew
            brew安装的安装包存储在/usr/local/Library/Cache/Homebrew也可以一并删除

4.2 redis

01.redis8
    a.安装
        brew search redis
        brew install redis
    b.配置
        cat /opt/homebrew/etc/redis.conf
        -----------------------------------------------------------------------------------------------------
        port 6389
        requirepass myslayers
    c.启动
        brew services list
        brew services start redis
        brew services stop redis
        brew services restart redis
        brew rmtree redis
    d.环境变量
        export PATH="/opt/homebrew/opt/redis/bin:$PATH"
    e.登录
        redis-cli -h 127.0.0.1 -p 6379
        redis-cli -h 127.0.0.1 -p 6379 -a myslayers

4.3 oracle23c

01.镜像
    docker pull container-registry.oracle.com/database/free:latest

02.部署
    docker run -d \
    --name oracle23c \
    -p 1521:1521 \
    -p 5500:5500 \
    -e ORACLE_PWD=oracle \
    -e ORACLE_PDB=ORCL \
    -v /Users/your_username/oracle_free_data:/opt/oracle/oradata \
    container-registry.oracle.com/database/free:latest

03.运行
    docker start oracle23c                                                  --启动容器
    docker stop oracle23c                                                   --停止容器
    docker restart oracle23c                                                --重启容器
    docker rm oracle23c                                                     --移除容器
    docker logs -f oracle23c                                                --查看日志 (使用-f实时跟踪)
    docker exec -it oracle23c /bin/bash                                     --进入容器

04.连接
    a.SSH连接
        docker exec -it oracle23c /bin/bash
        sqlplus system/oracle@localhost:1521/ORCL
    b.Navicat
        hostname: localhost
        port: 1521
        service name: ORCL
        username: system
        password: oracle
        Password for SYS, SYSTEM, PDBADMIN is oracle
    c.启用 ⁠scott/tiger 用户
        docker exec -it oracle23c /bin/bash
        sqlplus system/oracle@ORCL
        ALTER USER scott ACCOUNT UNLOCK;
        ALTER USER scott IDENTIFIED BY tiger;
        GRANT CONNECT, RESOURCE TO scott; -- 授予基本权限

4.4 mongodb

01.mongodb
    a.安装
        brew search mongodb
        brew tap mongodb/brew
        brew update
        brew install [email protected]
        brew install --cask mongodb-compass
    b.配置
        cat /opt/homebrew/etc/mongod.conf
        -----------------------------------------------------------------------------------------------------
        systemLog:
          destination: file
          path: /opt/homebrew/var/log/mongodb/mongo.log
          logAppend: true
        storage:
          dbPath: /opt/homebrew/var/mongodb
        net:
          bindIp: 127.0.0.1, ::1
          ipv6: true
    c.启动
        brew services list
        brew services start mongodb-community
        brew services stop mongodb-community
        brew services restart mongodb-community
        brew rmtree mongodb-community
    d.环境变量
        export PATH="/opt/homebrew/opt/mongodb-community/bin:$PATH"
    e.登录
        mongosh mongodb://localhost:27017

4.5 sqlite3

01.sqlite3
    a.安装
        brew search sqlite
        brew install sqlite
    b.配置
        sqlite3 /Users/troyesivens/Documents/software/sqlite/demo01.db

4.6 mariadb

01.mariadb,跟mysql只能同时启动1个,故而废弃
    a.安装
        brew search mariadb
        brew install [email protected]
    b.配置
        cat /opt/homebrew/etc/my_mariadb.cnf
        -----------------------------------------------------------------------------------------------------
        [mysqld]
        port=3308
        log-error=/opt/homebrew/var/log/mariadb/mariadb.log
        datadir=/opt/homebrew/var/mariadb
    c.启动时指定配置文件
        /opt/homebrew/opt/[email protected]/bin/mariadbd-safe --defaults-file=/opt/homebrew/etc/my_mariadb.cnf
        brew rmtree [email protected]
    d.环境变量
        export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
    e.登录
        mysql -uroot -P 3308 -p

4.7 postgre

00.汇总
    物理机                     localhost:5432
    MaxKB外嵌PostgreSQL        localhost:5433          ai-maxkb-pg      pgvector/pgvector:pg16      5433:5432
    SQLBot内嵌PostgreSQL       localhost:5434          ai-sqlbot        dataease/sqlbot:latest      5434:5432

01.postgre
    a.安装
        brew search postgre
        brew install postgresql@16
    b.配置
        cat /opt/homebrew/var/postgresql@16/postgresql.conf
        -----------------------------------------------------------------------------------------------------
        # 修改端口
        port = 5432

        # 跨域规则
        listen_addresses = '*'

        # 日志文件路径
        log_directory = 'log'
        log_filename = 'postgresql.log'
    c.启动
        brew services list
        brew services start postgresql@16
        brew services stop postgresql@16
        brew services restart postgresql@16
        brew rmtree postgresql@16
    d.环境变量
        export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
    e.登录
        # 无密码登录
        psql postgres

        # 为postgres分配角色
        SELECT rolname FROM pg_roles;
        CREATE ROLE postgres WITH LOGIN SUPERUSER;
        SELECT rolname FROM pg_roles;

        # 为postgres设置秘密
        ALTER USER postgres WITH PASSWORD '123456';
    f.登录
        psql -U postgres -p 5432

4.8 kafka

01.kafka
    a.安装
        brew search kafka
        brew install kafka
    b.配置
        cat /opt/homebrew/etc/kafka/server.properties
        -----------------------------------------------------------------------------------------------------
        # 修改端口
        listeners=PLAINTEXT://:9092

        # 设置日志目录
        log.dirs=/opt/homebrew/var/lib/kafka-logs
    c.启动
        brew services list
        brew services start kafka
        brew services stop kafka
        brew services restart kafka
        brew rmtree kafka
    d.环境变量
        export PATH="/opt/homebrew/opt/kafka/bin:$PATH"
    e.使用
        # 启动
        kafka-server-start /opt/homebrew/etc/kafka/server.properties

        # 创建主题
        kafka-topics --create --topic my-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

        # 列出主题
        kafka-topics --list --bootstrap-server localhost:9092

        # 启动一个生产者
        kafka-console-producer --topic my-topic --bootstrap-server localhost:9092

        # 启动一个消费者
        kafka-console-consumer --topic my-topic --from-beginning --bootstrap-server localhost:9092

4.9 rabbitmq

01.rabbitmq
    a.安装
        brew search rabbitmq
        brew install rabbitmq
    b.配置
        cat /opt/homebrew/etc/rabbitmq/rabbitmq-env.conf
        -----------------------------------------------------------------------------------------------------
        CONFIG_FILE=/opt/homebrew/etc/rabbitmq/rabbitmq
        NODE_IP_ADDRESS=127.0.0.1
        NODENAME=rabbit@localhost
        RABBITMQ_LOG_BASE=/opt/homebrew/var/log/rabbitmq
        PLUGINS_DIR="/opt/homebrew/opt/rabbitmq/plugins:/opt/homebrew/share/rabbitmq/plugins"
    c.启动
        brew services list
        brew services start rabbitmq
        brew services stop rabbitmq
        brew services restart rabbitmq
        brew rmtree rabbitmq
    d.环境变量
        export PATH="/opt/homebrew/opt/rabbitmq/sbin:$PATH"
    e.使用
        # 启用管理插件
        rabbitmq-plugins enable rabbitmq_management

        http://localhost:15672
        guest
        guest
    f.管理用户和权限
        # 添加用户
        rabbitmqctl add_user myuser mypassword

        # 设置用户角色
        rabbitmqctl set_user_tags myuser administrator

        # 设置权限
        rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

4.10 nacos

01.nacos
    a.安装
        curl -L cdownload/2.5.0/nacos-server-2.5.0.zip -o nacos-server.zip
        unzip nacos-server-2.5.0.zip -d /opt/homebrew/opt/
    b.配置
        cat /opt/homebrew/opt/nacos/conf/application.properties
        -----------------------------------------------------------------------------------------------------
        # 服务器端口
        server.port=8858

        # 数据库配置(如果需要使用 MySQL 等数据库)
        spring.datasource.platform=mysql
        db.num=1
        db.url.0=jdbc:mysql://localhost:3307/pisces-cloud-nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
        db.user=root
        db.password=123456
    c.启动
        # 启动
        cd /opt/homebrew/opt/nacos/bin
        sh startup.sh -m standalone

        # 停止
        sh shutdown.sh

        # 日志
        tail -f /opt/homebrew/opt/nacos/logs/start.out
    d.环境变量
        export PATH="/opt/homebrew/opt/nacos/bin:$PATH"
    e.使用
        http://localhost:8848/nacos
        nacos
        nacos
    f.命令
        nacos start     # 启动
        nacos stop      # 停止
        nacos restart   # 重启
        nacos status    # 状态
        nacos logs      # 日志

02.开机自启
    a.配置
        项目          路径
        plist        ~/Library/LaunchAgents/com.nacos.server.plist
        日志输出      /opt/homebrew/opt/nacos/logs/nacos.out
        错误日志      /opt/homebrew/opt/nacos/logs/nacos.err
    b.管理命令
        # 加载自启动(已加载)
        launchctl load ~/Library/LaunchAgents/com.nacos.server.plist
        # 卸载自启动
        launchctl unload ~/Library/LaunchAgents/com.nacos.server.plist
        # 手动启动
        launchctl start com.nacos.server
        # 手动停止
        launchctl stop com.nacos.server
        # 查看状态
        launchctl list | grep nacos
    c.当前状态
        Nacos 正在运行 (PID: 18485, 端口: 8848)
        开机自启动: 已启用

03.鉴权问题
    a.说明
        当前集群没有开启鉴权,请参考文档开启鉴权~
    b.解决
        检查配置:读取 /opt/homebrew/opt/nacos/conf/application.properties 文件,确认当前的配置状态。
        开启鉴权:在配置文件中添加或修改以下关键属性:
        设置 nacos.core.auth.enabled=true 开启鉴权。
        配置 nacos.core.auth.plugin.nacos.token.secret.key(Base64 编码的密钥,且长度需符合 Nacos 2.x 的要求,通常需大于 32 字节)。
        配置服务端身份识别信息 nacos.core.auth.server.identity.key 和 nacos.core.auth.server.identity.value。
        重启服务:停止并重新启动 Nacos 服务以使配置生效。
    c.操作
        vi /opt/homebrew/opt/nacos/conf/application.properties
        -----------------------------------------------------------------------------------------------------
        ### If turn on auth system:
        nacos.core.auth.enabled=true

        ### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
        ### The two properties is the white list for auth and used by identity the request from other server.
        nacos.core.auth.server.identity.key=nacos
        nacos.core.auth.server.identity.value=nacos

        ### The default token (Base64 String):
        nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzYXNlY3JldEtleUZvck5hY29zVG9rZW5Mb2NhbEhvc3Q=
    d.脚本
        alias start-nacos='cd /opt/homebrew/opt/nacos/bin && sh startup.sh -m standalone'
        alias stop-nacos='cd /opt/homebrew/opt/nacos/bin && sh shutdown.sh'
        export PATH="/opt/homebrew/opt/nacos/bin:$PATH"

04.配置文件
    a.地址
        https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/mysql-schema.sql
    b.本地
        cat ../nacos/conf/mysql-schema.sql
        -----------------------------------------------------------------------------------------------------
        /*
         * Copyright 1999-2018 Alibaba Group Holding Ltd.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *      http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */

        /******************************************/
        /*   表名称 = config_info                  */
        /******************************************/
        CREATE TABLE `config_info` (
                                       `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
                                       `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                       `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',
                                       `content` longtext NOT NULL COMMENT 'content',
                                       `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                       `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                       `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                       `src_user` text COMMENT 'source user',
                                       `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
                                       `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                       `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
                                       `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
                                       `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
                                       `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
                                       `type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
                                       `c_schema` text COMMENT '配置的模式',
                                       `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
                                       PRIMARY KEY (`id`),
                                       UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

        /******************************************/
        /*   表名称 = config_info  since 2.5.0                */
        /******************************************/
        CREATE TABLE `config_info_gray` (
                                            `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
                                            `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                            `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                            `content` longtext NOT NULL COMMENT 'content',
                                            `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                            `src_user` text COMMENT 'src_user',
                                            `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
                                            `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
                                            `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
                                            `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                            `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
                                            `gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
                                            `gray_rule` text NOT NULL COMMENT 'gray_rule',
                                            `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
                                            PRIMARY KEY (`id`),
                                            UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
                                            KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
                                            KEY `idx_gmt_modified` (`gmt_modified`)
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';

        /******************************************/
        /*   表名称 = config_info_beta             */
        /******************************************/
        CREATE TABLE `config_info_beta` (
                                            `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
                                            `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                            `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                            `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                            `content` longtext NOT NULL COMMENT 'content',
                                            `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
                                            `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                            `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                            `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                            `src_user` text COMMENT 'source user',
                                            `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
                                            `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
                                            `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
                                            PRIMARY KEY (`id`),
                                            UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

        /******************************************/
        /*   表名称 = config_info_tag              */
        /******************************************/
        CREATE TABLE `config_info_tag` (
                                           `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
                                           `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                           `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                           `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
                                           `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
                                           `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                           `content` longtext NOT NULL COMMENT 'content',
                                           `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                           `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                           `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                           `src_user` text COMMENT 'source user',
                                           `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
                                           PRIMARY KEY (`id`),
                                           UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

        /******************************************/
        /*   表名称 = config_tags_relation         */
        /******************************************/
        CREATE TABLE `config_tags_relation` (
                                                `id` bigint(20) NOT NULL COMMENT 'id',
                                                `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
                                                `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
                                                `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                                `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                                `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
                                                `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
                                                PRIMARY KEY (`nid`),
                                                UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
                                                KEY `idx_tenant_id` (`tenant_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

        /******************************************/
        /*   表名称 = group_capacity               */
        /******************************************/
        CREATE TABLE `group_capacity` (
                                          `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
                                          `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
                                          `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
                                          `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
                                          `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
                                          `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
                                          `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
                                          `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
                                          `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                          `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                          PRIMARY KEY (`id`),
                                          UNIQUE KEY `uk_group_id` (`group_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

        /******************************************/
        /*   表名称 = his_config_info              */
        /******************************************/
        CREATE TABLE `his_config_info` (
                                           `id` bigint(20) unsigned NOT NULL COMMENT 'id',
                                           `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
                                           `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                           `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                           `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                           `content` longtext NOT NULL COMMENT 'content',
                                           `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                           `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                           `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                           `src_user` text COMMENT 'source user',
                                           `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
                                           `op_type` char(10) DEFAULT NULL COMMENT 'operation type',
                                           `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
                                           `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
                                           `publish_type` varchar(50)  DEFAULT 'formal' COMMENT 'publish type gray or formal',
                                           `gray_name` varchar(50)  DEFAULT NULL COMMENT 'gray name',
                                           `ext_info`  longtext DEFAULT NULL COMMENT 'ext info',
                                           PRIMARY KEY (`nid`),
                                           KEY `idx_gmt_create` (`gmt_create`),
                                           KEY `idx_gmt_modified` (`gmt_modified`),
                                           KEY `idx_did` (`data_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


        /******************************************/
        /*   表名称 = tenant_capacity              */
        /******************************************/
        CREATE TABLE `tenant_capacity` (
                                           `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
                                           `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
                                           `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
                                           `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
                                           `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
                                           `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
                                           `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
                                           `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
                                           `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                           `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
                                           PRIMARY KEY (`id`),
                                           UNIQUE KEY `uk_tenant_id` (`tenant_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


        CREATE TABLE `tenant_info` (
                                       `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
                                       `kp` varchar(128) NOT NULL COMMENT 'kp',
                                       `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
                                       `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
                                       `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
                                       `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
                                       `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
                                       `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
                                       PRIMARY KEY (`id`),
                                       UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
                                       KEY `idx_tenant_id` (`tenant_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

        CREATE TABLE `users` (
                                 `username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',
                                 `password` varchar(500) NOT NULL COMMENT 'password',
                                 `enabled` boolean NOT NULL COMMENT 'enabled'
        );

        CREATE TABLE `roles` (
                                 `username` varchar(50) NOT NULL COMMENT 'username',
                                 `role` varchar(50) NOT NULL COMMENT 'role',
                                 UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
        );

        CREATE TABLE `permissions` (
                                       `role` varchar(50) NOT NULL COMMENT 'role',
                                       `resource` varchar(128) NOT NULL COMMENT 'resource',
                                       `action` varchar(8) NOT NULL COMMENT 'action',
                                       UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
        );

4.11 minio

01.MinIO
    a.安装
        a.更新Brew
            brew update
        b.安装MinIO
            brew install minio
        c.安装客户端(mc) - 可选,用于命令行管理
            brew install minio/stable/mc
    b.启动管理
        a.查看服务状态
            brew services list
        b.启动服务 (后台运行)
            brew services start minio
        c.停止服务
            brew services stop minio
        d.重启服务
            brew services restart minio
        e.前台调试运行 (查看实时日志)
            minio server /opt/homebrew/var/minio --console-address ":9001"
        f.前台调试运行 (查看实时日志)
            minio server /opt/homebrew/var/minio --address 127.0.0.1:9000 --console-address 127.0.0.1:9001
    c.验证与访问
        a.Web控制台
            http://localhost:9001
        b.API接口地址
            http://localhost:9000
        c.默认账号密码
            AccessKey: minioadmin
            SecretKey: minioadmin
    d.配置文件与数据
        a.配置文件路径
            /opt/homebrew/etc/minio/post-install.sh (或者环境变量配置)
        b.默认数据存储路径
            /opt/homebrew/var/minio
    e.常见问题
        a.端口占用 (9000/9001)
            lsof -i :9000
            kill -9 <PID>
        b.修改密码
            export MINIO_ROOT_USER=newuser
            export MINIO_ROOT_PASSWORD=newpassword
            minio server /opt/homebrew/var/minio
        c.脚本
            # minio
            alias start-minio='minio server /opt/homebrew/var/minio --address 127.0.0.1:9000 --console-address 127.0.0.1:9001 > /dev/null 2>&1 & echo "MinIO started."'
            alias stop-minio='pkill -f "minio server /opt/homebrew/var/minio" && echo "MinIO stopped."'

02.MinIO 卸载
    a.卸载步骤
        # 1. 停止服务
        brew services stop minio

        # 2. 卸载软件包
        brew uninstall minio
        brew uninstall mc

        # 3. 清理残留文件 (警告:包含所有存储的数据)
        rm -rf /opt/homebrew/var/minio
        rm -rf /opt/homebrew/etc/minio
    b.一键清理
        brew services stop minio
        brew uninstall --zap minio
    c.版本问题
        minio version RELEASE.2025-10-15T17-29-55Z (commit-id=9e49d5e7a648f00e26f2246f4dc28e6b07f8c84a)
        Runtime: go1.25.3 darwin/arm64
        License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
        Copyright: 2015-2025 MinIO, Inc.

4.12 elastic

01.elasticsearch、kibana、logstash
    a.添加tap
        a.地址
            https://github.com/elastic/homebrew-tap/
        b.添加
            brew tap elastic/tap
    b.elasticsearch
        a.安装
            brew install elastic/tap/elasticsearch-full
        b.启动
            brew services list
            brew services start elasticsearch-full
            brew services stop elasticsearch-full
            brew services restart elasticsearch-full
            brew rmtree elasticsearch-full
        c.验证
            http://localhost:9200/
    c.kibana
        a.安装
            brew install elastic/tap/kibana-full
        b.启动
            brew services list
            brew services start kibana-full
            brew services stop kibana-full
            brew services restart kibana-full
            brew rmtree kibana-full
        c.验证
            http://localhost:5601
    d.lgstash
        a.安装
            brew install elastic/tap/logstash-full
        b.启动
            brew services list
            brew services start logstash-full
            brew services stop logstash-full
            brew services restart logstash-full
            brew rmtree logstash-full
    e.ik分词器
        a.位置
            /opt/homebrew/bin/elasticsearch
        b.权限
            cd opt/homebrew/Cellar/elasticsearch-full/7.17.4/libexec/plugins
            mkdir ik
        c.安装
            https://github.com/medcl/elasticsearch-analysis-ik/tags
            mv /Users/对应自己的用户名/Downloads/elasticsearch-analysis-ik-7.17.4.zip /opt/homebrew/Cellar/elasticsearch-full/7.17.4/libexec/plugins/ik
            unzip elasticsearch-analysis-ik-7.17.4.zip
            rm elasticsearch-analysis-ik-7.17.4.zip
        d.测试
            POST _analyze
            {
            “analyzer”: “ik_max_word”, “text”: “南京市长江大桥”
            }
    f.报错
        a.文件
            /opt/homebrew/Library/Taps/elastic/homebrew-tap/Formula/elasticsearch-full.rb
        b.找到使用 rmtree 的地方,将其替换为 FileUtils.rm_r
            # Move config files into etc
            (etc/"elasticsearch").install Dir[libexec/"config/*"]
            FileUtils.rm_r libexec/"config"

02.elasticsearch、kibana、logstash卸载
    a.卸载步骤
        # 1. 停止服务
        brew services stop elasticsearch-full
        brew services stop kibana-full
        brew services stop logstash-full

        # 2. 卸载软件(保留配置文件和数据)
        brew uninstall elasticsearch-full
        brew uninstall kibana-full
        brew uninstall logstash-full

        # 或者完全卸载(包括配置文件和数据)
        brew uninstall --zap elasticsearch-full
        brew uninstall --zap kibana-full
        brew uninstall --zap logstash-full

        # 3. 如果不再需要 elastic tap,移除它
        brew untap elastic/tap

        # 4. (可选)删除残留的配置和数据目录
        # Elasticsearch 数据通常在:
        rm -rf /opt/homebrew/var/elasticsearch
        # 或者 /usr/local/var/elasticsearch(Intel Mac)

        # Kibana 配置和数据:
        rm -rf /opt/homebrew/var/kibana
        # 或者 /usr/local/var/kibana(Intel Mac)

        # Logstash 配置和数据:
        rm -rf /opt/homebrew/var/logstash
        # 或者 /usr/local/var/logstash(Intel Mac)
    b.快速一键卸载
        # 停止所有服务并卸载
        brew services stop elasticsearch-full kibana-full logstash-full
        brew uninstall --zap elasticsearch-full kibana-full logstash-full
        brew untap elastic/tap