CapRover

本地运行


注意:这是一项高级操作。本节涉及的一些概念对初学者并不友好。为了在你的本机上运行 CapRover(仅用于测试与开发),你需要在本机安装 Docker。


注意:如果你更喜欢视频教程,可以参考社区在 YouTube 上制作的教程视频

关于根域名(root domain),默认情况下 CapRover 使用 http://captain.captain.localhost。在大多数系统上,captain.captain.localhost 会自动解析到本机 IP 地址(即 127.0.0.1),因此不需要额外配置。

不过,如果它没有自动解析,你需要手动把 *.captain.localhost 指向 127.0.0.1192.168.1.2(你的本机 IP)。注意:仅修改 etc/hosts 不够,因为 Captain 需要通配符记录,而 etc/hosts 不支持通配符(例如 *.something)。在 Ubuntu 16 上,内置了 dnsmasq(本地 DNS 服务器)。因此,你只需要编辑这个文件:/etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.conf(不存在就创建),并添加这一行:address=/captain.localhost/192.168.1.2,其中 192.168.1.2 是你的本机 IP 地址。要确认你是否安装了 dnsmasq,可以在终端运行 which dnsmasq;如果可用会输出其路径,否则不会输出任何内容。 注意:对于 Ubuntu 18,请阅读这篇 Ask Ubuntu 说明

为了验证你已满足上述两个前置条件:

  • 运行 docker version,并确保版本至少满足 文档 中提到的要求
  • 运行 nslookup randomstring123.captain.localhost,并确保它解析到 127.0.0.1 或你的本机 IP(例如 192.168.1.2):
Server:		127.0.1.1
Address:	127.0.1.1#53

Name:	randomstring123.captain.localhost
Address: 192.168.1.2

安装

确认前置条件准备就绪后,你就可以像在服务器上一样,在本机安装 Captain。请确保使用具有足够权限的用户运行(例如在 Linux 系统上使用 sudo)。按这里的步骤操作即可:安装 CapRover,但需要注意下方提到的几处差异。

差异:

主 IP

