アプリコンテナの操作手順です。テンプレートごとの設定はハブのテンプレート一覧から。
いちばん簡単な例として、Tailscale を 1 つ足してみます。どのテンプレートでも流れは同じです。
デバイス詳細の「このデバイスに適用されているコンフィグ」からコンフィグを開き、右下の 編集 を押します。

コンフィグはバージョン管理されていて、編集すると新しいバージョンができます。前のバージョンはそのまま残るので、おかしくなったら戻せます。
いま宣言されているコンテナが一覧で出ます。いちばん下の コンテナを追加 を押します。
名前は自動で入ります (hidden-river-1372 のようなランダムな名前)。気に入らなければ変えてください。

タイルをクリックすると、そのテンプレートの説明が下に出ます。

💡テンプレートを選ぶと、そのアプリに合った初期値が自動で入ります。
UniFi なら公開ポート 4 つとメモリ 2GiB、Tailscale ならメモリ 256MiB といった具合です。
あとから自由に変えられます。
テンプレートによって、トークンや認証キーを求められます。Tailscale なら 認証キー です。

シークレットはプレースホルダーから選ぶのが基本です。詳しくは: シークレットを安全に渡す。
コンテナが参加する LAN を 1 つ以上選びます。WAN は選べません。
メモリ・CPU・永続ボリュームをスライダーか直接入力で決めます。

右下の 保存 を押すと差分の確認が出ます。問題なければ保存し、デバイス詳細に戻って「最新バージョンに更新」で適用します。
デバイス詳細の「アプリコンテナ」に出ます。コンテナ名の左にはテンプレートのロゴが出るので、何が動いているか一目で分かります。

稼働状況 が 稼働中 になれば完了です。構築には数分かかります (パッケージのダウンロードがあるため)。
追加・編集フォームは 5 つのセクションに分かれています。
| 項目 | 説明 |
|---|---|
| Key | コンテナ名。LXD インスタンス名になる (app- が付く)。変えると別コンテナとして作り直しになる |
| 表示名 | 画面に出る名前。いつでも変えられる。動作には影響しない |
テンプレート と カスタムイメージ のどちらかを選びます (両方は指定できません)。
テンプレートを選ぶと、そのテンプレートが要求する入力欄が出ます。入力欄はテンプレートごとに違います
(tunnelToken / authKey / serverAddress など)。
| 項目 | 説明 |
|---|---|
| 接続先 LAN | 1 件以上必須。複数選ぶと複数の LAN に足が生える。WAN は選べない |
| ポート公開範囲 | 公開しない / LAN / WAN |
| 公開ポート | 公開範囲が LAN / WAN のとき 1 件以上必須。プロトコル (TCP/UDP) とポート番号 |

| 項目 | 形式 | 説明 |
|---|---|---|
| メモリ上限 | 512MiB / 2GiB |
必須。足りないとコンテナ内のプロセスが OOM で落ちる |
| CPU コア数上限 | 1〜16 | 必須 |
| 永続ボリュームサイズ | none または 1GiB など |
必須。コンテナの /data にマウントされる |
ゲートウェイの設定です。普段は触りません。

接続先 LAN は、コンテナがどのネットワークに参加するかです。ここで選んだ LAN の DHCP からアドレスをもらい、その LAN の機器と直接通信できるようになります。
複数の LAN に繋ぐと、最初に書いた LAN が「主」になります。ポートフォワードやゲートウェイの
戻り経路は最初の LAN にだけ生成されます。
⚠️ 選んだ LAN が別々のファイアウォールゾーンに属していると警告が出ます。ゾーンをまたぐ通信はゾーン間 forwarding の設定しだいなので、意図したとおりに届かないことがあります。保存自体は通ります。
ポート公開範囲 は 3 択です。
| 設定 | どこから届くか | 使いどころ |
|---|---|---|
| 公開しない | どこからも届かない。コンテナから外へ出る通信だけ | Cloudflare Tunnel / Tailscale / WARP のように、自分から繋ぎにいくアプリ |
| LAN | 接続先 LAN の機器から届く | UniFi / Omada / Portainer のような社内向け管理 UI |
| WAN | インターネット側からも届く (ポートフォワード) | REALITY のように外から接続を受けるサーバー |
公開すると、ポートごとに プロトコル と ポート番号 を指定します。同じ「プロトコル + ポート」の
組み合わせは重複できません (tcp/53 と udp/53 は別物なので OK)。
🚩 WAN 公開には条件があります。
・接続先 LAN がちょうど 1 つのファイアウォールゾーンに属していること
・WAN を含むゾーンがあること
・その WAN が IPv4 の着信を受けられること — MAP-E と DS-Lite では公開できません
(MAP-E は PSID 分のポートしか持てず、DS-Lite は自分の IPv4 を持たないため)。ipip6 は使えます
・他のアプリや firewall.portForwards とポートがぶつからないこと
条件を満たさないと保存時にエラーになります。
コンテナを「LAN と対向ネットワークの橋渡し」にする設定です。Tailscale のサブネットルーターが典型例です。

