优化:已知问题

This commit is contained in:
2025-07-22 13:27:07 +08:00
parent 2b5ff62ff0
commit 505afb8c0d
29 changed files with 2144 additions and 6 deletions

181
ssl-setup.sh Executable file
View File

@@ -0,0 +1,181 @@
#!/bin/bash
# SSL证书配置脚本
set -e
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查域名
check_domain() {
local domain=$1
if [ -z "$domain" ]; then
log_error "请提供域名"
exit 1
fi
log_info "检查域名: $domain"
if ! nslookup $domain > /dev/null 2>&1; then
log_warning "域名解析失败,请确保域名已正确配置"
fi
}
# 使用Let's Encrypt获取证书
setup_letsencrypt() {
local domain=$1
local email=$2
log_info "使用Let's Encrypt获取SSL证书..."
# 安装certbot
if ! command -v certbot &> /dev/null; then
log_info "安装certbot..."
if command -v apt-get &> /dev/null; then
sudo apt-get update
sudo apt-get install -y certbot
elif command -v yum &> /dev/null; then
sudo yum install -y certbot
else
log_error "无法自动安装certbot请手动安装"
exit 1
fi
fi
# 创建webroot目录
mkdir -p /var/www/certbot
# 获取证书
sudo certbot certonly \
--webroot \
--webroot-path=/var/www/certbot \
--email $email \
--agree-tos \
--no-eff-email \
-d $domain
# 复制证书到项目目录
sudo cp /etc/letsencrypt/live/$domain/fullchain.pem ssl/
sudo cp /etc/letsencrypt/live/$domain/privkey.pem ssl/
sudo chown $(whoami):$(whoami) ssl/*.pem
log_info "SSL证书配置完成"
}
# 生成自签名证书(开发/测试用)
setup_selfsigned() {
local domain=$1
log_info "生成自签名SSL证书..."
# 创建ssl目录
mkdir -p ssl
# 生成私钥
openssl genrsa -out ssl/privkey.pem 2048
# 生成证书
openssl req -new -x509 -key ssl/privkey.pem -out ssl/fullchain.pem -days 365 \
-subj "/C=CN/ST=State/L=City/O=Organization/CN=$domain"
log_warning "已生成自签名证书,仅用于开发/测试环境"
log_warning "生产环境请使用有效的SSL证书"
}
# 配置证书自动续期
setup_auto_renewal() {
local domain=$1
log_info "配置证书自动续期..."
# 创建续期脚本
cat > ssl-renew.sh << EOF
#!/bin/bash
certbot renew --quiet
if [ \$? -eq 0 ]; then
cp /etc/letsencrypt/live/$domain/fullchain.pem ssl/
cp /etc/letsencrypt/live/$domain/privkey.pem ssl/
docker-compose -f docker-compose.prod.yml restart nginx-proxy
fi
EOF
chmod +x ssl-renew.sh
# 添加到crontab
(crontab -l 2>/dev/null; echo "0 3 * * * $(pwd)/ssl-renew.sh") | crontab -
log_info "证书自动续期配置完成"
}
# 主函数
main() {
echo "🔒 SSL证书配置脚本"
echo "=================="
read -p "请输入域名: " DOMAIN
check_domain $DOMAIN
echo ""
echo "请选择证书类型:"
echo "1) Let's Encrypt (免费,推荐生产环境)"
echo "2) 自签名证书 (开发/测试环境)"
echo ""
read -p "请输入选择 (1-2): " choice
case $choice in
1)
read -p "请输入邮箱地址: " EMAIL
if [ -z "$EMAIL" ]; then
log_error "邮箱地址不能为空"
exit 1
fi
setup_letsencrypt $DOMAIN $EMAIL
setup_auto_renewal $DOMAIN
;;
2)
setup_selfsigned $DOMAIN
;;
*)
log_error "无效选择"
exit 1
;;
esac
# 更新nginx配置中的域名
if [ -f "nginx-proxy.conf" ]; then
sed -i "s/your-domain.com/$DOMAIN/g" nginx-proxy.conf
log_info "已更新nginx配置中的域名"
fi
# 更新环境配置
if [ -f ".env.production" ]; then
sed -i "s/DOMAIN=your-domain.com/DOMAIN=$DOMAIN/g" .env.production
log_info "已更新环境配置中的域名"
fi
echo ""
log_info "SSL证书配置完成"
echo "证书文件位置:"
echo " - 证书: ssl/fullchain.pem"
echo " - 私钥: ssl/privkey.pem"
echo ""
echo "现在可以使用HTTPS模式部署:"
echo " ./deploy-prod.sh https"
}
# 运行主函数
main "$@"