mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-14 05:15:18 +00:00
323 lines
6.2 KiB
Markdown
323 lines
6.2 KiB
Markdown
|
|
# 构建脚本使用指南
|
||
|
|
|
||
|
|
本目录包含用于本地构建和推送 Docker 镜像的自动化脚本。
|
||
|
|
|
||
|
|
## 脚本列表
|
||
|
|
|
||
|
|
### 1. `build-and-push.sh` - 完整构建和推送流程 (推荐)
|
||
|
|
|
||
|
|
**功能**: 完整的构建、测试、推送流程,包含健康检查
|
||
|
|
|
||
|
|
**使用方法**:
|
||
|
|
```bash
|
||
|
|
# 1. 登录 GHCR (如需推送)
|
||
|
|
export CR_PAT=YOUR_PERSONAL_ACCESS_TOKEN
|
||
|
|
echo $CR_PAT | docker login ghcr.io -u ai-friend-coming --password-stdin
|
||
|
|
|
||
|
|
# 2. 运行脚本
|
||
|
|
./scripts/build-and-push.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
**流程**:
|
||
|
|
1. 检查 Git 状态和未提交更改
|
||
|
|
2. 构建 Docker 镜像 (slim 版本)
|
||
|
|
3. 验证镜像大小和 ID
|
||
|
|
4. 运行健康检查测试 (可选)
|
||
|
|
5. 推送镜像到 GHCR (需确认)
|
||
|
|
6. 清理构建缓存 (可选)
|
||
|
|
|
||
|
|
**适用场景**: 正式发布前的完整测试和推送
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 2. `quick-build.sh` - 快速本地构建
|
||
|
|
|
||
|
|
**功能**: 快速构建镜像用于本地测试,不推送
|
||
|
|
|
||
|
|
**使用方法**:
|
||
|
|
```bash
|
||
|
|
./scripts/quick-build.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
**特点**:
|
||
|
|
- 无交互式确认
|
||
|
|
- 仅构建,不推送
|
||
|
|
- 构建速度快 (如有缓存)
|
||
|
|
|
||
|
|
**适用场景**: 本地开发和快速测试
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 3. `simulate-workflow.sh` - 模拟 GitHub Actions
|
||
|
|
|
||
|
|
**功能**: 完整模拟 `.github/workflows/docker-build.yaml` 的执行流程
|
||
|
|
|
||
|
|
**使用方法**:
|
||
|
|
```bash
|
||
|
|
# 设置 CR_PAT (可选)
|
||
|
|
export CR_PAT=YOUR_PERSONAL_ACCESS_TOKEN
|
||
|
|
|
||
|
|
# 运行模拟
|
||
|
|
./scripts/simulate-workflow.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
**特点**:
|
||
|
|
- 模拟 GitHub Actions 环境变量
|
||
|
|
- 创建独立的 Buildx builder
|
||
|
|
- 使用 registry 缓存
|
||
|
|
- 输出格式与 GitHub Actions 一致
|
||
|
|
|
||
|
|
**适用场景**:
|
||
|
|
- 测试 workflow 配置
|
||
|
|
- 在推送代码前验证构建流程
|
||
|
|
- 排查 CI/CD 问题
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 使用示例
|
||
|
|
|
||
|
|
### 场景 1: 本地快速测试
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. 快速构建
|
||
|
|
./scripts/quick-build.sh
|
||
|
|
|
||
|
|
# 2. 运行测试
|
||
|
|
docker run -d -p 8080:8080 ghcr.io/ai-friend-coming/open-webui-next:slim
|
||
|
|
|
||
|
|
# 3. 验证
|
||
|
|
curl http://localhost:8080/health
|
||
|
|
```
|
||
|
|
|
||
|
|
### 场景 2: 发布新版本
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. 确保代码已提交
|
||
|
|
git add .
|
||
|
|
git commit -m "feat: add new feature"
|
||
|
|
git push
|
||
|
|
|
||
|
|
# 2. 登录 GHCR
|
||
|
|
export CR_PAT=ghp_xxxxxxxxxxxx
|
||
|
|
echo $CR_PAT | docker login ghcr.io -u ai-friend-coming --password-stdin
|
||
|
|
|
||
|
|
# 3. 构建和推送
|
||
|
|
./scripts/build-and-push.sh
|
||
|
|
# 按提示操作: 运行健康检查 → 确认推送 → 清理缓存
|
||
|
|
|
||
|
|
# 4. 验证推送成功
|
||
|
|
docker pull ghcr.io/ai-friend-coming/open-webui-next:slim
|
||
|
|
```
|
||
|
|
|
||
|
|
### 场景 3: 测试 GitHub Actions workflow
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. 模拟 workflow 执行
|
||
|
|
export CR_PAT=ghp_xxxxxxxxxxxx
|
||
|
|
./scripts/simulate-workflow.sh
|
||
|
|
|
||
|
|
# 2. 查看构建结果
|
||
|
|
docker images | grep open-webui-next
|
||
|
|
|
||
|
|
# 3. 如果成功,推送代码触发真实 workflow
|
||
|
|
git push origin main
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 环境要求
|
||
|
|
|
||
|
|
### 必需软件
|
||
|
|
|
||
|
|
- **Docker**: 24.0.0+
|
||
|
|
- **Docker Buildx**: v0.11.0+
|
||
|
|
- **Git**: 任意版本
|
||
|
|
- **Bash**: 4.0+
|
||
|
|
|
||
|
|
### 系统要求
|
||
|
|
|
||
|
|
- **内存**: 建议 8GB+
|
||
|
|
- **磁盘空间**: 至少 20GB 可用空间
|
||
|
|
- **网络**: 需要访问 ghcr.io
|
||
|
|
|
||
|
|
### Docker 配置
|
||
|
|
|
||
|
|
确保 Docker 有足够的资源:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Docker Desktop 配置 (推荐):
|
||
|
|
# - Memory: 8GB
|
||
|
|
# - Swap: 2GB
|
||
|
|
# - Disk image size: 64GB
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 常见问题
|
||
|
|
|
||
|
|
### 1. 构建失败 - 内存不足
|
||
|
|
|
||
|
|
**错误信息**:
|
||
|
|
```
|
||
|
|
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
|
||
|
|
```
|
||
|
|
|
||
|
|
**解决方案**:
|
||
|
|
- 确认 `Dockerfile` 第 30 行已启用: `ENV NODE_OPTIONS="--max-old-space-size=4096"`
|
||
|
|
- 增加 Docker Desktop 内存限制到 8GB+
|
||
|
|
|
||
|
|
### 2. 推送失败 - 未登录
|
||
|
|
|
||
|
|
**错误信息**:
|
||
|
|
```
|
||
|
|
unauthorized: authentication required
|
||
|
|
```
|
||
|
|
|
||
|
|
**解决方案**:
|
||
|
|
```bash
|
||
|
|
# 设置 PAT
|
||
|
|
export CR_PAT=ghp_your_token_here
|
||
|
|
|
||
|
|
# 登录 GHCR
|
||
|
|
echo $CR_PAT | docker login ghcr.io -u ai-friend-coming --password-stdin
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 脚本无执行权限
|
||
|
|
|
||
|
|
**错误信息**:
|
||
|
|
```
|
||
|
|
Permission denied
|
||
|
|
```
|
||
|
|
|
||
|
|
**解决方案**:
|
||
|
|
```bash
|
||
|
|
chmod +x scripts/*.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Buildx 不可用
|
||
|
|
|
||
|
|
**错误信息**:
|
||
|
|
```
|
||
|
|
ERROR: buildx: command not found
|
||
|
|
```
|
||
|
|
|
||
|
|
**解决方案**:
|
||
|
|
```bash
|
||
|
|
# 安装 Buildx 插件
|
||
|
|
docker buildx install
|
||
|
|
|
||
|
|
# 或更新 Docker Desktop 到最新版本
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 标签规则
|
||
|
|
|
||
|
|
所有脚本都会生成以下标签:
|
||
|
|
|
||
|
|
| 标签格式 | 示例 | 说明 |
|
||
|
|
|---------|------|------|
|
||
|
|
| `slim` | `ghcr.io/ai-friend-coming/open-webui-next:slim` | 主标签 (main 分支) |
|
||
|
|
| `latest-slim` | `ghcr.io/ai-friend-coming/open-webui-next:latest-slim` | 最新版本 (仅 main 分支) |
|
||
|
|
| `{branch}-slim` | `ghcr.io/ai-friend-coming/open-webui-next:main-slim` | 分支标签 |
|
||
|
|
| `git-{sha}-slim` | `ghcr.io/ai-friend-coming/open-webui-next:git-88396a1-slim` | Git commit 标签 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 安全最佳实践
|
||
|
|
|
||
|
|
### PAT (Personal Access Token) 管理
|
||
|
|
|
||
|
|
1. **权限设置**: 仅授予 `read:packages` 和 `write:packages`
|
||
|
|
2. **存储位置**: 使用环境变量,不要硬编码到脚本
|
||
|
|
3. **轮换周期**: 建议每 90 天轮换一次
|
||
|
|
4. **作用域**: 为不同用途创建不同的 PAT
|
||
|
|
|
||
|
|
### 环境变量设置
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 临时设置 (当前会话)
|
||
|
|
export CR_PAT=ghp_xxxxxxxxxxxx
|
||
|
|
|
||
|
|
# 永久设置 (添加到 ~/.bashrc 或 ~/.zshrc)
|
||
|
|
echo 'export CR_PAT=ghp_xxxxxxxxxxxx' >> ~/.bashrc
|
||
|
|
source ~/.bashrc
|
||
|
|
```
|
||
|
|
|
||
|
|
**注意**: 不要提交 PAT 到 Git 仓库
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 性能优化
|
||
|
|
|
||
|
|
### 使用构建缓存
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 第一次构建会较慢 (5-10 分钟)
|
||
|
|
./scripts/build-and-push.sh
|
||
|
|
|
||
|
|
# 后续构建会使用缓存 (1-2 分钟)
|
||
|
|
# 前提: 没有清理缓存
|
||
|
|
```
|
||
|
|
|
||
|
|
### 并行构建 (高级)
|
||
|
|
|
||
|
|
如果需要同时构建多个变体:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 构建 slim 和 cuda 版本
|
||
|
|
docker buildx build --build-arg USE_SLIM=true -t IMAGE:slim . &
|
||
|
|
docker buildx build --build-arg USE_CUDA=true -t IMAGE:cuda . &
|
||
|
|
wait
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 清理命令
|
||
|
|
|
||
|
|
### 清理所有本地镜像
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 删除所有 open-webui-next 镜像
|
||
|
|
docker images | grep open-webui-next | awk '{print $3}' | xargs docker rmi -f
|
||
|
|
|
||
|
|
# 清理悬空镜像
|
||
|
|
docker image prune -f
|
||
|
|
|
||
|
|
# 清理所有未使用的镜像
|
||
|
|
docker image prune -a -f
|
||
|
|
```
|
||
|
|
|
||
|
|
### 清理构建缓存
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 清理 Buildx 缓存
|
||
|
|
docker buildx prune -f
|
||
|
|
|
||
|
|
# 清理所有 Docker 数据 (谨慎使用)
|
||
|
|
docker system prune -a --volumes -f
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 相关文档
|
||
|
|
|
||
|
|
- [本地推送完整指南](../docs/LOCAL-PUSH-GUIDE.md)
|
||
|
|
- [Docker 部署指南](../docs/DOCKER-DEPLOYMENT.md)
|
||
|
|
- [GitHub Actions Workflow](../.github/workflows/docker-build.yaml)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 获取帮助
|
||
|
|
|
||
|
|
如果遇到问题:
|
||
|
|
|
||
|
|
1. 查看脚本输出的错误信息
|
||
|
|
2. 参考本文档的"常见问题"部分
|
||
|
|
3. 查看详细文档: `docs/LOCAL-PUSH-GUIDE.md`
|
||
|
|
4. 提交 Issue: https://github.com/ai-friend-coming/open-webui-next/issues
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**最后更新**: 2024-11-14
|