flnxi-Wu/scripts/tools/build-and-push.sh
WuYongJie d1c6efc79d
Some checks failed
CI Check / check (push) Has been cancelled
feat: NAS 部署与 Harbor 推送流程
2025-12-03 14:39:06 +08:00

385 lines
7.6 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
# ============================================
# FLNXI素材库 - 构建并推送私有镜像
# 供开发者使用,用于构建和发布镜像
# ============================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo "========================================"
echo " 构建并推送 Docker 私有镜像"
echo "========================================"
echo ""
# 配置项
DOCKER_REGISTRY="${DOCKER_REGISTRY:-your-registry.com}"
IMAGE_NAME="flnxi-material"
DEFAULT_VERSION="1.0.0"
# 读取版本号
echo -e "${BLUE}请输入版本号 (默认: $DEFAULT_VERSION):${NC}"
read -p "版本号: " VERSION
VERSION=${VERSION:-$DEFAULT_VERSION}
FULL_IMAGE_NAME="$DOCKER_REGISTRY/$IMAGE_NAME:$VERSION"
LATEST_IMAGE_NAME="$DOCKER_REGISTRY/$IMAGE_NAME:latest"
echo ""
echo -e "${YELLOW}将构建以下镜像:${NC}"
echo " - $FULL_IMAGE_NAME"
echo " - $LATEST_IMAGE_NAME"
echo ""
read -p "确认继续? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
# 构建镜像
echo ""
echo -e "${BLUE}[1/4]${NC} 构建 Docker 镜像..."
docker build -t $FULL_IMAGE_NAME -t $LATEST_IMAGE_NAME .
echo -e "${GREEN}✓ 镜像构建完成${NC}"
# 测试镜像
echo ""
echo -e "${BLUE}[2/4]${NC} 测试镜像..."
if docker run --rm $FULL_IMAGE_NAME node --version; then
echo -e "${GREEN}✓ 镜像测试通过${NC}"
else
echo -e "${RED}✗ 镜像测试失败${NC}"
exit 1
fi
# 登录到镜像仓库
echo ""
echo -e "${BLUE}[3/4]${NC} 登录到镜像仓库..."
if docker login $DOCKER_REGISTRY; then
echo -e "${GREEN}✓ 登录成功${NC}"
else
echo -e "${RED}✗ 登录失败${NC}"
exit 1
fi
# 推送镜像
echo ""
echo -e "${BLUE}[4/4]${NC} 推送镜像到仓库..."
docker push $FULL_IMAGE_NAME
docker push $LATEST_IMAGE_NAME
echo -e "${GREEN}✓ 镜像推送完成${NC}"
# 显示镜像信息
echo ""
echo "========================================"
echo -e "${GREEN} 构建完成!${NC}"
echo "========================================"
echo ""
echo "镜像信息:"
echo " 版本镜像: $FULL_IMAGE_NAME"
echo " 最新镜像: $LATEST_IMAGE_NAME"
echo ""
echo "镜像大小:"
docker images | grep $IMAGE_NAME | head -2
echo ""
echo "========================================"
# 询问是否生成发布包
echo ""
read -p "是否生成客户发布包? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo ""
echo "生成发布包..."
# 创建发布目录
RELEASE_DIR="release-v$VERSION"
rm -rf $RELEASE_DIR
mkdir -p $RELEASE_DIR
# 复制必要文件
cp docker-compose.prod.yml $RELEASE_DIR/docker-compose.yml
cp .env.template $RELEASE_DIR/.env
cp install.sh $RELEASE_DIR/
cp install-auto.sh $RELEASE_DIR/
cp quick-start.sh $RELEASE_DIR/
cp healthcheck.sh $RELEASE_DIR/
cp test-deployment.sh $RELEASE_DIR/
cp uninstall.sh $RELEASE_DIR/
# 创建镜像信息文件
cat > $RELEASE_DIR/IMAGE_INFO.txt << EOF
镜像信息
========
镜像地址: $FULL_IMAGE_NAME
版本号: $VERSION
构建时间: $(date)
使用方法
========
1. 修改 .env 文件中的 SERVER_IP
2. 执行 chmod +x *.sh
3. 执行 ./install.sh
详细说明请查看 README.md
EOF
# 创建客户端 README
cat > $RELEASE_DIR/README.md << 'EOF'
# FLNXI素材库 - 安装指南
## 系统要求
- Docker 20.10+
- Docker Compose 2.0+
- 2GB+ 内存
- 10GB+ 磁盘空间
## 快速安装
### 1. 解压文件
```bash
tar -xzf flnxi-material-vX.X.X.tar.gz
cd flnxi-material-vX.X.X
```
### 2. 配置环境
编辑 `.env` 文件,修改以下关键配置:
```bash
# 必须修改为服务器实际IP
SERVER_IP=192.168.1.100
# 可选:修改端口
APP_PORT=4320
MINIO_API_PORT=9000
MINIO_CONSOLE_PORT=9001
# 建议修改密码
POSTGRES_PASSWORD=your-strong-password
MINIO_ROOT_PASSWORD=your-strong-password
NEXTAUTH_SECRET=your-random-secret-key
```
### 3. 添加执行权限
```bash
chmod +x *.sh
```
### 4. 运行安装脚本
```bash
./install.sh
```
安装过程大约需要 5-10 分钟。
### 5. 访问系统
安装完成后,通过以下地址访问:
- **应用首页**: http://YOUR_SERVER_IP:4320
- **MinIO控制台**: http://YOUR_SERVER_IP:9001
## 首次使用
1. 访问应用首页
2. 点击「注册」创建账号
3. 设置管理员权限:
```bash
# 方法1: 使用 Prisma Studio
docker compose exec app npx prisma studio
# 方法2: 使用数据库命令
docker compose exec postgres psql -U postgres -d flnxi -c "UPDATE users SET role='ADMIN' WHERE email='your@email.com';"
```
## 常用命令
```bash
# 启动服务
./quick-start.sh
# 或
docker compose up -d
# 停止服务
docker compose down
# 重启服务
docker compose restart
# 查看日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f app
# 查看服务状态
docker compose ps
# 进入容器
docker compose exec app sh
# 数据库管理
docker compose exec app npx prisma studio
```
## 数据备份
### 备份数据库
```bash
docker compose exec postgres pg_dump -U postgres flnxi > backup_$(date +%Y%m%d).sql
```
### 备份文件
```bash
# 备份上传的文件
tar -czf uploads_backup_$(date +%Y%m%d).tar.gz uploads/
# 备份 MinIO 数据
docker compose exec minio tar -czf /tmp/minio_backup.tar.gz /data
docker compose cp minio:/tmp/minio_backup.tar.gz ./minio_backup_$(date +%Y%m%d).tar.gz
```
### 恢复数据库
```bash
docker compose exec -T postgres psql -U postgres flnxi < backup_20240101.sql
```
## 更新升级
```bash
# 1. 停止服务
docker compose down
# 2. 备份数据(重要!)
# 参考上面的备份命令
# 3. 拉取新镜像
docker compose pull
# 4. 启动服务
docker compose up -d
```
## 故障排查
### 服务无法启动
```bash
# 查看详细日志
docker compose logs
# 检查端口占用
netstat -tlnp | grep 4320
```
### 数据库连接失败
```bash
# 检查数据库状态
docker compose ps postgres
# 查看数据库日志
docker compose logs postgres
# 重启数据库
docker compose restart postgres
```
### MinIO 无法访问
```bash
# 检查 MinIO 状态
docker compose ps minio
# 查看 MinIO 日志
docker compose logs minio
# 重新初始化 bucket
docker compose up -d minio-init
```
### 图片无法显示
1. 检查 MinIO 是否正常运行
2. 确认 `.env` 中的 `SERVER_IP` 配置正确
3. 检查防火墙是否开放 MinIO 端口
## 性能优化
### 调整 Docker 资源限制
编辑 `docker-compose.yml`,为服务添加资源限制:
```yaml
services:
app:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
```
### 启用 Nginx 反向代理
建议使用 Nginx 进行反向代理,提供 SSL 支持和缓存功能。
## 安全建议
1. **修改默认密码**: 务必修改 `.env` 中的所有默认密码
2. **启用 HTTPS**: 使用 Nginx + Let's Encrypt 配置 SSL 证书
3. **防火墙配置**: 只开放必要端口(如 80, 443)
4. **定期备份**: 设置自动备份任务
5. **更新系统**: 定期更新 Docker 镜像
## 技术支持
如遇到问题,请提供以下信息:
1. 系统环境(操作系统、Docker 版本)
2. 错误日志(`docker compose logs`)
3. 服务状态(`docker compose ps`)
## 许可证
本软件为商业软件,未经授权不得复制、分发或修改。
EOF
# 打包
tar -czf $RELEASE_DIR.tar.gz $RELEASE_DIR/
echo ""
echo -e "${GREEN}✓ 发布包已生成: $RELEASE_DIR.tar.gz${NC}"
echo ""
echo "发布包内容:"
ls -lh $RELEASE_DIR.tar.gz
echo ""
echo "发布包目录结构:"
tree $RELEASE_DIR/ 2>/dev/null || ls -R $RELEASE_DIR/
fi
echo ""
echo "========================================"
echo "完成!"
echo "========================================"