| モード | 意味 |
|---|---|
| 動作しない | ゲートウェイにしない (既定) |
| サブネットルーター | 接続先 LAN のサブネットを対向へ広告する。対向から LAN の機器に届くようになる |
| Exit ノード | デフォルトルートを引き受ける。対向のすべての通信を中継する |
有効にすると確認ダイアログが出て、実際に広告される範囲が表示されます。

この 2 つは向きが逆なので混同しないでください。
| 項目 | 向き | 意味 |
|---|---|---|
| 広告する経路 | ローカル → 対向 | このコンテナが対向に「ここまで届くよ」と伝える範囲。空欄なら接続先 LAN のサブネットを自動で広告 |
| 対向クライアント範囲 | 対向 → ローカル | 対向側クライアントのアドレス範囲 (例: Tailscale の 100.64.0.0/10)。LAN の機器からの応答をコンテナへ戻す経路がここから作られる |
対向側が LAN 向きの通信を SNAT しているなら、クライアントのアドレスは LAN 側に出てこないので
対向クライアント範囲 は不要です。
テンプレートの推奨値が入るので、基本はそのままで大丈夫です。実測の目安:
| アプリ | 実測 RSS | 推奨 |
|---|---|---|
| Cloudflare Tunnel | 小さい | 256MiB |
| Tailscale | 小さい | 256MiB |
| REALITY (sing-box) | 小さい | 256MiB |
| WARP Connector | — | 512MiB |
| Docker + Portainer | 約 140MiB (Docker と Portainer 自身のみ) | 512MiB + 動かすコンテナの分 |
| UniFi | 852〜955MiB | 2GiB 以上 |
| Omada | 約 1.4GiB | 2GiB 以上 |
足りないとコンテナ内のプロセスが OOM Killer に落とされます。Java 系 (UniFi / Omada) は特に要注意です。
1〜16 コア。ほとんどのアプリは 1 で足ります。
none にすると、コンテナを作り直したときに中のデータは消えます。データを残したいアプリでは
容量を指定してください。
| アプリ | 推奨 |
|---|---|
| Cloudflare Tunnel / Tailscale / REALITY / WARP | none |
| UniFi / Omada | 4GiB 以上 |
| Docker + Portainer | 8GiB 以上 (Docker のイメージが載るため) |
ボリュームはコンテナの /data にマウントされます。
テンプレートは、アプリが既定で書き込む場所を /data の下へ向け直しています。たとえば UniFi は
本来 /var/lib/unifi にデータを書きますが、cloud-init が起動前にそれを /data へ移して
symlink を張り替えています (そうしないとボリュームを付けてもコンテナの作り直しでサイト設定が消えるため)。
🚩 コンテナをコンフィグから消すと、ボリュームごと消えます。 名前 (Key) を変えたときも、
旧コンテナとボリュームを削除して新規作成になります。中のデータは戻りません。
残したいものがあるなら、消す前にコンテナの中でバックアップを取ってください。

トークンや認証キーは、プレースホルダー経由で渡すのが基本です。
シークレットの入力欄には、登録済みのプレースホルダーが一覧で出ます。

その場で新しく作ることもできます。

選ぶと、コンフィグには {{.kaoru_tailscale2}} のような参照だけが書かれます。値そのものは
コンフィグに入りません。
^[a-zA-Z_][a-zA-Z0-9_]*$
英字かアンダースコアで始まり、以降は英数字とアンダースコア。ハイフンは使えません —
デバイス側の置換が Go の text/template で、{{.foo-bar}} を識別子として解析できないためです。
入力欄には値を直接書くこともできます。ただしその値は平文のまま次の場所に残ります。
プレースホルダー参照にしておけば、これらに残るのは {{.key}} だけです。
コンテナが動き出すと、テンプレートが宣言した出力がクラウドへ報告されます。一覧の「出力」列から開きます。

出力には 3 種類あります。
| 種類 | 例 | 見え方 |
|---|---|---|
| サービスの稼働状態 | running |
そのまま表示 |
| URL | 管理 UI のアドレス | クリックできるリンク + QR |
| シークレット | クライアント接続リンク | 伏せ字。目のアイコンで表示できる |
URI 形式の値には QR コードが付きます。スマートフォンのクライアントで読み取れます。

