# 部署模式：在本地或云端运行引擎

运行引擎的两种方式：在你自己的机器上本地运行，或者凭 Pro 密钥在 AfterPack 的云端运行。

Source: https://www.afterpack.dev/zh/docs/deployment-modes

部署模式改变的是工作在哪里进行，以及哪些东西会接触到你的源代码。它不会改变变换本身的作用：无论引擎在哪里运行，同样的输入和同样的[设置](https://www.afterpack.dev/zh/docs/config)都会产生同样的保护。AfterPack 有两种运行模式。

## 模式 1：本地（Free）

[`npx afterpack@latest <path>`](https://www.afterpack.dev/zh/docs/cli#usage) 在你的机器上原生运行 AfterPack，未配置 [`key`](https://www.afterpack.dev/zh/docs/config#key) 的每个[框架插件](https://www.afterpack.dev/zh/docs/frameworks)也是如此。**你的源代码从不离开你的文件系统。**安装、构建，就这样。不需要[账户](https://www.afterpack.dev/zh/docs/accounts)，不需要密钥，混淆本身也不需要任何网络往返。

这是默认路径，几乎每一次构建都应该走这条路径。

有两项仅限 Pro 的设置在这里表现不同：加固标志 [`transforms.selfIntegrity.enabled`](https://www.afterpack.dev/zh/docs/config#transforms-kind-enabled) 和 [`transforms.comparisonHardening.enabled`](https://www.afterpack.dev/zh/docs/config#transforms-kind-enabled) 不会被应用，而会提高保护强度的按区域 [`@afterpack` 指令](https://www.afterpack.dev/zh/docs/directives#free-builds)会让构建停止。参见 [Pro](https://www.afterpack.dev/zh/docs/pro)。

> **一次与混淆无关的网络调用**
>
> 发出 `error` 或 `critical` 级别[诊断](https://www.afterpack.dev/zh/docs/diagnostics)的构建会上报匿名的构建诊断信息：代码、严重级别、版本、分桶计数，从不包含源代码。干净的构建不会发送任何内容。用 [`AFTERPACK_telemetry_enabled=false`](https://www.afterpack.dev/zh/docs/config#telemetry-enabled) 或插件选项中的 [`telemetry.enabled`](https://www.afterpack.dev/zh/docs/config#telemetry-enabled) 关闭它。详情见[隐私与数据处理](https://www.afterpack.dev/zh/docs/privacy)。

## 模式 2：AfterPack 云端（Pro）

同一个包，再加上一个 [`key`](https://www.afterpack.dev/zh/docs/config#key)。它是一个普通的配置键，和其他每个键一样可以通过三种方式设置：命令行上的 `--key=ap_v1_…`、环境变量中的 [`AFTERPACK_key=ap_v1_…`](https://www.afterpack.dev/zh/docs/config#key)，或者 `afterpack.json` 中的 `"key"`。命令行标志优先于环境变量，环境变量优先于文件；完整的优先级规则见[配置](https://www.afterpack.dev/zh/docs/config)。

> **密钥应该放在环境变量里，而不是命令行上**
>
> `--key=` 用于一次性的本地运行。命令行会留在 shell 历史、CI 日志和 `ps` 输出中，所以任何共享场景都请使用 [`AFTERPACK_key`](https://www.afterpack.dev/zh/docs/config#key)。没有登录步骤，也没有单独的凭据：[控制台中的密钥](https://www.afterpack.dev/zh/docs/dashboard/api-keys)就是全部。

当 `key` 被解析出来时，引擎会把你的文件打成批次并调用 [`POST /v1/obfuscate/batch`](https://www.afterpack.dev/zh/docs/cloud-api)。云端运行 [Pro](https://www.afterpack.dev/zh/docs/pro) 版本的引擎，并在每个文件处理完成后以流的形式返回混淆后的输出；你的构建在每个结果到达时将其写入。源代码只在内存中处理，不会被持久化。只有一项产物会被存储：为[控制台](https://www.afterpack.dev/zh/docs/dashboard/builds)提供数据的逐构建 [Protection Map](https://www.afterpack.dev/zh/docs/protection-map)，你可以[按项目关闭它](https://www.afterpack.dev/zh/docs/protection-map#turning-it-off)。完整的通信契约见 [Cloud API 参考](https://www.afterpack.dev/zh/docs/cloud-api)。

**云端不可用时失败即中止。**如果无法连接到云端（DNS 失败、连接被拒绝、针对 `5xx` 的重试次数耗尽，或请求超时），构建会失败，而不是降级为免费层级的输出。[诊断](https://www.afterpack.dev/zh/docs/diagnostics#fail-closed-no-exceptions)定义了这条规则及其背后的退出码。

客户端会按 1 s / 4 s / 16 s 的间隔重试 `503`/`504`（共四次尝试），并在放弃前严格遵循 `429` 的 `Retry-After` 重试一次。其他所有状态都不可重试，会以构建失败的形式呈现，并附带 API 自身的[诊断代码](https://www.afterpack.dev/zh/docs/diagnostics)。

## 如何选择

| 情形 | 模式 |
|---|---|
| 默认：零摩擦，没有任何东西离开你的机器 | 模式 1（本地） |
| 你希望[按区域指令](https://www.afterpack.dev/zh/docs/directives)真正生效 | 模式 2（云端） |
| 你希望在控制台中存储 [Protection Map](https://www.afterpack.dev/zh/docs/protection-map) 和[构建历史](https://www.afterpack.dev/zh/docs/dashboard/builds) | 模式 2（云端） |
| 合规要求源代码不得离开你的基础设施 | 模式 1（本地） |

## 其他部署形态

### Cloudflare Workers

引擎足够小，可以在 Cloudflare Worker 中运行，而云端构建正是在那里运行的：你的 bundle 在一个 Worker 隔离环境中完成变换，并在几毫秒内返回；对 Worker 来说过大的文件会自动转到容器中处理。你也可以用同样的方式在自己的 Worker 中运行 AfterPack：参见[在 Cloudflare Worker 中运行 AfterPack](https://www.afterpack.dev/zh/docs/workers)。

在你自己的 Worker 中，给同一个 `obfuscate()` 调用传入你的 Pro 密钥，构建就会以模式 2 在 AfterPack 的云端运行：参见[从你自己的 Worker 使用 Pro](https://www.afterpack.dev/zh/docs/workers#pro-from-your-own-worker)。

### 不得离开你基础设施的源代码

模式 1 已经解决了这个问题：Free、本地、没有网络调用，没有需要审查的东西。如果要在你自己的账户内进行私有 Pro 部署，参见 [Enterprise](https://www.afterpack.dev/zh/docs/enterprise)；这不是目前可以直接开启的功能。

## 下一步

- [Cloud API 参考](https://www.afterpack.dev/zh/docs/cloud-api)：模式 2 完整的请求/响应契约。
- [Pro](https://www.afterpack.dev/zh/docs/pro)：Pro 在本地引擎之上增加了什么。
- [隐私与数据处理](https://www.afterpack.dev/zh/docs/privacy)：每种模式存储什么，以及存储多久。
- [套餐](https://www.afterpack.dev/zh/docs/tiers)：哪个套餐解锁模式 2，以及它计量什么。
- [CLI 参考](https://www.afterpack.dev/zh/docs/cli)：驱动模式 1 的命令。
- [配置](https://www.afterpack.dev/zh/docs/config)：每一个键、标志和变量，包括 [`key`](https://www.afterpack.dev/zh/docs/config#key)。
- [威胁模型](https://www.afterpack.dev/zh/docs/threat-model)：引擎换了运行位置时，什么会改变、什么不会。
