Search code examples
nginxreverse-proxydokku

How to proxy subdomains to other servers with dokku?


I want my dokku host to run the main nginx for my domain (let say cooldok.ku).

On cooldok.ku for some reasons I have other Virtual Machines serving content. I want to expose this content on a subdomain (say vm.cooldok.ku, runs in a VM at 10.0.0.7 on the cooldok.ku host).

I figured the involved methodology is called reverse-proxy.

In an optimal world, there would be a dokku-only way to register and 'link'/proxy the subdomains. As an added bonus, the cooldok.ku host would do the ssl-stuff for https itself (like ssltunnel) so that I could leverage existing certificates and/or use the awesome letsencrypt on the same machine and secure applications in the VM that were not meant to be served via https.

How can this scenario be realised with dokku? How difficult would it be to write a plugin doing that?

Update

So, basically dokku (0.8) comes equipped with exactly everything it would need. The question is, how much of what dokku wants to achieve (fire up those yummy docker containers) is in the way. To hack a setup which does what I want, following can be done:

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

Now, these files have to be created/be present (vanilla 0.8 dokku installation)

#/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;
}

Afterwards, nginx needs a manual restart (or ... dokku can do something for us here)

I am pretty sure that some of the (redundant) information can be left out, as dokku should puzzle the nginx.conf itself, for example. I am not sure if this setup survives a reboot/nginx restart. Also, on tests, letsencrypt would not let me install the certificates/rebuild the nginx configuration because it sees the app vm as not being deployed.

Update2

To overcome the "app not deployed" issue, it suffices to touch /home/dokku/vm/CONTAINER, but this gets messier and messier ...


Solution

  • I bundled the information from the updates of my post into a dirty script at https://github.com/econya/scripts/blob/master/scripts/virt-helpers/fake-dokku-app.sh .

    I guess the cleanest solution as-is with upwards compatibility would be to create a Dockerfile that launches a reverse proxy itself (configured via env/ config:set variables) - but I am happy to learn a smarter and nicer solution, or that I get paid to write a proper plugin ;)

    Second approach would be to use a "Null"-Docker image together with a custom nginx template I guess.

    Update 2021 According to the release notes it works now (look for "Routing to non-Dokku managed apps"):

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

    I still use an older dokku and the solution written above, though.