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 菜单也继承了相关的安全影响:

  • 初始启用容器支持需要物理访问。
  • 一旦启用,容器可远程管理。
  • 被攻陷的设备可利用容器安装恶意软件。
  • 设备的防护能力与所运行容器的安全性相当。
  • 第三方容器镜像可能引入安全漏洞。

属性

PropertyTypeDefaultDescription
auto-updateyes | nono当新的容器镜像版本可用时,启用或禁用自动更新。
check-certificateyes | noyes在拉取容器镜像前,根据路由器的 certificate store 验证镜像仓库证书。
container-command-linesstring(empty)指定启动容器时传递给应用的命令行参数。
devicesstring(empty)指定要透传给容器应用的额外硬件设备。
environmentstring(empty)定义可供运行中的应用使用的环境变量。以键值对列表的形式指定。
extra-mountsstring(empty)指定要附加到容器的额外挂载点。
firewall-redirectsstring(empty)配置从主机设备到容器的端口重定向。
networkdefault | lan | internaldefault指定容器将使用的网络:internal(位于 NAT 之后)、lan(位于 LAN 网络)、或 default(因应用而异;可为 internal 或 lan)。
network-outgoing-accessyes | noyes允许特定容器应用的网络出向访问,当设置为 no 时,会创建一条 mangle 丢弃规则。
pvidinteger1设置容器虚拟以太网接口在桥中的端口 VLAN ID(PVID)。
required-hw-devicesstring(empty)容器启动前必须存在于主机上的硬件设备。该属性仅在添加 YAML 配置后才可配置。Compose 格式:[host-hw-device]:[device-in-app]
required-mountsstring(empty)容器启动所需的挂载目录。该属性仅在添加 YAML 配置后才可可配置。Compose 格式:[dir-on-host]:[dir-in-app]
use-httpsyes | noyes为应用 URL 使用 HTTPS。此选项在不支持云服务的设备上无法使用。
yamlstring(empty)提供应用的 YAML 组合配置。有关配置示例请参阅文档。

只读属性

PropertyTypeDefaultDescription
app-size应用的总大小。
app-store-urlstring安装该应用时所在的应用商店 URL。
cpu-usage应用当前的 CPU 使用率百分比。
customyes | no指示该应用是否为用户创建的自定义应用。
data-size应用所存储数据的大小。
default-credentialstring应用所需的默认凭据。
default-networklan | internal应用使用的默认网络。有效值为 lan 或 internal。
descriptionstring应用描述,定义于 YAML 配置的 descr 参数中。
from-app-storeyes | no指示该应用是否从自定义应用商店安装。
interfacestring应用使用的 VETH 接口。
ip-addressIP分配给 VETH 接口的 IP 地址。
memory-current应用当前使用的内存量。
namestring应用名称,定义于 YAML 配置的 name 参数中。
project-pagestring应用项目页面 URL,定义于 YAML 配置的 page 参数中。
running指示应用当前是否正在运行。
statusacquire veth | configuring container(s) | downloading/extracting | starting应用的当前状态。可能的值表示应用正在获取 VETH 接口、配置容器、下载/解压,或正在启动。
ui-urlstring应用 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 配置相比提供了简化的设置。

属性

PropertyTypeDefaultDescription
app-store-urlsstring(empty)自定义应用商店的 URL。该 URL 必须指向一个 YAML 数组,其中每个应用都是数组中的一个元素。
auto-updateyes | nono全局设置,为所有已安装的应用软件包启用自动更新。
diskstring(empty)全局设置,指定用于存储操作的磁盘。
download-pathstring(empty)手动指定所有已下载内容所存储的目录路径。
lan-bridgestring(empty)手动指定代表本地局域网的桥接接口。
media-pathstring(empty)手动指定所有媒体文件所存储的目录路径。
registry-mirrorsstring(empty)指定一个或多个用于获取容器镜像的镜像仓库镜像 URL 地址。
router-ipIP(empty)手动指定当前 RouterOS 设备可达的 IP 地址。
show-in-webfigyes | noyes控制指向已启用应用的链接是否显示在 WebFig 登录页面上。

自动配置的设置

某些参数会根据网络检测在初始时自动配置。如有需要,这些值始终可以手动覆盖。

PropertyTypeDefaultDescription
assumed-router-ipIP(detected)自动检测到的 RouterOS 设备网络 IP 地址。
assumed-lan-bridgestring(detected)自动检测到的用于 LAN 连接的桥接接口。
assumed-media-pathstringdisk/media默认媒体存储路径,通常位于系统磁盘上。
assumed-download-pathstringdisk/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 部署自动化了整个过程:

  1. 选择: 通过 CLI 或 WebFig 从目录中选择一个应用。
  2. 下载: 自动下载并解压容器镜像。
  3. 网络设置: 自动配置 veth 接口和桥接。
  4. 端口转发: 为 Web 访问自动创建防火墙规则。
  5. 启动: 以预配置设置初始化容器。
  6. 访问: UI-URL 可用,可立即访问 Web 界面。

清理命令

清理命令提供完整的应用移除,包括所有相关数据。此操作具有破坏性且不可逆:

/app> cleanup pihole 
App data will be lost, continue? [y/N]:

清理流程:

  1. 停止运行中的容器。
  2. 移除所有应用数据和配置文件。
  3. 从存储中删除容器镜像。
  4. 将应用重置为未安装状态(APP-SIZE 和 DATA-SIZE 为空)。
  5. 移除该应用专属的网络配置。

警告

所有用户数据、配置设置和应用状态都将永久丢失。应用将恢复到其原始目录状态,如果执行清理则需要完全重新配置。

自定义应用

从 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 字段参考

FieldDescription
name自定义应用的唯一标识符
descr应用功能的可读描述
page项目官方文档或网站的 URL
category分类组(例如 network、system、utilities)
auto-update自动更新 true/false
icon自定义应用图标
default-credentials登录凭据(仅供参考;可留空)
url-path基础 URL 之后的路径(例如 /login)
services容器服务定义
image容器使用的 Docker 镜像
container_name与特定镜像一起使用的名称
userLinux 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。

  • 数据持久化: 您的应用数据存储于指定的存储路径中,即使在应用重启或系统重启后也会保持完好。