#!/bin/bash # ================= 颜色定义 ================= RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' BLUE='\033[34m' PLAIN='\033[0m' # ================= 默认配置 ================= DEFAULT_PORT=5005 CONTAINER_NAME="telegram-monitor" IMAGE_NAME="ghcr.io/riniba/telegrammonitor:latest" YML_FILE="${CONTAINER_NAME}.yml" # 检查是否以 root 运行 if [[ $EUID -ne 0 ]]; then echo -e "${RED}错误: 必须使用 root 用户运行此脚本!${PLAIN}" exit 1 fi clear echo -e "${BLUE}====================================================${PLAIN}" echo -e "${BLUE} Telegram Monitor 一键部署脚本 (优化版 v2.0) ${PLAIN}" echo -e "${BLUE}====================================================${PLAIN}" # 1. 检查 Docker 环境 echo -e "${YELLOW}[1/6] 检查 Docker 环境...${PLAIN}" if ! command -v docker &> /dev/null; then echo -e "${RED}未检测到 Docker,请先安装 Docker!${PLAIN}" exit 1 fi echo -e "${GREEN}Docker 已安装。${PLAIN}" # 2. 设置安装路径 echo -e "${YELLOW}[2/6] 配置安装路径...${PLAIN}" read -p "请输入安装路径 (默认: $HOME/telegram-monitor): " INSTALL_DIR if [ -z "$INSTALL_DIR" ]; then INSTALL_DIR="$HOME/telegram-monitor" fi echo -e "安装目录: ${GREEN}$INSTALL_DIR${PLAIN}" # 创建目录 if [ ! -d "$INSTALL_DIR/data" ]; then mkdir -p "$INSTALL_DIR/data" echo -e "已创建数据目录: $INSTALL_DIR/data" fi cd "$INSTALL_DIR" # 3. 设置端口 echo -e "${YELLOW}[3/6] 配置服务端口...${PLAIN}" read -p "请输入宿主机端口 (默认: $DEFAULT_PORT): " PORT if [ -z "$PORT" ]; then PORT=$DEFAULT_PORT fi # 检查端口占用 if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null ; then echo -e "${RED}警告: 端口 $PORT 已经被占用!${PLAIN}" read -p "是否强制继续?(y/n): " FORCE_PORT if [[ "$FORCE_PORT" != "y" ]]; then echo "脚本已取消。" exit 1 fi fi echo -e "使用端口: ${GREEN}$PORT${PLAIN}" # 4. 清理旧容器 echo -e "${YELLOW}[4/6] 清理旧环境...${PLAIN}" if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo -e "${YELLOW}发现同名容器,正在停止并删除...${PLAIN}" docker stop $CONTAINER_NAME >/dev/null 2>&1 docker rm $CONTAINER_NAME >/dev/null 2>&1 echo -e "${GREEN}旧容器已清理。${PLAIN}" fi # 5. 生成配置文件 (符合你的命名习惯) echo -e "${YELLOW}[5/6] 生成配置文件 $YML_FILE ...${PLAIN}" cat > $YML_FILE </dev/null 2>&1; then CMD="docker compose" elif docker-compose version >/dev/null 2>&1; then CMD="docker-compose" else echo -e "${RED}错误: 未找到 docker-compose 插件。尝试直接使用 docker run 启动...${PLAIN}" docker run -d --name $CONTAINER_NAME --restart unless-stopped -p $PORT:5005 -v $INSTALL_DIR/data:/app -e ASPNETCORE_ENVIRONMENT=Production $IMAGE_NAME CMD="docker" fi if [ "$CMD" != "docker" ]; then $CMD -f $YML_FILE up -d fi echo -e "${BLUE}正在进行健康检查 (等待 5 秒)...${PLAIN}" sleep 5 # 检查容器状态 STATUS=$(docker inspect --format='{{.State.Status}}' $CONTAINER_NAME 2>/dev/null) if [ "$STATUS" == "running" ]; then IP=$(hostname -I | awk '{print $1}') echo -e "${BLUE}========================================${PLAIN}" echo -e "${GREEN}✅ 部署成功!${PLAIN}" echo -e "容器状态: ${GREEN}$STATUS${PLAIN}" echo -e "配置文件: $INSTALL_DIR/$YML_FILE" echo -e "数据目录: $INSTALL_DIR/data" echo -e "访问地址: ${GREEN}http://$IP:$PORT${PLAIN}" echo -e "${BLUE}========================================${PLAIN}" else echo -e "${BLUE}========================================${PLAIN}" echo -e "${RED}❌ 部署可能失败,容器状态: $STATUS${PLAIN}" echo -e "${YELLOW}请运行以下命令查看报错日志:${PLAIN}" echo -e "docker logs $CONTAINER_NAME" echo -e "${BLUE}========================================${PLAIN}" fi