install.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/bash
  2. #############################################
  3. # SSL Manager 一键安装脚本
  4. #############################################
  5. set -e
  6. echo "🚀 开始安装 SSL 证书管理器..."
  7. # 颜色定义
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. NC='\033[0m' # No Color
  12. # 检查 Node.js
  13. check_node() {
  14. if ! command -v node &> /dev/null; then
  15. echo -e "${RED}❌ 未检测到 Node.js,请先安装 Node.js 18+${NC}"
  16. exit 1
  17. fi
  18. NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
  19. if [ "$NODE_VERSION" -lt 18 ]; then
  20. echo -e "${RED}❌ Node.js 版本过低,需要 18+,当前版本:$(node -v)${NC}"
  21. exit 1
  22. fi
  23. echo -e "${GREEN}✓ Node.js 版本检查通过:$(node -v)${NC}"
  24. }
  25. # 安装 acme.sh(使用 Gitee 镜像)
  26. install_acme() {
  27. echo "📦 安装 acme.sh..."
  28. if [ -f /root/.acme.sh/acme.sh ]; then
  29. echo -e "${YELLOW}⚠️ acme.sh 已安装,跳过${NC}"
  30. else
  31. echo -e "${YELLOW}📌 使用 Gitee 镜像源安装 acme.sh${NC}"
  32. # 从 Gitee 克隆到临时目录,避免冲突
  33. if command -v git &> /dev/null; then
  34. git clone https://gitee.com/Neilpang/acme.sh.git /tmp/acme.sh
  35. cd /tmp/acme.sh
  36. ./acme.sh --install --accountemail "${ACME_EMAIL:-}" --home /root/.acme.sh
  37. rm -rf /tmp/acme.sh
  38. echo -e "${GREEN}✓ acme.sh 安装完成(Gitee 镜像)${NC}"
  39. else
  40. # 备用方案 - 使用 GitHub 镜像站
  41. echo -e "${YELLOW}⚠️ Git 不可用,尝试备用方案...${NC}"
  42. curl -L https://ghproxy.com/https://github.com/acmesh-official/acme.sh/archive/master.tar.gz | tar xz
  43. cd acme.sh-master
  44. ./acme.sh --install --accountemail "${ACME_EMAIL:-}" --home /root/.acme.sh
  45. cd ..
  46. rm -rf acme.sh-master
  47. echo -e "${GREEN}✓ acme.sh 安装完成(GitHub 镜像)${NC}"
  48. fi
  49. fi
  50. }
  51. # 安装后端依赖(使用淘宝镜像)
  52. install_backend() {
  53. echo "📦 安装后端依赖..."
  54. cd "$(dirname "$0")/backend"
  55. # 配置 npm 淘宝镜像
  56. npm config set registry https://registry.npmmirror.com
  57. npm install --production
  58. echo -e "${GREEN}✓ 后端依赖安装完成(淘宝镜像)${NC}"
  59. }
  60. # 安装前端依赖并构建(使用淘宝镜像)
  61. install_frontend() {
  62. echo "📦 安装前端依赖并构建..."
  63. cd "$(dirname "$0")/frontend"
  64. # 配置 npm 淘宝镜像
  65. npm config set registry https://registry.npmmirror.com
  66. npm install
  67. npm run build
  68. echo -e "${GREEN}✓ 前端构建完成(淘宝镜像)${NC}"
  69. }
  70. # 创建日志目录
  71. setup_logs() {
  72. echo "📁 创建日志目录..."
  73. sudo mkdir -p /var/log/ssl-manager
  74. sudo chmod 755 /var/log/ssl-manager
  75. echo -e "${GREEN}✓ 日志目录创建完成${NC}"
  76. }
  77. # 配置环境变量
  78. setup_env() {
  79. echo "⚙️ 配置环境变量..."
  80. cd "$(dirname "$0")/backend"
  81. if [ ! -f .env ]; then
  82. cp .env.example .env
  83. # 生成加密密钥
  84. ENCRYPTION_KEY=$(openssl rand -hex 32)
  85. sed -i "s/your-32-character-secret-key-here/$ENCRYPTION_KEY/" .env
  86. echo -e "${GREEN}✓ 环境配置完成${NC}"
  87. else
  88. echo -e "${YELLOW}⚠️ .env 已存在,跳过${NC}"
  89. fi
  90. }
  91. # 配置 systemd 服务(可选)
  92. setup_systemd() {
  93. echo "🔧 配置 systemd 服务..."
  94. read -p "是否配置 systemd 服务以便开机自启?(y/n): " choice
  95. if [ "$choice" != "y" ]; then
  96. echo -e "${YELLOW}⚠️ 跳过 systemd 配置${NC}"
  97. return
  98. fi
  99. SERVICE_FILE="/etc/systemd/system/ssl-manager.service"
  100. cat > "$SERVICE_FILE" << EOF
  101. [Unit]
  102. Description=SSL Certificate Manager
  103. After=network.target
  104. [Service]
  105. Type=simple
  106. User=root
  107. WorkingDirectory=$(dirname "$0")/backend
  108. ExecStart=/usr/bin/node src/index.js
  109. Restart=always
  110. RestartSec=10
  111. [Install]
  112. WantedBy=multi-user.target
  113. EOF
  114. systemctl daemon-reload
  115. systemctl enable ssl-manager
  116. systemctl start ssl-manager
  117. echo -e "${GREEN}✓ systemd 服务配置完成${NC}"
  118. echo -e "${GREEN} 服务状态:systemctl status ssl-manager${NC}"
  119. }
  120. # 主流程
  121. main() {
  122. echo ""
  123. check_node
  124. echo ""
  125. install_acme
  126. echo ""
  127. install_backend
  128. echo ""
  129. install_frontend
  130. echo ""
  131. setup_logs
  132. echo ""
  133. setup_env
  134. echo ""
  135. setup_systemd
  136. echo ""
  137. echo "=========================================="
  138. echo -e "${GREEN}🎉 安装完成!${NC}"
  139. echo "=========================================="
  140. echo ""
  141. echo "📍 访问地址:http://localhost:3000"
  142. echo "📝 日志文件:/var/log/ssl-manager/renew.log"
  143. echo "🔧 管理服务:systemctl [start|stop|restart|status] ssl-manager"
  144. echo ""
  145. echo -e "${YELLOW}⚠️ 别忘了配置自动续期:${NC}"
  146. echo " chmod +x scripts/auto-renew.sh"
  147. echo " crontab -e"
  148. echo " 添加:0 0 * * * $(dirname "$0")/scripts/auto-renew.sh"
  149. echo ""
  150. }
  151. # 执行
  152. main