#!/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 "========================================"