# 部署

本文档说明如何构建、运行、容器化和发布 DiAL。开发环境运行见 [README 快速开始](../../README.md#快速开始)。

## 生产构建和运行

```bash
bun run build
./dist/dial-server ./probes.yaml
```

构建产物为独立可执行文件，只需要一个 YAML 配置文件即可运行。

启动后：

| 地址                           | 行为               |
| ------------------------------ | ------------------ |
| `http://127.0.0.1:3000/`       | 返回前端 Dashboard |
| `http://127.0.0.1:3000/api/*`  | 返回后端 API       |
| `http://127.0.0.1:3000/health` | 返回健康检查       |

## Docker 部署

DiAL 提供基于 Alpine 的多阶段镜像。构建阶段使用 Bun 生成 musl 目标单可执行文件，运行阶段只包含 `dial-server`、基础证书、`ping`、Bun musl executable 必需运行库、时区数据和容器运行目录。

```bash
docker build -t dial:alpine .
docker run --rm -p 3000:3000 -v dial-data:/data/dial dial:alpine
```

容器默认读取 `/etc/dial/probes.yaml`，推荐将数据卷挂载到 `/data/dial`。

使用自定义配置文件：

```bash
docker run --rm -p 3000:3000 \
  -v "$PWD/docker/probes.yaml:/etc/dial/probes.yaml:ro" \
  -v dial-data:/data/dial \
  dial:alpine
```

容器专用示例配置位于 [`../../docker/probes.yaml`](../../docker/probes.yaml)，默认监听 `0.0.0.0:3000`，并将 SQLite 数据和日志写入 `/data/dial`。

## ICMP 权限

如需在容器中运行 ICMP checker，除镜像内置 `iputils-ping` 外，还需要授予 `NET_RAW` capability：

```bash
docker run --rm --cap-add=NET_RAW -p 3000:3000 -v dial-data:/data/dial dial:alpine
```

## CMD checker 额外命令

官方镜像不内置 `bun`、`node`、`curl`、`dig`、`psql`、`mysql`、`redis-cli` 等 CMD checker 可能需要的额外命令。需要这些命令时请使用派生镜像自行安装：

```dockerfile
FROM dial:alpine

USER root
RUN apk add --no-cache curl bind-tools postgresql-client
USER dial
```

## 多架构镜像

```bash
docker buildx build --platform linux/amd64,linux/arm64 -t dial:alpine .
```

Dockerfile 通过 Docker 提供的 `TARGETARCH` 选择 Bun compile target。

| `TARGETARCH` | `BUN_TARGET`           |
| ------------ | ---------------------- |
| `amd64`      | `bun-linux-x64-musl`   |
| `arm64`      | `bun-linux-arm64-musl` |

## 跨平台发布包

```bash
bun run release
bun run release --target linux-x64
bun run release --target linux-x64,windows-x64,darwin-arm64
```

支持的目标平台：

| CLI 参数           | Bun CompileTarget      |
| ------------------ | ---------------------- |
| `linux-x64`        | `bun-linux-x64`        |
| `linux-arm64`      | `bun-linux-arm64`      |
| `linux-x64-musl`   | `bun-linux-x64-musl`   |
| `linux-arm64-musl` | `bun-linux-arm64-musl` |
| `windows-x64`      | `bun-windows-x64`      |
| `darwin-x64`       | `bun-darwin-x64`       |
| `darwin-arm64`     | `bun-darwin-arm64`     |

产出物结构：

```text
dist/release/
├── binaries/
│   ├── dial-server-0.1.0-linux-x64
│   └── dial-server-0.1.0-windows-x64.exe
└── packages/
    ├── dial-server_0.1.0_linux_x64.tar.gz
    └── dial-server_0.1.0_linux_x64.tar.gz.sha256
```

压缩包内含可执行文件、`probes.example.yaml` 和 `LICENSE`，解压后可直接使用。
