flnxi-Wu/scripts/server/setup-registry.sh
WuYongJie f646b71813
Some checks failed
CI Check / check (push) Has been cancelled
chore: 初始化本地仓库并同步最近改动
2025-11-18 17:50:16 +08:00

161 lines
4.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================
# 在 git.1080p.hk 服务器上部署 Docker Registry
# ============================================
set -e
echo "=========================================="
echo "部署 Docker Registry 私有镜像仓库"
echo "=========================================="
echo ""
# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
echo "❌ 错误: 请使用 root 用户或 sudo 运行此脚本"
exit 1
fi
# 配置变量
REGISTRY_PORT="${REGISTRY_PORT:-5000}"
REGISTRY_DOMAIN="${REGISTRY_DOMAIN:-git.1080p.hk}"
REGISTRY_USER="${REGISTRY_USER:-registry-user}"
REGISTRY_PASSWORD="${REGISTRY_PASSWORD:-}"
echo "📋 配置信息:"
echo " 端口: ${REGISTRY_PORT}"
echo " 域名: ${REGISTRY_DOMAIN}"
echo ""
# 创建必要目录
echo "📦 创建目录..."
mkdir -p /var/lib/docker-registry
mkdir -p /etc/docker/registry
mkdir -p /auth
chmod 755 /var/lib/docker-registry
chmod 755 /etc/docker/registry
chmod 755 /auth
echo " ✓ 目录创建完成"
# 生成SSL证书(如果不存在)
if [ ! -f "/etc/docker/registry/domain.crt" ]; then
echo ""
echo "🔐 生成SSL证书..."
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout /etc/docker/registry/domain.key \
-out /etc/docker/registry/domain.crt \
-days 365 \
-subj "/CN=${REGISTRY_DOMAIN}"
echo " ✓ 证书生成完成: /etc/docker/registry/domain.crt"
else
echo " ✓ 证书已存在,跳过生成"
fi
# 创建认证文件(如果提供了密码)
if [ -n "$REGISTRY_PASSWORD" ]; then
echo ""
echo "🔒 创建认证文件..."
docker run --rm --entrypoint htpasswd httpd:2 \
-Bbn "$REGISTRY_USER" "$REGISTRY_PASSWORD" > /auth/htpasswd
echo " ✓ 认证文件创建完成"
echo " 用户名: ${REGISTRY_USER}"
else
echo ""
echo "⚠️ 未提供密码,将创建无认证的Registry(仅内网使用)"
# 创建空认证文件(Registry会忽略)
touch /auth/htpasswd
fi
# 停止现有Registry(如果存在)
if docker ps -a | grep -q docker-registry; then
echo ""
echo "🛑 停止现有Registry..."
docker stop docker-registry 2>/dev/null || true
docker rm docker-registry 2>/dev/null || true
echo " ✓ 已停止"
fi
# 启动Registry
echo ""
echo "🚀 启动Docker Registry..."
# 检查是否使用认证
if [ -n "$REGISTRY_PASSWORD" ] && [ -s "/auth/htpasswd" ]; then
# 使用认证
docker run -d \
--name docker-registry \
--restart=always \
-p ${REGISTRY_PORT}:5000 \
-v /var/lib/docker-registry:/var/lib/registry \
-v /etc/docker/registry:/certs \
-v /auth:/auth \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_PRIVATE_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
registry:2
else
# 不使用认证(仅HTTP,内网使用)
docker run -d \
--name docker-registry \
--restart=always \
-p ${REGISTRY_PORT}:5000 \
-v /var/lib/docker-registry:/var/lib/registry \
registry:2
fi
echo " ✓ Registry已启动"
# 等待服务就绪
echo ""
echo "⏳ 等待服务就绪..."
sleep 3
# 验证部署
echo ""
echo "🔍 验证部署..."
if curl -s http://localhost:${REGISTRY_PORT}/v2/ > /dev/null 2>&1; then
echo " ✓ Registry运行正常"
else
echo " ⚠️ Registry可能还在启动中,请稍后检查"
fi
# 显示配置信息
echo ""
echo "=========================================="
echo "✅ 部署完成!"
echo "=========================================="
echo ""
echo "📋 配置信息:"
echo " 访问地址: http://${REGISTRY_DOMAIN}:${REGISTRY_PORT}"
echo " 存储目录: /var/lib/docker-registry"
echo " 证书目录: /etc/docker/registry"
if [ -n "$REGISTRY_PASSWORD" ]; then
echo " 认证: 已启用"
echo " 用户名: ${REGISTRY_USER}"
else
echo " 认证: 未启用(仅内网使用)"
fi
echo ""
echo "🧪 测试命令:"
echo " # 测试连接"
echo " curl http://${REGISTRY_DOMAIN}:${REGISTRY_PORT}/v2/"
echo ""
if [ -n "$REGISTRY_PASSWORD" ]; then
echo " # 登录"
echo " docker login ${REGISTRY_DOMAIN}:${REGISTRY_PORT}"
echo " 用户名: ${REGISTRY_USER}"
echo " 密码: ${REGISTRY_PASSWORD}"
echo ""
fi
echo " # 推送镜像"
echo " docker tag your-image:latest ${REGISTRY_DOMAIN}:${REGISTRY_PORT}/your-image:latest"
echo " docker push ${REGISTRY_DOMAIN}:${REGISTRY_PORT}/your-image:latest"
echo ""
echo " # 拉取镜像"
echo " docker pull ${REGISTRY_DOMAIN}:${REGISTRY_PORT}/your-image:latest"
echo ""