- package.sh: 打包包含 configs 种子数据、tools 构建工具、deps 离线依赖、scripts 辅助脚本 - ImportSeedAssets: 首次启动检测空库自动导入 templates/profiles/overlays - face_gallery.html: 添加构建人脸库按钮 - device.html: 无标准配置时显示设备实际模型/资源,无人脸库配置时隐藏按钮 - register-face-gallery.py: 手动注册已构建人脸库到 standard_resources - deployment.md: 更新部署流程反映新包结构 - .gitignore: 排除 *.tar.gz 构建产物
116 lines
4.5 KiB
Bash
116 lines
4.5 KiB
Bash
#!/bin/bash
|
||
# 管理端离线部署包构建脚本
|
||
# 交叉编译 safesightd,打包配置、种子数据、工具和部署脚本
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
EDGE_DIR="$(cd "$PROJECT_DIR/../safesight-edge" 2>/dev/null && pwd || echo '')"
|
||
PACKAGE_NAME="safesight-control-$(date +%Y%m%d-%H%M%S)"
|
||
BUILD_DIR="/tmp/$PACKAGE_NAME"
|
||
|
||
echo "========== 构建管理端离线部署包 =========="
|
||
echo "项目目录: $PROJECT_DIR"
|
||
[ -n "$EDGE_DIR" ] && echo "Edge 目录: $EDGE_DIR"
|
||
echo ""
|
||
|
||
# ── 编译 ──
|
||
echo "[1/6] 交叉编译..."
|
||
cd "$PROJECT_DIR"
|
||
mkdir -p "$BUILD_DIR"
|
||
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o "$BUILD_DIR/safesightd-linux-arm64" ./cmd/safesightd/ 2>/dev/null && echo " ✓ ARM64" || echo " ✗ ARM64 failed"
|
||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o "$BUILD_DIR/safesightd-linux-amd64" ./cmd/safesightd/ 2>/dev/null && echo " ✓ AMD64" || echo " ✗ AMD64 failed"
|
||
|
||
# ── 部署文件 ──
|
||
echo "[2/6] 部署文件..."
|
||
mkdir -p "$BUILD_DIR/scripts"
|
||
cp scripts/deploy/safesightd.service "$BUILD_DIR/"
|
||
cp scripts/deploy/safesightd "$BUILD_DIR/" 2>/dev/null || true
|
||
cp scripts/deploy/import-assets.py "$BUILD_DIR/scripts/" 2>/dev/null || true
|
||
cp scripts/deploy/register-face-gallery.py "$BUILD_DIR/scripts/" 2>/dev/null || true
|
||
cp safesightd.json.example "$BUILD_DIR/safesightd.json.example" 2>/dev/null || true
|
||
echo " ✓ 部署脚本已复制"
|
||
|
||
# ── 种子配置数据 ──
|
||
echo "[3/6] 种子配置数据..."
|
||
SEED_SRC=""
|
||
if [ -n "$EDGE_DIR" ] && [ -d "$EDGE_DIR/configs" ]; then
|
||
SEED_SRC="$EDGE_DIR/configs"
|
||
elif [ -d "$PROJECT_DIR/seed-configs" ]; then
|
||
SEED_SRC="$PROJECT_DIR/seed-configs"
|
||
fi
|
||
if [ -n "$SEED_SRC" ]; then
|
||
mkdir -p "$BUILD_DIR/configs"
|
||
cp -r "$SEED_SRC/templates" "$BUILD_DIR/configs/" 2>/dev/null || true
|
||
cp -r "$SEED_SRC/profiles" "$BUILD_DIR/configs/" 2>/dev/null || true
|
||
cp -r "$SEED_SRC/overlays" "$BUILD_DIR/configs/" 2>/dev/null || true
|
||
echo " ✓ 种子数据 ($SEED_SRC)"
|
||
else
|
||
echo " ⚠ 找不到 configs 目录,跳过"
|
||
fi
|
||
|
||
# ── 人脸库构建工具 ──
|
||
echo "[4/6] 人脸库构建工具..."
|
||
if [ -d "$PROJECT_DIR/tools" ]; then
|
||
mkdir -p "$BUILD_DIR/tools"
|
||
cp -r "$PROJECT_DIR/tools/gallery_builder" "$BUILD_DIR/tools/" 2>/dev/null || true
|
||
cp "$PROJECT_DIR/tools/build_gallery.py" "$BUILD_DIR/tools/" 2>/dev/null || true
|
||
mkdir -p "$BUILD_DIR/tools/models"
|
||
cp "$PROJECT_DIR/tools/models"/*.onnx "$BUILD_DIR/tools/models/" 2>/dev/null || true
|
||
cp "$PROJECT_DIR/tools/models"/*.json "$BUILD_DIR/tools/models/" 2>/dev/null || true
|
||
echo " ✓ 构建工具已复制"
|
||
else
|
||
echo " ⚠ 找不到 tools 目录,跳过"
|
||
fi
|
||
|
||
# ── 离线 Python 依赖 ──
|
||
echo "[5/6] 离线 Python 依赖..."
|
||
mkdir -p "$BUILD_DIR/deps"
|
||
# 尝试下载 onnxruntime ARM64 wheel(离线安装用)
|
||
if command -v pip3 &>/dev/null; then
|
||
pip3 download onnxruntime numpy --platform linux_aarch64 --platform manylinux2014_aarch64 --only-binary=:all: -d "$BUILD_DIR/deps/" 2>/dev/null && echo " ✓ ARM64 wheels" || echo " ⚠ pip download 失败,跳过"
|
||
else
|
||
echo " ⚠ pip3 不可用,跳过"
|
||
fi
|
||
|
||
# ── README ──
|
||
echo "[6/6] 生成 README..."
|
||
cat > "$BUILD_DIR/README.txt" << 'EOF'
|
||
SafeSight Control 离线部署包
|
||
=============================
|
||
|
||
快速部署(ARM64):
|
||
sudo mkdir -p /opt/safesightd/{bin,config,data,scripts,tools}
|
||
sudo cp safesightd-linux-arm64 /opt/safesightd/bin/safesightd
|
||
sudo chmod +x /opt/safesightd/bin/safesightd
|
||
sudo cp safesightd.json.example /opt/safesightd/config/safesightd.json
|
||
sudo cp -r configs /opt/safesightd/
|
||
sudo cp -r tools /opt/safesightd/
|
||
sudo cp -r scripts /opt/safesightd/
|
||
sudo cp safesightd.service /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now safesightd
|
||
|
||
初始化(首次部署必做):
|
||
sudo python3 /opt/safesightd/scripts/import-assets.py /opt/safesightd/configs
|
||
|
||
安装人脸库构建依赖(离线):
|
||
sudo pip3 install deps/*.whl
|
||
|
||
人脸库注册(如已有 face_gallery.db):
|
||
sudo cp face_gallery.db /opt/safesightd/resources/standard_resources/face_gallery/
|
||
sudo python3 /opt/safesightd/scripts/register-face-gallery.py
|
||
|
||
打开 http://<IP>:18080
|
||
EOF
|
||
|
||
# ── 打包 ──
|
||
cd /tmp
|
||
tar -czf "$PROJECT_DIR/$PACKAGE_NAME.tar.gz" "$PACKAGE_NAME"
|
||
rm -rf "$BUILD_DIR"
|
||
|
||
echo ""
|
||
echo "========== 打包完成 =========="
|
||
echo "$PROJECT_DIR/$PACKAGE_NAME.tar.gz"
|
||
ls -lh "$PROJECT_DIR/$PACKAGE_NAME.tar.gz"
|