Fix AdGuard resolving dashboard to docker bridge IP
Issue 1: DO droplet when given the name my.blah.com , will put an entry in /etc/hosts with `127.0.1.1 my.blah.com` . When app containers use system DNS, they get this IP address which does not work inside a container. An idea is to remove this entry when running cloudron-setup, but maybe this causes trouble later. Issue 2: Some networks seem to lack loopback networking. With OIDC changes, we want the apps to access my.blah.com even if hairpin nat is not working. Solution: make my.blah.com to resolve to the docker bridge IP (172.18.0.1) where nginx also listens to. This means that such requests never go outside the server Caveats: * This breaks AdGuard which now starts resolving it to 172.18.0.1 for the entire network! So, we skip ExtraHosts configuration for adguard * Maybe ExtraHosts should be scoped to OIDC apps only. But the thought here is that it will help apps like say n8n which are querying dasahboard.
This commit is contained in:
@@ -288,7 +288,9 @@ async function createSubcontainer(app, name, cmd, options) {
|
||||
const { hostPort, type:portType, count:portCount } = app.portBindings[portName];
|
||||
const portSpec = portType == 'tcp' ? manifest.tcpPorts : manifest.udpPorts;
|
||||
const containerPort = portSpec[portName].containerPort || hostPort;
|
||||
const hostIps = hostPort === 53 ? await getAddressesForPort53() : [ '0.0.0.0', '::0' ]; // port 53 is special because it is possibly taken by systemd-resolved
|
||||
// port 53 is special. systemd-resolved is listening on 127.0.0.x port 53 and another process cannot listen to 0.0.0.0 port 53
|
||||
// for port 53 alone, we listen explicitly on the server's interface IP
|
||||
const hostIps = hostPort === 53 ? await getAddressesForPort53() : [ '0.0.0.0', '::0' ];
|
||||
|
||||
portEnv.push(`${portName}=${hostPort}`);
|
||||
if (portCount > 1) portEnv.push(`${portName}_COUNT=${portCount}`);
|
||||
@@ -373,7 +375,9 @@ async function createSubcontainer(app, name, cmd, options) {
|
||||
if (isAppContainer) {
|
||||
containerOptions.Hostname = app.id;
|
||||
containerOptions.HostConfig.NetworkMode = 'cloudron'; // user defined bridge network
|
||||
containerOptions.HostConfig.ExtraHosts = [ `${dashboardFqdn}:172.18.0.1` ];
|
||||
|
||||
// Do not inject for AdGuard. It ends up resolving the dashboard domain as the docker bridge IP
|
||||
if (manifest.id !== 'com.adguard.home.cloudronapp') containerOptions.HostConfig.ExtraHosts = [ `${dashboardFqdn}:172.18.0.1` ];
|
||||
|
||||
containerOptions.NetworkingConfig = {
|
||||
EndpointsConfig: {
|
||||
|
||||
Reference in New Issue
Block a user