首先,本地安装的命令需要额外参数(MAIN_NODE_IP_ADDRESS

echo  "{\"skipVerifyingDomains\":\"true\"}" >  /captain/data/config-override.json
docker run -e ACCEPTED_TERMS=true -e MAIN_NODE_IP_ADDRESS=127.0.0.1 -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover

**注意:**如果 80 和 443 端口当前已被占用,而你又希望把 CapRover 跑在反向代理后面,请参阅这里

初始化设置

不要运行 caprover serversetup。请改为打开 http://captain.captain.localhost:3000,并手动把 root domain 设置为 captain.localhost。不要启用或强制 HTTPS。显然,你无法在本地域名(captain.localhost)上启用 HTTPS。

当你把 root domain 设为 captain.localhost 后,使用 caprover login,在 captain URL 里输入 http://captain.captain.localhost,默认密码输入 captain42

但如果你希望从局域网内的其他设备访问该 CapRover 实例,你可以把 root domain 设置为 captain.LOCAL_IP.sslip.io(例如 captain.192.168.1.2.sslip.io)。

非 Linux 用户 你需要把 /captain 添加到共享路径(shared paths)。 操作方式:点击 Docker 图标 -> Setting -> File Sharing,然后添加 /captain

至此就可以了!

在私有(本地)网络中安装 CapRover

当你想在家庭网络中安装 CapRover(例如装在 Raspberry Pi 上)时,这会很有用。

假设你的网络如下:

┌───────────────────────┐
│    Your Router        │
│                       │
│     public IP         │
│    11.22.33.44        │           your private network
├───────────────────────┴─────────────────────────────────────────────────────────────────────┐
│                                                                                             │
│ ┌────────────────┐      ┌──────────────────┐        ┌──────────────────┐                    │
│ │                │      │                  │        │                  │                    │
│ │    PC1         │      │     PC2          │        │       PC3        │                    │
│ │                │      │                  │        │                  │                    │
│ │  192.168.1.10  │      │    192.168.1.11  │        │    192.168.1.12  │                    │
│ │                │      │                  │        │                  │                    │
│ └────────────────┘      └──────────────────┘        └──────────────────┘                    │
│                                                                                             │
│                                                                                             │
│                                                                                             │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

你可以在 PC3 上通过运行以下命令来安装 CapRover:

echo  "{\"skipVerifyingDomains\":\"true\"}" >  /captain/data/config-override.json
docker run -e ACCEPTED_TERMS=true -e MAIN_NODE_IP_ADDRESS=192.168.1.12 -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover

这里唯一额外需要注意的是: -e MAIN_NODE_IP_ADDRESS=192.168.1.12,以及同时在 CapRover 中禁用域名校验(domain verification)。

此时,你应该可以从 PC1 和 PC2 的浏览器通过 http://192.168.1.12:3000 访问 CapRover 控制台。

你暂时还无法部署应用,但控制台应当是可访问的。 如果控制台不可访问,说明你内部网络里可能有防火墙阻止 PC1 访问 PC3。

如果控制台可访问,请继续下一阶段。

选项 1 - 仅内部使用场景:

你可以把 CapRover 安装在内网中,使其只在私有网络内可访问。要做到这一点,你需要在本地 DNS 服务器中添加 *.caproverinstance.local(或类似域名)的解析并指向 192.168.1.12。如果你没有本地 DNS 服务器,就无法使用这种方式。

一些本地 DNS 服务器(例如 PiHole)不允许在本地 DNS 记录中使用通配符;这种情况下,你需要添加 captain.caproverinstance.local 指向该 IP,未来再把应用域名一个个添加进去。虽然麻烦,但可行。

现在,通过 http://192.168.1.12:3000 打开控制台,将 root domain 更新为 caproverinstance.local

此时,你应该可以在浏览器中通过 http://captain.caproverinstance.local 访问控制台。 如果在这里遇到问题,说明你的本地 DNS 服务器没有按预期工作,你需要先修复它。

注意:对于内部域名,你不应该(也无法)启用 HTTPS。

选项 2 - 让实例可从外网访问

前置要求:你的公网 IP 必须是静态 IP 地址。

这与在公网 VPS 上安装 CapRover 非常类似。你需要做的就是在路由器上启用端口转发(port forwarding):

port 80 of router => port 80 of 192.168.1.12
port 443 of router => port 80 of 192.168.1.12

然后使用你常用的 DNS 服务商,把 *.domain.com 解析到你网络的公网 IP 地址。

接下来像普通安装一样,登录 http://192.168.1.12:3000,把 root domain 更新为 domain.com

此时,你的实例应该可以通过 http://captain.domain.com 访问。你可以启用 HTTPS 并部署应用。

故障排查:

如上所述,在本机运行属于高级任务,可能由于各种原因失败;不同错误对应的解决方式也不同。例如,如果你遇到如下错误:

Captain Starting ...
Installing Captain Service ...
December 18th 2017, 11:51:11.295 pm    Starting swarm at 34.232.18.13:2377
Installation failed.
{ Error: (HTTP code 400) bad parameter - must specify a listening address because the address to advertise is not recognized as a system address, and a system's IP address to use could not be uniquely identified
    at /usr/src/app/node_modules/docker-modem/lib/modem.js:254:17
    at process._tickCallback (internal/process/next_tick.js:180:9)
  reason: 'bad parameter',
  statusCode: 400,
  json:
   { message: 'must specify a listening address because the address to advertise is not recognized as a system address, and a system\'s IP address to use could not be uniquely identified' } }

你可以尝试:

docker run -e ACCEPTED_TERMS=true -e "MAIN_NODE_IP_ADDRESS=192.168.1.2" -v /var/run/docker.sock:/var/run/docker.sock caprover/caprover

并把 192.168.1.2 替换成你自己的本机 IP。