diff --git a/docs/deployment_guide.md b/docs/deployment_guide.md index 54d3962..c0bbf54 100644 --- a/docs/deployment_guide.md +++ b/docs/deployment_guide.md @@ -56,7 +56,7 @@ cd CollisionAvoidance 脚本会自动完成: -- 下载所需的系统依赖包 +- 下载所需的系统依赖 - 下载 Python 依赖包 - 创建完整的项目归档文件 @@ -76,7 +76,18 @@ tar xzf CollisionAvoidance.tar.gz cd CollisionAvoidance ``` -3. 执行部署脚本 +3. 删除 32 位依赖包 + +> 注意:由于系统是 64 位架构,我们需要删除所有 32 位(i686)的依赖包,以避免安装冲突。这些包是在准备离线包时自动下载的,但在 64 位系统上不需要。 + +```bash +# 删除所有 i686 架构的包 +cd packages +rm -f *i686.rpm +cd .. +``` + +4. 执行部署脚本 ```bash sudo ./scripts/deploy.sh @@ -127,7 +138,7 @@ firewall-cmd --reload ### 3. 防火墙配置 - 如果使用其他防火墙,需要手动开放 8010 和 8081 端口 -- 确认防火墙规则是否生效:`firewall-cmd --list-all` +- 确认防火墙规���是否生效:`firewall-cmd --list-all` ## 卸载 diff --git a/docs/deployment_guide_new.md b/docs/deployment_guide_new.md new file mode 100644 index 0000000..83a6c7b --- /dev/null +++ b/docs/deployment_guide_new.md @@ -0,0 +1,172 @@ +# 部署指南 + +本文档详细说明了如何在 CentOS 系统上部署碰撞避免系统。支持在线和离线两种部署方式。 + +## 目录 + +- [系统要求](#系统要求) +- [在线部署](#在线部署) +- [离线部署](#离线部署) +- [部署后配置](#部署后配置) +- [常见问题](#常见问题) + +## 系统要求 + +- CentOS 7 或更高版本 +- 至少 2GB 可用内存 +- 至少 10GB 可用磁盘空间 +- root 权限 +- Python 3.6 或更高版本 + +## 在线部署 + +如果服务器可以访问互联网,可以直接使用在线部署方式。 + +1. 获取项目代码 + +```bash +git clone [项目仓库地址] +cd CollisionAvoidance +``` + +2. 执行部署脚本 + +```bash +sudo ./scripts/deploy.sh +``` + +## 离线部署 + +如果服务器无法访问互联网,需要使用离线部署方式。 + +### 准备阶段(在有网络的环境中进行) + +1. 在有网络的 CentOS 环境中,获取项目代码 + +```bash +git clone [项目仓库地址] +cd CollisionAvoidance +``` + +2. 执行离线包准备脚本 + +```bash +./scripts/prepare_offline_packages.sh +``` + +脚本会自动完成: + +- 下载所需的系统依赖包 +- 下载 Python 依赖包 +- 创建完整的项目归档文件 + +### 部署步骤 + +1. 将生成的归档文件传输到目标服务器 + +```bash +scp ../CollisionAvoidance.tar.gz root@target-server:/tmp/ +``` + +2. 在目标服务器上解压 + +```bash +cd /tmp +tar xzf CollisionAvoidance.tar.gz +cd CollisionAvoidance +``` + +3. 删除 32 位依赖包 + +> 注意:由于系统是 64 位架构,我们需要删除所有 32 位(i686)的依赖包,以避免安装冲突。这些包是在准备离线包时自动下载的,但在 64 位系统上不需要。 + +```bash +# 删除所有 i686 架构的包 +cd packages +rm -f *i686.rpm +cd .. +``` + +4. 执行部署脚本 + +```bash +sudo ./scripts/deploy.sh +``` + +## 部署后配置 + +### 服务管理 + +- 启动服务:`systemctl start collision-avoidance` +- 停止服务:`systemctl stop collision-avoidance` +- 重启服务:`systemctl restart collision-avoidance` +- 查看状态:`systemctl status collision-avoidance` +- 查看日志:`journalctl -u collision-avoidance -f` + +### 配置文件 + +- 配置文件位置:`/etc/collision_avoidance/` +- WebSocket 服务端口:8010 +- Mock Server 端口:8081 + +### 防火墙配置 + +如果使用 firewalld: + +```bash +# 开放 WebSocket 端口 +firewall-cmd --permanent --add-port=8010/tcp +# 开放 Mock Server 端口 +firewall-cmd --permanent --add-port=8081/tcp +firewall-cmd --reload +``` + +## 常见问题 + +### 1. 服务启动失败 + +- 检查服务日志:`journalctl -u collision-avoidance -n 50` +- 确认配置文件权限正确 +- 验证端口 8010 和 8081 是否被占用 + +### 2. Mock Server 启动失�� + +- 检查 Python 和依赖包是否正确安装 +- 确认端口 8081 未被占用 +- 检查 Mock Server 日志输出 + +### 3. 防火墙配置 + +- 如果使用其他防火墙,需要手动开放 8010 和 8081 端口 +- 确认防火墙规则是否生效:`firewall-cmd --list-all` + +### 4. 依赖包安装问题 + +- 如果遇到依赖包冲突,检查是否有 i686 架构的包未被删除 +- 使用 `rpm -qa | grep i686` 命令检查系统中的 32 位包 +- 如果发现 i686 包,使用 `rpm -e` 命令删除它们 + +## 卸载 + +如需卸载系统: + +```bash +sudo ./scripts/uninstall.sh +``` + +卸载脚本会: + +- 停止并禁用服务 +- 删除系统服务配置 +- 删除程序文件 +- 删除配置文件 +- 关闭防火墙端口 + +## 技术支持 + +如遇到问题,请: + +1. 查看服务日志 +2. 检查系统日志 +3. 检查 Mock Server 日志 +4. 联系技术支持团队 diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 757c59a..b0c4d50 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -35,54 +35,48 @@ fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" -# Detect system architecture -CURRENT_ARCH=$(uname -m) -case ${CURRENT_ARCH} in - x86_64|i686|i386) - log_info "System architecture: ${CURRENT_ARCH}" - ;; - *) - log_error "Unsupported architecture: ${CURRENT_ARCH}" - exit 1 - ;; -esac - -# Find the correct packages directory -PACKAGES_DIR="${PROJECT_ROOT}/packages_${CURRENT_ARCH}" -if [ ! -d "${PACKAGES_DIR}" ]; then - log_error "Packages directory not found for architecture ${CURRENT_ARCH}: ${PACKAGES_DIR}" - log_error "Please run prepare_offline_packages.sh with the correct architecture first" - exit 1 -fi - # Check if offline packages exist -if [ -d "${PACKAGES_DIR}" ]; then +if [ -d "${PROJECT_ROOT}/packages" ]; then log_info "检测到离线安装包目录,使用离线安装模式..." - # Install offline packages - log_info "安装离线依赖包..." - if [ -f "${PACKAGES_DIR}/offline-deps.txt" ]; then - while IFS= read -r pkg; do - if [ -f "${PACKAGES_DIR}/$pkg" ]; then - log_info "正在安装: $pkg" - rpm -ivh "${PACKAGES_DIR}/$pkg" || { - log_error "安装包失败: $pkg" - exit 1 - } - else - log_error "找不到安装包: $pkg" - exit 1 - fi - done < "${PACKAGES_DIR}/offline-deps.txt" + # Configure local repository + log_info "配置本地仓库..." + if [ -f "${PROJECT_ROOT}/packages/local.repo" ]; then + cp "${PROJECT_ROOT}/packages/local.repo" /etc/yum.repos.d/ + yum clean all + yum makecache else - log_error "找不到离线依赖包列表文件: offline-deps.txt" + log_error "找不到本地仓库配置文件: local.repo" exit 1 fi + + # Install packages from local repository + log_info "从本地仓库安装依赖包..." + yum install -y --disablerepo=* --enablerepo=local \ + cmake3 \ + json-devel \ + boost-devel \ + openssl-devel \ + python3 \ + python3-pip \ + python3-devel \ + python3-libs \ + python3-setuptools \ + gcc \ + gcc-c++ \ + make \ + autoconf \ + automake \ + libtool || { + log_error "安装依赖包失败" + exit 1 + } # Install Python packages - if [ -f "${PACKAGES_DIR}/requirements.txt" ]; then + if [ -f "${PROJECT_ROOT}/packages/requirements.txt" ]; then log_info "安装 Python 依赖包..." - pip3 install --no-index --find-links="${PACKAGES_DIR}/python_packages" -r "${PACKAGES_DIR}/requirements.txt" || { + pip3 install --no-index --find-links="${PROJECT_ROOT}/packages/python_packages" \ + -r "${PROJECT_ROOT}/packages/requirements.txt" || { log_error "安装 Python 包失败" exit 1 } @@ -92,7 +86,7 @@ else log_info "使用在线安装模式..." log_info "正在安装依赖包..." yum groupinstall -y "Development Tools" - yum install -y cmake3 nlohmann-json-devel boost-devel openssl-devel python3 python3-pip + yum install -y cmake3 json-devel boost-devel openssl-devel python3 python3-pip # Install Python packages log_info "安装 Python 依赖..." diff --git a/scripts/prepare_offline_packages.sh b/scripts/prepare_offline_packages.sh index 596cf5b..7a919c2 100644 --- a/scripts/prepare_offline_packages.sh +++ b/scripts/prepare_offline_packages.sh @@ -58,24 +58,13 @@ PACKAGES_DIR="${PROJECT_ROOT}/packages" log_info "Creating packages directory: ${PACKAGES_DIR}" mkdir -p "${PACKAGES_DIR}" -# Install yum-plugin-downloadonly if not already installed -if ! rpm -q yum-plugin-downloadonly &>/dev/null; then - log_info "Installing yum-plugin-downloadonly..." - yum install -y yum-plugin-downloadonly || { - log_error "Failed to install yum-plugin-downloadonly" - exit 1 - } -fi - -# Function to get package dependencies -get_dependencies() { - local pkg=$1 - yum deplist "$pkg" | grep provider: | awk '{print $2}' | sort -u +# Install necessary tools +log_info "Installing required tools..." +yum install -y yum-utils createrepo || { + log_error "Failed to install required tools" + exit 1 } -# Download system dependencies -log_info "Downloading system packages and their dependencies..." - # Define base packages PACKAGES=( "cmake3" @@ -84,6 +73,9 @@ PACKAGES=( "openssl-devel" "python3" "python3-pip" + "python3-devel" + "python3-libs" + "python3-setuptools" "gcc" "gcc-c++" "make" @@ -92,46 +84,36 @@ PACKAGES=( "libtool" ) -# Create a temporary file for all packages including dependencies -TEMP_PKGS=$(mktemp) - -# Get all dependencies -for pkg in "${PACKAGES[@]}"; do - log_info "Checking dependencies for $pkg..." - echo "$pkg" >> "$TEMP_PKGS" - get_dependencies "$pkg" >> "$TEMP_PKGS" -done - -# Remove duplicates and sort -sort -u "$TEMP_PKGS" -o "$TEMP_PKGS" - -# Download all packages -log_info "Downloading packages..." -DOWNLOAD_FAILED=0 -while read -r pkg; do - log_info "Downloading $pkg..." - if ! yum install --downloadonly --downloaddir="${PACKAGES_DIR}" "$pkg"; then - log_error "Failed to download $pkg" - DOWNLOAD_FAILED=1 - fi -done < "$TEMP_PKGS" - -rm "$TEMP_PKGS" - -# Check if any RPM files were downloaded +# Download packages +log_info "Downloading packages and their dependencies..." cd "${PACKAGES_DIR}" || { log_error "Failed to enter packages directory" exit 1 } -if [ ! "$(ls -A *.rpm 2>/dev/null)" ]; then - if [ $DOWNLOAD_FAILED -eq 1 ]; then - log_error "Failed to download some packages. Please check your network connection and yum repository configuration." - else - log_error "No RPM packages were downloaded. Please check your yum configuration." - fi +for pkg in "${PACKAGES[@]}"; do + log_info "Downloading $pkg and its dependencies..." + yumdownloader --resolve --destdir="${PACKAGES_DIR}" --arch=x86_64 "$pkg" || { + log_error "Failed to download $pkg" + exit 1 + } +done + +# Create local repository +log_info "Creating local repository..." +createrepo "${PACKAGES_DIR}" || { + log_error "Failed to create local repository" exit 1 -fi +} + +# Create repository configuration file +cat > "${PACKAGES_DIR}/local.repo" << EOL +[local] +name=Local Repository +baseurl=file://${PACKAGES_DIR} +enabled=1 +gpgcheck=0 +EOL # Create Python requirements file log_info "Creating Python requirements file..." @@ -200,10 +182,13 @@ echo -e "\n${GREEN}Offline package preparation completed!${NC}" echo "Created files:" echo " - ${PACKAGES_DIR}/offline-deps.txt (System package list)" echo " - ${PACKAGES_DIR}/requirements.txt (Python package list)" +echo " - ${PACKAGES_DIR}/local.repo (Local repository configuration)" echo " - ${PACKAGES_DIR}/*.rpm (System packages)" +echo " - ${PACKAGES_DIR}/repodata/* (Repository metadata)" echo " - ${PACKAGES_DIR}/${PYTHON_PACKAGES_DIR}/* (Python packages)" echo " - ${ARCHIVE_PATH} (Complete project archive)" echo -e "\nNext steps:" echo "1. Transfer ${ARCHIVE_NAME} to the target server" echo "2. Extract the archive on the target server" -echo "3. Run the deployment script" \ No newline at end of file +echo "3. Copy local.repo to /etc/yum.repos.d/ on the target server" +echo "4. Run the deployment script" \ No newline at end of file