一覧の右端「…」から操作できます。

| 操作 | 説明 |
|---|---|
| 起動 / 停止 | 実行中の状態への一時的な操作。コンフィグの宣言は変わらないので、次の収束で起動状態に戻ります |
| ターミナル | コンテナの中にシェルで入ります |
ブラウザからコンテナの中に入れます。ログを見たり、設定を確認したりするのに使います。


⚠️ ここで手を入れた変更は残りません。 コンテナの中身は cloud-init が作る前提なので、
再プロビジョニング (テンプレート更新やシークレット差し替え) が走ると上書きされます。
恒久的に変えたいならテンプレート側を直してください。
| したいこと | やること | デバイス上で起きること |
|---|---|---|
| 設定を変える | 該当の項目を編集して保存・適用 | 差分だけを収束 |
| シークレットを入れ替える | プレースホルダーの値を更新 | cloud-init が走り直して反映 |
| 名前を変える | Key を書き換える | 旧コンテナとボリュームを削除して新規作成 |
| 止める | — | できません。止めたいならコンフィグから消す |
| 消す | エントリを削除して保存・適用 | コンテナとボリュームを削除 |
💡 一時的に止めたいだけなら一覧の「停止」が使えますが、これはコンフィグの宣言を変えないので、
次の収束でまた起動します。恒久的に止める手段はコンフィグから消すことだけです。
GUI の代わりに JSON を直接書けます。まとめて直したいときや、他のコンフィグからコピーしたいときに便利です。

UCI プレビューに切り替えると、この設定がデバイス上でどんな UCI になるかが見られます。
apps から自動生成された veth の port や DHCP 予約、ポートフォワードのルールもここで確認できます。
テンプレートにないものを動かしたいときは、素の OS イメージからコンテナを立てられます。
| テンプレート | カスタムイメージ | |
|---|---|---|
| 中身 | cloud-init が自動で作る | 空。自分で入れる |
| 入力 | テンプレートが宣言したものを渡せる | 渡せない (inputs は指定不可) |
| 出力 | テンプレートが宣言したものが返る | なし |
| 再現性 | コンテナを作り直しても同じ状態になる | 手で入れたものは消える |
| 向いている場面 | 定番のアプリ | 試したいとき、一度きりの用途 |
⚠️ カスタムイメージのコンテナは、中身が再現できません。コンテナを作り直すと素の状態に戻ります。
何度も使うならテンプレートにするのがおすすめです。
「カスタムイメージ」タブに切り替えると、OS がタイルで並びます。

AlmaLinux / Alpine / Arch / CentOS / Debian / Fedora / Gentoo / Kali / Mint / openSUSE / OpenWrt /
Oracle / RockyLinux / Slackware / Ubuntu / Void Linux など、LXD の公式イメージサーバーにあるものが
そのまま選べます。
OS を選ぶと、バージョンと変種を選ぶプルダウンが出ます。

右側に、実際に使われる alias (debian/bookworm/cloud など) が表示されます。
イメージ一覧は LXD 公式のカタログ (images.lxd.canonical.com) から取っていて、
amd64 のものだけを出しています。
カスタムイメージのコンテナは素の OS なので、中身は自分で作ります。
稼働中 になるのを待つ# Debian 系
apt-get update && apt-get install -y nginx
# Alpine
apk add nginx
# systemd (Debian / Ubuntu など)
systemctl enable --now nginx
# OpenRC (Alpine)
rc-update add nginx default
rc-service nginx start
/data の下に置く (ボリュームを付けている場合)たとえば LAN 内向けに Web サービスを立てるなら:
| 手順 | やること |
|---|---|
| 1 | カスタムイメージで debian/bookworm/cloud を選ぶ |
| 2 | 接続先 LAN を選ぶ |
| 3 | ポート公開範囲を LAN にして、使うポート (tcp/80 など) を追加 |
| 4 | ボリュームを指定する (データを残すなら) |
| 5 | メモリを決める。Web サーバーなら 256〜512MiB |
| 6 | 保存してデバイスに適用 |
| 7 | 稼働したら WebShell で入ってアプリを導入 |
| 8 | DHCP リースの一覧でコンテナの IP を確認 (app-<コンテナ名> で出ます) |
| 9 | LAN の端末から http://<その IP> でアクセス |
コンテナの IP は、デバイス詳細の「DHCP リース」で app-<コンテナ名> というホスト名で見つかります
(アプリコンテナ一覧のすぐ下にあります)。
以下に当てはまるならテンプレート化を検討してください。