# FLNXI素材库 - 开发者打包指南 ## 📦 打包流程总览 本文档说明如何将项目打包成可销售的私有镜像产品。 ## 🎯 打包方案架构 ### 完整架构图 ``` ┌─────────────────────────────────────────────┐ │ 开发环境 │ │ ┌────────────────────────────────┐ │ │ │ 源代码 + Dockerfile │ │ │ └────────────┬───────────────────┘ │ │ │ build & push │ │ ↓ │ │ ┌────────────────────────────────┐ │ │ │ 私有Docker镜像仓库 │ │ │ │ (Harbor/阿里云/Docker Hub) │ │ │ └────────────┬───────────────────┘ │ └───────────────┼──────────────────────────────┘ │ │ 提供给客户 ↓ ┌─────────────────────────────────────────────┐ │ 客户环境 │ │ ┌────────────────────────────────┐ │ │ │ 发布包 (release-vX.X.X) │ │ │ │ - docker-compose.yml │ │ │ │ - .env │ │ │ │ - install.sh │ │ │ └────────────┬───────────────────┘ │ │ │ ./install.sh │ │ ↓ │ │ ┌────────────────────────────────┐ │ │ │ 完整系统运行 │ │ │ │ - 应用 (私有镜像) │ │ │ │ - PostgreSQL │ │ │ │ - MinIO │ │ │ └────────────────────────────────┘ │ └─────────────────────────────────────────────┘ ``` ## 📋 准备工作 ### 1. 配置私有镜像仓库 选择以下任一方案: #### 方案A: Docker Hub 私有仓库 ```bash # 注册 Docker Hub 账号: https://hub.docker.com/ # 创建私有仓库 # 设置环境变量 export DOCKER_REGISTRY=yourusername ``` #### 方案B: 阿里云容器镜像服务 ```bash # 登录: https://cr.console.aliyun.com/ # 创建命名空间和仓库 # 设置环境变量 export DOCKER_REGISTRY=registry.cn-hangzhou.aliyuncs.com/your_namespace ``` #### 方案C: 自建 Harbor ```bash # 部署 Harbor: https://goharbor.io/ # 创建项目 # 设置环境变量 export DOCKER_REGISTRY=your-harbor.com/project ``` ### 2. 修改构建脚本 编辑 `build-and-push.sh`: ```bash # 修改默认仓库地址 DOCKER_REGISTRY="${DOCKER_REGISTRY:-your-registry.com}" ``` ## 🚀 打包步骤 ### 第一步: 构建并推送镜像 ```bash # 给脚本添加执行权限(Linux/Mac) chmod +x build-and-push.sh # Windows 用户在 Git Bash 中执行 # 或使用 WSL # 执行构建 ./build-and-push.sh ``` 脚本会提示: 1. 输入版本号(如: 1.0.0) 2. 确认构建信息 3. 自动构建、测试、推送镜像 4. 询问是否生成发布包 ### 第二步: 验证镜像 ```bash # 检查镜像是否存在 docker images | grep flnxi-material # 测试镜像 docker run --rm your-registry.com/flnxi-material:1.0.0 node --version ``` ### 第三步: 生成发布包 构建脚本会自动生成 `release-vX.X.X.tar.gz`,包含: ``` release-v1.0.0/ ├── docker-compose.yml # 生产环境配置 ├── .env # 环境变量模板 ├── install.sh # 一键安装脚本 ├── quick-start.sh # 快速启动 ├── healthcheck.sh # 健康检查 ├── uninstall.sh # 卸载脚本 ├── README.md # 客户使用文档 ├── IMAGE_INFO.txt # 镜像信息 └── VERSION.txt # 版本信息 ``` ## 📁 发布包文件说明 ### docker-compose.yml 使用 `docker-compose.prod.yml` 作为模板,特点: - 使用 `image:` 拉取私有镜像,而非 `build:` - 包含 PostgreSQL 和 MinIO - 支持环境变量配置 - 包含健康检查 ### .env 环境配置文件,客户需要修改: - `SERVER_IP`: 服务器IP地址(必须) - `APP_PORT`: 应用端口(可选) - `POSTGRES_PASSWORD`: 数据库密码(建议修改) - `MINIO_ROOT_PASSWORD`: MinIO密码(建议修改) ### install.sh 一键安装脚本,功能: - ✅ 检查 Docker 环境 - ✅ 自动检测服务器 IP - ✅ 生成随机密码 - ✅ 创建配置文件 - ✅ 拉取镜像 - ✅ 启动服务 - ✅ 初始化数据库 - ✅ 配置 MinIO bucket ## 🔐 镜像访问控制 ### 方式1: 镜像仓库权限控制 ```bash # 为客户创建只读账号 # Docker Hub: 添加 Collaborator # Harbor: 创建 Robot Account # 阿里云: 创建子账号 # 客户使用时需要登录 docker login your-registry.com # 输入提供的账号密码 ``` ### 方式2: License Key 验证 在应用代码中添加 License 验证: ```typescript // lib/license.ts export async function verifyLicense() { const licenseKey = process.env.LICENSE_KEY if (!licenseKey) { throw new Error('License key is required') } // 验证逻辑 // 1. 检查格式 // 2. 验证签名 // 3. 检查过期时间 // 4. 可选:联网验证 return true } // middleware.ts 或 app/layout.tsx import { verifyLicense } from '@/lib/license' if (!await verifyLicense()) { throw new Error('Invalid license') } ``` ## 🎁 交付给客户 ### 交付清单 1. **发布包**: `release-v1.0.0.tar.gz` 2. **镜像访问凭证**(如需要): - 仓库地址 - 用户名 - 密码 3. **License Key**(如实施) 4. **安装文档**: 发布包内的 `README.md` 5. **技术支持方式** ### 交付方式 #### 方式A: 在线下载 ```bash # 客户执行 wget https://your-domain.com/releases/flnxi-material-v1.0.0.tar.gz # 或 curl -O https://your-domain.com/releases/flnxi-material-v1.0.0.tar.gz ``` #### 方式B: 私有下载链接 使用云存储服务生成临时下载链接(24小时有效) #### 方式C: 物理介质 刻录到U盘或光盘,适用于无法联网的环境 ### 客户安装步骤 ```bash # 1. 解压 tar -xzf flnxi-material-v1.0.0.tar.gz cd flnxi-material-v1.0.0 # 2. 配置 vim .env # 修改 SERVER_IP # 3. 安装 chmod +x *.sh ./install.sh # 4. 访问 # http://SERVER_IP:4320 ``` ## 🔄 版本更新流程 ### 发布新版本 ```bash # 1. 更新代码 git pull git checkout main # 2. 修改版本号 vim package.json # 更新 version vim VERSION.txt # 添加更新日志 # 3. 构建新版本 ./build-and-push.sh # 输入新版本号,如: 1.1.0 # 4. 测试新版本 # 在测试环境验证 # 5. 发布 # 将 release-v1.1.0.tar.gz 提供给客户 ``` ### 客户升级步骤 ```bash # 1. 备份数据 docker compose exec postgres pg_dump -U postgres flnxi > backup.sql tar -czf uploads_backup.tar.gz uploads/ # 2. 下载新版本配置 # 获取新的 docker-compose.yml(如有变化) # 3. 停止服务 docker compose down # 4. 更新镜像 # 方法1: 修改 .env 中的 IMAGE_TAG vim .env # IMAGE_TAG=1.1.0 docker compose pull # 方法2: 直接拉取 docker pull your-registry.com/flnxi-material:1.1.0 # 5. 启动服务 docker compose up -d # 6. 验证 ./test-deployment.sh ``` ## 📊 打包检查清单 在发布前,确认以下事项: - [ ] 代码已提交到主分支 - [ ] 版本号已更新(package.json, VERSION.txt) - [ ] 镜像构建成功 - [ ] 镜像已推送到仓库 - [ ] 发布包已生成 - [ ] 在测试环境验证安装 - [ ] 所有脚本有执行权限 - [ ] 文档已更新 - [ ] LICENSE 验证正常(如有) - [ ] 准备好技术支持 ## 🧪 测试和验证 ### 本地测试 ```bash # 1. 解压发布包 tar -xzf release-v1.0.0.tar.gz cd release-v1.0.0 # 2. 配置环境 cp .env .env.test vim .env.test # 设置测试配置 # 3. 安装 ./install.sh # 4. 运行测试 ./test-deployment.sh # 5. 功能测试 # - 注册账号 # - 上传素材 # - 下载素材 # - 管理功能 # 6. 清理 ./uninstall.sh ``` ### 性能测试 ```bash # 并发测试 ab -n 1000 -c 10 http://localhost:4320/ # 大文件上传测试 # 通过界面上传 100MB+ 文件 # 资源监控 docker stats ``` ## 📝 常见问题 ### Q: 如何处理敏感信息? A: 1. 不要在镜像中硬编码密码 2. 使用环境变量 3. 提供 .env.template 而非实际配置 4. 文档中说明需要修改的配置 ### Q: 如何防止客户转售? A: 1. 实施 License Key 验证 2. 绑定硬件信息(MAC地址) 3. 在用户协议中明确禁止 4. 联网验证(可选) ### Q: 如何支持离线安装? A: 1. 将镜像导出: `docker save -o image.tar` 2. 在发布包中包含镜像文件 3. 修改 install.sh 从本地加载镜像 4. 缺点:包体积大 ### Q: 如何提供试用版? A: 1. 生成 30 天试用 License 2. 限制功能(如用户数) 3. 在应用中检查 License 过期时间 ### Q: 客户无法访问镜像仓库怎么办? A: 1. 检查仓库是否公开(或提供了凭证) 2. 检查网络连接 3. 提供国内镜像源 4. 提供离线安装包 ## 🎯 最佳实践 1. **版本管理** - 使用语义化版本号(Semantic Versioning) - 保持向后兼容 - 提供升级文档 2. **文档完善** - 详细的安装文档 - 清晰的故障排查指南 - 常见问题 FAQ 3. **自动化测试** - 每次发布前运行测试脚本 - 验证所有功能 - 记录测试结果 4. **客户支持** - 提供技术支持渠道 - 收集客户反馈 - 持续改进产品 5. **安全性** - 定期更新依赖 - 修复安全漏洞 - 及时发布补丁 ## 📞 需要帮助? 如在打包过程中遇到问题: 1. 检查 `build-and-push.sh` 的输出 2. 验证镜像仓库配置 3. 查看 Docker 构建日志 4. 在测试环境验证 --- **祝打包顺利!🚀**