如何使用 dokku 将子域代理到其他服务器?

How to proxy subdomains to other servers with dokku?

我希望我的 dokku 主机 运行 我域的主要 nginx(比方说 cooldok.ku)。

在 cooldok.ku 出于某些原因,我有其他虚拟机提供内容。我想在子域上公开此内容(比如 vm.cooldok.ku,运行s 在 cooldok.ku 主机上 10.0.0.7 的虚拟机中)。

我认为涉及的方法称为反向代理。

在理想情况下,将有一种仅限 dokku 的方式来注册和 'link'/代理子域。作为一个额外的好处,cooldok.ku 主机会为 https 本身做 ssl-stuff(比如 ssltunnel),这样我就可以利用现有的证书 and/or 在同一台机器上使用很棒的 letsencrypt 并在不打算通过 https 提供服务的虚拟机。

这个场景用dokku怎么实现?编写一个这样做的插件有多难?

更新

所以,基本上 dokku (0.8) 配备了它需要的一切。问题是,dokku 想要实现的目标(启动那些美味的 docker 容器)中有多少阻碍了。要破解一个可以满足我要求的设置,可以执行以下操作:

# create folder where we want it
dokku apps:create vm

现在,这些文件必须 created/be 存在(vanilla 0.8 dokku 安装)

#/home/dokku/vm/DOCKER_OPTIONS_DEPLOY
--restart=on-failure:10

#/home/dokku/vm/IP.web.1 
10.0.0.7

#/home/dokku/vm/PORT.web.1 
80

#/home/dokku/vm/URLS 
# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN - I did it nonetheless
http://vm.cooldok.ku

#/home/dokku/vm/VHOST 
vm.cookdok.ku

#/home/dokku/vm/nginx.conf
# Just listing changes from another default app
[...]
proxy_pass  http://vm-host;
[...]
upstream vm-host {

  server 10.0.0.7:80;
}

之后,nginx需要手动重启(或者... dokku可以在这里为我们做点什么)

我很确定可以省略一些(冗余)信息,例如 dokku 应该会混淆 nginx.conf 本身。我不确定此设置是否在 reboot/nginx 重启后仍然存在。此外,在测试中,letsencrypt 不会让我安装 certificates/rebuild nginx 配置,因为它认为应用程序 vm 未部署。

更新2

要克服"app not deployed"的问题,touch /home/dokku/vm/CONTAINER就够了,但这会越来越乱...

我将 post 的更新信息捆绑到 https://github.com/econya/scripts/blob/master/scripts/virt-helpers/fake-dokku-app.sh 的脏脚本中。

我想最干净的解决方案是向上兼容的是创建一个 Docker 文件来启动反向代理本身(通过 env/ config:set 变量配置) - 但我很高兴学习一个更聪明更好的解决方案,或者我得到报酬写一个合适的插件 ;)

第二种方法是使用“Null”-Docker 图像和我猜的自定义 nginx 模板。

2021 年更新 根据发行说明,它现在可以使用(查找“路由到非 Dokku 管理的应用程序”):

https://dokku.github.io/release/dokku-0.25.0

不过,我仍然使用旧的 dokku 和上面写的解决方案。