161 lines
4.6 KiB
Bash
161 lines
4.6 KiB
Bash
#!/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 ""
|
||
|