| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #!/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
|