Files
LiteOps/start-containers.sh
2025-07-11 16:30:39 +08:00

146 lines
3.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # 无颜色
# 设置变量
CONTAINER_IMAGE="liteops/liteops:[最新版本]"
CONTAINER_NAME="liteops"
MYSQL_CONTAINER="liteops-mysql"
MYSQL_VERSION="8"
MYSQL_PASSWORD="1234567xx"
MYSQL_PORT="3306"
NETWORK_NAME="liteops-network"
# 打印带颜色的信息
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_step() {
echo -e "\n${PURPLE}=== $1 ===${NC}"
}
# 等待MySQL就绪的函数
wait_for_mysql() {
local max_attempts=30
local attempt=1
print_info "等待MySQL服务完全启动..."
while [ $attempt -le $max_attempts ]; do
if docker exec $MYSQL_CONTAINER mysqladmin ping -uroot -p$MYSQL_PASSWORD --silent >/dev/null 2>&1; then
print_success "MySQL服务已就绪 (尝试次数: $attempt)"
return 0
fi
print_info "MySQL还未就绪等待中... (尝试 $attempt/$max_attempts)"
sleep 2
attempt=$((attempt + 1))
done
print_error "MySQL在 $((max_attempts * 2)) 秒内未能就绪"
return 1
}
# 导入SQL文件的函数
import_sql_with_retry() {
local max_attempts=3
local attempt=1
while [ $attempt -le $max_attempts ]; do
print_info "尝试导入初始化数据 (尝试 $attempt/$max_attempts)..."
if docker exec -i $MYSQL_CONTAINER mysql -uroot -p$MYSQL_PASSWORD liteops < liteops_init.sql; then
print_success "初始化数据导入成功"
return 0
else
print_warning "初始化数据导入失败,尝试 $attempt/$max_attempts"
if [ $attempt -lt $max_attempts ]; then
print_info "等待5秒后重试..."
sleep 5
fi
attempt=$((attempt + 1))
fi
done
print_error "初始化数据导入失败,已尝试 $max_attempts"
return 1
}
# 创建Docker网络如果不存在
print_step "创建Docker网络"
if ! docker network inspect $NETWORK_NAME >/dev/null 2>&1; then
print_info "创建Docker网络: $NETWORK_NAME"
docker network create $NETWORK_NAME
print_success "网络创建成功"
else
print_info "网络 $NETWORK_NAME 已存在,跳过创建"
fi
# 停止并删除已存在的容器
print_step "清理已存在的容器"
print_info "停止并删除已存在的容器..."
docker stop $CONTAINER_NAME $MYSQL_CONTAINER 2>/dev/null || true
docker rm $CONTAINER_NAME $MYSQL_CONTAINER 2>/dev/null || true
print_success "容器清理完成"
# 启动MySQL容器
print_step "启动MySQL容器"
print_info "启动MySQL $MYSQL_VERSION 容器..."
docker run -d \
--name $MYSQL_CONTAINER \
--network $NETWORK_NAME \
-p $MYSQL_PORT:3306 \
-e MYSQL_ROOT_PASSWORD=$MYSQL_PASSWORD \
-e MYSQL_DATABASE=liteops \
mysql:$MYSQL_VERSION
# 等待MySQL完全就绪
if ! wait_for_mysql; then
print_error "MySQL启动失败退出部署"
exit 1
fi
# 初始化数据库
print_step "初始化数据库"
if ! import_sql_with_retry; then
print_error "数据库初始化失败,退出部署"
exit 1
fi
print_success "数据库初始化完成"
# 启动应用容器
print_step "启动应用容器"
print_info "启动LiteOps容器Docker in Docker模式..."
docker run -d \
--name $CONTAINER_NAME \
--network $NETWORK_NAME \
--privileged \
-p 80:80 \
-p 8900:8900 \
$CONTAINER_IMAGE
print_step "部署完成"
print_success "LiteOps已成功部署"
print_info "前端访问地址: ${CYAN}http://localhost${NC}"
print_info "后端API地址: ${CYAN}http://localhost:8900/api/${NC}"
print_info "MySQL端口映射: ${CYAN}$MYSQL_PORT${NC}"