[Koishi Desktop] market的插件不能用了

在我更新了koishi后,market插件突然不能用了,插件市场打开是这样的


依赖管理是这样的

日志输出了这些

2024-02-17 21:47:44 [I] loader unload plugin market:7o3j74
2024-02-17 21:47:45 [I] loader apply plugin market:7o3j74
2024-02-17 21:47:45 [W] market ReferenceError: Headers is not defined
                            at Proxy.[cordis.invoke] (/home/jingming295/.koishi/data/instances/default/node_modules/undios/lib/index.cjs:153:23)
                            at Function.applyProxy (/home/jingming295/.koishi/data/instances/default/node_modules/@cordisjs/core/lib/index.cjs:722:35)
                            at http (/home/jingming295/.koishi/data/instances/default/node_modules/@cordisjs/core/lib/index.cjs:977:24)
                            at Proxy.<anonymous> (/home/jingming295/.koishi/data/instances/default/node_modules/undios/lib/index.cjs:70:36)
                            at _MarketProvider.collect (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/node/index.js:391:38)
                            at _MarketProvider.prepare (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/shared/index.js:52:45)
                            at _MarketProvider.start (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/node/index.js:382:16)
                            at /home/jingming295/.koishi/data/instances/default/node_modules/@cordisjs/core/lib/index.cjs:994:18
                            at processTicksAndRejections (node:internal/process/task_queues:96:5)
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market ReferenceError: Headers is not defined
                            at Proxy.[cordis.invoke] (/home/jingming295/.koishi/data/instances/default/node_modules/undios/lib/index.cjs:153:23)
                            at Function.applyProxy (/home/jingming295/.koishi/data/instances/default/node_modules/@cordisjs/core/lib/index.cjs:722:35)
                            at http (/home/jingming295/.koishi/data/instances/default/node_modules/@cordisjs/core/lib/index.cjs:977:24)
                            at Proxy.<anonymous> (/home/jingming295/.koishi/data/instances/default/node_modules/undios/lib/index.cjs:70:36)
                            at _MarketProvider.collect (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/node/index.js:391:38)
                            at _MarketProvider.prepare (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/shared/index.js:52:45)
                            at _MarketProvider.get (/home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/plugin-market/lib/node/index.js:425:16)
                            at /home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/console/lib/index.js:57:25
                            at /home/jingming295/.koishi/data/instances/default/node_modules/@koishijs/console/lib/index.js:247:27
                            at processTicksAndRejections (node:internal/process/task_queues:96:5)
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined
2024-02-17 21:47:45 [W] market Headers is not defined

把 registry.endpoint改成https://registry.npmjs.org/
search.endpoint改成https://registry.koishi.chat/index.json
也没用

这是我的market插件配置

koishi版本为:

Core: 4.17.0-beta.2

Console: 5.27.9

Koishi Desktop: 0.10.7

market 版本为: 2.11.1

2 个赞

全部依赖升级至最新版本即可解决

1 个赞

如果我的market不能用的话我应该怎么升级,直接到.koishi 里面执行 yarn upgrade吗?

我koishi 每次都是用koishi的appimage启动的,每次执行完yarn upgrade以后就打不开了,需要 koi.AppImage yarn -n default 才能再次成功打开,然后打开后还是一样的情况,market没法用

2 个赞

(试试yarn dep?

3 个赞

我看见里面的package.json只有一个 start script


我添加了dep的script

然后我运行yarn dep

输出

jingming295@jingming295-PowerEdge-R730:~/.koishi/data/instances/default$ yarn dep           yarn run v1.22.19
$ yakumo upgrade
/bin/sh: line 1: yakumo: command not found
error Command failed with exit code 127.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
jingming295@jingming295-PowerEdge-R730:~/.koishi/data/instances/default$

貌似原本就没有 yakumo (我这个koishi是用appimage启动的)

2 个赞

soga))那没事了)

2 个赞

然而我在.koishi/data/instances/default 运行 yarn start的时候启动成功了

并且插件市场也是好的

使用 koi start default 就永远无法启动起来,是否意味着我以后只能进入.koishi/data/instances/default 运行 yarn start 来启动koishi了

1 个赞

我不确定这是不是koishi desktop 的问题,所以我发了一个issue: Issues · koishijs/koishi-desktop · GitHub

1 个赞
1 个赞

