#!/usr/bin/env bash # OPSX VPN 管理平台 —— 安装脚本 set -euo pipefail APP_NAME="opsx-vpn" INSTALL_DIR="/opt/${APP_NAME}" CONFIG_DIR="/etc/${APP_NAME}" SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*" >&2; } # 检查 root 权限 if [[ $EUID -ne 0 ]]; then error "请使用 root 或 sudo 执行此脚本" exit 1 fi # 检查二进制文件 BINARY="" if [[ -f "${PROJECT_ROOT}/opsx-vpn" ]]; then BINARY="${PROJECT_ROOT}/opsx-vpn" elif [[ -f "${PROJECT_ROOT}/build/opsx-vpn" ]]; then BINARY="${PROJECT_ROOT}/build/opsx-vpn" else error "未找到 opsx-vpn 二进制文件,请先执行编译" exit 1 fi info "安装 OPSX VPN 管理平台..." # 停止已有服务(如果在运行) if systemctl is-active --quiet "${APP_NAME}" 2>/dev/null; then info "停止现有服务..." systemctl stop "${APP_NAME}" fi # 创建安装目录 info "创建安装目录: ${INSTALL_DIR}" mkdir -p "${INSTALL_DIR}" mkdir -p "${INSTALL_DIR}/data" # 复制二进制文件 info "复制二进制文件..." cp "${BINARY}" "${INSTALL_DIR}/${APP_NAME}" chmod 755 "${INSTALL_DIR}/${APP_NAME}" # 复制前端资源(如果有 dist 目录) if [[ -d "${PROJECT_ROOT}/frontend/dist" ]]; then info "前端资源已内嵌于二进制文件中" fi # 创建默认配置文件 info "创建默认配置: ${CONFIG_DIR}/env" mkdir -p "${CONFIG_DIR}" if [[ ! -f "${CONFIG_DIR}/env" ]]; then cat > "${CONFIG_DIR}/env" << 'EOF' # OPSX VPN 管理平台环境配置 # 监听地址(默认 :8080) VPN_LISTEN_ADDR=:8080 # 数据目录(默认 /opt/opsx-vpn/data) VPN_DATA_DIR=/opt/opsx-vpn/data # 日志保留天数(默认 90 天) VPN_LOG_RETENTION_DAYS=90 # 实例日志轮转:单文件最大大小(默认 50MB) VPN_INSTANCE_LOG_MAX_SIZE=50MB # 实例日志轮转:最大文件数(默认 2) VPN_INSTANCE_LOG_MAX_FILES=2 # 访问日志轮转:单文件最大大小(默认 20MB) VPN_ACCESS_LOG_MAX_SIZE=20MB # 访问日志轮转:最大文件数(默认 3) VPN_ACCESS_LOG_MAX_FILES=3 EOF info "已创建默认配置文件" else warn "配置文件已存在,跳过创建: ${CONFIG_DIR}/env" fi # 安装 systemd 服务 info "安装 systemd 服务..." cp "${SCRIPT_DIR}/${APP_NAME}.service" "${SERVICE_FILE}" systemctl daemon-reload # 启用并启动服务 info "启用并启动服务..." systemctl enable "${APP_NAME}" systemctl start "${APP_NAME}" # 检查服务状态 sleep 2 if systemctl is-active --quiet "${APP_NAME}"; then LISTEN_ADDR=$(grep -E '^VPN_LISTEN_ADDR=' "${CONFIG_DIR}/env" 2>/dev/null | cut -d= -f2 || echo ":8080") echo "" info "============================================" info " OPSX VPN 管理平台安装成功!" info "============================================" info "" info " 访问地址: http://localhost${LISTEN_ADDR}" info " 默认账号: admin / admin123" info "" info " 服务管理:" info " 启动: systemctl start ${APP_NAME}" info " 停止: systemctl stop ${APP_NAME}" info " 状态: systemctl status ${APP_NAME}" info " 日志: journalctl -u ${APP_NAME} -f" info "" info " 配置文件: ${CONFIG_DIR}/env" info " 数据目录: ${INSTALL_DIR}/data" info "============================================" else error "服务启动失败,请检查日志: journalctl -u ${APP_NAME} -n 50" exit 1 fi