高阶网关应用（GatewayApp）
==========================

在 iKuaiOS 上运行 Linux 容器。不是虚拟机，不需要宿主 root。

一、这是什么
------------
一个容器运行平台，全部操作在网页控制台完成，不需要命令行。

你把一个 Linux 根文件系统打成 .rfs 镜像导入，就能在路由器上跑一个隔离的 Linux
实例。本包只含运行平台本身，不含系统镜像，镜像请在控制台的「镜像库」里下载或
上传。

二、安装后怎么用
----------------
1. 应用市场安装本应用，填写两个字段：
     - 控制台密码：自己设一个，用于登录网页控制台
     - 控制台端口：默认 18770
2. 打开 http://路由器IP:18770，用上面的密码登录。
3. 依次做三件事：
     「镜像库」→ 添加一个系统镜像（填下载地址，或上传 .rfs 文件）
     「网络」  → 确认要接入的网络（可自动探测到宿主网桥）
     「实例」  → 新建实例，四步向导走完即可

三、创建实例的四步
------------------
1. 镜像   选择镜像库里已有的系统
2. 网络   选择实例接入哪个网络：
             - 桥接 LAN：拿一个和路由器同网段的地址，像普通设备一样被访问
             - NAT：独立内网地址，只能出网，外部访问需要发布端口
             - 无网络：只在本机跑，不联网
3. 资源   名称、主机名、内存上限、CPU 上限、是否随系统启动
4. 确认   核对摘要，可勾选「创建后立即启动」

四、网络怎么选
--------------
默认建议用「桥接 LAN」，也就是旁路由那种用法。

假设路由器 LAN 是 192.168.9.1/24，把实例桥接上去后它会通过 DHCP 拿到
192.168.9.x 的地址，局域网里其他设备可以直接访问它，不需要做端口映射。

地址是稳定的：本应用按实例名派生固定 MAC，重启后仍然拿到同一个地址，因此
你在别处写的 IP、端口、DNS 记录不会因为重启而失效。

NAT 模式适合作业型实例（爬虫、下载器）：实例在一段独立内网里，出网正常，
外部想访问就在创建时发布端口，例如 2222:22 表示把实例的 22 端口映射到宿主
2222。未发布的端口不会被外部访问到。

五、镜像从哪来
--------------
本应用不带系统镜像。官方镜像请从
  https://dl.naixi.net/ikuai/gateway-app/
下载 .rfs 文件，然后在「镜像库」里填这个地址，或在本地下载后上传。

也可以自己制作：在任意 Linux 环境里准备好根文件系统目录，用包内的
gateway-import 打成 .rfs。镜像里不需要装 DHCP 客户端、不需要装 sshd 之外的
任何网络工具——地址由宿主代取。

关于 glibc 和 musl：两种都支持，导入时会自动识别镜像用的是哪一种。

本应用的组件一律静态编译，所以在任何镜像里都能直接运行，不受镜像 libc 影响。
如果你要往实例里放自己的程序（例如 iptables 这类涉及内核的工具），按镜像里的
系统来选版本即可：Debian/Ubuntu 用 glibc 版，Alpine/OpenWrt 用 musl 版。选错
版本的典型现象是执行时提示「No such file or directory」，但文件明明就在那里——
那是因为程序内嵌的动态加载器路径在镜像里不存在，不是文件丢了。


六、日常维护
------------
在实例详情页可以：启动、停止、快照、设为/取消开机启动、删除。
「开机启动」打开后，路由器重启会自动把实例拉起来，并续到原来的地址。

七、常见问题
------------
Q: 实例起来了但地址显示「—」或「获取中」
A: 桥接模式下地址来自局域网的 DHCP。若一直取不到，检查路由器 DHCP 是否
   开启、地址池是否还有空位。租约失败的原因会显示在网络卡片里。

Q: 局域网访问不到实例
A: 先确认实例状态是「运行中」且地址不是灰的（灰色表示已停止）。桥接模式下
   实例和路由器同网段，若仍不通，检查是否有客户端隔离之类的设置。

Q: 实例重启后地址变了
A: 正常情况下不会。若变了，说明 DHCP 服务器把原地址分给了别人（例如地址池
   很小）。可以改用 NAT 模式配合端口发布，完全不依赖局域网的 DHCP。

Q: 要不要在镜像里装 SSH
A: 需要远程登录就装。也可以不用 SSH，直接在实例里跑你的服务。

八、风险提示
------------
实例之间互相隔离，但都运行在同一台路由器上，共享宿主内核与磁盘。不要在里面
跑不受信任的代码。
