mcpField
R
routeros-app-yaml

routeros-app-yaml

github.com/tikoci云与 DevOps8343 次安装5 天前更新
代码仓库

关于 routeros-app-yaml

介绍通过 MikroTik RouterOS `/app` 定义和管理容器应用的 YAML 格式,适用于 RouterOS 用户及相关工具开发者,说明支持属性、校验方式与 API 用法。

主要功能

  1. 01定义服务、卷和网络
  2. 02配置端口与占位符
  3. 03声明内联配置文件
  4. 04使用 JSON Schema 校验
  5. 05通过命令行或 REST API 加载应用

适用场景

  1. 01创建 RouterOS 容器应用
  2. 02部署前检查 YAML
  3. 03配置应用商店集合
  4. 04设置 YAML 编辑器补全

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tikoci/routeros-skills --skill routeros-app-yaml

安装后在 Claude Code 中输入/routeros-app-yaml确认已加载。

附带文件references/examples.md

详细介绍

RouterOS /app YAML 格式(7.21+)

RouterOS 7.21 引入了 /app 路径(内置应用列表和管理功能)。完整的 YAML 应用创建功能(/app/add)在 7.22 中推出(首次出现在 7.22beta5 中)。可以把它看作 MikroTik 提供的一种固执己见的 docker-compose 替代方案——但它不是 docker-compose,且两者存在显著差异。

/app 是什么

/app 子系统允许用户在 YAML 中将一个或多个容器定义为一个“应用”。RouterOS 会解析 YAML,创建容器、卷、网络和配置文件,然后管理其生命周期。

关键概念:

  • 每个 /app 都通过包含服务、配置、卷和网络的 YAML 文档定义
  • YAML 通过 CLI(/app/add yaml-url=...)或 REST API 加载到 RouterOS 中
  • 内置应用随 RouterOS 一起提供(可通过 GET /rest/app 查看)
  • 可通过 URL 或内联 YAML 添加自定义应用
  • 应用商店(app-store-urls=)提供精选合集

与 docker-compose 的关键差异

功能docker-composeRouterOS /app
端口格式host:container[/protocol]两种格式(见下文)
环境变量KEY=value 或列表相同,但支持占位符展开
卷命名卷或绑定挂载子集——不支持绑定挂载选项
网络完整的 Docker 网络模型简化版——名称 + 外部网络
构建完整的 Dockerfile 支持基础支持(context + dockerfile)
配置Docker 配置 API仅支持内联 content
部署/资源支持不支持
顶层 version:已弃用(曾为必填项)不使用
文件扩展名.yml / .yaml.tikapp.yaml(约定)

顶层属性

属性类型必填说明
namestring否/app 的唯一标识符
descrstring否在应用 UI 中显示的可读描述
pagestring (URI)否项目主页 URL
categorystring (enum)否应用商店分类
iconstring (URI)否图标 URL(当 show-in-webfig=yes 时在 WebFig 中显示)
default-credentialsstring 或 null否在 UI 中显示的 username:password
url-pathstring否用于浏览器访问的 URL 路径后缀(例如 /admin)
credentialsstring否凭据提示(可替代 default-credentials)
optionboolean否应用是否为可选项
auto-updateboolean否每次启动时拉取并重启容器
servicesobject是容器服务定义(至少需要 1 个)
volumesobject否命名卷声明
networksobject否网络声明
configsobject否带内联内容的配置文件声明
类别值(完整列表)
productivity, storage, networking, development, communication,
file-management, search, video, media, media-management,
home-automation, monitoring, database, automation, ai,
messaging, radio, security, business

MikroTik 添加内置应用时会出现新的类别。CI 架构验证会检测这些类别。

服务属性

services: 下的每个键都定义一个容器。必需属性:image。

属性类型说明
image字符串容器镜像(省略注册表即可使用 /container/config 的 registry-url)
container_name字符串显式名称;用作 /container 下文件路径的基础名称
hostname字符串容器主机名
entrypoint字符串或字符串[]覆盖默认入口点
command字符串或字符串[]覆盖默认命令
ports数组端口映射(参见格式一节)
environment对象或数组或 null环境变量(KEY=value 列表或 {KEY: value} 映射)
volumes字符串数组卷挂载(例如 my-vol:/data)
configs对象数组配置文件放置位置({source, target, mode})
restart枚举no、always、on-failure、unless-stopped
depends_on数组或对象服务依赖顺序
devices字符串数组传递给容器的设备映射
user字符串运行容器所用的用户
security_opt字符串数组安全选项
shm_size字符串共享内存大小
stop_grace_period字符串或整数SIGKILL 前的等待时间
ulimits对象资源限制(例如 nofile: {soft: 65536, hard: 65536})
build对象或字符串构建配置(context、dockerfile、args)
healthcheck对象健康检查(test、interval、timeout、retries、start_period)
stdin_open布尔值保持 stdin 打开
expose数组内部端口(不发布到主机)
secrets字符串数组要公开的密钥
attach布尔值附加到标准输入输出

