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. 04JSON Schema による検証
  5. 05CLI または REST API でアプリを読み込み

活用シーン

  1. 01RouterOS コンテナーアプリの作成
  2. 02デプロイ前の YAML 確認
  3. 03アプリストアコレクションの設定
  4. 04YAML エディターの補完設定

インストール

コマンドをコピーしてターミナルで実行します。

$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で1つ以上のコンテナを単一の「アプリケーション」として定義できます。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]2種類の形式(下記参照)
環境変数KEY=valueまたはリスト同じですが、プレースホルダーが展開されます
ボリューム名前付きまたはバインドマウント一部のみ対応 — バインドマウントのオプションはありません
ネットワーク完全なDockerネットワークモデル簡易版 — 名前と外部ネットワーク
ビルドDockerfileを完全にサポート最小限(contextとdockerfile)
設定Docker configs 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 or 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: 配下の各キーは、1つのコンテナを定義します。必須プロパティは image です。

プロパティ型説明
imagestringコンテナイメージ(レジストリを省略すると、/container/config の registry-url が使用されます)
container_namestring明示的な名前。/container 配下のファイルパスのベースとして使用されます
hostnamestringコンテナのホスト名
entrypointstring or string[]デフォルトのエントリーポイントを上書きします
commandstring or string[]デフォルトのコマンドを上書きします
portsarrayポートマッピング(形式のセクションを参照)
environmentobject or array or null環境変数(KEY=value のリスト、または {KEY: value} のマップ)
volumesarray of stringsボリュームのマウント(例:my-vol:/data)
configsarray of objects設定ファイルの配置({source, target, mode})
restartenumno、always、on-failure、unless-stopped
depends_onarray or objectサービスの依存関係の順序
devicesarray of stringsコンテナに渡すデバイスマッピング
userstringコンテナを実行するユーザー
security_optarray of stringsセキュリティオプション
shm_sizestring共有メモリのサイズ
stop_grace_periodstring or intSIGKILL を送信するまでの時間
ulimitsobjectリソース制限(例:nofile: {soft: 65536, hard: 65536})
buildobject or stringビルド設定(コンテキスト、Dockerfile、引数)
healthcheckobjectヘルスチェック(test、interval、timeout、retries、start_period)
stdin_openboolean標準入力を開いたままにします
exposearray内部ポート(ホストには公開されません)
secretsarray of strings公開するシークレット
attachboolean標準入出力に接続します

ポート形式 — 2つのスタイル

RouterOS では、2種類のポートマッピング文字列形式がサポートされています。どちらも有効ですが、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 からアプリコレクションを読み込めます。ストア形式は、/app 定義を並べた単純な YAML 配列です:

- 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 ドキュメントには、2種類のスキーマがあります:

スキーマ用途ポートの検証環境変数名
*.latest.jsonCI/厳格な検証正規表現パターンを適用^[A-Z_][A-Z0-9_]*$ のみ
*.editor.jsonエディター/SchemaStore の使いやすさ正規表現なし(自動補完が可能)大文字と小文字を区別しない

厳格なスキーマでは、ポート文字列に正規表現の pattern が設定されており、VSCode の自動補完が妨げられます。YAML 拡張機能は、パターンが設定されたフィールドの値を候補として提案しません。エディター用のバリアントでは、これらのパターンを削除しています。

VSCode との統合

YAML の自動補完を有効にするには、VSCode の設定に次を追加します:

{
  "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 はこれを無視するため、不要です
  • 1 つのエントリでポート形式を混在させる — 各ポート文字列では、いずれか 1 つの形式のみを使用する必要があります
  • 厳密な検証では環境変数名を大文字にする必要があります — 大文字と小文字が混在する場合は *.editor.json を使用してください
  • コンテナパッケージを忘れる — container 追加パッケージがないと /app は 404 を返します
  • deploy: や resources: を使う — RouterOS ではサポートされていません

その他のリソース

コメント