forked from coop-cloud/abra
fix: ensure ipv4 is present for app deploys
See coop-cloud/organising#227.
This commit is contained in:
parent
ecba4e01f1
commit
85ff04202f
|
@ -8,6 +8,7 @@ import (
|
||||||
"coopcloud.tech/abra/pkg/catalogue"
|
"coopcloud.tech/abra/pkg/catalogue"
|
||||||
"coopcloud.tech/abra/pkg/client"
|
"coopcloud.tech/abra/pkg/client"
|
||||||
"coopcloud.tech/abra/pkg/config"
|
"coopcloud.tech/abra/pkg/config"
|
||||||
|
"coopcloud.tech/abra/pkg/dns"
|
||||||
"coopcloud.tech/abra/pkg/recipe"
|
"coopcloud.tech/abra/pkg/recipe"
|
||||||
"coopcloud.tech/abra/pkg/upstream/stack"
|
"coopcloud.tech/abra/pkg/upstream/stack"
|
||||||
"github.com/AlecAivazis/survey/v2"
|
"github.com/AlecAivazis/survey/v2"
|
||||||
|
@ -107,6 +108,12 @@ func DeployAction(c *cli.Context) error {
|
||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domainName := app.Env["DOMAIN"]
|
||||||
|
ipv4, err := dns.EnsureIPv4(domainName)
|
||||||
|
if err != nil || ipv4 == "" {
|
||||||
|
logrus.Fatalf("could not find an IP address assigned to %s?", domainName)
|
||||||
|
}
|
||||||
|
|
||||||
if err := stack.RunDeploy(cl, deployOpts, compose); err != nil {
|
if err := stack.RunDeploy(cl, deployOpts, compose); err != nil {
|
||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,21 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/user"
|
"os/user"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
abraFormatter "coopcloud.tech/abra/cli/formatter"
|
abraFormatter "coopcloud.tech/abra/cli/formatter"
|
||||||
"coopcloud.tech/abra/cli/internal"
|
"coopcloud.tech/abra/cli/internal"
|
||||||
"coopcloud.tech/abra/pkg/client"
|
"coopcloud.tech/abra/pkg/client"
|
||||||
"coopcloud.tech/abra/pkg/config"
|
"coopcloud.tech/abra/pkg/config"
|
||||||
contextPkg "coopcloud.tech/abra/pkg/context"
|
contextPkg "coopcloud.tech/abra/pkg/context"
|
||||||
|
"coopcloud.tech/abra/pkg/dns"
|
||||||
"coopcloud.tech/abra/pkg/server"
|
"coopcloud.tech/abra/pkg/server"
|
||||||
"coopcloud.tech/abra/pkg/ssh"
|
"coopcloud.tech/abra/pkg/ssh"
|
||||||
"github.com/AlecAivazis/survey/v2"
|
"github.com/AlecAivazis/survey/v2"
|
||||||
|
@ -268,33 +266,11 @@ func initSwarmLocal(c *cli.Context, cl *dockerClient.Client, domainName string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func initSwarm(c *cli.Context, cl *dockerClient.Client, domainName string) error {
|
func initSwarm(c *cli.Context, cl *dockerClient.Client, domainName string) error {
|
||||||
// comrade librehosters DNS resolver -> https://www.privacy-handbuch.de/handbuch_93d.htm
|
ipv4, err := dns.EnsureIPv4(domainName)
|
||||||
freifunkDNS := "5.1.66.255:53"
|
|
||||||
|
|
||||||
resolver := &net.Resolver{
|
|
||||||
PreferGo: false,
|
|
||||||
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
|
|
||||||
d := net.Dialer{
|
|
||||||
Timeout: time.Millisecond * time.Duration(10000),
|
|
||||||
}
|
|
||||||
return d.DialContext(ctx, "udp", freifunkDNS)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
logrus.Debugf("created DNS resolver via '%s'", freifunkDNS)
|
|
||||||
|
|
||||||
ips, err := resolver.LookupIPAddr(c.Context, domainName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ips) == 0 {
|
|
||||||
return fmt.Errorf("unable to retrieve ipv4 address for %s", domainName)
|
|
||||||
}
|
|
||||||
|
|
||||||
ipv4 := ips[0].IP.To4().String()
|
|
||||||
logrus.Debugf("discovered the following ipv4 addr: %s", ipv4)
|
|
||||||
|
|
||||||
initReq := swarm.InitRequest{
|
initReq := swarm.InitRequest{
|
||||||
ListenAddr: "0.0.0.0:2377",
|
ListenAddr: "0.0.0.0:2377",
|
||||||
AdvertiseAddr: ipv4,
|
AdvertiseAddr: ipv4,
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
package dns
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/AlecAivazis/survey/v2"
|
"github.com/AlecAivazis/survey/v2"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
@ -26,3 +29,38 @@ func NewToken(provider, providerTokenEnvVar string) (string, error) {
|
||||||
|
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EnsureIPv4 ensures that an ipv4 address is set for a domain name
|
||||||
|
func EnsureIPv4(domainName string) (string, error) {
|
||||||
|
var ipv4 string
|
||||||
|
|
||||||
|
// comrade librehosters DNS resolver -> https://www.privacy-handbuch.de/handbuch_93d.htm
|
||||||
|
freifunkDNS := "5.1.66.255:53"
|
||||||
|
|
||||||
|
resolver := &net.Resolver{
|
||||||
|
PreferGo: false,
|
||||||
|
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
d := net.Dialer{
|
||||||
|
Timeout: time.Millisecond * time.Duration(10000),
|
||||||
|
}
|
||||||
|
return d.DialContext(ctx, "udp", freifunkDNS)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
logrus.Debugf("created DNS resolver via '%s'", freifunkDNS)
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
ips, err := resolver.LookupIPAddr(ctx, domainName)
|
||||||
|
if err != nil {
|
||||||
|
return ipv4, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ips) == 0 {
|
||||||
|
return ipv4, fmt.Errorf("unable to retrieve ipv4 address for %s", domainName)
|
||||||
|
}
|
||||||
|
|
||||||
|
ipv4 = ips[0].IP.To4().String()
|
||||||
|
logrus.Debugf("discovered the following ipv4 addr: %s", ipv4)
|
||||||
|
|
||||||
|
return ipv4, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue