feat: 配置本地 Docker Registry 并使用 self-hosted runner

## 主要更改

### 本地 Registry 部署
- 添加 docker-compose 配置部署本地 Docker Registry
- Registry 地址: localhost:5000
- 包含 Web UI (localhost:8888)
- 认证: admin/admin123

### Workflow 优化
- 将 build-and-push job 改为使用 self-hosted runner
- 使用本地 Registry (localhost:5000) 替代远程 Harbor
- 简化镜像推送流程,避免网络超时
- 优先读取 .env.local-registry 配置

### K8s 配置更新
- 更新 ljwx-boot deployment 镜像地址为本地 Registry
- 更新镜像拉取密钥配置
- 支持本地开发和 CI/CD 流程

### 监控工具
- 添加 monitor-deployment.sh 查看部署状态
- 添加 watch-deployment.sh 实时监控

## 部署流程
推送代码 → 本地 self-hosted runner 构建 → 推送到本地 Registry → 部署到 K3s

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
This commit is contained in:
root
2025-12-16 07:35:51 +01:00
co-authored by Claude Sonnet 4.5
parent e8ce4cbed9
commit 00a243580f
8 changed files with 248 additions and 19 deletions
+21
View File
@@ -0,0 +1,21 @@
# 本地 Docker Registry 配置(用于 CI/CD)
# 此文件配置使用本地 Registry 进行镜像构建和部署
# Registry 配置
REGISTRY=localhost:5000
HARBOR_HOST=localhost:5000
HARBOR_PROJECT=ljwx-health
# 版本配置
LJWX_VERSION=2.0.4
# 镜像版本(与 LJWX_VERSION 保持一致)
LJWX_MYSQL_VERSION=2.0.4
LJWX_REDIS_VERSION=2.0.4
LJWX_BOOT_VERSION=2.0.4
LJWX_BIGSCREEN_VERSION=2.0.4
LJWX_ADMIN_VERSION=2.0.4
# Registry 凭据(用于本地开发)
REGISTRY_USERNAME=admin
REGISTRY_PASSWORD=admin123
+17 -18
View File
@@ -40,13 +40,19 @@ jobs:
- name: Load .env configuration
id: config
run: |
if [ -f .env ]; then
source .env
# 优先使用本地 Registry 配置
if [ -f .env.local-registry ]; then
source .env.local-registry
echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
echo "harbor_host=${HARBOR_HOST}" >> $GITHUB_OUTPUT
echo "harbor_project=${HARBOR_PROJECT}" >> $GITHUB_OUTPUT
elif [ -f .env ]; then
source .env
echo "registry=${REGISTRY:-localhost:5000}" >> $GITHUB_OUTPUT
echo "harbor_host=${HARBOR_HOST:-localhost:5000}" >> $GITHUB_OUTPUT
echo "harbor_project=${HARBOR_PROJECT:-ljwx-health}" >> $GITHUB_OUTPUT
else
echo "registry=harbor.omniverseai.net/health" >> $GITHUB_OUTPUT
echo "registry=localhost:5000" >> $GITHUB_OUTPUT
fi
- name: Determine version
@@ -80,7 +86,7 @@ jobs:
build-and-push:
name: Build and Push ${{ matrix.component }}
needs: prepare
runs-on: ubuntu-latest
runs-on: self-hosted
strategy:
fail-fast: false
matrix:
@@ -95,12 +101,9 @@ jobs:
with:
platforms: linux/amd64,linux/arm64
- name: Log in to Harbor
uses: docker/login-action@v3
with:
registry: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Log in to Local Registry
run: |
echo "admin123" | docker login localhost:5000 -u admin --password-stdin
- name: Prepare build context
id: context
@@ -191,16 +194,12 @@ jobs:
run: |
kubectl create namespace ljwx-health --dry-run=client -o yaml | kubectl apply -f -
- name: Create Harbor image pull secret
env:
HARBOR_HOST: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
- name: Create Local Registry image pull secret
run: |
kubectl create secret docker-registry harbor-secret \
--docker-server=${HARBOR_HOST} \
--docker-username=${HARBOR_USERNAME} \
--docker-password=${HARBOR_PASSWORD} \
--docker-server=localhost:5000 \
--docker-username=admin \
--docker-password=admin123 \
--namespace=ljwx-health \
--dry-run=client -o yaml | kubectl apply -f -
+2
View File
@@ -0,0 +1,2 @@
admin:$2y$05$DtBHPQ2Xl6BaiRU.W5BZ0uv1Ilcq64LW5oWH4e2jgk/nMQe6ou3GC
+46
View File
@@ -0,0 +1,46 @@
version: '3.8'
services:
registry:
image: registry:2
container_name: local-harbor-registry
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- ./data/registry:/var/lib/registry
- ./auth:/auth
networks:
- harbor
registry-ui:
image: joxit/docker-registry-ui:latest
container_name: local-harbor-ui
restart: always
ports:
- "8888:80"
environment:
- SINGLE_REGISTRY=true
- REGISTRY_TITLE=LJWX Health Registry
- DELETE_IMAGES=true
- SHOW_CONTENT_DIGEST=true
- NGINX_PROXY_PASS_URL=http://registry:5000
- SHOW_CATALOG_NB_TAGS=true
- CATALOG_MIN_BRANCHES=1
- CATALOG_MAX_BRANCHES=1
- TAGLIST_PAGE_SIZE=100
- REGISTRY_SECURED=false
- CATALOG_ELEMENTS_LIMIT=1000
networks:
- harbor
depends_on:
- registry
networks:
harbor:
driver: bridge
+71
View File
@@ -0,0 +1,71 @@
#!/bin/bash
set -e
echo "========================================="
echo "🚀 本地 Docker Registry 部署脚本"
echo "========================================="
echo ""
HARBOR_DIR="/root/codes/ljwx-health/harbor"
cd "$HARBOR_DIR"
# 创建必要的目录
echo "📁 创建数据目录..."
mkdir -p data/registry
mkdir -p auth
# 生成 htpasswd 文件(admin/admin123)
echo "🔐 创建认证文件..."
if command -v htpasswd &> /dev/null; then
htpasswd -Bbn admin admin123 > auth/htpasswd
else
# 如果没有 htpasswd 命令,使用 docker 生成
docker run --rm --entrypoint htpasswd httpd:2 -Bbn admin admin123 > auth/htpasswd
fi
echo "✅ 认证文件已创建"
cat auth/htpasswd
echo ""
# 停止并删除旧容器
echo "🧹 清理旧容器..."
docker compose down -v 2>/dev/null || true
echo ""
echo "🐳 启动 Docker Registry..."
docker compose up -d
echo ""
echo "⏳ 等待 Registry 启动 (10秒)..."
sleep 10
# 测试连接
echo ""
echo "🔍 测试 Registry 连接..."
if curl -s -f http://localhost:5000/v2/ > /dev/null; then
echo "✅ Registry API 可访问"
else
echo "⚠️ Registry API 尚未就绪,请稍等片刻"
fi
echo ""
echo "========================================="
echo "✅ Docker Registry 部署完成!"
echo "========================================="
echo ""
echo "📦 Registry 信息:"
echo " - Registry API: http://localhost:5000"
echo " - Web UI: http://localhost:8888"
echo " - 用户名: admin"
echo " - 密码: admin123"
echo ""
echo "🔧 Docker 登录:"
echo " docker login localhost:5000 -u admin -p admin123"
echo ""
echo "📝 推送镜像示例:"
echo " docker tag myimage:latest localhost:5000/ljwx-health/myimage:latest"
echo " docker push localhost:5000/ljwx-health/myimage:latest"
echo ""
echo "🌐 查看所有仓库:"
echo " curl -u admin:admin123 http://localhost:5000/v2/_catalog"
echo ""
+1 -1
View File
@@ -46,7 +46,7 @@ spec:
containers:
- name: ljwx-boot
image: harbor.omniverseai.net/ljwx-health/ljwx-boot:latest
image: localhost:5000/ljwx-health/ljwx-boot:latest
imagePullPolicy: Always
ports:
+67
View File
@@ -0,0 +1,67 @@
#!/bin/bash
# 监控 ljwx-health 部署状态
echo "========================================="
echo "📊 LJWX Health 部署状态监控"
echo "========================================="
echo ""
# 设置颜色
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 检查 namespace
echo -e "${YELLOW}[1/5] 检查 Namespace...${NC}"
kubectl get ns ljwx-health -o wide
echo ""
# 检查 Secrets
echo -e "${YELLOW}[2/5] 检查 Secrets...${NC}"
kubectl get secrets -n ljwx-health | grep -E "NAME|harbor-secret|ljwx-boot-secret"
echo ""
# 检查 Deployments
echo -e "${YELLOW}[3/5] 检查 Deployments...${NC}"
kubectl get deployments -n ljwx-health -o wide
echo ""
# 检查 Pods
echo -e "${YELLOW}[4/5] 检查 Pods...${NC}"
kubectl get pods -n ljwx-health -o wide
echo ""
# 检查最近的 Events
echo -e "${YELLOW}[5/5] 最近的 Events (最后 10 条)...${NC}"
kubectl get events -n ljwx-health --sort-by='.lastTimestamp' | tail -10
echo ""
# 健康状态摘要
echo "========================================="
echo "📈 健康状态摘要"
echo "========================================="
TOTAL_PODS=$(kubectl get pods -n ljwx-health --no-headers 2>/dev/null | wc -l | tr -d ' ')
RUNNING_PODS=$(kubectl get pods -n ljwx-health --field-selector=status.phase=Running --no-headers 2>/dev/null | wc -l | tr -d ' ')
READY_PODS=$(kubectl get pods -n ljwx-health -o json 2>/dev/null | jq '[.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True"))] | length' 2>/dev/null || echo "0")
echo "总 Pods: $TOTAL_PODS"
echo "运行中: $RUNNING_PODS"
echo "就绪: $READY_PODS"
if [ "$READY_PODS" = "$TOTAL_PODS" ] && [ "$TOTAL_PODS" -gt 0 ]; then
echo -e "${GREEN}✅ 所有 Pods 已就绪!${NC}"
else
echo -e "${YELLOW}⚠️ 部分 Pods 未就绪,请检查详细信息${NC}"
fi
echo ""
echo "========================================="
echo "💡 实用命令"
echo "========================================="
echo "查看 ljwx-boot 日志: kubectl logs -f deployment/ljwx-boot -n ljwx-health"
echo "查看 ljwx-bigscreen 日志: kubectl logs -f deployment/ljwx-bigscreen -n ljwx-health"
echo "查看所有资源: kubectl get all -n ljwx-health"
echo "重新运行此脚本: ./monitor-deployment.sh"
echo ""
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# 实时监控 ljwx-health 部署变化
echo "========================================="
echo "🔍 实时监控 ljwx-health 部署 (每 5 秒刷新)"
echo "========================================="
echo "按 Ctrl+C 停止监控"
echo ""
sleep 2
# 使用 watch 命令实时监控
watch -n 5 -c '
echo "📊 Deployments:"
kubectl get deployments -n ljwx-health -o wide
echo ""
echo "🐳 Pods:"
kubectl get pods -n ljwx-health -o wide
echo ""
echo "🔑 Secrets:"
kubectl get secrets -n ljwx-health | grep -E "NAME|harbor|ljwx"
echo ""
echo "⏰ 更新时间: $(date +"%Y-%m-%d %H:%M:%S")"
'