Apps
Apps 菜单提供了一个预配置应用目录,可通过容器进行部署,并自动完成 RouterOS 配置,同时支持多个容器镜像仓库。使用该功能需要安装 Container 软件包、在初始设置时具备物理访问权限,并包含证书验证与硬件设备管理等方面的安全注意事项。
Apps
摘要
子菜单: /app
所需软件包: container
App 菜单提供了一个应用目录,只需点击几下即可完成部署。每个应用可以由一个或多个预配置的容器组成,必要的 RouterOS 配置(如防火墙规则和地址转换)会自动应用。该目录由 MikroTik 准备和维护,但容器镜像来源于多个镜像仓库,例如 Docker Hub、GCR 和 Quay。
不过,配置参数可以在启用应用之前进行编辑,且已应用的 yaml 文件始终可以查看。
要求
App 系统继承了与 Container 软件包相同的要求:
- 架构支持: arm64 和 x86 架构。
- Container 软件包: 必须已安装。
- Device Mode(设备模式): 必须启用 Container 模式(需要物理访问并重置设备)。
- 外部存储: 强烈推荐以获得最佳性能。
- 内存要求: 运行容器需要充足的 RAM(16MB SPI flash 设备可能需要外部存储来存放镜像)。
- 架构限制: 搭载 EN7562CT CPU 的设备(如 hEX Refresh)不受支持。
安全注意事项
与底层的 Container 系统一样,App 菜单也继承了相关的安全影响:
- 初始启用容器支持需要物理访问。
- 一旦启用,容器可远程管理。
- 被攻陷的设备可利用容器安装恶意软件。
- 设备的防护能力与所运行容器的安全性相当。
- 第三方容器镜像可能引入安全漏洞。
属性
| Property | Type | Default | Description |
|---|---|---|---|
| auto-update | yes | no | no | 当新的容器镜像版本可用时,启用或禁用自动更新。 |
| check-certificate | yes | no | yes | 在拉取容器镜像前,根据路由器的 certificate store 验证镜像仓库证书。 |
| container-command-lines | string | (empty) | 指定启动容器时传递给应用的命令行参数。 |
| devices | string | (empty) | 指定要透传给容器应用的额外硬件设备。 |
| environment | string | (empty) | 定义可供运行中的应用使用的环境变量。以键值对列表的形式指定。 |
| extra-mounts | string | (empty) | 指定要附加到容器的额外挂载点。 |
| firewall-redirects | string | (empty) | 配置从主机设备到容器的端口重定向。 |
| network | default | lan | internal | default | 指定容器将使用的网络:internal(位于 NAT 之后)、lan(位于 LAN 网络)、或 default(因应用而异;可为 internal 或 lan)。 |
| network-outgoing-access | yes | no | yes | 允许特定容器应用的网络出向访问,当设置为 no 时,会创建一条 mangle 丢弃规则。 |
| pvid | integer | 1 | 设置容器虚拟以太网接口在桥中的端口 VLAN ID(PVID)。 |
| required-hw-devices | string | (empty) | 容器启动前必须存在于主机上的硬件设备。该属性仅在添加 YAML 配置后才可配置。Compose 格式:[host-hw-device]:[device-in-app] |
| required-mounts | string | (empty) | 容器启动所需的挂载目录。该属性仅在添加 YAML 配置后才可可配置。Compose 格式:[dir-on-host]:[dir-in-app] |
| use-https | yes | no | yes | 为应用 URL 使用 HTTPS。此选项在不支持云服务的设备上无法使用。 |
| yaml | string | (empty) | 提供应用的 YAML 组合配置。有关配置示例请参阅文档。 |
只读属性
| Property | Type | Default | Description |
|---|---|---|---|
| app-size | 应用的总大小。 | ||
| app-store-url | string | 安装该应用时所在的应用商店 URL。 | |
| cpu-usage | 应用当前的 CPU 使用率百分比。 | ||
| custom | yes | no | 指示该应用是否为用户创建的自定义应用。 | |
| data-size | 应用所存储数据的大小。 | ||
| default-credential | string | 应用所需的默认凭据。 | |
| default-network | lan | internal | 应用使用的默认网络。有效值为 lan 或 internal。 | |
| description | string | 应用描述,定义于 YAML 配置的 descr 参数中。 | |
| from-app-store | yes | no | 指示该应用是否从自定义应用商店安装。 | |
| interface | string | 应用使用的 VETH 接口。 | |
| ip-address | IP | 分配给 VETH 接口的 IP 地址。 | |
| memory-current | 应用当前使用的内存量。 | ||
| name | string | 应用名称,定义于 YAML 配置的 name 参数中。 | |
| project-page | string | 应用项目页面 URL,定义于 YAML 配置的 page 参数中。 | |
| running | 指示应用当前是否正在运行。 | ||
| status | acquire veth | configuring container(s) | downloading/extracting | starting | 应用的当前状态。可能的值表示应用正在获取 VETH 接口、配置容器、下载/解压,或正在启动。 | |
| ui-url | string | 应用 Web 界面所生成的 URL(如果可用)。 | |
| variables-to-be-used-in-environment | 应用环境中存在的所有变量列表。 |
设置向导
App 菜单包含一个设置向导(GUI 中的“Setup”按钮,或命令 /app/setup)。该向导可自动完成所有网络、存储和镜像仓库的设置,否则需要多个手动步骤。
第 1 步:选择存储
选择用于安装应用的存储磁盘。系统会自动检测可用的已格式化磁盘驱动器(如 nvme1、usb1、disk1 及类似设备)。如果列表中没有出现合适的磁盘,您必须先使用 ext4 或 btrfs 文件系统格式化磁盘,然后通过 /disk 菜单挂载。
要求:
- 建议顺序读写速度至少达到 100 MB/s。
- 建议随机 IOPS(每秒输入/输出操作数)至少达到 10,000。
- 在继续之前,使用
/disk/test命令验证存储性能。 - 强烈推荐使用外部存储设备以获得最佳性能。
第 2 步:桥接配置
选择用于容器网络的 LAN 桥接接口。此配置可启用自动端口转发和本地网络上的应用自动发现。设置向导会自动配置以下内容:
- 虚拟以太网(veth)接口的创建
- 将 veth 接口添加到已配置的桥中
- 用于出向连接的 NAT 规则
第 3 步:IP 配置
定义路由器的 IP 地址以启用应用访问。系统会自动检测主 IP 地址;不过,对于复杂的网络设置也支持手动配置。指定的 IP 地址用于以下目的:
- 生成应用 UI URL。
- 创建自动端口转发规则。
- 提供 WebFig 集成链接。
完成
完成设置向导后,App 系统即可立即使用。您可以直接通过界面启用应用。系统会自动处理所有底层的容器配置。
配置
应用配置可通过 /app/settings 访问,与手动 Container 配置相比提供了简化的设置。
属性
| Property | Type | Default | Description |
|---|---|---|---|
| app-store-urls | string | (empty) | 自定义应用商店的 URL。该 URL 必须指向一个 YAML 数组,其中每个应用都是数组中的一个元素。 |
| auto-update | yes | no | no | 全局设置,为所有已安装的应用软件包启用自动更新。 |
| disk | string | (empty) | 全局设置,指定用于存储操作的磁盘。 |
| download-path | string | (empty) | 手动指定所有已下载内容所存储的目录路径。 |
| lan-bridge | string | (empty) | 手动指定代表本地局域网的桥接接口。 |
| media-path | string | (empty) | 手动指定所有媒体文件所存储的目录路径。 |
| registry-mirrors | string | (empty) | 指定一个或多个用于获取容器镜像的镜像仓库镜像 URL 地址。 |
| router-ip | IP | (empty) | 手动指定当前 RouterOS 设备可达的 IP 地址。 |
| show-in-webfig | yes | no | yes | 控制指向已启用应用的链接是否显示在 WebFig 登录页面上。 |
自动配置的设置
某些参数会根据网络检测在初始时自动配置。如有需要,这些值始终可以手动覆盖。
| Property | Type | Default | Description |
|---|---|---|---|
| assumed-router-ip | IP | (detected) | 自动检测到的 RouterOS 设备网络 IP 地址。 |
| assumed-lan-bridge | string | (detected) | 自动检测到的用于 LAN 连接的桥接接口。 |
| assumed-media-path | string | disk/media | 默认媒体存储路径,通常位于系统磁盘上。 |
| assumed-download-path | string | disk/media/downloads | 默认下载目录路径,通常位于媒体存储区域内。 |
应用管理
应用通过 /app 界面进行管理,提供状态监控和生命周期控制,类似于底层的 /container 系统:
/app> print
Flags: X - DISABLED, R - RUNNING
Columns: NAME, UI-URL, MEMORY-CURRENT, APP-SIZE, DATA-SIZE, CATEGORY, DESCRIPTION
状态指示与元数据
- Flags(标志):
- X(DISABLED,已禁用)— 可表示两种状态:未下载/未安装(APP-SIZE 和 DATA-SIZE 为空),或已下载但已禁用(APP-SIZE 和 DATA-SIZE 显示存储占用)。
- R(RUNNING,运行中)— 应用正在活跃运行且可访问。
- UI-URL: 应用运行时的直接 Web 界面访问 URL。
- MEMORY-CURRENT: 实时内存消耗(以 MiB 计,仅在运行时)。
- APP-SIZE: 容器镜像存储占用(以 MiB 计,下载后显示已用空间)。
- DATA-SIZE: 应用持久化数据大小(以 KiB/MiB 计,显示配置和用户数据)。
- CATEGORY: 应用功能分类。
- DESCRIPTION: 应用功能描述。
应用生命周期管理
部署流程
与需要多个配置步骤(veth 接口、桥接设置、环境变量、挂载和防火墙规则)的手动 Container 部署不同,App 部署自动化了整个过程:
- 选择: 通过 CLI 或 WebFig 从目录中选择一个应用。
- 下载: 自动下载并解压容器镜像。
- 网络设置: 自动配置 veth 接口和桥接。
- 端口转发: 为 Web 访问自动创建防火墙规则。
- 启动: 以预配置设置初始化容器。
- 访问: UI-URL 可用,可立即访问 Web 界面。
清理命令
清理命令提供完整的应用移除,包括所有相关数据。此操作具有破坏性且不可逆:
/app> cleanup pihole
App data will be lost, continue? [y/N]:
清理流程:
- 停止运行中的容器。
- 移除所有应用数据和配置文件。
- 从存储中删除容器镜像。
- 将应用重置为未安装状态(APP-SIZE 和 DATA-SIZE 为空)。
- 移除该应用专属的网络配置。
警告
所有用户数据、配置设置和应用状态都将永久丢失。应用将恢复到其原始目录状态,如果执行清理则需要完全重新配置。
自定义应用
从 RouterOS v7.22 开始,您可以使用“compose”YAML 文件创建自己的自定义应用。这让有经验的用户能够构建契合其特定网络需求的解决方案。
工作原理:
- 您以 YAML 格式定义应用内部逻辑和有限的 RouterOS 配置
- RouterOS 拉取指定的镜像并创建您的应用
- 应用在 RouterOS 硬件上运行,免费提供新功能
- 可选地,让其与我们的 API 交互
为何使用它:
- 为您的网络精准构建所需内容
- 无需等待官方应用发布
- 非常适合自动化、自定义路由或专用服务
- 声明式配置使管理更轻松
如何添加应用
有三种方式,但它们都依赖 YAML。
方法 1:创建空白应用并编辑 YAML
首先,创建应用并将其分配到 LAN 网络:
/app/add network=lan
默认情况下,应用将被命名为“app”。
接下来,添加 YAML 配置。在终端中运行:
/app/edit app yaml
这会打开一个文本编辑器,您可以在其中粘贴您的 YAML。粘贴完成后,按 <kbd>Control</kbd>+<kbd>O</kbd> 保存更改。最后,启用应用以启动运行。
方法 2:从文件导入
或者,将您的 compose 文本保存到一个文件并上传到设备。然后,使用以下命令将该文件设为应用的 YAML:
/app/add yaml=[/file/get alpine-iperf.yml contents]
当您已有预配置的 YAML 文件准备导入时,此方法很有用。
方法 3:添加自定义应用商店 URL
如果您或您认识的人已在 Web 服务器上托管了自己的应用或应用列表,您只需在 APP 设置中添加该 URL。这样就能拥有一个动态更新的自定义应用目录。
/app/settings set app-store-urls="<custom_url>"
为使此功能正常工作,该 URL 应直接返回 YAML 文件的文本内容,其中多个应用按照标准 YAML 语法以简单列表形式列出。
为自定义应用编写 YAML
此示例使用现有的 openEuler 基础镜像创建一个 iperf3 应用。
name: openeuler-iperf
descr: openEuler container running iperf3 server
page: https://iperf.fr/
category: network
default-credential: none
services:
iperf:
image: docker.io/openeuler/iperf:latest
ports:
- 5201:5201:tcp
- 5201:5201/udp:udp
command: /bin/sh -c "iperf3 -s"
关键区别:
- 基础镜像已安装 iperf
- 必要端口已转发/映射到路由器 IP
- “command”在容器启动时执行并运行 iperf3
或者,您也可以使用像 Alpine Linux 这样的纯净基础镜像,并使用“command”安装 iperf3。
name: alpine-iperf
descr: Alpine Linux container running iperf3 server
page: https://iperf.fr/
category: network
default-credential: none
services:
iperf:
image: docker.io/alpine:latest
command: /bin/sh -c "apk add --no-cache iperf3 && iperf3 -s"
networks:
default:
name: lan
external: true
关键区别:
- 干净的基础镜像
- iperf3 在每次启动时安装并运行
- 应用的网络设置为您的 LAN(作为转发端口的替代方案)
可选地,如果您想确保“command”只执行一次,可以考虑使用类似这样的条件单行命令:
command: /bin/sh -c "if ! command -v iperf3 >/dev/null 2>&1; then apk add --no-cache iperf3; fi; exec iperf3 -s"
端口映射
映射端口时使用 X:Y 或 X:Y:Z 语法,其中 X 是您路由器上的端口,Y 是容器上的端口,Z 为端口命名,但某些名称具有特殊功能,例如“web”会使 RouterOS 设置一个带有自动生成 URL 的反向代理。 一些有效示例:
2211:21
888:80:web
9000:9000:api
9001:9001:api-secure
所有端口默认设置为 TCP,除非您将其定义为 UDP,如下所示:
6000:6000/udp:udp
8000:8000/udp:custom_name
警告
默认情况下,端口
80被视为 Web 端口,除非您显式将其设置为其他类型。有一个健康检查会探测此端口——如果没有任何进程在监听,应用会卡在starting状态。当端口80未被映射时,将改用第一个定义的端口。为避免歧义,请显式命名您使用的端口。
YAML 字段参考
| Field | Description |
|---|---|
name | 自定义应用的唯一标识符 |
descr | 应用功能的可读描述 |
page | 项目官方文档或网站的 URL |
category | 分类组(例如 network、system、utilities) |
auto-update | 自动更新 true/false |
icon | 自定义应用图标 |
default-credentials | 登录凭据(仅供参考;可留空) |
url-path | 基础 URL 之后的路径(例如 /login) |
services | 容器服务定义 |
image | 容器使用的 Docker 镜像 |
container_name | 与特定镜像一起使用的名称 |
user | Linux UID |
entrypoint | 使用此选项指定 shell |
volumes | 挂载位置 RouterOS:Container |
healthcheck | 在给定的 interval 时间间隔、retries 重试次数下,使用一个 test,并带有以秒为单位的 start_period 和 timeout。 |
ports | 端口映射列表(port:port/prot:name)或 name; target; published; app_protocol 的键值对 |
environment | 环境变量 |
command | 在容器内执行的启动命令 |
networks | 应用网络配置 |
secrets | 安全存储的信息,如密码和密钥 |
configs | 以文本或单独文件形式提供的额外配置 |
shm_size | 共享内存大小。 |
stop_grace_period | 优雅关闭的超时(默认 30 秒) |
提示与最佳实践
-
存储: 为获得最佳性能与更大容量,建议使用 USB 驱动器、SATA 驱动器或 NVMe SSD 等外部存储设备。
-
内存: 通过在终端中运行
/app/print命令,跟踪您的应用内存消耗。 -
更新: 仅在需要时且认为必要时更新您的系统。虽然自动更新可以提供安全补丁和新功能,但在启用或应用更新之前,评估您的特定用例是否真的需要更新是很重要的。
-
网络: 应用会自动管理端口转发并生成用于外部访问的必要 URL。
-
数据持久化: 您的应用数据存储于指定的存储路径中,即使在应用重启或系统重启后也会保持完好。