#!/bin/bash ############################################# # SSL Manager 一键安装脚本 ############################################# set -e echo "🚀 开始安装 SSL 证书管理器..." # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 检查 Node.js check_node() { if ! command -v node &> /dev/null; then echo -e "${RED}❌ 未检测到 Node.js,请先安装 Node.js 18+${NC}" exit 1 fi NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) if [ "$NODE_VERSION" -lt 18 ]; then echo -e "${RED}❌ Node.js 版本过低,需要 18+,当前版本:$(node -v)${NC}" exit 1 fi echo -e "${GREEN}✓ Node.js 版本检查通过:$(node -v)${NC}" } # 安装 acme.sh(使用 Gitee 镜像) install_acme() { echo "📦 安装 acme.sh..." if [ -f /root/.acme.sh/acme.sh ]; then echo -e "${YELLOW}⚠️ acme.sh 已安装,跳过${NC}" else echo -e "${YELLOW}📌 使用 Gitee 镜像源安装 acme.sh${NC}" # 从 Gitee 克隆到临时目录,避免冲突 if command -v git &> /dev/null; then git clone https://gitee.com/Neilpang/acme.sh.git /tmp/acme.sh cd /tmp/acme.sh ./acme.sh --install --accountemail "${ACME_EMAIL:-}" --home /root/.acme.sh rm -rf /tmp/acme.sh echo -e "${GREEN}✓ acme.sh 安装完成(Gitee 镜像)${NC}" else # 备用方案 - 使用 GitHub 镜像站 echo -e "${YELLOW}⚠️ Git 不可用,尝试备用方案...${NC}" curl -L https://ghproxy.com/https://github.com/acmesh-official/acme.sh/archive/master.tar.gz | tar xz cd acme.sh-master ./acme.sh --install --accountemail "${ACME_EMAIL:-}" --home /root/.acme.sh cd .. rm -rf acme.sh-master echo -e "${GREEN}✓ acme.sh 安装完成(GitHub 镜像)${NC}" fi fi } # 安装后端依赖(使用淘宝镜像) install_backend() { echo "📦 安装后端依赖..." cd "$(dirname "$0")/backend" # 配置 npm 淘宝镜像 npm config set registry https://registry.npmmirror.com npm install --production echo -e "${GREEN}✓ 后端依赖安装完成(淘宝镜像)${NC}" } # 安装前端依赖并构建(使用淘宝镜像) install_frontend() { echo "📦 安装前端依赖并构建..." cd "$(dirname "$0")/frontend" # 配置 npm 淘宝镜像 npm config set registry https://registry.npmmirror.com npm install npm run build echo -e "${GREEN}✓ 前端构建完成(淘宝镜像)${NC}" } # 创建日志目录 setup_logs() { echo "📁 创建日志目录..." sudo mkdir -p /var/log/ssl-manager sudo chmod 755 /var/log/ssl-manager echo -e "${GREEN}✓ 日志目录创建完成${NC}" } # 配置环境变量 setup_env() { echo "⚙️ 配置环境变量..." cd "$(dirname "$0")/backend" if [ ! -f .env ]; then cp .env.example .env # 生成加密密钥 ENCRYPTION_KEY=$(openssl rand -hex 32) sed -i "s/your-32-character-secret-key-here/$ENCRYPTION_KEY/" .env echo -e "${GREEN}✓ 环境配置完成${NC}" else echo -e "${YELLOW}⚠️ .env 已存在,跳过${NC}" fi } # 配置 systemd 服务(可选) setup_systemd() { echo "🔧 配置 systemd 服务..." read -p "是否配置 systemd 服务以便开机自启?(y/n): " choice if [ "$choice" != "y" ]; then echo -e "${YELLOW}⚠️ 跳过 systemd 配置${NC}" return fi SERVICE_FILE="/etc/systemd/system/ssl-manager.service" cat > "$SERVICE_FILE" << EOF [Unit] Description=SSL Certificate Manager After=network.target [Service] Type=simple User=root WorkingDirectory=$(dirname "$0")/backend ExecStart=/usr/bin/node src/index.js Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable ssl-manager systemctl start ssl-manager echo -e "${GREEN}✓ systemd 服务配置完成${NC}" echo -e "${GREEN} 服务状态:systemctl status ssl-manager${NC}" } # 主流程 main() { echo "" check_node echo "" install_acme echo "" install_backend echo "" install_frontend echo "" setup_logs echo "" setup_env echo "" setup_systemd echo "" echo "==========================================" echo -e "${GREEN}🎉 安装完成!${NC}" echo "==========================================" echo "" echo "📍 访问地址:http://localhost:3000" echo "📝 日志文件:/var/log/ssl-manager/renew.log" echo "🔧 管理服务:systemctl [start|stop|restart|status] ssl-manager" echo "" echo -e "${YELLOW}⚠️ 别忘了配置自动续期:${NC}" echo " chmod +x scripts/auto-renew.sh" echo " crontab -e" echo " 添加:0 0 * * * $(dirname "$0")/scripts/auto-renew.sh" echo "" } # 执行 main