端口格式 — 两种写法

RouterOS 支持两种端口映射字符串格式,两种都有效;7.23beta2 及更高版本中的新应用优先使用冒号格式。

旧版 OCI 风格(7.23 之前)
[ip:]host_port:container_port[/tcp|/udp][:label]

示例:

ports:
  - "8080:80/tcp"
  - "8443:443/tcp:https"
  - "192.168.1.1:53:53/udp:dns"
新版 RouterOS 风格(7.23+)
[ip:]host_port:container_port[:label][:tcp|:udp]

协议使用冒号而非斜杠追加:

ports:
  - "8080:80:web:tcp"
  - "8443:443:https:tcp"
  - "53:53:dns:udp"
长格式(对象)语法
ports:
  - target: 80
    published: 8080
    protocol: tcp
    name: web
    app_protocol: http
端口中的 IP 地址和占位符

端口字符串可以包含字面 IP 地址或占位符表达式:

ports:
  - "[accessIP]:[accessPort]:80/tcp:web"      # Old style with placeholders
  - "[accessIP]:[accessPort]:80:web:tcp"       # New style with placeholders

占位符

RouterOS 会在部署时展开以下占位符:

占位符展开为
[accessIP]从外部访问应用时使用的 IP 地址
[accessPort]外部访问的主机主端口
[accessPort2]次要主机端口
[containerIP]分配给容器的 IP 地址
[routerIP]路由器自身的 IP 地址

占位符可出现在端口映射、环境变量值和配置内容中。

配置(内联文件)

顶层的 configs: 用于声明配置内容;服务会引用这些配置:

configs:
  my-config:
    content: |
      server {
        listen 80;
        server_name [accessIP];
      }

services:
  web:
    image: nginx:alpine
    configs:
      - source: my-config
        target: /etc/nginx/conf.d/default.conf
        mode: 0644

卷和网络

volumes:
  app-data: {}      # Named volume (null or empty object)

networks:
  app-net:
    name: my-network
    external: true   # Use existing RouterOS network

存储库架构(app-store-urls)

RouterOS 可以从通过 app-store-urls= 配置的 URL 加载应用集合。存储库格式就是一个 YAML 数组,其中包含 /app 定义:

- name: app-one
  services:
    web:
      image: nginx:alpine
- name: app-two
  services:
    db:
      image: postgres:16

按照惯例,存储库文件使用 .tikappstore.yaml 扩展名。

/app 的 REST API

// List all /app entries (built-in + custom)
const apps = await fetch(`${base}/app`, auth).then(r => r.json());

// Each entry has: .id, name, yaml (raw YAML string), and metadata
// The 'yaml' field is a RouterOS string containing the full YAML document

// Add a custom /app from URL
await fetch(`${base}/app`, {
  method: "PUT",
  ...auth,
  body: JSON.stringify({ "yaml-url": "https://example.com/my-app.tikapp.yaml" }),
});

注意:/app 端点要求安装 container 额外软件包。

用于验证的 JSON Schema

每个 /app 文档都有两种 Schema 变体:

Schema用途端口验证环境变量名称
*.latest.jsonCI/严格验证强制执行正则表达式模式仅限 ^[A-Z_][A-Z0-9_]*$
*.editor.json编辑器/SchemaStore 用户体验无正则表达式(允许自动补全)不区分大小写

严格 Schema 在端口字符串上使用正则 pattern,这会 阻止 VSCode 自动补全——YAML 扩展不会为带有模式的字段提供建议。编辑器变体移除了这些模式。

VSCode 集成

将以下内容添加到 VSCode 设置中,以启用 YAML 自动补全:

{
  "yaml.schemas": {
    "https://tikoci.github.io/restraml/routeros-app-yaml-schema.latest.json": "*.tikapp.yaml",
    "https://tikoci.github.io/restraml/routeros-app-yaml-store-schema.latest.json": "*.tikappstore.yaml"
  }
}

使用 .editor.json URL 可获得更好的自动补全,但验证严格性会降低。

版本历史

  • 7.22:初始支持 /app,提供基本服务属性
  • 7.23beta2:新增冒号样式的端口格式(:tcp/:udp 后缀)
  • 7.23+:新增服务属性(devices、expose、secrets、attach)

常见错误

  • 误以为兼容 docker-compose——并非支持所有属性,部分属性的行为也有所不同
  • 使用 version: 键——RouterOS 会忽略它;无需使用
  • 在同一条目中混用端口格式——每个端口字符串必须且只能使用一种格式
  • 严格验证要求环境变量名称使用大写——混合大小写时请使用 *.editor.json
  • 忘记容器软件包——未安装额外的 container 软件包时,/app 会返回 404
  • 使用 deploy: 或 resources:——RouterOS 不支持

其他资源

评论

支持 Markdown