installer-env: wait for services to be reachable
diff --git a/core/installer/tasks/dns.go b/core/installer/tasks/dns.go
index 08cb863..4a33670 100644
--- a/core/installer/tasks/dns.go
+++ b/core/installer/tasks/dns.go
@@ -2,6 +2,7 @@
 
 import (
 	"context"
+	"fmt"
 	"net"
 	"text/template"
 	"time"
@@ -13,13 +14,20 @@
 
 type Check func(ch Check) error
 
-func NewDNSResolverTask(
+func SetupZoneTask(env Env, st *state) Task {
+	return newSequentialParentTask(
+		fmt.Sprintf("Setup DNS zone records for %s", env.Domain),
+		CreateZoneRecords(env.Domain, st.publicIPs, env, st),
+		WaitToPropagate(env.Domain, st.publicIPs),
+	)
+}
+
+func CreateZoneRecords(
 	name string,
 	expected []net.IP,
 	env Env,
 	st *state,
 ) Task {
-	ctx := context.TODO()
 	t := newLeafTask("Configure DNS", func() error {
 		repo, err := st.ssClient.GetRepo("config")
 		if err != nil {
@@ -87,7 +95,17 @@
 			}
 			r.CommitAndPush("configure dns zone")
 		}
+		return nil
+	})
+	return &t
+}
 
+func WaitToPropagate(
+	name string,
+	expected []net.IP,
+) Task {
+	t := newLeafTask("Propagate DNS records", func() error {
+		ctx := context.TODO()
 		gotExpectedIPs := func(actual []net.IP) bool {
 			for _, a := range actual {
 				found := false