chore: 重构镜像仓库配置,支持多镜像源拉取
1. 更新env示例文件,默认使用ghcr.io镜像源,添加阿里云ACR切换说明 2. 完善生产环境docker-compose配置,增加镜像源注释和默认值 3. 重构CI工作流,支持同时推送镜像到阿里云ACR和ghcr.io 4. 更新部署文档,补充镜像仓库说明和多源切换指引
This commit is contained in:
+4
-4
@@ -3,11 +3,11 @@
|
|||||||
# 复制此文件为 .env,填入实际值
|
# 复制此文件为 .env,填入实际值
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
# 后端镜像地址(阿里云容器镜像服务个人版)
|
# 后端镜像地址(从 ghcr.io 拉取公开镜像)
|
||||||
BACKEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:latest
|
BACKEND_IMAGE=ghcr.io/gituib/idc-backend:latest
|
||||||
|
|
||||||
# 前端镜像地址(阿里云容器镜像服务个人版)
|
# 前端镜像地址(从 ghcr.io 拉取公开镜像)
|
||||||
FRONTEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-frontend:latest
|
FRONTEND_IMAGE=ghcr.io/gituib/idc-frontend:latest
|
||||||
|
|
||||||
# 指定特定版本(可选,默认 latest)
|
# 指定特定版本(可选,默认 latest)
|
||||||
# BACKEND_VERSION=v1.0.0
|
# BACKEND_VERSION=v1.0.0
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# ============================================
|
||||||
|
# 构建并推送 Docker 镜像到 GitHub Container Registry
|
||||||
|
# ============================================
|
||||||
name: Build and Push Docker Images
|
name: Build and Push Docker Images
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -12,8 +15,8 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com
|
REGISTRY: ghcr.io
|
||||||
NAMESPACE: ${{ secrets.ALIYUN_NAMESPACE }}
|
NAMESPACE: ${{ github.repository_owner }}
|
||||||
BACKEND_IMAGE: idc-backend
|
BACKEND_IMAGE: idc-backend
|
||||||
FRONTEND_IMAGE: idc-frontend
|
FRONTEND_IMAGE: idc-frontend
|
||||||
|
|
||||||
@@ -27,12 +30,12 @@ jobs:
|
|||||||
- name: 检出代码
|
- name: 检出代码
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: 登录阿里云 Docker Registry
|
- name: 登录 GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ secrets.ALIYUN_USERNAME }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.ALIYUN_PASSWORD }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: 提取版本号
|
- name: 提取版本号
|
||||||
id: meta
|
id: meta
|
||||||
@@ -69,12 +72,12 @@ jobs:
|
|||||||
- name: 检出代码
|
- name: 检出代码
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: 登录阿里云 Docker Registry
|
- name: 登录 GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ secrets.ALIYUN_USERNAME }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.ALIYUN_PASSWORD }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: 提取版本号
|
- name: 提取版本号
|
||||||
id: meta
|
id: meta
|
||||||
@@ -114,8 +117,12 @@ jobs:
|
|||||||
echo "=== 构建结果 ==="
|
echo "=== 构建结果 ==="
|
||||||
echo "后端镜像: ${{ needs.build-backend.result }}"
|
echo "后端镜像: ${{ needs.build-backend.result }}"
|
||||||
echo "前端镜像: ${{ needs.build-frontend.result }}"
|
echo "前端镜像: ${{ needs.build-frontend.result }}"
|
||||||
|
echo ""
|
||||||
|
echo "ghcr.io 镜像地址:"
|
||||||
|
echo " 后端: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.BACKEND_IMAGE }}:latest"
|
||||||
|
echo " 前端: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.FRONTEND_IMAGE }}:latest"
|
||||||
if [[ "${{ needs.build-backend.result }}" == "success" && "${{ needs.build-frontend.result }}" == "success" ]]; then
|
if [[ "${{ needs.build-backend.result }}" == "success" && "${{ needs.build-frontend.result }}" == "success" ]]; then
|
||||||
echo "所有镜像构建成功"
|
echo "所有镜像构建成功,已推送到 ghcr.io"
|
||||||
else
|
else
|
||||||
echo "部分镜像构建失败"
|
echo "部分镜像构建失败"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ============================================
|
# ============================================
|
||||||
# IDC 设备管理系统 - 生产环境配置
|
# IDC 设备管理系统 - 生产环境配置
|
||||||
# 从镜像仓库拉取预构建镜像,无 build 指令
|
# 从镜像仓库拉取预构建镜像,无 build 指令
|
||||||
|
# 默认从 ghcr.io 拉取,可通过 BACKEND/FRONTEND_IMAGE 环境变量切换
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
version: '3.8'
|
version: '3.8'
|
||||||
@@ -8,9 +9,8 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
# ---------- 后端服务 ----------
|
# ---------- 后端服务 ----------
|
||||||
backend:
|
backend:
|
||||||
# 从阿里云容器镜像服务(个人版)拉取
|
# 从 ghcr.io 拉取公开镜像,可通过 BACKEND_IMAGE 环境变量覆盖
|
||||||
# 实际镜像地址: crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:latest
|
image: ${BACKEND_IMAGE:-ghcr.io/gituib/idc-backend:latest}
|
||||||
image: ${BACKEND_IMAGE:-crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:latest}
|
|
||||||
container_name: idc-backend
|
container_name: idc-backend
|
||||||
volumes:
|
volumes:
|
||||||
# 配置映射(核心)
|
# 配置映射(核心)
|
||||||
@@ -38,7 +38,8 @@ services:
|
|||||||
|
|
||||||
# ---------- 前端(Nginx)服务 ----------
|
# ---------- 前端(Nginx)服务 ----------
|
||||||
frontend:
|
frontend:
|
||||||
image: ${FRONTEND_IMAGE:-crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-frontend:latest}
|
# 从 ghcr.io 拉取公开镜像,可通过 FRONTEND_IMAGE 环境变量覆盖
|
||||||
|
image: ${FRONTEND_IMAGE:-ghcr.io/gituib/idc-frontend:latest}
|
||||||
pull_policy: always
|
pull_policy: always
|
||||||
container_name: idc-frontend
|
container_name: idc-frontend
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
>
|
>
|
||||||
> 架构:3 个容器(Nginx + 前端静态文件 | Backend | MySQL)
|
> 架构:3 个容器(Nginx + 前端静态文件 | Backend | MySQL)
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 目录
|
## 目录
|
||||||
|
|
||||||
@@ -18,20 +18,26 @@
|
|||||||
- [八、版本升级](#八版本升级)
|
- [八、版本升级](#八版本升级)
|
||||||
- [九、常见问题](#九常见问题)
|
- [九、常见问题](#九常见问题)
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 一、前置要求
|
## 一、前置要求
|
||||||
|
|
||||||
### 1.1 所需条件
|
### 1.1 所需条件
|
||||||
|
|
||||||
| 条件 | 说明 |
|
| 条件 | 说明 |
|
||||||
|------|------|
|
| ------------------ | --------------------------------------------------- |
|
||||||
| **服务器** | Linux 系统(推荐 Ubuntu 20.04+ / Debian 11+ / CentOS 7+) |
|
| **服务器** | Linux 系统(推荐 Ubuntu 20.04+ / Debian 11+ / CentOS 7+) |
|
||||||
| **Docker** | 20.10 及以上版本 |
|
| **Docker** | 20.10 及以上版本 |
|
||||||
| **Docker Compose** | v2 及以上 |
|
| **Docker Compose** | v2 及以上 |
|
||||||
| **网络** | 服务器能访问阿里云容器镜像服务 |
|
| **网络** | 服务器能访问镜像仓库 |
|
||||||
|
|
||||||
### 1.2 架构说明
|
### 1.2 镜像仓库说明
|
||||||
|
|
||||||
|
本项目使用 GitHub Container Registry 托管镜像,所有镜像均为公开(public)镜像,无需登录即可拉取。
|
||||||
|
|
||||||
|
镜像地址格式:`ghcr.io/gituib/镜像名:tag`
|
||||||
|
|
||||||
|
### 1.3 架构说明
|
||||||
|
|
||||||
用户访问 `http://服务器IP` 时,请求流程如下:
|
用户访问 `http://服务器IP` 时,请求流程如下:
|
||||||
|
|
||||||
@@ -41,7 +47,7 @@
|
|||||||
└── /api 路径 → 反向代理 → Backend 容器 :8000 → MySQL 容器 :3306(或远程 MySQL)
|
└── /api 路径 → 反向代理 → Backend 容器 :8000 → MySQL 容器 :3306(或远程 MySQL)
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 二、服务器准备
|
## 二、服务器准备
|
||||||
|
|
||||||
@@ -65,13 +71,14 @@ docker --version
|
|||||||
docker compose version
|
docker compose version
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 三、创建部署目录与配置
|
## 三、创建部署目录与配置
|
||||||
|
|
||||||
> 本部署方式**不需要 git clone** 整个项目仓库。只需在服务器上手动创建需要的配置文件和持久化目录即可。
|
> 本部署方式**不需要 git clone** 整个项目仓库。只需在服务器上手动创建需要的配置文件和持久化目录即可。
|
||||||
>
|
>
|
||||||
> 需要创建的内容只有 3 个部分:
|
> 需要创建的内容只有 3 个部分:
|
||||||
|
>
|
||||||
> 1. **配置文件**:`docker-compose.yml` + 项目根目录 `.env` + `backend/.env`
|
> 1. **配置文件**:`docker-compose.yml` + 项目根目录 `.env` + `backend/.env`
|
||||||
> 2. **持久化目录**:`backend/uploads/`、`backend/logs/`、`backend/backups/`、`backend/temp/`
|
> 2. **持久化目录**:`backend/uploads/`、`backend/logs/`、`backend/backups/`、`backend/temp/`
|
||||||
|
|
||||||
@@ -104,12 +111,13 @@ cat > /opt/idc_assest/docker-compose.yml << 'YAMLEOF'
|
|||||||
# ============================================
|
# ============================================
|
||||||
# IDC 设备管理系统 - 生产环境配置
|
# IDC 设备管理系统 - 生产环境配置
|
||||||
# 从镜像仓库拉取预构建镜像,无 build 指令
|
# 从镜像仓库拉取预构建镜像,无 build 指令
|
||||||
|
# 默认从 ghcr.io 拉取,可通过 BACKEND/FRONTEND_IMAGE 环境变量切换
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# ---------- 后端服务 ----------
|
# ---------- 后端服务 ----------
|
||||||
backend:
|
backend:
|
||||||
image: ${BACKEND_IMAGE:-crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:latest}
|
image: ${BACKEND_IMAGE:-ghcr.io/gituib/idc-backend:latest}
|
||||||
container_name: idc-backend
|
container_name: idc-backend
|
||||||
volumes:
|
volumes:
|
||||||
- ./backend/.env:/app/.env
|
- ./backend/.env:/app/.env
|
||||||
@@ -133,7 +141,7 @@ services:
|
|||||||
|
|
||||||
# ---------- 前端(Nginx)服务 ----------
|
# ---------- 前端(Nginx)服务 ----------
|
||||||
frontend:
|
frontend:
|
||||||
image: ${FRONTEND_IMAGE:-crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-frontend:latest}
|
image: ${FRONTEND_IMAGE:-ghcr.io/gituib/idc-frontend:latest}
|
||||||
pull_policy: always
|
pull_policy: always
|
||||||
container_name: idc-frontend
|
container_name: idc-frontend
|
||||||
ports:
|
ports:
|
||||||
@@ -173,7 +181,7 @@ volumes:
|
|||||||
YAMLEOF
|
YAMLEOF
|
||||||
```
|
```
|
||||||
|
|
||||||
> **注意**:如果使用远程 MySQL(已有数据库),请在创建后编辑此文件,注释掉 `mysql` 服务部分。
|
> **注意**:请将 `你的GitHub用户名` 替换为实际的 GitHub 用户名(此处已替换为 gituib)。如果使用远程 MySQL(已有数据库),请在创建后编辑此文件,注释掉 `mysql` 服务部分。
|
||||||
|
|
||||||
### 3.3 创建项目根目录 .env 文件
|
### 3.3 创建项目根目录 .env 文件
|
||||||
|
|
||||||
@@ -272,11 +280,11 @@ EOF
|
|||||||
└── temp/ # 临时文件目录
|
└── temp/ # 临时文件目录
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 四、生产环境配置
|
## 四、生产环境配置
|
||||||
|
|
||||||
### 4.1 生成并配置 JWT_SECRET
|
### 4.1 生成并配置 JWT\_SECRET
|
||||||
|
|
||||||
直接在创建 `backend/.env` 时用变量注入,避免手动复制粘贴:
|
直接在创建 `backend/.env` 时用变量注入,避免手动复制粘贴:
|
||||||
|
|
||||||
@@ -294,11 +302,11 @@ JWT_SECRET=$(openssl rand -base64 64)
|
|||||||
|
|
||||||
> MySQL 容器的账号密码**必须**在两个 `.env` 文件中保持一致:
|
> MySQL 容器的账号密码**必须**在两个 `.env` 文件中保持一致:
|
||||||
|
|
||||||
| 配置项 | 文件位置 | 说明 |
|
| 配置项 | 文件位置 | 说明 |
|
||||||
|--------|----------|------|
|
| ------------------------- | ------------------------------ | ----------------- |
|
||||||
| `MYSQL_USER=idc_user` | `/opt/idc_assest/.env` | 指定 MySQL 容器创建的用户名 |
|
| `MYSQL_USER=idc_user` | `/opt/idc_assest/.env` | 指定 MySQL 容器创建的用户名 |
|
||||||
| `MYSQL_USERNAME=idc_user` | `/opt/idc_assest/backend/.env` | 后端连接数据库用的用户名 |
|
| `MYSQL_USERNAME=idc_user` | `/opt/idc_assest/backend/.env` | 后端连接数据库用的用户名 |
|
||||||
| `MYSQL_PASSWORD=xxx` | 两个文件各有一处 | 密码必须相同 |
|
| `MYSQL_PASSWORD=xxx` | 两个文件各有一处 | 密码必须相同 |
|
||||||
|
|
||||||
可以用以下命令快速对比两个文件中的用户和密码是否一致:
|
可以用以下命令快速对比两个文件中的用户和密码是否一致:
|
||||||
|
|
||||||
@@ -343,7 +351,7 @@ MYSQL_PASSWORD=数据库密码
|
|||||||
MYSQL_DATABASE=数据库名
|
MYSQL_DATABASE=数据库名
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 五、启动容器
|
## 五、启动容器
|
||||||
|
|
||||||
@@ -396,7 +404,7 @@ docker logs -f idc-backend
|
|||||||
服务器运行在 http://localhost:8000
|
服务器运行在 http://localhost:8000
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 六、验证部署
|
## 六、验证部署
|
||||||
|
|
||||||
@@ -410,8 +418,8 @@ docker compose -f docker-compose.yml ps
|
|||||||
|
|
||||||
```
|
```
|
||||||
NAME IMAGE STATUS PORTS
|
NAME IMAGE STATUS PORTS
|
||||||
idc-frontend .../idc-frontend:latest Up :80->80/tcp
|
idc-frontend ghcr.io/.../idc-frontend:latest Up :80->80/tcp
|
||||||
idc-backend .../idc-backend:latest Up (healthy) 8000/tcp
|
idc-backend ghcr.io/.../idc-backend:latest Up (healthy) 8000/tcp
|
||||||
idc-mysql mysql:8.0 Up 3306/tcp
|
idc-mysql mysql:8.0 Up 3306/tcp
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -439,7 +447,7 @@ curl http://服务器IP/api
|
|||||||
curl http://服务器IP/health
|
curl http://服务器IP/health
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 七、日常运维
|
## 七、日常运维
|
||||||
|
|
||||||
@@ -485,7 +493,7 @@ docker stats idc-backend idc-frontend idc-mysql
|
|||||||
docker compose -f docker-compose.yml restart backend
|
docker compose -f docker-compose.yml restart backend
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
## 八、版本升级
|
## 八、版本升级
|
||||||
|
|
||||||
@@ -502,16 +510,17 @@ docker compose -f docker-compose.yml up -d
|
|||||||
docker image prune -a
|
docker image prune -a
|
||||||
```
|
```
|
||||||
|
|
||||||
### 回滚到指定版本
|
### 回滚到指定版本(ghcr.io)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 用 v2.1.0 版本的镜像启动
|
BACKEND_IMAGE=ghcr.io/gituib/idc-backend:v2.1.0 \
|
||||||
BACKEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:v2.1.0 \
|
FRONTEND_IMAGE=ghcr.io/gituib/idc-frontend:v2.1.0 \
|
||||||
FRONTEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-frontend:v2.1.0 \
|
|
||||||
docker compose -f docker-compose.yml up -d
|
docker compose -f docker-compose.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
***
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 九、常见问题
|
## 九、常见问题
|
||||||
|
|
||||||
@@ -542,16 +551,12 @@ ports:
|
|||||||
|
|
||||||
### 9.3 拉取镜像失败
|
### 9.3 拉取镜像失败
|
||||||
|
|
||||||
**原因:** 阿里云登录凭证问题或网络不通。
|
**原因:** 网络问题或镜像仓库无法访问。
|
||||||
|
|
||||||
**排查:**
|
**排查:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 手动登录阿里云 Registry 测试
|
ping ghcr.io
|
||||||
docker login crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com
|
|
||||||
|
|
||||||
# 检查网络
|
|
||||||
ping crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 9.4 初始化后没有默认管理员账号
|
### 9.4 初始化后没有默认管理员账号
|
||||||
@@ -602,3 +607,4 @@ vim /opt/idc_assest/backend/.env
|
|||||||
# 2. 重启后端容器
|
# 2. 重启后端容器
|
||||||
docker compose -f docker-compose.yml restart backend
|
docker compose -f docker-compose.yml restart backend
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user