优化探针部署命令

This commit is contained in:
dushixiang authored and XiaoTan committed 2025-11-28 07:10:02 +00:00
1 parent 935bcaa8ed
commit cef231e045
4 files changed
+182 -40

No files matched your search

+1
View File
@@ -135,6 +135,7 @@ func setupApi(app *orz.App, components *AppComponents) {
// Agent 版本和下载(完全公开,无需任何认证)
publicApi.GET("/agent/version", components.AgentHandler.GetAgentVersion)
publicApi.GET("/agent/downloads/:filename", components.AgentHandler.DownloadAgent)
publicApi.GET("/agent/install.sh", components.AgentHandler.GetInstallScript)
}
// 公开接口(支持可选认证)- 已登录返回全部数据,未登录只返回公开数据
+145
View File
@@ -802,3 +802,148 @@ func (h *AgentHandler) GetTags(c echo.Context) error {
"tags": tags,
})
}
// GetInstallScript 生成自动安装脚本
func (h *AgentHandler) GetInstallScript(c echo.Context) error {
token := c.QueryParam("token")
if token == "" {
return orz.NewError(400, "token不能为空")
}
serverUrl := c.Scheme() + "://" + c.Request().Host
script := `#!/bin/bash
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
echo_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
echo_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
echo_error "请使用 root 权限运行此脚本"
echo_info "使用方式: sudo bash install.sh"
exit 1
fi
# 检测操作系统和架构
detect_platform() {
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
case "$ARCH" in
x86_64)
ARCH="amd64"
;;
aarch64|arm64)
ARCH="arm64"
;;
*)
echo_error "不支持的架构: $ARCH"
exit 1
;;
esac
case "$OS" in
linux)
PLATFORM="linux-$ARCH"
AGENT_NAME="pika-agent"
;;
darwin)
PLATFORM="darwin-$ARCH"
AGENT_NAME="pika-agent"
;;
*)
echo_error "不支持的操作系统: $OS"
exit 1
;;
esac
echo_info "检测到平台: $PLATFORM"
}
# 下载探针
download_agent() {
local download_url="` + serverUrl + `/api/agent/downloads/agent-$PLATFORM"
local temp_file="/tmp/pika-agent-download"
echo_info "正在下载探针..."
if command -v wget &> /dev/null; then
wget -q --show-progress "$download_url" -O "$temp_file"
elif command -v curl &> /dev/null; then
curl -# -L "$download_url" -o "$temp_file"
else
echo_error "未找到 wget 或 curl 命令,请先安装其中之一"
exit 1
fi
if [ ! -f "$temp_file" ]; then
echo_error "下载失败"
exit 1
fi
# 移动到目标位置
mv "$temp_file" "/usr/local/bin/$AGENT_NAME"
chmod +x "/usr/local/bin/$AGENT_NAME"
echo_info "探针下载完成: /usr/local/bin/$AGENT_NAME"
}
# 注册并启动服务
register_agent() {
local endpoint="` + serverUrl + `"
local token="` + token + `"
echo_info "正在注册探针..."
if /usr/local/bin/$AGENT_NAME register --endpoint "$endpoint" --token "$token"; then
echo_info "探针注册成功"
else
echo_error "探针注册失败"
exit 1
fi
}
# 主流程
main() {
echo_info "开始安装 Pika Agent..."
echo ""
detect_platform
download_agent
register_agent
echo ""
echo_info "=========================================="
echo_info "安装完成!"
echo_info "=========================================="
echo ""
echo_info "常用命令:"
echo " 查看状态: pika-agent status"
echo " 启动服务: pika-agent start"
echo " 停止服务: pika-agent stop"
echo " 重启服务: pika-agent restart"
echo " 卸载服务: pika-agent uninstall"
echo ""
}
main`
c.Response().Header().Set("Content-Type", "text/plain; charset=utf-8")
return c.String(http.StatusOK, script)
}
+9 -1
View File
@@ -2,7 +2,7 @@ import {type JSX, useEffect, useMemo, useState} from 'react';
import {Outlet, useLocation, useNavigate} from 'react-router-dom';
import type {MenuProps} from 'antd';
import {App, Avatar, Button, Dropdown, Space} from 'antd';
import {Activity, Eye, Key, LogOut, Server, Settings, User as UserIcon} from 'lucide-react';
import {Activity, BookOpen, Eye, Key, LogOut, Server, Settings, User as UserIcon} from 'lucide-react';
import {logout} from '../../api/auth';
import {getServerVersion} from '../../api/agent';
import type {User} from '../../types';
@@ -131,6 +131,14 @@ const AdminLayout = () => {
>
公共页面
</Button>
<Button
type="text"
icon={<BookOpen className="h-4 w-4" strokeWidth={2} />}
onClick={() => navigate('/admin/agents-install')}
className="!h-9 !items-center !rounded-full !px-3 !text-xs !text-white hover:!bg-blue-500/10"
>
部署指南
</Button>
<Dropdown menu={{items: userMenuItems}} placement="bottomRight" trigger={['click']}>
<button
type="button"
+27 -39
View File
@@ -18,7 +18,7 @@ interface OSConfig {
}
const AgentInstall = () => {
const [selectedOS, setSelectedOS] = useState<string>('linux-amd64');
const [selectedOS, setSelectedOS] = useState<string>('linux');
const [apiKeys, setApiKeys] = useState<ApiKey[]>([]);
const [selectedApiKey, setSelectedApiKey] = useState<string>('');
@@ -44,8 +44,8 @@ const AgentInstall = () => {
}, []);
const osConfigs: Record<string, OSConfig> = {
'linux-amd64': {
name: 'Linux (AMD64)',
'linux': {
name: 'Linux',
icon: <img src={linuxPng} alt="Linux" className={'h-4 w-4'}/>,
downloadUrl: '/api/agent/downloads/agent-linux-amd64',
},
@@ -64,13 +64,8 @@ const AgentInstall = () => {
icon: <img src={applePng} alt="macOS" className={'h-4 w-4'}/>,
downloadUrl: '/api/agent/downloads/agent-darwin-amd64',
},
'darwin-arm64': {
name: 'macOS (Apple Silicon)',
icon: <img src={applePng} alt="macOS" className={'h-4 w-4'}/>,
downloadUrl: '/api/agent/downloads/agent-darwin-arm64',
},
'windows-amd64': {
name: 'Windows (AMD64)',
'windows': {
name: 'Windows',
icon: <img src={windowsPng} alt="Windows" className={'h-4 w-4'}/>,
downloadUrl: '/api/agent/downloads/agent-windows-amd64.exe',
},
@@ -81,36 +76,24 @@ const AgentInstall = () => {
message.success('已复制到剪贴板');
};
// 一键注册命令
const getRegisterCommand = (os: string) => {
const config = osConfigs[os];
const agentName = os.startsWith('windows') ? 'pika-agent.exe' : 'pika-agent';
// 获取一键安装命令
const getInstallCommand = (os: string) => {
const token = selectedApiKey;
if (os.startsWith('windows')) {
return `# 1. 下载探针
// Windows 使用 PowerShell 手动安装
const config = osConfigs[os];
const agentName = 'pika-agent.exe';
return `# Windows 安装方式(需要管理员权限)
# 1. 下载探针
Invoke-WebRequest -Uri "${serverUrl}${config.downloadUrl}" -OutFile "${agentName}"
# 2. 运行注册命令(需要管理员权限)
# 2. 运行注册命令
.\\${agentName} register --endpoint "${serverUrl}" --token "${token}"`;
} else if (os.startsWith('linux')) {
return `# 1. 下载探针
wget ${serverUrl}${config.downloadUrl} -O ${agentName}
# 2. 添加执行权限
chmod +x ${agentName}
# 3. 运行注册命令(需要 root 权限)
sudo ./${agentName} register --endpoint "${serverUrl}" --token "${token}"`;
} else { // macOS
return `# 1. 下载探针
curl -L ${serverUrl}${config.downloadUrl} -o ${agentName}
# 2. 添加执行权限
chmod +x ${agentName}
# 3. 运行注册命令(需要 root 权限)
sudo ./${agentName} register --endpoint "${serverUrl}" --token "${token}"`;
} else {
// Linux/macOS 使用一键安装脚本
return `curl -fsSL ${serverUrl}/api/agent/install.sh?token=${token} | sudo bash`;
}
};
@@ -195,14 +178,19 @@ ${agentCmd} version`;
key={key}
>
<Space direction={'vertical'} className={'w-full'}>
<Card type="inner" title="安装步骤">
<pre className="m-0 overflow-auto text-sm">
<code>{getRegisterCommand(key)}</code>
</pre>
<Card type="inner" title={key.startsWith('windows') ? '安装步骤' : '一键安装'}>
{!key.startsWith('windows') && (
<Paragraph type="secondary" className="mb-3">
脚本会自动检测系统架构并下载对应版本的探针,然后完成注册和安装。
</Paragraph>
)}
<pre className="m-0 overflow-auto text-sm">
<code>{getInstallCommand(key)}</code>
</pre>
<Button
type={'link'}
onClick={() => {
copyToClipboard(getRegisterCommand(key));
copyToClipboard(getInstallCommand(key));
}}
icon={<CopyIcon className={'h-4 w-4'}/>}
style={{margin: 0, padding: 0}}