blob: b62f2fa2a2ae0f04e040f97936c9a43c9b95ccfa [file] [log] [blame] [raw]
#!/bin/bash
# Docker Bot管理脚本
# 快速启动、停止、重启所有或单个bot
set -e
# Bot列表
BOTS=("tomato" "cyrene" "gold-ship" "lunatalk_private")
# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 显示帮助信息
show_help() {
cat << EOF
📦 Docker Bot 管理脚本
用法: $0 <command> [bot_name]
命令:
start <bot> 启动指定bot (或all启动所有)
stop <bot> 停止指定bot (或all停止所有)
restart <bot> 重启指定bot (或all重启所有)
logs <bot> 查看指定bot日志
status 查看所有bot状态
build 重新构建镜像
clean 清理停止的容器和未使用的卷
可用的bot:
- tomato 西红柿bot
- cyrene Cyrene bot
- gold-ship 黄金船bot
- lunatalk_private LunaTalk Private bot
- all 所有bot
示例:
$0 start tomato 启动tomato bot
$0 stop all 停止所有bot
$0 restart cyrene 重启cyrene bot
$0 logs tomato 查看tomato日志
$0 status 查看所有bot状态
EOF
}
# 检查bot是否有效
check_bot() {
local bot=$1
if [[ "$bot" == "all" ]]; then
return 0
fi
for b in "${BOTS[@]}"; do
if [[ "$b" == "$bot" ]]; then
return 0
fi
done
return 1
}
# 启动bot
start_bot() {
local bot=$1
if [[ "$bot" == "all" ]]; then
echo -e "${GREEN}🚀 启动所有bot...${NC}"
for b in "${BOTS[@]}"; do
start_single_bot "$b"
done
else
start_single_bot "$bot"
fi
}
start_single_bot() {
local bot=$1
echo -e "${GREEN}🚀 启动 ${bot} bot...${NC}"
cd "run/$bot"
if [[ ! -f ".env" ]]; then
echo -e "${RED}❌ 错误: .env 文件不存在${NC}"
echo -e "${YELLOW} 请先复制 .env.example 为 .env 并配置${NC}"
cd ../..
return 1
fi
docker-compose up -d
cd ../..
echo -e "${GREEN}✅ ${bot} bot 启动完成${NC}"
}
# 停止bot
stop_bot() {
local bot=$1
if [[ "$bot" == "all" ]]; then
echo -e "${YELLOW}🛑 停止所有bot...${NC}"
for b in "${BOTS[@]}"; do
stop_single_bot "$b"
done
else
stop_single_bot "$bot"
fi
}
stop_single_bot() {
local bot=$1
echo -e "${YELLOW}🛑 停止 ${bot} bot...${NC}"
cd "run/$bot"
docker-compose down
cd ../..
echo -e "${GREEN}✅ ${bot} bot 已停止${NC}"
}
# 重启bot
restart_bot() {
local bot=$1
if [[ "$bot" == "all" ]]; then
echo -e "${YELLOW}🔄 重启所有bot...${NC}"
for b in "${BOTS[@]}"; do
restart_single_bot "$b"
done
else
restart_single_bot "$bot"
fi
}
restart_single_bot() {
local bot=$1
echo -e "${YELLOW}🔄 重启 ${bot} bot...${NC}"
cd "run/$bot"
docker-compose restart
cd ../..
echo -e "${GREEN}✅ ${bot} bot 重启完成${NC}"
}
# 查看日志
show_logs() {
local bot=$1
echo -e "${GREEN}📋 查看 ${bot} bot 日志...${NC}"
cd "run/$bot"
docker-compose logs -f
cd ../..
}
# 查看状态
show_status() {
echo -e "${GREEN}📊 Bot状态:${NC}"
echo ""
for bot in "${BOTS[@]}"; do
cd "run/$bot"
container_name="claude-bot-${bot//_/-}"
if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then
echo -e " ${GREEN}●${NC} ${bot}: 运行中"
else
echo -e " ${RED}○${NC} ${bot}: 已停止"
fi
cd ../..
done
echo ""
}
# 构建镜像
build_image() {
echo -e "${GREEN}🔨 构建Docker镜像...${NC}"
docker build -t claude-bot:latest .
echo -e "${GREEN}✅ 镜像构建完成${NC}"
}
# 清理
clean_docker() {
echo -e "${YELLOW}🧹 清理Docker资源...${NC}"
docker system prune -f
echo -e "${GREEN}✅ 清理完成${NC}"
}
# 主逻辑
if [[ $# -lt 1 ]]; then
show_help
exit 0
fi
command=$1
bot=${2:-}
case "$command" in
start)
if [[ -z "$bot" ]]; then
echo -e "${RED}❌ 错误: 请指定bot名称或使用 'all'${NC}"
exit 1
fi
if ! check_bot "$bot"; then
echo -e "${RED}❌ 错误: 未知的bot: $bot${NC}"
exit 1
fi
start_bot "$bot"
;;
stop)
if [[ -z "$bot" ]]; then
echo -e "${RED}❌ 错误: 请指定bot名称或使用 'all'${NC}"
exit 1
fi
if ! check_bot "$bot"; then
echo -e "${RED}❌ 错误: 未知的bot: $bot${NC}"
exit 1
fi
stop_bot "$bot"
;;
restart)
if [[ -z "$bot" ]]; then
echo -e "${RED}❌ 错误: 请指定bot名称或使用 'all'${NC}"
exit 1
fi
if ! check_bot "$bot"; then
echo -e "${RED}❌ 错误: 未知的bot: $bot${NC}"
exit 1
fi
restart_bot "$bot"
;;
logs)
if [[ -z "$bot" ]]; then
echo -e "${RED}❌ 错误: 请指定bot名称${NC}"
exit 1
fi
if ! check_bot "$bot"; then
echo -e "${RED}❌ 错误: 未知的bot: $bot${NC}"
exit 1
fi
show_logs "$bot"
;;
status)
show_status
;;
build)
build_image
;;
clean)
clean_docker
;;
help|--help|-h)
show_help
;;
*)
echo -e "${RED}❌ 错误: 未知命令: $command${NC}"
echo ""
show_help
exit 1
;;
esac