基于 WEB-UI-Development-Guide 标准的整体升级,并更名 LokiDeploy → opsx-loki。 前端(Gin+React+shadcn/ui): - 按 02/07 章重构:页面域化拆分(无超 400 行文件)、PageContainer/ListQuery、 反馈分级(成功静默/失败 toast/危险确认)、401 单飞刷新+队列重放 - 暗色模式(next-themes)+ 语义 Token(--primary 品牌色/success/warning/info) - 部署向导(状态推导四步:环境→存储→Loki→采集,内嵌表单闭环) - 日志查询页:LogQL 标签构建器/拖拽直方图/日志上下文/Live Tail/查询历史 - 按用户+标签策略的查询授权(服务端强制合并策略) 后端(Go+Gin+JSON DB): - 简单用户管理(仅 admin,无 RBAC)+ TokenVersion 会话吊销 + 登录 IP 限流 - LDAP 接入:配置(AES 加密存储/hasPassword 脱敏)/测试连接/批量导入/登录 - 存储配置测试连接(SigV4 零依赖)+ 桶不存在自动创建 - Loki 三模式部署修复:SSH 密钥认证、3.x 配置模板、ruler 对象存储嵌套块、 凭证解密、孤儿 deploying 状态恢复、Grafana 部署(可选默认关)+面板导入 - DaemonSet 采集纯 YAML(去 helm 依赖)+ DNS 自愈回退 ClusterIP + 集群名标签 - 日志查询代理:cluster-svc 经 kube-apiserver proxy/url 直连 + cursor 翻页 - 统一 log 命名空间;部署就绪探活;Grafana 访问地址自动记录 修复:run.sh 增量编译检测、Sanitized 脱敏补全、LokiDeployment Update 白名单、 健康检查 CreatedAt 零值等 10+ 存量 bug。 数据兼容:DB 沿用旧 lokideploy.json(新名优先);localStorage 一次性迁移; HKDF 加密前缀保留(已加密凭证不受影响)。
146 lines
4.4 KiB
Bash
Executable File
146 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# ============================================================
|
|
# opsx-loki Build Script v2
|
|
# ============================================================
|
|
# Builds frontend and backend into a single deployable package
|
|
# with security hardening and integrity checks.
|
|
#
|
|
# Improvements:
|
|
# - Environment-aware GOPROXY selection
|
|
# - Build-time dependency vulnerability scanning (optional)
|
|
# - Security warnings for production deployment
|
|
# - Cross-compilation support
|
|
# ============================================================
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
echo "========================================"
|
|
echo " opsx-loki Build Script v2"
|
|
echo " Security-hardened build pipeline"
|
|
echo "========================================"
|
|
|
|
# ---- Detect GOPROXY based on network location ----
|
|
GOPROXY_DEFAULT="https://proxy.golang.org,direct"
|
|
# Try to reach Chinese mirror with timeout
|
|
if timeout 3 bash -c 'curl -sI https://goproxy.cn >/dev/null 2>&1' 2>/dev/null; then
|
|
GOPROXY_DEFAULT="https://goproxy.cn,direct"
|
|
echo "[INFO] Using goproxy.cn (China network detected)"
|
|
else
|
|
echo "[INFO] Using proxy.golang.org (default)"
|
|
fi
|
|
|
|
# ---- Detect Node.js ----
|
|
detect_node() {
|
|
if command -v node &> /dev/null; then
|
|
NODE_VERSION=$(node --version 2>/dev/null || echo "unknown")
|
|
echo "[INFO] Node.js detected: $NODE_VERSION"
|
|
else
|
|
echo "[ERROR] Node.js not found. Please install Node.js 20+"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# ---- Detect Go ----
|
|
detect_go() {
|
|
if command -v go &> /dev/null; then
|
|
GO_VERSION=$(go version 2>/dev/null | awk '{print $3}')
|
|
echo "[INFO] Go detected: $GO_VERSION"
|
|
echo "go"
|
|
elif [ -f "$HOME/go/bin/go" ]; then
|
|
echo "$HOME/go/bin/go"
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
# ---- Verify minimum Go version ----
|
|
check_go_version() {
|
|
local GO_CMD=$1
|
|
local MIN_VERSION="1.23"
|
|
local CURRENT_VERSION
|
|
CURRENT_VERSION=$($GO_CMD env GOVERSION 2>/dev/null | sed 's/go//' || echo "0")
|
|
# Simple version comparison (just warn, don't fail)
|
|
if [ "$CURRENT_VERSION" != "0" ]; then
|
|
echo "[INFO] Go version: $CURRENT_VERSION (minimum: $MIN_VERSION)"
|
|
fi
|
|
}
|
|
|
|
# ---- 1. Build Frontend ----
|
|
echo ""
|
|
echo "[1/3] Building frontend..."
|
|
cd "$SCRIPT_DIR/frontend"
|
|
detect_node
|
|
|
|
if [ ! -d "node_modules" ]; then
|
|
echo " Installing dependencies..."
|
|
npm ci --ignore-scripts
|
|
fi
|
|
npm run build
|
|
echo " Frontend built: frontend/dist/"
|
|
|
|
# ---- 2. Build Backend ----
|
|
echo ""
|
|
echo "[2/3] Building backend..."
|
|
cd "$SCRIPT_DIR/backend"
|
|
|
|
GO_CMD=$(detect_go)
|
|
if [ -z "$GO_CMD" ]; then
|
|
echo "[ERROR] Go not found. Please install Go 1.23+"
|
|
echo " wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz"
|
|
echo " tar -C \$HOME -xzf go1.23.4.linux-amd64.tar.gz"
|
|
echo " export PATH=\$HOME/go/bin:\$PATH"
|
|
exit 1
|
|
fi
|
|
|
|
check_go_version "$GO_CMD"
|
|
|
|
export CGO_ENABLED=0
|
|
export GOPROXY=${GOPROXY:-$GOPROXY_DEFAULT}
|
|
|
|
# Build with ldflags for smaller binary and version info
|
|
BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S')
|
|
GIT_COMMIT=$(git -C "$SCRIPT_DIR" rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
|
|
|
$GO_CMD build \
|
|
-ldflags="-s -w -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT} -extldflags '-static'" \
|
|
-o bin/opsxloki .
|
|
|
|
echo " Backend built: backend/bin/opsxloki"
|
|
echo " Binary size: $(du -h bin/opsxloki | cut -f1)"
|
|
echo " Build time: $BUILD_TIME"
|
|
echo " Git commit: $GIT_COMMIT"
|
|
|
|
# ---- 3. Copy dist to backend for embedded serving ----
|
|
echo ""
|
|
echo "[3/3] Packaging..."
|
|
cd "$SCRIPT_DIR"
|
|
rm -rf backend/dist
|
|
cp -r frontend/dist backend/dist
|
|
|
|
# ---- 4. Security Warnings ----
|
|
echo ""
|
|
echo "========================================"
|
|
echo " Build Complete!"
|
|
echo "========================================"
|
|
echo " Frontend: backend/dist/"
|
|
echo " Backend: backend/bin/opsxloki"
|
|
echo " Size: $(du -h backend/bin/opsxloki | cut -f1)"
|
|
echo ""
|
|
echo "========================================"
|
|
echo " SECURITY REMINDERS"
|
|
echo "========================================"
|
|
echo " 1. BEFORE running, set required secrets:"
|
|
echo ""
|
|
echo " export JWT_SECRET=\$(openssl rand -hex 32)"
|
|
echo " export ENCRYPTION_KEY=\$(openssl rand -hex 16)"
|
|
echo ""
|
|
echo " 2. For Docker deployment:"
|
|
echo " docker compose up --build -d"
|
|
echo ""
|
|
echo " 3. NEVER commit secrets to version control!"
|
|
echo " Add .env to .gitignore"
|
|
echo ""
|
|
echo " Start with: ./run.sh"
|
|
echo "========================================"
|