thingsboard/summary/07-DEB包说明.md

316 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
<!-- application/pom.xml -->
<plugin>
<groupId>org.thingsboard</groupId>
<artifactId>gradle-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>invoke</goal>
</goals>
<configuration>
<tasks>
<task>buildDeb</task>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
```
## 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)