这个问题,我也遇到了,但我是docker安装的,重启容器后恢复正常

3 个赞

同,但是重启和重装后依旧没有解决(docker安装)
使用此脚本安装

#!/bin/bash

Koishi + NapCat 一键安装与管理脚本

功能:安装、管理、日志查看、开机自启

==================== 配置区域 ====================

Koishi 配置

KOISHI_HOST_PORT=5140
KOISHI_CONTAINER_PORT=5140
KOISHI_EXTERNAL_PORT=37003
KOISHI_CONTAINER_NAME=“koishi”
KOISHI_IMAGE=“koishijs/koishi:latest”

NapCat 配置

NAPCAT_HOST_PORT=6099
NAPCAT_CONTAINER_PORT=6099
NAPCAT_EXTERNAL_PORT=45477
NAPCAT_CONTAINER_NAME=“napcat”
NAPCAT_IMAGE=“mlikiowa/napcat-docker:latest”

NapCat 数据目录

NAPCAT_CONFIG_DIR=“/root/napcat/config”
NAPCAT_QQ_DIR=“/root/napcat/.config”

NapCat 环境变量

MESSAGE_POST_FORMAT=“string”
WSR_ENABLE=true
MAC_ADDRESS=“02:42:ac:11:00:99”

服务器外网 IP

SERVER_IP=“160.202.232.88”

颜色定义

