CapRover

故障排查


本节涵盖用户最常遇到的问题。

无法连接 <ip_server>:3000

造成这种情况的原因有很多。

第一)

你需要先确认 CapRover 正在服务器上运行。要检查这一点,请 ssh 登录到服务器并运行:

docker service ps captain-captain --no-trunc

你可能会看到 Captain 因为某个错误在不断重启。修复问题后再重试。例如可以参考:创建 vxlan 接口出错,或创建挂载源路径出错。以 Linode 为例,它有不少相关问题,比如 subnet sandbox join failedvxlan interface。请在 CapRover GitHub Issues 中搜索你的问题;如果找不到解决方案,可以在 GitHub 上新建一个 issue。

第二)

如果你运行 docker service ps captain-captain --no-trunc 没有看到任何错误,那么再试试:

docker service logs captain-captain --since 60m

## you should also get the logs from nginx

docker service logs captain-nginx --since 60m

你可能会看到 CapRover 因为某个错误在不断重启。请在 CapRover GitHub Issues 中搜索你的问题;如果找不到解决方案,可以在 GitHub 上新建一个 issue。

第三)

如果上述“第一”和“第二”步都没有发现问题,日志里也看不到错误,请在服务器上运行下面的命令:

 curl localhost:3000 -v

如果返回成功,通常是防火墙拦截了连接。请查看防火墙文档

部署成功但出现 502 Bad Gateway!

如果你符合以下情况:

  • You have been able to setup your server and access it via captain.rootdomain.example.com.
  • You have been able to deploy one of the samples apps (see here) successfully and it worked.
  • You tried to deploy your own application and it deployed successfully, but when you try to access it via yourappname.root.example.com you get a 502 error.

如果以上都符合,可以按下面步骤排查:

  • ssh 登录服务器并查看应用日志,确认应用没有崩溃且仍在运行。查看日志请参考本页末尾的“如何查看应用日志”。
  • 如果日志显示应用在运行,最常见原因是应用监听的是自定义端口而不是 80 端口。例如 CouchDB 使用 5984 端口。此时请进入 CapRover 的应用设置,打开 HTTP Settings,把 “Container Port” 设置为 5984。
  • 如果你的应用绑定 IP 地址为 127.0.0.1,请改为 0.0.0.0;更多细节见 这个 issue

域名验证失败 - 错误 1107!

当 CapRover 无法验证 yourcustomdomain.com 是否指向 CapRover 的 IP 地址时,会出现该问题。可能原因包括:

  • DNS 变更最多可能需要 24 小时才会全网生效,尤其是你的服务器之前缓存过解析记录时。先等待 24 小时再重试;若仍不行继续下一步。
  • 为了确认,请访问 MXToolbox DNS Lookup 并输入 yourcustomdomain.com,确保解析到服务器 IP。如果你使用了 CloudFlare 等代理服务,可能会导致验证失败。请在 CloudFlare 的 DNS 里关闭代理,让 A 记录直接指向 CapRover 服务器 IP。
  • 如果你验证了以上步骤,并且访问 something.domain.com 能看到 CapRover 页面,则说明域名本身工作正常;但 CapRover 可能因为回环测试不工作而无法验证。在这种情况下,你可以选择跳过 CapRover 的域名验证:
echo  "{\"skipVerifyingDomains\":\"true\"}" >  /captain/data/config-override.json
docker service update captain-captain --force
  • 如果以上都无效,请在 GitHub 上提交一个 issue。
  • AWS EC2 用户:请检查 VPC 的 CIDR Block 是否大于 172.0.0.0/16(不要是常见的 0.0.0.0/16)。

连接超时

