134 lines
4.3 KiB
Bash
134 lines
4.3 KiB
Bash
#!/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 <<EOF
|
||
version: '3.8'
|
||
services:
|
||
telegram-monitor:
|
||
image: $IMAGE_NAME
|
||
container_name: $CONTAINER_NAME
|
||
restart: unless-stopped
|
||
ports:
|
||
- "$PORT:5005"
|
||
volumes:
|
||
- ./data:/app
|
||
environment:
|
||
- ASPNETCORE_ENVIRONMENT=Production
|
||
EOF
|
||
echo -e "${GREEN}配置文件已生成。${PLAIN}"
|
||
|
||
# 6. 启动容器与健康检查
|
||
echo -e "${YELLOW}[6/6] 拉取镜像并启动容器...${PLAIN}"
|
||
|
||
# 判断使用 docker compose 还是 docker-compose
|
||
if docker compose version >/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 |