GREEN=‘\033[0;32m’
RED=‘\033[0;31m’
YELLOW=‘\033[1;33m’
BLUE=‘\033[0;34m’
CYAN=‘\033[0;36m’
NC=‘\033[0m’ # No Color

==================== 安装函数 ====================

install_services() {
clear
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :rocket: Koishi + NapCat 一键安装 :rocket:"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
echo “:package: 将要安装的服务:”
echo “”
echo " :one: Koishi 机器人"
echo " 本地端口: $KOISHI_HOST_PORT"
echo " 外网访问: http://$SERVER_IP:$KOISHI_EXTERNAL_PORT"
echo “”
echo " :two: NapCat QQ机器人"
echo " 本地端口: $NAPCAT_HOST_PORT"
echo " 外网访问: http://$SERVER_IP:$NAPCAT_EXTERNAL_PORT"
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
read -p “按 Enter 继续安装,或 Ctrl+C 取消…”

# 停止Docker服务
echo -e "\n=== 1. 停止Docker相关服务 ==="
sudo systemctl stop docker.socket 2>/dev/null

sudo systemctl stop docker
echo “:white_check_mark: Docker服务已停止”

# 配置Docker镜像源
echo -e "\n=== 2. 配置Docker镜像源(国内加速) ==="
sudo rm -f /etc/docker/daemon.json

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [
https://docker.1panel.live”,
https://hub.rat.dev”,
https://docker.m.daocloud.io”,
https://docker.unsee.tech”,
https://docker.chenby.cn
]
}
EOF

echo "✅ 镜像源配置完成"

# 启动Docker服务
echo -e "\n=== 3. 启动Docker并设置开机自启 ==="

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

# 验证Docker服务
echo -e "\n=== 4. 验证Docker服务 ==="

if systemctl is-active --quiet docker; then
echo “:white_check_mark: Docker服务启动成功”
else
echo “:x: Docker服务启动失败”
echo “请运行: journalctl -xeu docker.service 查看错误日志”
read -p “按 Enter 返回…”
return 1
fi

# 显示镜像配置
echo -e "\n=== 5. 验证Docker镜像配置 ==="
docker info | grep -A 5 "Registry Mirrors" || echo "镜像源配置查看失败(正常现象)"

# 安装 Koishi
echo -e "\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  📦 开始安装 Koishi"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# 清理旧容器
if docker ps -a | grep -q "$KOISHI_CONTAINER_NAME"; then
    echo "正在清理旧的 Koishi 容器..."
    docker stop "$KOISHI_CONTAINER_NAME" 2>/dev/null
    docker rm "$KOISHI_CONTAINER_NAME" 2>/dev/null
    echo "✅ 旧容器已清理"
fi

# 检查端口占用
if netstat -tuln 2>/dev/null | grep -q ":$KOISHI_HOST_PORT " || ss -tuln 2>/dev/null | grep -q ":$KOISHI_HOST_PORT "; then
    echo "⚠️  警告:端口 $KOISHI_HOST_PORT 被占用"
    read -p "是否强制停止占用进程?(y/n): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        PID=$(netstat -tulnp 2>/dev/null | grep :$KOISHI_HOST_PORT | awk '{print $7}' | cut -d'/' -f1 | head -1)
        [ -z "$PID" ] && PID=$(ss -tulnp 2>/dev/null | grep :$KOISHI_HOST_PORT | grep -oP 'pid=\K[0-9]+' | head -1)
        if [ ! -z "$PID" ]; then
            kill -9 $PID
            echo "✅ 已停止进程 $PID"
            sleep 2
        fi
    else
        echo "⚠️  跳过 Koishi 安装(端口被占用)"
        SKIP_KOISHI=true
    fi
fi

# 拉取并启动 Koishi
if [ "$SKIP_KOISHI" != "true" ]; then
    echo "正在拉取 Koishi 镜像..."
    docker pull "$KOISHI_IMAGE"
    
    if [ $? -eq 0 ]; then
        echo "✅ Koishi 镜像拉取成功"
        echo "正在启动 Koishi 容器..."
        docker run -d \
            --name "$KOISHI_CONTAINER_NAME" \
            --restart=always \
            -p $KOISHI_HOST_PORT:$KOISHI_CONTAINER_PORT \
            "$KOISHI_IMAGE"
        
        if [ $? -eq 0 ]; then
            echo "✅ Koishi 启动成功!"
        else
            echo "❌ Koishi 启动失败"
        fi
    else
        echo "❌ Koishi 镜像拉取失败"
    fi
fi

# 安装 NapCat
echo -e "\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  📦 开始安装 NapCat"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# 创建数据目录
echo "创建数据目录..."
mkdir -p "$NAPCAT_CONFIG_DIR"
mkdir -p "$NAPCAT_QQ_DIR"
echo "✅ 数据目录创建完成"

# 清理旧容器
if docker ps -a | grep -q "$NAPCAT_CONTAINER_NAME"; then
    echo "正在清理旧的 NapCat 容器..."
    docker stop "$NAPCAT_CONTAINER_NAME" 2>/dev/null
    docker rm "$NAPCAT_CONTAINER_NAME" 2>/dev/null
    echo "✅ 旧容器已清理"
fi

# 检查端口占用
if netstat -tuln 2>/dev/null | grep -q ":$NAPCAT_HOST_PORT " || ss -tuln 2>/dev/null | grep -q ":$NAPCAT_HOST_PORT "; then
    echo "⚠️  警告:端口 $NAPCAT_HOST_PORT 被占用"
    read -p "是否强制停止占用进程?(y/n): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        PID=$(netstat -tulnp 2>/dev/null | grep :$NAPCAT_HOST_PORT | awk '{print $7}' | cut -d'/' -f1 | head -1)
        [ -z "$PID" ] && PID=$(ss -tulnp 2>/dev/null | grep :$NAPCAT_HOST_PORT | grep -oP 'pid=\K[0-9]+' | head -1)
        if [ ! -z "$PID" ]; then
            kill -9 $PID
            echo "✅ 已停止进程 $PID"
            sleep 2
        fi
    else
        echo "⚠️  跳过 NapCat 安装(端口被占用)"
        SKIP_NAPCAT=true
    fi
fi

# 拉取并启动 NapCat
if [ "$SKIP_NAPCAT" != "true" ]; then
    echo "正在拉取 NapCat 镜像..."
    docker pull "$NAPCAT_IMAGE"
    
    if [ $? -eq 0 ]; then
        echo "✅ NapCat 镜像拉取成功"
        echo "正在启动 NapCat 容器..."
        docker run -d \
            -e MESSAGE_POST_FORMAT="$MESSAGE_POST_FORMAT" \
            -e WSR_ENABLE=$WSR_ENABLE \
            -p $NAPCAT_HOST_PORT:$NAPCAT_CONTAINER_PORT \
            -v "$NAPCAT_CONFIG_DIR:/usr/src/app/napcat/config" \
            -v "$NAPCAT_QQ_DIR:/root/.config" \
            --name "$NAPCAT_CONTAINER_NAME" \
            --mac-address="$MAC_ADDRESS" \
            --restart=always \
            "$NAPCAT_IMAGE"
        
        if [ $? -eq 0 ]; then
            echo "✅ NapCat 启动成功!"
        else
            echo "❌ NapCat 启动失败"
        fi
    else
        echo "❌ NapCat 镜像拉取失败"
    fi
fi

# 显示安装结果
sleep 2
show_install_result

}

显示安装结果

show_install_result() {
clear
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :tada: 安装完成!"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
echo “:bar_chart: 容器运行状态:”
echo “”
docker ps --format “table {{.Names}}\t{{.Status}}\t{{.Ports}}” | grep -E “NAMES|koishi|napcat”
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
show_urls_simple
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
echo “:white_check_mark: 开机自启: 已启用 (–restart=always)”
echo “:white_check_mark: 后台运行: 已启用”
echo “”
echo “:bulb: 运行 ./bot_manager.sh 打开管理菜单”
echo “”
read -p “按 Enter 继续…”
}

==================== 管理函数 ====================

显示菜单

show_menu() {
clear
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :robot: 机器人管理菜单 :robot:"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
echo " ${CYAN}安装管理${NC}"
echo " 1. 一键安装所有服务"
echo " 2. 查看安装状态"
echo “”
echo " ${CYAN}服务控制${NC}"
echo " 3. 启动所有服务"
echo " 4. 停止所有服务"
echo " 5. 重启所有服务"
echo “”
echo " ${CYAN}Koishi 管理${NC}"
echo " 6. 启动 Koishi"
echo " 7. 停止 Koishi"
echo " 8. 重启 Koishi"
echo " 9. 查看 Koishi 日志"
echo “”
echo " ${CYAN}NapCat 管理${NC}"
echo " 10. 启动 NapCat"
echo " 11. 停止 NapCat"
echo " 12. 重启 NapCat"
echo " 13. 查看 NapCat 日志"
echo “”
echo " ${CYAN}其他操作${NC}"
echo " 14. 查看访问地址"
echo " 15. 查看运行状态"
echo " 16. 清理所有容器"
echo “”
echo " 0. 退出"
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
}

查看状态

check_status() {
clear
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :bar_chart: 容器运行状态"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”

if docker ps -a | grep -qE "koishi|napcat"; then
    docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "NAMES|koishi|napcat"
    echo ""
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo ""
    show_urls_simple
else
    echo -e "${YELLOW}未找到相关容器,请先运行安装${NC}"
    echo ""
fi

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
pause

}

启动所有

start_all() {
echo -e “${BLUE}启动所有服务…${NC}”
docker start $KOISHI_CONTAINER_NAME $NAPCAT_CONTAINER_NAME 2>/dev/null
sleep 2
echo -e “${GREEN}:white_check_mark: 完成${NC}”
docker ps | grep -E “koishi|napcat”
pause
}

停止所有

stop_all() {
echo -e “${YELLOW}停止所有服务…${NC}”
docker stop $KOISHI_CONTAINER_NAME $NAPCAT_CONTAINER_NAME 2>/dev/null
echo -e “${GREEN}:white_check_mark: 完成${NC}”
pause
}

重启所有

restart_all() {
echo -e “${BLUE}重启所有服务…${NC}”
docker restart $KOISHI_CONTAINER_NAME $NAPCAT_CONTAINER_NAME 2>/dev/null
sleep 2
echo -e “${GREEN}:white_check_mark: 完成${NC}”
docker ps | grep -E “koishi|napcat”
pause
}

Koishi 操作

start_koishi() {
echo -e “${BLUE}启动 Koishi…${NC}”
docker start $KOISHI_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
sleep 1
docker ps | grep $KOISHI_CONTAINER_NAME
pause
}

stop_koishi() {
echo -e “${YELLOW}停止 Koishi…${NC}”
docker stop $KOISHI_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
pause
}

restart_koishi() {
echo -e “${BLUE}重启 Koishi…${NC}”
docker restart $KOISHI_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
sleep 1
docker ps | grep $KOISHI_CONTAINER_NAME
pause
}

logs_koishi() {
clear
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :clipboard: Koishi 实时日志(Ctrl+C 退出)"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
docker logs -f $KOISHI_CONTAINER_NAME 2>&1
}

NapCat 操作

start_napcat() {
echo -e “${BLUE}启动 NapCat…${NC}”
docker start $NAPCAT_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
sleep 1
docker ps | grep $NAPCAT_CONTAINER_NAME
pause
}

stop_napcat() {
echo -e “${YELLOW}停止 NapCat…${NC}”
docker stop $NAPCAT_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
pause
}

restart_napcat() {
echo -e “${BLUE}重启 NapCat…${NC}”
docker restart $NAPCAT_CONTAINER_NAME 2>/dev/null && echo -e “${GREEN}:white_check_mark: 完成${NC}” || echo -e “${RED}:x: 失败${NC}”
sleep 1
docker ps | grep $NAPCAT_CONTAINER_NAME
pause
}

logs_napcat() {
clear
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :clipboard: NapCat 实时日志(Ctrl+C 退出)"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
docker logs -f $NAPCAT_CONTAINER_NAME 2>&1
}

显示访问地址(简化版)

show_urls_simple() {
if docker ps | grep -q $KOISHI_CONTAINER_NAME; then
echo -e “${GREEN}:white_check_mark: Koishi${NC}”
echo " 本地: http://127.0.0.1:$KOISHI_HOST_PORT"
echo " 外网: http://$SERVER_IP:$KOISHI_EXTERNAL_PORT"
echo “”
fi

if docker ps | grep -q $NAPCAT_CONTAINER_NAME; then
    echo -e "${GREEN}✅ NapCat${NC}"
    echo "   本地: http://127.0.0.1:$NAPCAT_HOST_PORT"
    echo "   外网: http://$SERVER_IP:$NAPCAT_EXTERNAL_PORT"
    echo "   配置: $NAPCAT_CONFIG_DIR"
    echo ""
fi

}

查看访问地址(详细版)

show_urls() {
clear
echo “”
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :globe_with_meridians: 访问地址"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”

show_urls_simple

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "💡 提示:"
echo "  - Koishi: 访问 WebUI 进行配置和插件安装"
echo "  - NapCat: 扫码登录 QQ,配置机器人功能"
echo ""
pause

}

清理所有容器

clean_all() {
clear
echo “”
echo -e “${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}”
echo -e “${RED} :warning: 警告:这将删除所有容器!${NC}”
echo -e “${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}”
echo “”
echo “将要删除:”
echo " - Koishi 容器"
echo " - NapCat 容器"
echo “”
echo “注意:NapCat 的配置文件不会被删除”
echo " 位置: $NAPCAT_CONFIG_DIR"
echo “”
read -p "确认删除?输入 yes 继续: " confirm

if [ "$confirm" = "yes" ]; then
    echo ""
    echo "停止并删除容器..."
    docker stop $KOISHI_CONTAINER_NAME $NAPCAT_CONTAINER_NAME 2>/dev/null
    docker rm $KOISHI_CONTAINER_NAME $NAPCAT_CONTAINER_NAME 2>/dev/null
    echo -e "${GREEN}✅ 清理完成${NC}"
else
    echo "已取消"
fi
pause

}

暂停

pause() {
echo “”
read -p “按 Enter 继续…”
}

==================== 主程序 ====================

检查是否第一次运行(没有安装容器)

check_first_run() {
if ! docker ps -a | grep -qE “koishi|napcat”; then
clear
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo " :wave: 欢迎使用机器人管理脚本"
echo “━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━”
echo “”
echo “检测到尚未安装服务”
echo “”
read -p "是否立即安装?(y/n): " -n 1 -r
echo “”
if [[ $REPLY =~ [1]$ ]]; then
install_services
fi
fi
}

主函数

main() {
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
echo -e “${RED}:x: 未检测到 Docker,请先安装 Docker${NC}”
exit 1
fi

# 检查是否首次运行
check_first_run

# 主循环
while true; do
    show_menu
    read -p "请选择操作 [0-16]: " choice
    
    case $choice in
        1) install_services ;;
        2) check_status ;;
        3) start_all ;;
        4) stop_all ;;
        5) restart_all ;;
        6) start_koishi ;;
        7) stop_koishi ;;
        8) restart_koishi ;;
        9) logs_koishi ;;
        10) start_napcat ;;
        11) stop_napcat ;;
        12) restart_napcat ;;
        13) logs_napcat ;;
        14) show_urls ;;
        15) check_status ;;
        16) clean_all ;;
        0) 
            clear
            echo ""
            echo "👋 再见!"
            echo ""
            exit 0
            ;;
        *) 
            echo -e "${RED}❌ 无效选择,请重试${NC}"
            sleep 2
            ;;
    esac
done

}

运行主函数

main


  1. Yy ↩︎

与你的安装方法无关