312 lines
7.6 KiB
PowerShell
312 lines
7.6 KiB
PowerShell
# 创建客户部署包
|
||
# 用于分发给其他公司,实现一键部署
|
||
|
||
[CmdletBinding()]
|
||
param(
|
||
[string]$RegistryHost = "45.249.208.118:5000",
|
||
[string]$PackageName = "customer-deploy-package",
|
||
[string]$OutputDir = "."
|
||
)
|
||
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
Write-Host "===> 创建客户部署包" -ForegroundColor Cyan
|
||
|
||
$packageDir = Join-Path $OutputDir $PackageName
|
||
$packageZip = "$PackageName.zip"
|
||
|
||
# 清理旧包
|
||
if (Test-Path $packageDir) {
|
||
Remove-Item -Path $packageDir -Recurse -Force
|
||
}
|
||
if (Test-Path $packageZip) {
|
||
Remove-Item -Path $packageZip -Force
|
||
}
|
||
|
||
# 创建目录
|
||
New-Item -ItemType Directory -Path $packageDir -Force | Out-Null
|
||
|
||
Write-Host "复制配置文件..." -ForegroundColor Gray
|
||
|
||
# 复制 docker-compose.prod.yml
|
||
if (Test-Path "docker-compose.prod.yml") {
|
||
Copy-Item "docker-compose.prod.yml" "$packageDir/" -Force
|
||
Write-Host "✓ docker-compose.prod.yml" -ForegroundColor Green
|
||
} else {
|
||
Write-Host "✗ 未找到 docker-compose.prod.yml" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
|
||
# 创建 .env.example
|
||
$envExample = @"
|
||
# ============================================
|
||
# 由壹点3D素材 - 环境变量配置
|
||
# ============================================
|
||
|
||
# Registry 配置(必须)
|
||
DOCKER_REGISTRY=$RegistryHost
|
||
IMAGE_TAG=latest
|
||
|
||
# 服务器配置(必须)
|
||
SERVER_IP=您的服务器IP地址
|
||
APP_PORT=4320
|
||
|
||
# 数据库配置(建议修改密码)
|
||
POSTGRES_USER=postgres
|
||
POSTGRES_PASSWORD=请修改为安全密码
|
||
POSTGRES_DB=youyidian3d
|
||
|
||
# MinIO 配置(建议修改密码)
|
||
MINIO_ROOT_USER=minioadmin
|
||
MINIO_ROOT_PASSWORD=请修改为安全密码
|
||
MINIO_API_PORT=9000
|
||
MINIO_CONSOLE_PORT=9001
|
||
S3_BUCKET=youyidian3d
|
||
|
||
# 认证配置(建议修改)
|
||
NEXTAUTH_SECRET=请生成随机密钥(openssl rand -base64 32)
|
||
NEXTAUTH_URL=http://`${SERVER_IP}:`${APP_PORT}
|
||
|
||
# 其他配置(可选)
|
||
NEXT_PUBLIC_S3_FILE_PATH=materials/
|
||
S3_FILE_PATH=materials/
|
||
"@
|
||
|
||
$envExample | Out-File "$packageDir/.env.example" -Encoding UTF8
|
||
Write-Host "✓ .env.example" -ForegroundColor Green
|
||
|
||
# 创建客户 README
|
||
$readme = @"
|
||
# 由壹点3D素材 - 快速部署指南
|
||
|
||
## 🚀 一键部署(3 步完成)
|
||
|
||
### 步骤 1:配置环境变量
|
||
|
||
\`\`\`bash
|
||
# 复制模板
|
||
cp .env.example .env
|
||
|
||
# 编辑配置(使用您喜欢的编辑器)
|
||
nano .env
|
||
# 或
|
||
vi .env
|
||
\`\`\`
|
||
|
||
**必须修改的配置**:
|
||
- \`DOCKER_REGISTRY\` - Registry 地址(已配置,无需修改)
|
||
- \`SERVER_IP\` - 您的服务器 IP 地址
|
||
- \`POSTGRES_PASSWORD\` - 数据库密码(建议修改)
|
||
- \`MINIO_ROOT_PASSWORD\` - 存储密码(建议修改)
|
||
- \`NEXTAUTH_SECRET\` - 认证密钥(建议生成新的)
|
||
|
||
**生成随机密钥**:
|
||
\`\`\`bash
|
||
openssl rand -base64 32
|
||
\`\`\`
|
||
|
||
### 步骤 2:配置 Docker(如果 Registry 使用 HTTP)
|
||
|
||
如果 Registry 使用 HTTP(非 HTTPS),需要配置 Docker 允许不安全的 Registry:
|
||
|
||
\`\`\`bash
|
||
# 创建或编辑 Docker 配置
|
||
cat > /etc/docker/daemon.json <<EOF
|
||
{
|
||
"insecure-registries": ["$RegistryHost"]
|
||
}
|
||
EOF
|
||
|
||
# 重启 Docker
|
||
systemctl restart docker
|
||
\`\`\`
|
||
|
||
**Windows 用户**:
|
||
1. 打开 Docker Desktop
|
||
2. 进入 Settings → Docker Engine
|
||
3. 添加配置:
|
||
\`\`\`json
|
||
{
|
||
"insecure-registries": ["$RegistryHost"]
|
||
}
|
||
\`\`\`
|
||
4. 点击 "Apply & Restart"
|
||
|
||
### 步骤 3:启动服务
|
||
|
||
\`\`\`bash
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
\`\`\`
|
||
|
||
**完成!** 等待 1-2 分钟,访问 \`http://您的服务器IP:4320\`
|
||
|
||
## 📋 验证部署
|
||
|
||
### 检查服务状态
|
||
|
||
\`\`\`bash
|
||
docker compose -f docker-compose.prod.yml ps
|
||
\`\`\`
|
||
|
||
所有服务应该显示为 "Up" 状态。
|
||
|
||
### 查看日志
|
||
|
||
\`\`\`bash
|
||
# 查看所有服务日志
|
||
docker compose -f docker-compose.prod.yml logs -f
|
||
|
||
# 只查看应用日志
|
||
docker compose -f docker-compose.prod.yml logs -f app
|
||
\`\`\`
|
||
|
||
### 访问应用
|
||
|
||
打开浏览器访问:\`http://您的服务器IP:4320\`
|
||
|
||
## 🔧 常用命令
|
||
|
||
### 停止服务
|
||
\`\`\`bash
|
||
docker compose -f docker-compose.prod.yml down
|
||
\`\`\`
|
||
|
||
### 重启服务
|
||
\`\`\`bash
|
||
docker compose -f docker-compose.prod.yml restart
|
||
\`\`\`
|
||
|
||
### 更新镜像
|
||
\`\`\`bash
|
||
# 拉取最新镜像
|
||
docker compose -f docker-compose.prod.yml pull
|
||
|
||
# 重启服务
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
\`\`\`
|
||
|
||
### 查看资源使用
|
||
\`\`\`bash
|
||
docker stats
|
||
\`\`\`
|
||
|
||
## 📞 技术支持
|
||
|
||
如有问题,请联系技术支持。
|
||
|
||
## 📝 系统要求
|
||
|
||
- **操作系统**:Linux(推荐 Ubuntu 20.04+)或 Windows(Docker Desktop)
|
||
- **Docker**:20.10+
|
||
- **Docker Compose**:2.0+
|
||
- **内存**:至少 2GB
|
||
- **磁盘**:至少 20GB
|
||
|
||
## 🔐 安全建议
|
||
|
||
1. **修改默认密码**:生产环境必须修改数据库和 MinIO 密码
|
||
2. **生成随机密钥**:使用 \`openssl rand -base64 32\` 生成 NEXTAUTH_SECRET
|
||
3. **配置防火墙**:只开放必要的端口(4320, 9000, 9001)
|
||
4. **定期备份**:定期备份数据库和上传的文件
|
||
"@
|
||
|
||
$readme | Out-File "$packageDir/README.md" -Encoding UTF8
|
||
Write-Host "✓ README.md" -ForegroundColor Green
|
||
|
||
# 创建快速安装脚本(Linux)
|
||
$installScript = @"
|
||
#!/bin/bash
|
||
# 由壹点3D素材 - 快速安装脚本
|
||
|
||
set -e
|
||
|
||
echo "===> 由壹点3D素材 - 快速安装"
|
||
echo ""
|
||
|
||
# 检查 Docker
|
||
if ! command -v docker &> /dev/null; then
|
||
echo "错误: 未安装 Docker"
|
||
echo "请先安装 Docker: https://docs.docker.com/get-docker/"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查 Docker Compose
|
||
if ! command -v docker compose &> /dev/null; then
|
||
echo "错误: 未安装 Docker Compose"
|
||
echo "请先安装 Docker Compose: https://docs.docker.com/compose/install/"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查配置文件
|
||
if [ ! -f ".env" ]; then
|
||
echo "创建 .env 文件..."
|
||
cp .env.example .env
|
||
echo "⚠ 请编辑 .env 文件,修改必要的配置"
|
||
echo " 必须修改: SERVER_IP, POSTGRES_PASSWORD, MINIO_ROOT_PASSWORD"
|
||
read -p "按 Enter 继续(已编辑 .env 文件)..."
|
||
fi
|
||
|
||
# 配置 Docker(如果需要)
|
||
if [ ! -f "/etc/docker/daemon.json" ] || ! grep -q "insecure-registries" /etc/docker/daemon.json; then
|
||
echo "配置 Docker 允许不安全的 Registry..."
|
||
sudo mkdir -p /etc/docker
|
||
if [ -f "/etc/docker/daemon.json" ]; then
|
||
sudo python3 -c "
|
||
import json
|
||
with open('/etc/docker/daemon.json', 'r') as f:
|
||
config = json.load(f)
|
||
if 'insecure-registries' not in config:
|
||
config['insecure-registries'] = []
|
||
if '$RegistryHost' not in config['insecure-registries']:
|
||
config['insecure-registries'].append('$RegistryHost')
|
||
with open('/etc/docker/daemon.json', 'w') as f:
|
||
json.dump(config, f, indent=2)
|
||
"
|
||
else
|
||
echo "{ \"insecure-registries\": [\"$RegistryHost\"] }" | sudo tee /etc/docker/daemon.json > /dev/null
|
||
fi
|
||
sudo systemctl restart docker
|
||
echo "✓ Docker 配置完成"
|
||
fi
|
||
|
||
# 启动服务
|
||
echo ""
|
||
echo "启动服务..."
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
|
||
echo ""
|
||
echo "等待服务启动..."
|
||
sleep 10
|
||
|
||
# 检查状态
|
||
echo ""
|
||
echo "服务状态:"
|
||
docker compose -f docker-compose.prod.yml ps
|
||
|
||
echo ""
|
||
echo "✓ 安装完成!"
|
||
echo ""
|
||
echo "访问地址: http://\$(grep SERVER_IP .env | cut -d '=' -f2):4320"
|
||
echo ""
|
||
"@
|
||
|
||
$installScript | Out-File "$packageDir/install.sh" -Encoding UTF8 -NoNewline
|
||
# 设置执行权限(Linux 下)
|
||
Write-Host "✓ install.sh" -ForegroundColor Green
|
||
|
||
# 打包
|
||
Write-Host ""
|
||
Write-Host "打包部署包..." -ForegroundColor Gray
|
||
Compress-Archive -Path "$packageDir/*" -DestinationPath $packageZip -Force
|
||
|
||
Write-Host ""
|
||
Write-Host "✓ 客户部署包已创建" -ForegroundColor Green
|
||
Write-Host " 文件: $packageZip" -ForegroundColor Gray
|
||
Write-Host " 大小: $((Get-Item $packageZip).Length / 1KB) KB" -ForegroundColor Gray
|
||
Write-Host ""
|
||
Write-Host "部署包内容:" -ForegroundColor Cyan
|
||
Get-ChildItem $packageDir | ForEach-Object {
|
||
Write-Host " - $($_.Name)" -ForegroundColor Gray
|
||
}
|
||
|