# DEB 包说明 ## 1. 什么是 DEB 包 ### 1.1 基本概念 **DEB** (Debian Package) 是 Debian 及其衍生 Linux 发行版(如 Ubuntu)使用的软件包格式。类似于 Windows 的 `.exe` 安装程序或 macOS 的 `.pkg` 安装包。 ### 1.2 文件格式 - **文件扩展名**: `.deb` - **内部结构**: 使用 `ar` 归档格式(类似于 tar) - **包含内容**: - 控制信息(包的元数据、依赖关系等) - 数据文件(应用程序文件、配置文件等) ### 1.3 安装方式 ```bash # 安装 DEB 包 sudo dpkg -i package.deb # 或者使用 apt(会自动处理依赖) sudo apt install ./package.deb ``` ## 2. ThingsBoard 为什么使用 DEB 包 ### 2.1 优势 1. **标准化安装**: 统一的安装位置和文件结构 2. **依赖管理**: 自动检查和处理依赖关系(如 Java 17) 3. **系统集成**: 可以注册为系统服务(systemd) 4. **配置管理**: 配置文件会被标记,升级时不会被覆盖 5. **权限管理**: 自动设置正确的文件权限和所有者 ### 2.2 在 Docker 中的使用 虽然 Docker 中可以使用其他方式安装,但使用 DEB 包有以下好处: - **一致性**: 与直接安装在 Linux 系统上的方式一致 - **便利性**: 一键安装,自动配置所有文件和权限 - **可维护性**: 便于卸载和升级 ## 3. ThingsBoard DEB 包包含的内容 ### 3.1 包结构 根据 `packaging/java/build.gradle` 配置,DEB 包包含以下内容: ``` /usr/share/thingsboard/ # 安装目录(pkgInstallFolder) ├── bin/ # 可执行文件 │ ├── thingsboard.jar # 主 JAR 文件(Spring Boot 打包) │ └── install/ # 安装脚本(如果启用) │ ├── install.sh │ ├── upgrade.sh │ └── logback.xml ├── conf/ # 配置文件 │ ├── thingsboard.conf # 主配置文件 │ ├── thingsboard.yml # YAML 配置 │ ├── logback.xml # 日志配置 │ └── actor-system.conf # Actor 系统配置 ├── data/ # 数据文件 └── extensions/ # 扩展文件 /lib/systemd/system/ # 系统服务目录 └── thingsboard.service # systemd 服务文件 /etc/thingsboard/conf -> /usr/share/thingsboard/conf # 符号链接 ``` ### 3.2 关键文件说明 #### 3.2.1 JAR 文件 - **位置**: `/usr/share/thingsboard/bin/thingsboard.jar` - **内容**: Spring Boot 打包的完整应用(包含所有依赖) - **格式**: Fat JAR(可执行 JAR) #### 3.2.2 配置文件 - **thingsboard.conf**: 环境变量和系统配置 - **thingsboard.yml**: 应用配置(数据库、队列等) - **logback.xml**: 日志配置 - **actor-system.conf**: Actor 系统配置 #### 3.2.3 系统服务文件 - **thingsboard.service**: systemd 服务文件 - 允许使用 `systemctl start thingsboard` 管理服务 ### 3.3 安装脚本 DEB 包包含以下安装钩子脚本: - **preinst**: 安装前执行 - **postinst**: 安装后执行(创建用户、启动服务等) - **prerm**: 卸载前执行 - **postrm**: 卸载后执行(清理文件等) ## 4. DEB 包的构建过程 ### 4.1 构建工具 ThingsBoard 使用 **Gradle** 的 `nebula.ospackage` 插件来构建 DEB 包。 **位置**: `packaging/java/build.gradle` ### 4.2 构建步骤 ```gradle buildDeb { arch = "all" // 架构:all 表示适用于所有架构 archiveFileName = "${pkgName}.deb" // 输出文件名 // 依赖要求:需要 Java 17 requires("openjdk-17-jre") .or("java17-runtime") .or("oracle-java17-installer") .or("openjdk-17-jre-headless") // 复制配置文件 from("${buildDir}/conf") { include "${pkgName}.conf" into "${pkgInstallFolder}/conf" } // 复制 JAR 文件 from(mainJar) { rename { "${pkgName}.jar" } into "bin" } // 安装钩子脚本 preInstall file("${buildDir}/control/deb/preinst") postInstall file("${buildDir}/control/deb/postinst") preUninstall file("${buildDir}/control/deb/prerm") postUninstall file("${buildDir}/control/deb/postrm") // 系统服务文件 from("${buildDir}/control/template.service") { into "/lib/systemd/system" rename { "${pkgName}.service" } } } ``` ### 4.3 构建命令 ```bash # 在 application 模块目录下 cd application # 执行 Gradle 构建 DEB 包 gradle buildDeb # 生成的 DEB 包位置 # application/target/thingsboard-4.2.1.deb ``` ### 4.4 Maven 集成 Maven 构建时会自动调用 Gradle 构建 DEB 包: ```xml org.thingsboard gradle-maven-plugin package invoke buildDeb ``` ## 5. DEB 包在 Docker 构建中的使用 ### 5.1 Dockerfile 中的安装 ```dockerfile # msa/tb-node/docker/Dockerfile FROM thingsboard/openjdk17:bookworm-slim # 复制 DEB 包到临时目录 COPY ${pkg.name}.deb /tmp/ # 安装 DEB 包 RUN dpkg -i /tmp/${pkg.name}.deb && \ rm /tmp/${pkg.name}.deb # DEB 包会将应用安装到 /usr/share/thingsboard/ ``` ### 5.2 安装后的效果 安装 DEB 包后: 1. **文件安装**: 所有文件复制到 `/usr/share/thingsboard/` 2. **用户创建**: 创建 `thingsboard` 用户(如果不存在) 3. **权限设置**: 设置正确的文件权限 4. **服务注册**: 注册 systemd 服务(但在 Docker 中通常不使用) ## 6. DEB 包的内容示例 ### 6.1 查看 DEB 包内容 ```bash # 查看 DEB 包信息 dpkg -I thingsboard-4.2.1.deb # 查看 DEB 包文件列表 dpkg -c thingsboard-4.2.1.deb # 解压 DEB 包(不安装) dpkg-deb -x thingsboard-4.2.1.deb /tmp/extract ``` ### 6.2 典型输出 ``` package: thingsboard version: 4.2.1-1 architecture: all maintainer: ThingsBoard Authors depends: openjdk-17-jre | java17-runtime | ... description: ThingsBoard IoT Platform ``` ## 7. DEB vs RPM vs JAR ### 7.1 包格式对比 | 格式 | 适用系统 | 构建工具 | ThingsBoard 支持 | |------|---------|---------|-----------------| | **DEB** | Debian/Ubuntu | Gradle (nebula.ospackage) | ✅ | | **RPM** | RedHat/CentOS | Gradle (nebula.ospackage) | ✅ | | **JAR** | 跨平台 | Maven (spring-boot-maven-plugin) | ✅ | ### 7.2 ThingsBoard 的构建 ThingsBoard 同时支持多种打包格式: - **DEB**: 用于 Debian/Ubuntu 系统安装 - **RPM**: 用于 RedHat/CentOS 系统安装 - **JAR**: 用于 Docker 或直接运行 ## 8. 为什么 Docker 中也用 DEB 包 ### 8.1 原因 1. **统一构建流程**: 与 Linux 系统安装使用相同的构建产物 2. **自动化安装**: `dpkg -i` 一键安装,自动处理所有文件 3. **权限管理**: DEB 包会自动设置正确的权限和所有者 4. **配置管理**: 配置文件会被正确标记和保护 ### 8.2 替代方案 理论上可以直接复制 JAR 文件,但使用 DEB 包有以下优势: ```dockerfile # 方案1:使用 DEB 包(ThingsBoard 采用) COPY thingsboard.deb /tmp/ RUN dpkg -i /tmp/thingsboard.deb # 方案2:直接复制 JAR(更简单但需要手动配置) COPY thingsboard.jar /usr/share/thingsboard/bin/ RUN mkdir -p /usr/share/thingsboard/conf && \ chown -R thingsboard:thingsboard /usr/share/thingsboard ``` DEB 包方案更标准化,减少了手动配置的工作。 ## 9. 总结 ### 9.1 DEB 包是什么 - **定义**: Debian/Ubuntu Linux 系统的软件包格式 - **作用**: 标准化软件安装、配置和管理 - **格式**: `.deb` 文件,包含软件文件和控制信息 ### 9.2 ThingsBoard 中的 DEB 包 - **包含内容**: JAR 文件、配置文件、启动脚本、系统服务文件 - **构建工具**: Gradle (nebula.ospackage 插件) - **构建位置**: `application/target/thingsboard-{version}.deb` - **使用场景**: - Linux 系统直接安装 - Docker 镜像构建(作为中间产物) ### 9.3 在 Docker 构建中的角色 ``` 源码编译 → JAR 打包 → DEB 打包 → Dockerfile 安装 DEB → Docker 镜像 ``` DEB 包是连接 Maven/Gradle 构建和 Docker 镜像构建的桥梁,提供了标准化的安装和配置方式。 ## 10. 参考资料 - [Debian Package Management](https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html) - [Gradle OS Package Plugin](https://github.com/nebula-plugins/gradle-ospackage-plugin) - [ThingsBoard Packaging](https://github.com/thingsboard/thingsboard/tree/master/packaging)