flnxi-Wu/scripts/tools/install.sh
WuYongJie f646b71813
Some checks failed
CI Check / check (push) Has been cancelled
chore: 初始化本地仓库并同步最近改动
2025-11-18 17:50:16 +08:00

245 lines
7.4 KiB
Bash
Raw 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
# ============================================
# 由壹点3D素材 - 一键安装脚本
# ============================================
set -e
echo "========================================"
echo " 由壹点3D素材 - 一键安装向导"
echo "========================================"
echo ""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 检查是否为root用户
if [ "$EUID" -eq 0 ]; then
echo -e "${YELLOW}警告: 不建议使用root用户运行此脚本${NC}"
read -p "是否继续? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 检查 Docker 是否安装
echo -e "${BLUE}[1/8]${NC} 检查 Docker 环境..."
if ! command -v docker &> /dev/null; then
echo -e "${RED}错误: 未检测到 Docker,请先安装 Docker${NC}"
echo "安装指南: https://docs.docker.com/engine/install/"
exit 1
fi
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo -e "${RED}错误: 未检测到 Docker Compose,请先安装 Docker Compose${NC}"
echo "安装指南: https://docs.docker.com/compose/install/"
exit 1
fi
echo -e "${GREEN}✓ Docker 环境检查通过${NC}"
# 检测 docker-compose 命令
if docker compose version &> /dev/null; then
DOCKER_COMPOSE="docker compose"
else
DOCKER_COMPOSE="docker-compose"
fi
echo -e "${GREEN}✓ 使用命令: $DOCKER_COMPOSE${NC}"
# 创建 .env 文件
echo ""
echo -e "${BLUE}[2/8]${NC} 配置环境变量..."
if [ ! -f .env ]; then
# 自动检测服务器IP
echo "正在自动检测服务器IP地址..."
# 尝试多种方法获取IP
SERVER_IP=""
# 方法1: 通过 ip route 获取
if command -v ip &> /dev/null; then
SERVER_IP=$(ip route get 1 2>/dev/null | awk '{print $7; exit}')
fi
# 方法2: 通过 hostname 获取
if [ -z "$SERVER_IP" ] && command -v hostname &> /dev/null; then
SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
fi
# 方法3: 通过 ifconfig 获取
if [ -z "$SERVER_IP" ] && command -v ifconfig &> /dev/null; then
SERVER_IP=$(ifconfig 2>/dev/null | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | head -n 1)
fi
# 如果自动检测失败,提示用户输入
if [ -z "$SERVER_IP" ]; then
echo -e "${YELLOW}无法自动检测IP地址${NC}"
read -p "请输入服务器IP地址: " SERVER_IP
else
echo -e "${GREEN}检测到服务器IP: $SERVER_IP${NC}"
read -p "是否使用此IP? (Y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Nn]$ ]]; then
read -p "请输入服务器IP地址: " SERVER_IP
fi
fi
# 询问端口配置
echo ""
echo "端口配置 (直接回车使用默认值):"
read -p "应用端口 [4320]: " APP_PORT
APP_PORT=${APP_PORT:-4320}
read -p "MinIO API端口 [9000]: " MINIO_API_PORT
MINIO_API_PORT=${MINIO_API_PORT:-9000}
read -p "MinIO控制台端口 [9001]: " MINIO_CONSOLE_PORT
MINIO_CONSOLE_PORT=${MINIO_CONSOLE_PORT:-9001}
# 生成随机密码
echo ""
echo "生成安全密码..."
POSTGRES_PASSWORD=$(openssl rand -base64 16 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)
MINIO_ROOT_PASSWORD=$(openssl rand -base64 16 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)
NEXTAUTH_SECRET=$(openssl rand -base64 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
# 创建 .env 文件
cat > .env << EOF
# 由壹点3D素材 - 环境配置
# 生成时间: $(date)
# 服务器配置
SERVER_IP=$SERVER_IP
APP_PORT=$APP_PORT
# 数据库配置
POSTGRES_USER=postgres
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
POSTGRES_DB=youyidian3d
# MinIO 配置
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
MINIO_API_PORT=$MINIO_API_PORT
MINIO_CONSOLE_PORT=$MINIO_CONSOLE_PORT
S3_BUCKET=youyidian3d
# 应用安全配置
NEXTAUTH_SECRET=$NEXTAUTH_SECRET
EOF
echo -e "${GREEN}✓ 环境配置文件已创建${NC}"
echo ""
echo -e "${YELLOW}重要信息 (请保存):${NC}"
echo "----------------------------------------"
echo "服务器IP: $SERVER_IP"
echo "应用端口: $APP_PORT"
echo "MinIO控制台: http://$SERVER_IP:$MINIO_CONSOLE_PORT"
echo " - 用户名: minioadmin"
echo " - 密码: $MINIO_ROOT_PASSWORD"
echo "数据库密码: $POSTGRES_PASSWORD"
echo "----------------------------------------"
echo ""
read -p "按回车键继续安装..."
else
echo -e "${GREEN}✓ 检测到已存在的配置文件${NC}"
source .env
fi
# 创建必要的目录
echo ""
echo -e "${BLUE}[3/8]${NC} 创建数据目录..."
mkdir -p uploads
chmod 755 uploads
echo -e "${GREEN}✓ 数据目录创建完成${NC}"
# 停止旧容器(如果存在)
echo ""
echo -e "${BLUE}[4/8]${NC} 清理旧容器..."
$DOCKER_COMPOSE down 2>/dev/null || true
echo -e "${GREEN}✓ 清理完成${NC}"
# 构建镜像
echo ""
echo -e "${BLUE}[5/8]${NC} 构建 Docker 镜像..."
echo "这可能需要几分钟时间,请耐心等待..."
$DOCKER_COMPOSE build --no-cache
echo -e "${GREEN}✓ 镜像构建完成${NC}"
# 启动服务
echo ""
echo -e "${BLUE}[6/8]${NC} 启动服务..."
$DOCKER_COMPOSE up -d
echo -e "${GREEN}✓ 服务启动成功${NC}"
# 等待服务就绪
echo ""
echo -e "${BLUE}[7/8]${NC} 等待服务启动..."
echo "正在等待数据库启动..."
sleep 10
# 检查服务状态
echo ""
echo -e "${BLUE}[8/8]${NC} 检查服务状态..."
$DOCKER_COMPOSE ps
# 初始化数据库
echo ""
echo "初始化数据库..."
max_retries=30
retry_count=0
while [ $retry_count -lt $max_retries ]; do
if $DOCKER_COMPOSE exec -T app npx prisma db push --accept-data-loss 2>/dev/null; then
echo -e "${GREEN}✓ 数据库初始化成功${NC}"
break
else
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
echo "等待应用启动... ($retry_count/$max_retries)"
sleep 5
else
echo -e "${RED}数据库初始化失败,请稍后手动执行:${NC}"
echo " $DOCKER_COMPOSE exec app npx prisma db push"
fi
fi
done
# 显示安装完成信息
echo ""
echo "========================================"
echo -e "${GREEN} 安装完成!${NC}"
echo "========================================"
echo ""
echo -e "${BLUE}访问地址:${NC}"
echo " 应用首页: http://$SERVER_IP:$APP_PORT"
echo " MinIO控制台: http://$SERVER_IP:$MINIO_CONSOLE_PORT"
echo ""
echo -e "${BLUE}MinIO 管理员账号:${NC}"
echo " 用户名: minioadmin"
echo " 密码: $MINIO_ROOT_PASSWORD"
echo ""
echo -e "${BLUE}首次使用:${NC}"
echo " 1. 访问 http://$SERVER_IP:$APP_PORT"
echo " 2. 点击注册创建账号"
echo " 3. 使用以下命令设置管理员权限:"
echo " $DOCKER_COMPOSE exec app npx prisma studio"
echo " 或手动修改数据库中用户的 role 为 ADMIN"
echo ""
echo -e "${BLUE}常用命令:${NC}"
echo " 查看日志: $DOCKER_COMPOSE logs -f"
echo " 重启服务: $DOCKER_COMPOSE restart"
echo " 停止服务: $DOCKER_COMPOSE down"
echo " 启动服务: $DOCKER_COMPOSE up -d"
echo ""
echo -e "${YELLOW}注意事项:${NC}"
echo " - 所有配置信息已保存在 .env 文件中"
echo " - 请妥善保管数据库密码和MinIO密码"
echo " - 数据存储在 Docker volumes 中,卸载前请备份"
echo ""
echo "========================================"