16 KiB
16 KiB
AI监控系统 - BT离线部署指南
📋 概述
本指南介绍如何使用BitTorrent(BT)技术在无网络环境中部署AI监控系统到昇腾服务器,包括种子制作、P2P传输和离线安装。
🔧 BT部署原理
工作流程
有网络环境 → 制作种子 → 分发种子 → P2P下载 → 离线安装
优势
- 高速传输:多节点并行下载
- 带宽节省:P2P共享减少服务器压力
- 断点续传:网络中断后可继续传输
- 完整性校验:自动验证文件完整性
🌱 制作BT种子
1. 准备完整部署包
#!/bin/bash
# create_deployment_package.sh
echo "=== 制作AI监控系统部署包 ==="
# 创建部署目录结构
DEPLOY_DIR="AIMonitor_deploy_v1.0"
mkdir -p $DEPLOY_DIR/{packages,drivers,models,configs,scripts}
# 1. 复制项目文件
echo "1. 复制项目文件..."
cp -r *.py *.yaml *.md $DEPLOY_DIR/
cp -r requirements.txt $DEPLOY_DIR/
# 2. 下载Python依赖包
echo "2. 下载Python依赖包..."
pip download -r requirements.txt -d $DEPLOY_DIR/packages/ \
--platform linux_x86_64 --only-binary=:all:
# 3. 下载昇腾驱动和工具包
echo "3. 下载昇腾相关包..."
cd $DEPLOY_DIR/drivers/
# Atlas 300I驱动
wget https://ascend-repo.huawei.com/Atlas%20200I%20DK/Ascend-hdk-23.0.0-ubuntu20.04.aarch64.run
# CANN工具包
wget https://ascend-repo.huawei.com/CANN/CANN%205.0.2/Ascend-cann-toolkit_5.0.2_linux-aarch64.run
# 4. 准备模型文件
echo "4. 准备AI模型..."
cp -r YOLO_Weight/ $DEPLOY_DIR/models/
# 5. 创建配置文件模板
echo "5. 创建配置模板..."
cat > $DEPLOY_DIR/configs/config_template.yaml << EOF
cameras:
- id: 1
name: "摄像头1"
rtsp_url: "rtsp://admin:password@192.168.1.100:554/stream1"
- id: 2
name: "摄像头2"
rtsp_url: "rtsp://admin:password@192.168.1.101:554/stream1"
EOF
# 6. 创建安装脚本
echo "6. 创建安装脚本..."
cat > $DEPLOY_DIR/scripts/install.sh << 'EOF'
#!/bin/bash
echo "=== AI监控系统安装 ==="
# 安装系统依赖
sudo rpm -ivh packages/*.rpm 2>/dev/null || sudo dpkg -i packages/*.deb
# 安装Python依赖
python3 -m pip install packages/*.whl --no-index --find-links=packages/
# 安装昇腾驱动
sudo bash drivers/Ascend-hdk-*.run --silent
# 安装CANN工具包
sudo bash drivers/Ascend-cann-toolkit-*.run --silent
# 配置环境
echo "source /usr/local/Ascend/ascend-toolkit/set_env.sh" >> ~/.bashrc
echo "安装完成!"
EOF
chmod +x $DEPLOY_DIR/scripts/install.sh
# 7. 创建启动脚本
cat > $DEPLOY_DIR/scripts/start.sh << 'EOF'
#!/bin/bash
cd /opt/AIMonitor
source ~/.bashrc
python3 rtsp_service_ws.py &
python3 static_server.py &
EOF
chmod +x $DEPLOY_DIR/scripts/start.sh
# 8. 创建说明文档
cat > $DEPLOY_DIR/README.txt << EOF
AI监控系统离线部署包 v1.0
安装步骤:
1. 运行 sudo ./scripts/install.sh
2. 配置 configs/config.yaml
3. 运行 ./scripts/start.sh
技术支持:请参考 deploy_升腾.md
EOF
# 9. 压缩部署包
echo "7. 压缩部署包..."
tar -czf AIMonitor_deploy_v1.0.tar.gz $DEPLOY_DIR/
echo "✓ 部署包制作完成: AIMonitor_deploy_v1.0.tar.gz"
2. 制作BT种子
#!/bin/bash
# create_torrent.sh
echo "=== 制作BT种子 ==="
# 安装BT制作工具
pip install transmission-rpc
# 创建种子文件
transmission-create -o AIMonitor_deploy_v1.0.torrent \
-t "https://tracker1.example.com:6969/announce" \
-t "https://tracker2.example.com:6969/announce" \
-c "AI监控系统离线部署包 v1.0 - 昇腾服务器专用" \
AIMonitor_deploy_v1.0.tar.gz
# 创建带校验和的种子
transmission-show -i AIMonitor_deploy_v1.0.torrent
echo "✓ BT种子创建完成: AIMonitor_deploy_v1.0.torrent"
3. 创建私有Tracker
#!/bin/bash
# setup_tracker.sh
echo "=== 搭建私有BT Tracker ==="
# 使用opentracker作为tracker服务器
docker run -d \
--name bt-tracker \
-p 6969:6969 \
-v $(pwd)/tracker.conf:/etc/opentracker/tracker.conf \
--restart unless-stopped \
prologic/opentracker
# 创建tracker配置
cat > tracker.conf << EOF
listen.ipv4_addr = 0.0.0.0
listen.port = 6969
daemon = 0
access.log = access.log
error.log = error.log
debug.log = debug.log
EOF
echo "✓ Private Tracker started on port 6969"
🚀 P2P部署方案
方案一:服务器间P2P传输
1. 在有网络的服务器上
#!/bin/bash
# seed_deployment.sh
echo "=== 启动种子分享 ==="
# 1. 创建完整部署包
./create_deployment_package.sh
# 2. 制作BT种子
./create_torrent.sh
# 3. 启动Transmission作为种子服务器
transmission-daemon
transmission-remote -a AIMonitor_deploy_v1.0.torrent \
-w ./ \
--find
echo "✓ 开始分享AI监控系统部署包"
echo "Torrent Info:"
transmission-show -i AIMonitor_deploy_v1.0.torrent
2. 在目标昇腾服务器上
#!/bin/bash
# download_deployment.sh
echo "=== 下载AI监控系统部署包 ==="
# 1. 安装下载工具
pip install transmission-cli
# 2. 从种子文件下载
transmission-cli -f AIMonitor_deploy_v1.0.torrent \
-w /tmp/ \
--seedlimit 0
# 3. 校验文件完整性
echo "校验下载文件..."
if [ -f "/tmp/AIMonitor_deploy_v1.0.tar.gz" ]; then
echo "✓ 文件下载完成"
# 4. 解压并安装
cd /tmp
tar -xzf AIMonitor_deploy_v1.0.tar.gz
cd AIMonitor_deploy_v1.0
# 5. 运行安装脚本
sudo ./scripts/install.sh
echo "✓ AI监控系统安装完成"
else
echo "✗ 文件下载失败"
fi
方案二:多节点分布式部署
1. 主节点(有网络)
#!/bin/bash
# master_node.sh
echo "=== 主节点配置 ==="
# 1. 启动Tracker服务
docker-compose up -d
# 2. 创建多个种子版本
python3 create_multi_version_torrents.py
# 3. 启动种子服务
transmission-daemon
# 添加所有种子
for torrent in *.torrent; do
transmission-remote -a "$torrent" -w ./
done
echo "✓ 主节点启动完成"
2. 从节点(无网络)
#!/bin/bash
# slave_node.sh
echo "=== 从节点部署 ==="
# 1. 连接到主节点Tracker
TRACKER_URL="http://master-server:6969/announce"
# 2. 下载种子文件
curl -O http://master-server:torrents/AIMonitor_deploy_v1.0.torrent
# 3. 多线程下载
transmission-cli \
-f AIMonitor_deploy_v1.0.torrent \
-w /tmp/ \
--peer-info \
--encryption-preferred
# 4. 验证并安装
if [ -f "/tmp/AIMonitor_deploy_v1.0.tar.gz" ]; then
cd /tmp && tar -xzf AIMonitor_deploy_v1.0.tar.gz
cd AIMonitor_deploy_v1.0
sudo ./scripts/install.sh
else
echo "下载失败,请检查网络连接"
fi
🛠️ BT部署工具
1. 自动化部署脚本
#!/usr/bin/env python3
# bt_deployment_tool.py
import os
import sys
import hashlib
import subprocess
from pathlib import Path
class BTDeploymentTool:
def __init__(self):
self.deployment_dir = "AIMonitor_bt_deploy"
self.torrent_file = None
def create_deployment_package(self):
"""创建部署包"""
print("创建部署包...")
# 创建目录结构
Path(self.deployment_dir).mkdir(exist_ok=True)
Path(f"{self.deployment_dir}/packages").mkdir(exist_ok=True)
Path(f"{self.deployment_dir}/scripts").mkdir(exist_ok=True)
# 复制必要文件
essential_files = [
"rtsp_service_ws.py", "static_server.py", "monitor_gui.py",
"npu_yolo_onnx.py", "config.yaml", "requirements.txt"
]
for file in essential_files:
if os.path.exists(file):
os.system(f"cp {file} {self.deployment_dir}/")
print(f"✓ 部署包创建完成: {self.deployment_dir}")
def create_torrent(self, tracker_urls=None):
"""创建BT种子"""
print("创建BT种子...")
tracker_urls = tracker_urls or [
"https://tracker1.example.com:6969/announce",
"https://tracker2.example.com:6969/announce"
]
# 使用libtorrent创建种子
import libtorrent as lt
# 创建torrent
fs = lt.file_storage()
lt.add_files(fs, self.deployment_dir)
t = lt.create_torrent(fs)
t.add_tracker(tracker_urls[0])
t.set_creator("AI监控系统部署工具")
t.set_comment("昇腾AI监控系统离线部署包")
# 生成torrent文件
self.torrent_file = f"{self.deployment_dir}.torrent"
with open(self.torrent_file, 'wb') as f:
f.write(lt.bencode(t.generate()))
print(f"✓ BT种子创建完成: {self.torrent_file}")
return self.torrent_file
def calculate_checksum(self, file_path):
"""计算文件校验和"""
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
sha256_hash.update(chunk)
return sha256_hash.hexdigest()
def deploy_from_torrent(self, torrent_path, download_dir="/tmp"):
"""从种子部署"""
print(f"从种子部署: {torrent_path}")
# 使用transmission下载
cmd = [
"transmission-cli", "-f", torrent_path,
"-w", download_dir, "--seedlimit", "0"
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
# 验证下载文件
expected_file = os.path.join(download_dir, self.deployment_dir + ".tar.gz")
if os.path.exists(expected_file):
print("✓ 下载完成,开始安装...")
# 解压并安装
os.chdir(download_dir)
os.system(f"tar -xzf {os.path.basename(expected_file)}")
install_script = os.path.join(self.deployment_dir, "scripts", "install.sh")
if os.path.exists(install_script):
os.system(f"sudo {install_script}")
print("✓ 部署完成")
else:
print("✗ 安装脚本不存在")
else:
print("✗ 下载文件不完整")
else:
print(f"✗ 下载失败: {result.stderr}")
def main():
tool = BTDeploymentTool()
if len(sys.argv) < 2:
print("使用方法:")
print(" python3 bt_deployment_tool.py create # 创建部署包")
print(" python3 bt_deployment_tool.py deploy # 从种子部署")
return
command = sys.argv[1]
if command == "create":
tool.create_deployment_package()
torrent_file = tool.create_torrent()
print(f"\n种子文件: {torrent_file}")
elif command == "deploy":
if len(sys.argv) < 3:
print("请提供种子文件路径")
return
tool.deploy_from_torrent(sys.argv[2])
else:
print(f"未知命令: {command}")
if __name__ == "__main__":
main()
2. Docker容器化BT部署
# Dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
python3-pip \
transmission-cli \
curl \
tar \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install transmission-rpc libtorrent
WORKDIR /app
COPY . /app/
CMD ["python3", "bt_deployment_tool.py"]
# docker-compose.yml
version: '3.8'
services:
bt-tracker:
image: prologic/opentracker
ports:
- "6969:6969"
volumes:
- ./tracker.conf:/etc/opentracker/tracker.conf
bt-seeder:
build: .
volumes:
- ./deployment:/app/deployment
command: ["python3", "bt_deployment_tool.py", "create"]
depends_on:
- bt-tracker
bt-downloader:
build: .
volumes:
- ./downloads:/app/downloads
command: ["python3", "bt_deployment_tool.py", "deploy", "/torrents/AIMonitor_deploy_v1.0.torrent"]
depends_on:
- bt-tracker
🔐 安全配置
1. 加密传输
# 启用加密传输
transmission-cli \
--encryption-preferred \
--encryption-required \
-f deployment.torrent
2. 访问控制
# tracker访问控制
ALLOWED_PEERS = [
"192.168.1.0/24",
"10.0.0.0/8",
"172.16.0.0/12"
]
def is_peer_allowed(peer_ip):
"""检查对等节点是否被允许"""
import ipaddress
peer_addr = ipaddress.ip_address(peer_ip)
for network in ALLOWED_PEERS:
if peer_addr in ipaddress.ip_network(network):
return True
return False
3. 完整性验证
#!/bin/bash
# verify_deployment.sh
TORRENT_FILE=$1
DEPLOYMENT_FILE=$2
echo "验证部署包完整性..."
# 1. 验证torrent信息
transmission-show -i $TORRENT_FILE > torrent_info.txt
# 2. 计算实际文件校验和
ACTUAL_HASH=$(sha256sum $DEPLOYMENT_FILE | cut -d' ' -f1)
# 3. 验证文件大小
EXPECTED_SIZE=$(grep "Size:" torrent_info.txt | awk '{print $2}')
ACTUAL_SIZE=$(stat -c%s $DEPLOYMENT_FILE)
if [ "$EXPECTED_SIZE" = "$ACTUAL_SIZE" ]; then
echo "✓ 文件大小正确"
else
echo "✗ 文件大小不匹配"
exit 1
fi
echo "✓ 部署包验证通过"
📊 监控和管理
1. BT传输监控
#!/usr/bin/env python3
# bt_monitor.py
import time
import transmission_rpc
from datetime import datetime
class BTMonitor:
def __init__(self, host='localhost', port=9091):
self.tc = transmission_rpc.Client(host=host, port=port)
def monitor_download(self, torrent_hash):
"""监控下载进度"""
while True:
try:
torrent = self.tc.get_torrent(torrent_hash)
progress = torrent.progress
status = torrent.status
print(f"[{datetime.now()}] 进度: {progress:.2f}%, 状态: {status}")
if status == 'seeding':
print("下载完成")
break
except Exception as e:
print(f"监控错误: {e}")
time.sleep(10)
def list_active_torrents(self):
"""列出活跃的种子"""
torrents = self.tc.get_torrents()
for torrent in torrents:
print(f"{torrent.name}: {torrent.progress:.2f}%")
if __name__ == "__main__":
monitor = BTMonitor()
monitor.list_active_torrents()
2. 自动重试机制
#!/bin/bash
# auto_retry_download.sh
TORRENT_FILE=$1
MAX_RETRIES=5
RETRY_DELAY=60
for ((i=1; i<=MAX_RETRIES; i++)); do
echo "尝试下载 (第 $i 次)..."
if transmission-cli -f $TORRENT_FILE -w /tmp/ --seedlimit 0; then
echo "✓ 下载成功"
exit 0
else
echo "✗ 下载失败,${RETRY_DELAY}秒后重试..."
sleep $RETRY_DELAY
fi
done
echo "✗ 达到最大重试次数,下载失败"
exit 1
🎯 部署流程
完整部署步骤
1. 准备阶段(有网络环境)
# 1. 创建部署包
./create_deployment_package.sh
# 2. 制作BT种子
./create_torrent.sh
# 3. 启动种子服务
./seed_deployment.sh
2. 传输阶段(P2P)
# 1. 分发种子文件
scp AIMonitor_deploy_v1.0.torrent user@target-server:/tmp/
# 2. 在目标服务器下载
./download_deployment.sh
3. 安装阶段(离线环境)
# 1. 解压部署包
tar -xzf AIMonitor_deploy_v1.0.tar.gz
# 2. 运行安装脚本
sudo ./scripts/install.sh
# 3. 配置系统
./scripts/configure.sh
# 4. 启动服务
./scripts/start.sh
验证部署结果
# 1. 检查服务状态
systemctl status aimonitor
# 2. 验证端口监听
netstat -tulpn | grep -E "(8765|5000)"
# 3. 测试NPU功能
npu-smi
# 4. 启动GUI界面
python3 monitor_gui.py
文档版本: v1.0
适用平台: 昇腾Atlas系列服务器
网络要求: 支持P2P传输的内网环境