有时当数据库连接池处于不活跃状态时,Docker 会在一段时间后断开连接。你可以通过以下方式之一修复:

  • 实现自动重试策略
  • 每隔几分钟自动 ping 一次,确保连接不会变为不活跃
  • 调整应用中的 Keepalive 配置(knex 示例见 这里
  • 修改 Docker 配置(更高级的做法)

根因 与 CapRover 无关,这是 Docker 底层的问题。

Something bad happened(出现异常)

当你在 UI 中看到这个错误,说明发生了“意外”情况,比如连接丢失、服务器崩溃(内存不足)等。最好的排查方式是查看服务器日志:

docker service logs captain-captain --since 5m --follow

如何查看应用日志?

你的应用是以 Docker service 的形式部署的。例如,如果你在 CapRover 里应用名是 my-app,你可以通过 ssh 登录服务器并运行下面的命令查看日志:

docker service logs srv-captain--my-app --since 60m --follow

注意 Docker service 名称会以 srv-captain-- 作为前缀。你也可以把 60m 改成 10m,以查看最近 10 分钟的日志。

如何重启我的应用?

如果你的应用表现异常,可以尝试强制重启:在 Web 面板中选择你的应用,然后点击 “Save Configuration & Update” 按钮。它会强制重启你的应用。

如何进入应用容器并运行 shell

直接运行下面的命令:

docker exec -it $(docker ps --filter name=srv-captain--myappname -q) /bin/sh

当然,你需要把 myappname 替换成你自己的应用名称。

我修改了 Nginx 配置,导致管理界面打不开了!

这种情况下重启是没用的。请参考这里操作:按这个做

运行 nginx 修复脚本以回滚 你手动做过的所有 nginx 修改

docker service scale captain-captain=0 && \
docker run -it --rm -v /captain:/captain  caprover/caprover /bin/sh -c "wget https://raw.githubusercontent.com/caprover/caprover/master/dev-scripts/clear-custom-nginx.js ; node clear-custom-nginx.js ;" && \
docker service scale captain-captain=1 && \
echo "OKAY"

按上述步骤操作后,问题通常就能解决。

如何重启 CapRover

如果你的 CapRover 表现异常,可以尝试用下面的命令强制重启 CapRover:

docker service update captain-captain --force

如何使用 Edge 版本

Edge 版本会在每次向 master 推送时自动构建。如果你使用的版本里存在某个 bug,而该 bug 刚好在 master 分支被修复,你可以临时把 CapRover 更新到 Edge 版本。注意:一旦切换到 edge,你将不会收到自动更新;等到 CapRover 下一个正式版本发布后,你需要手动切回正式版。并且这属于高级操作。一般建议:切换到 Edge 之后,在新的正式版本发布之前不要切回正式版。

切换到 Edge:

docker pull caprover/caprover-edge:latest
docker service update captain-captain --image caprover/caprover-edge:latest

切回主镜像:

docker service update captain-captain --image caprover/caprover:latest

自定义配置

你可以通过在 /captain/data/config-override.json 添加一个 JSON 文件,来覆盖 configs 下 CaptainConstants 里定义的任意常量。例如要修改 defaultMaxLogSize/captain/data/config-override.json 的内容应为:

{
 "defaultMaxLogSize":"128m"
}

编辑该文件后,如果变更会影响 CapRover、nginx 或 certbot,请重启 CapRover;或者在 UI 中把 NetData 关闭再打开一次。

使用现有 swarm

首次安装 CapRover 时,它会尝试自动为你创建一个 swarm 集群。但在少数情况下,你可能已经有一个 swarm 集群并希望复用它。此时只需要把 useExistingSwarm 设为 true 来覆盖默认行为。在尝试安装 CapRover 之前运行以下脚本:

mkdir -p  /captain/data
echo  "{\"useExistingSwarm\":\"true\"}" >  /captain/data/config-override.json

AWS 设置

AWS 在端口处理等方面有自己的特殊性,可能需要额外的自定义设置。示例可参考 这篇博客

CloudFlare SSL 设置

使用 CloudFlare 免费套餐时,请注意其 Universal SSL 只支持到一级子域名。因此,如果你启用 CloudFlare 的 Universal SSL,并用一级子域名作为 CapRover 的根域名,在访问 CapRover 部署的应用时可能会遇到下面的错误:

This site can’t provide a secure connection
app.root.example.com uses an unsupported protocol.
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

如果你想搭配 CloudFlare 的 Universal SSL 使用 CapRover,请避免使用子域名作为根域名。

ARM 处理器

从 1.8.1 开始,CapRover 可以在 ARM 处理器(例如 “raspberry pi”)上运行。注意:某些一键应用可能无法在 raspberry pi 上工作。一键应用属于外部应用,并不由 CapRover 维护。

重置密码

如果你忘记了密码,但仍可以通过 ssh 访问服务器:

  • 通过 SSH 登录到服务器
  • 运行 jq -V 确认已安装 jq
  • 然后运行:
docker service scale captain-captain=0

# backup config
cp /captain/data/config-captain.json /captain/data/config-captain.json.backup

# delete old password
jq 'del(.hashedPassword)' /captain/data/config-captain.json > /captain/data/config-captain.json.new
cat /captain/data/config-captain.json.new > /captain/data/config-captain.json
rm /captain/data/config-captain.json.new

# set a temporary password
docker service update --env-add DEFAULT_PASSWORD=mytemppassword captain-captain
docker service scale captain-captain=1
  • 使用临时密码登录 CapRover,并在设置中修改为新密码。

如何停止并移除 Captain?

CapRover 使用 docker swarm 来支持集群以及容器异常退出后的自动重启。要从系统中彻底卸载 CapRover,请运行:

docker service rm $(docker service ls -q)
## remove CapRover settings directory
rm -rf /captain
## leave swarm if you don't want it
docker swarm leave --force
## full cleanup of docker
docker system prune --all --force

我收到了 Let's Encrypt 的邮件,说域名证书要过期了,但我觉得不应该

这种情况可能发生在你曾经用同一个域名做过旧项目、后来又删除了该项目时。 Let's Encrypt 会记录旧证书并在其即将过期时通知你,但这不会影响新证书。 要确认的话,可以用下面这样的在线工具检查 SSL 过期时间: SSL Shopper 检查工具