From ff92a149e0430d0b6c2ca37582b2015a5a8e6d41 Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 22:40:45 +1000 Subject: [PATCH 1/7] Dynamic URL protocols for up command Signed-off-by: Karl --- external/docker/commands/up.go | 16 +++++++++++----- internal/service/docker/haproxy/haproxy.go | 2 +- internal/service/docker/haproxy/haproxy_test.go | 2 +- internal/utils/endpoint/endpoint.go | 10 +++++++++- main_test.go | 6 +++--- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/external/docker/commands/up.go b/external/docker/commands/up.go index 12aa10ce..e0a7aa7f 100644 --- a/external/docker/commands/up.go +++ b/external/docker/commands/up.go @@ -186,11 +186,17 @@ func Up(c setup.Config) error { name, _ := service.GetFieldString(ctx, cli, "name") url, _ := service.GetFieldString(ctx, cli, "url") if s, _ := service.Status(ctx, cli); s && url != "" { - endpoint.Validate(url) - if r := endpoint.Validate(url); r { - fmt.Printf(" - %v (%v)\n", url, name) - } else { - fmt.Printf(" ! %v (%v)\n", url, name) + var endpointTestStatus bool + for _, protocol := range []string{"https", "http"} { + route := fmt.Sprintf("%s://%s", protocol, url) + if r := endpoint.Validate(route); r { + fmt.Printf(" - %v (%v)\n", route, name) + endpointTestStatus = true + break + } + } + if !endpointTestStatus { + fmt.Printf(" ! http://%v (%v)\n", url, name) } } } diff --git a/internal/service/docker/haproxy/haproxy.go b/internal/service/docker/haproxy/haproxy.go index b88cf102..1595a449 100644 --- a/internal/service/docker/haproxy/haproxy.go +++ b/internal/service/docker/haproxy/haproxy.go @@ -24,7 +24,7 @@ func New(c *docker.Params, tlsCertPath string) docker.Service { "pygmy.enable": "true", "pygmy.name": "amazeeio-haproxy", "pygmy.network": "amazeeio-network", - "pygmy.url": fmt.Sprintf("http://%s/stats", c.Domain), + "pygmy.url": fmt.Sprintf("%s/stats", c.Domain), "pygmy.weight": "14", }, Env: []string{ diff --git a/internal/service/docker/haproxy/haproxy_test.go b/internal/service/docker/haproxy/haproxy_test.go index 1be670cf..1355ccab 100644 --- a/internal/service/docker/haproxy/haproxy_test.go +++ b/internal/service/docker/haproxy/haproxy_test.go @@ -26,7 +26,7 @@ func Test(t *testing.T) { So(obj.Config.Labels["pygmy.enable"], ShouldEqual, "true") So(obj.Config.Labels["pygmy.name"], ShouldEqual, "amazeeio-haproxy") So(obj.Config.Labels["pygmy.network"], ShouldEqual, "amazeeio-network") - So(obj.Config.Labels["pygmy.url"], ShouldEqual, "http://docker.amazee.io/stats") + So(obj.Config.Labels["pygmy.url"], ShouldEqual, "docker.amazee.io/stats") So(obj.Config.Labels["pygmy.weight"], ShouldEqual, "14") So(obj.HostConfig.AutoRemove, ShouldBeFalse) So(fmt.Sprint(obj.HostConfig.Binds), ShouldEqual, fmt.Sprint([]string{"/var/run/docker.sock:/tmp/docker.sock", "/path/to/ssl/cert.pem:/app/server.pem:ro"})) diff --git a/internal/utils/endpoint/endpoint.go b/internal/utils/endpoint/endpoint.go index 46c126cf..b48f3a89 100644 --- a/internal/utils/endpoint/endpoint.go +++ b/internal/utils/endpoint/endpoint.go @@ -6,6 +6,7 @@ import ( "context" "crypto/tls" "net/http" + "strings" "time" ) @@ -19,13 +20,20 @@ func Validate(url string) bool { defer cancel() client := &http.Client{ - Timeout: 5 * time.Second, + Timeout: 2 * time.Second, Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, DisableKeepAlives: true, }, } + if strings.HasPrefix(url, "https://") { + client.Transport = &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: false}, + DisableKeepAlives: true, + } + } + // Create a web request using HEAD for faster response req, err := http.NewRequestWithContext(ctx, "HEAD", url, nil) if err != nil { diff --git a/main_test.go b/main_test.go index 5fd77bc2..1407f86a 100644 --- a/main_test.go +++ b/main_test.go @@ -2,7 +2,6 @@ package main_test import ( "fmt" - "github.com/pygmystack/pygmy/internal/runtime/docker/internals" "os" "testing" "time" @@ -11,6 +10,7 @@ import ( "github.com/docker/docker/api/types/network" . "github.com/smartystreets/goconvey/convey" + "github.com/pygmystack/pygmy/internal/runtime/docker/internals" "github.com/pygmystack/pygmy/internal/runtime/docker/internals/containers" "github.com/pygmystack/pygmy/internal/runtime/docker/internals/images" ) @@ -194,7 +194,7 @@ func TestDefault(t *testing.T) { configuration := &config{ name: "default", configpath: "/examples/pygmy.basic.yml", - endpoints: []string{"http://docker.amazee.io/stats", "http://mailhog.docker.amazee.io"}, + endpoints: []string{"docker.amazee.io/stats", "mailhog.docker.amazee.io"}, images: []string{"pygmystack/haproxy", "pygmystack/dnsmasq", "pygmystack/mailhog"}, services: []string{"amazeeio-haproxy", "amazeeio-dnsmasq", "amazeeio-mailhog"}, servicewithports: []string{"amazeeio-haproxy", "amazeeio-mailhog"}, @@ -208,7 +208,7 @@ func TestCustom(t *testing.T) { configuration := &config{ name: "custom", configpath: "/examples/pygmy.complex.yml", - endpoints: []string{"http://traefik.docker.amazee.io", "http://mailhog.docker.amazee.io", "http://phpmyadmin.docker.amazee.io"}, + endpoints: []string{"traefik.docker.amazee.io", "mailhog.docker.amazee.io", "http://phpmyadmin.docker.amazee.io"}, images: []string{"pygmystack/ssh-agent", "pygmystack/mailhog", "phpmyadmin/phpmyadmin", "library/traefik:v2.1.3"}, services: []string{"unofficial-traefik-2", "unofficial-phpmyadmin", "amazeeio-mailhog"}, servicewithports: []string{"amazeeio-mailhog", "unofficial-phpmyadmin", "unofficial-traefik-2"}, From cc0bd624e83e695f28d13809497faed2e4e03a13 Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 23:07:21 +1000 Subject: [PATCH 2/7] Adjustments for status command Signed-off-by: Karl --- external/docker/commands/status.go | 1 + external/docker/commands/up.go | 19 +++++++++---------- internal/service/docker/haproxy/haproxy.go | 5 +++-- internal/service/docker/mailhog/mailhog.go | 3 ++- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/external/docker/commands/status.go b/external/docker/commands/status.go index b146660c..b53dcd7d 100644 --- a/external/docker/commands/status.go +++ b/external/docker/commands/status.go @@ -153,6 +153,7 @@ func Status(ctx context.Context, cli *client.Client, c setup.Config) { } cleanurls := setup.Unique(urls) + fmt.Println(cleanurls) // Validate URLs in parallel for better performance type urlResult struct { diff --git a/external/docker/commands/up.go b/external/docker/commands/up.go index e0a7aa7f..9c9f2cfa 100644 --- a/external/docker/commands/up.go +++ b/external/docker/commands/up.go @@ -186,18 +186,17 @@ func Up(c setup.Config) error { name, _ := service.GetFieldString(ctx, cli, "name") url, _ := service.GetFieldString(ctx, cli, "url") if s, _ := service.Status(ctx, cli); s && url != "" { - var endpointTestStatus bool - for _, protocol := range []string{"https", "http"} { - route := fmt.Sprintf("%s://%s", protocol, url) - if r := endpoint.Validate(route); r { - fmt.Printf(" - %v (%v)\n", route, name) - endpointTestStatus = true - break + for _, envVar := range service.Config.Env { + if strings.HasPrefix(envVar, "LAGOON_ROUTE=") { + route := strings.TrimPrefix(envVar, "LAGOON_ROUTE=") + if r := endpoint.Validate(route); r { + fmt.Printf(" - %v (%v)\n", route, name) + } else { + fmt.Printf(" ! %v (%v)\n", route, name) + } } } - if !endpointTestStatus { - fmt.Printf(" ! http://%v (%v)\n", url, name) - } + } } diff --git a/internal/service/docker/haproxy/haproxy.go b/internal/service/docker/haproxy/haproxy.go index 1595a449..7fb1a1d6 100644 --- a/internal/service/docker/haproxy/haproxy.go +++ b/internal/service/docker/haproxy/haproxy.go @@ -24,11 +24,12 @@ func New(c *docker.Params, tlsCertPath string) docker.Service { "pygmy.enable": "true", "pygmy.name": "amazeeio-haproxy", "pygmy.network": "amazeeio-network", - "pygmy.url": fmt.Sprintf("%s/stats", c.Domain), + "pygmy.url": fmt.Sprintf("http://%s/stats", c.Domain), "pygmy.weight": "14", }, Env: []string{ - fmt.Sprintf("AMAZEEIO_URL=%s", c.Domain), + "LAGOON_ROUTE=http://docker.amazee.io/stats", + fmt.Sprintf("AMAZEEIO_URL=http://%s", c.Domain), }, }, HostConfig: container.HostConfig{ diff --git a/internal/service/docker/mailhog/mailhog.go b/internal/service/docker/mailhog/mailhog.go index dbd75d20..5ad4fdcf 100644 --- a/internal/service/docker/mailhog/mailhog.go +++ b/internal/service/docker/mailhog/mailhog.go @@ -26,6 +26,7 @@ func New(c *docker.Params) docker.Service { "MH_UI_BIND_ADDR=0.0.0.0:80", "MH_API_BIND_ADDR=0.0.0.0:80", "AMAZEEIO=AMAZEEIO", + "LAGOON_ROUTE=https://mailhog.docker.amazee.io", fmt.Sprintf("AMAZEEIO_URL=mailhog.%s", c.Domain), }, Image: "pygmystack/mailhog", @@ -34,7 +35,7 @@ func New(c *docker.Params) docker.Service { "pygmy.enable": "true", "pygmy.name": "amazeeio-mailhog", "pygmy.network": "amazeeio-network", - "pygmy.url": fmt.Sprintf("http://mailhog.%s", c.Domain), + "pygmy.url": fmt.Sprintf("https://mailhog.%s", c.Domain), "pygmy.weight": "15", }, }, From ad442bd1b38273fbf6cdaf350f87e6a572f190c7 Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 23:17:35 +1000 Subject: [PATCH 3/7] cleanup Signed-off-by: Karl --- external/docker/commands/status.go | 1 - external/docker/commands/up.go | 15 +++++---------- external/docker/setup/setup.go | 2 +- internal/service/docker/mailhog/mailhog.go | 15 +++++++++++---- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/external/docker/commands/status.go b/external/docker/commands/status.go index b53dcd7d..b146660c 100644 --- a/external/docker/commands/status.go +++ b/external/docker/commands/status.go @@ -153,7 +153,6 @@ func Status(ctx context.Context, cli *client.Client, c setup.Config) { } cleanurls := setup.Unique(urls) - fmt.Println(cleanurls) // Validate URLs in parallel for better performance type urlResult struct { diff --git a/external/docker/commands/up.go b/external/docker/commands/up.go index 9c9f2cfa..12aa10ce 100644 --- a/external/docker/commands/up.go +++ b/external/docker/commands/up.go @@ -186,17 +186,12 @@ func Up(c setup.Config) error { name, _ := service.GetFieldString(ctx, cli, "name") url, _ := service.GetFieldString(ctx, cli, "url") if s, _ := service.Status(ctx, cli); s && url != "" { - for _, envVar := range service.Config.Env { - if strings.HasPrefix(envVar, "LAGOON_ROUTE=") { - route := strings.TrimPrefix(envVar, "LAGOON_ROUTE=") - if r := endpoint.Validate(route); r { - fmt.Printf(" - %v (%v)\n", route, name) - } else { - fmt.Printf(" ! %v (%v)\n", route, name) - } - } + endpoint.Validate(url) + if r := endpoint.Validate(url); r { + fmt.Printf(" - %v (%v)\n", url, name) + } else { + fmt.Printf(" ! %v (%v)\n", url, name) } - } } diff --git a/external/docker/setup/setup.go b/external/docker/setup/setup.go index 5ad65741..00a24d98 100644 --- a/external/docker/setup/setup.go +++ b/external/docker/setup/setup.go @@ -139,7 +139,7 @@ func Setup(ctx context.Context, cli *client.Client, c *Config) { ImportDefaults(ctx, cli, c, "amazeeio-ssh-agent-add-key", key.NewAdder()) ImportDefaults(ctx, cli, c, "amazeeio-dnsmasq", dnsmasq.New(&dockerruntime.Params{Domain: c.Domain})) ImportDefaults(ctx, cli, c, "amazeeio-haproxy", haproxy.New(&dockerruntime.Params{Domain: c.Domain}, c.TLSCertPath)) - ImportDefaults(ctx, cli, c, "amazeeio-mailhog", mailhog.New(&dockerruntime.Params{Domain: c.Domain})) + ImportDefaults(ctx, cli, c, "amazeeio-mailhog", mailhog.New(&dockerruntime.Params{Domain: c.Domain}, c.TLSCertPath)) // Disable Resolvers if needed. if c.ResolversDisabled { diff --git a/internal/service/docker/mailhog/mailhog.go b/internal/service/docker/mailhog/mailhog.go index 5ad4fdcf..283034f5 100644 --- a/internal/service/docker/mailhog/mailhog.go +++ b/internal/service/docker/mailhog/mailhog.go @@ -13,8 +13,8 @@ import ( ) // New will provide the standard object for the mailhog container. -func New(c *docker.Params) docker.Service { - return docker.Service{ +func New(c *docker.Params, tlsCertPath string) docker.Service { + serviceSpec := docker.Service{ Config: container.Config{ User: "0", ExposedPorts: nat.PortSet{ @@ -26,7 +26,6 @@ func New(c *docker.Params) docker.Service { "MH_UI_BIND_ADDR=0.0.0.0:80", "MH_API_BIND_ADDR=0.0.0.0:80", "AMAZEEIO=AMAZEEIO", - "LAGOON_ROUTE=https://mailhog.docker.amazee.io", fmt.Sprintf("AMAZEEIO_URL=mailhog.%s", c.Domain), }, Image: "pygmystack/mailhog", @@ -35,7 +34,6 @@ func New(c *docker.Params) docker.Service { "pygmy.enable": "true", "pygmy.name": "amazeeio-mailhog", "pygmy.network": "amazeeio-network", - "pygmy.url": fmt.Sprintf("https://mailhog.%s", c.Domain), "pygmy.weight": "15", }, }, @@ -49,6 +47,15 @@ func New(c *docker.Params) docker.Service { NetworkConfig: network.NetworkingConfig{}, } + if tlsCertPath != "" { + serviceSpec.Config.Env = append(serviceSpec.Config.Env, "LAGOON_ROUTE=https://mailhog.docker.amazee.io") + serviceSpec.Config.Labels["pygmy.url"] = fmt.Sprintf("https://mailhog.%s", c.Domain) + } else { + serviceSpec.Config.Env = append(serviceSpec.Config.Env, "LAGOON_ROUTE=http://mailhog.docker.amazee.io") + serviceSpec.Config.Labels["pygmy.url"] = fmt.Sprintf("http://mailhog.%s", c.Domain) + } + + return serviceSpec } // NewDefaultPorts will provide the standard ports used for merging into the From 09b681724228f2a185b863c103109fc432908c00 Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 23:23:42 +1000 Subject: [PATCH 4/7] cleanup Signed-off-by: Karl --- external/docker/setup/setup.go | 4 ++-- internal/runtime/docker/types.go | 2 ++ internal/service/docker/haproxy/haproxy.go | 6 +++--- internal/service/docker/mailhog/mailhog.go | 4 ++-- internal/service/docker/mailhog/mailhog_test.go | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/external/docker/setup/setup.go b/external/docker/setup/setup.go index 00a24d98..6f153e2c 100644 --- a/external/docker/setup/setup.go +++ b/external/docker/setup/setup.go @@ -138,8 +138,8 @@ func Setup(ctx context.Context, cli *client.Client, c *Config) { ImportDefaults(ctx, cli, c, "amazeeio-ssh-agent", agent.New()) ImportDefaults(ctx, cli, c, "amazeeio-ssh-agent-add-key", key.NewAdder()) ImportDefaults(ctx, cli, c, "amazeeio-dnsmasq", dnsmasq.New(&dockerruntime.Params{Domain: c.Domain})) - ImportDefaults(ctx, cli, c, "amazeeio-haproxy", haproxy.New(&dockerruntime.Params{Domain: c.Domain}, c.TLSCertPath)) - ImportDefaults(ctx, cli, c, "amazeeio-mailhog", mailhog.New(&dockerruntime.Params{Domain: c.Domain}, c.TLSCertPath)) + ImportDefaults(ctx, cli, c, "amazeeio-haproxy", haproxy.New(&dockerruntime.Params{Domain: c.Domain, TLSCertPath: c.TLSCertPath})) + ImportDefaults(ctx, cli, c, "amazeeio-mailhog", mailhog.New(&dockerruntime.Params{Domain: c.Domain, TLSCertPath: c.TLSCertPath})) // Disable Resolvers if needed. if c.ResolversDisabled { diff --git a/internal/runtime/docker/types.go b/internal/runtime/docker/types.go index 5a63a294..765fb41d 100644 --- a/internal/runtime/docker/types.go +++ b/internal/runtime/docker/types.go @@ -18,4 +18,6 @@ type Service struct { type Params struct { // Domain is the target domain for Pygmy to use. Domain string + // TLSCertPath is the TLS Certificate Path. + TLSCertPath string } diff --git a/internal/service/docker/haproxy/haproxy.go b/internal/service/docker/haproxy/haproxy.go index 7fb1a1d6..a063d70b 100644 --- a/internal/service/docker/haproxy/haproxy.go +++ b/internal/service/docker/haproxy/haproxy.go @@ -11,10 +11,10 @@ import ( ) // New will provide the standard object for the haproxy container. -func New(c *docker.Params, tlsCertPath string) docker.Service { +func New(c *docker.Params) docker.Service { binds := []string{"/var/run/docker.sock:/tmp/docker.sock"} - if tlsCertPath != "" { - binds = append(binds, fmt.Sprintf("%s:/app/server.pem:ro", tlsCertPath)) + if c.TLSCertPath != "" { + binds = append(binds, fmt.Sprintf("%s:/app/server.pem:ro", c.TLSCertPath)) } return docker.Service{ Config: container.Config{ diff --git a/internal/service/docker/mailhog/mailhog.go b/internal/service/docker/mailhog/mailhog.go index 283034f5..b084d7d8 100644 --- a/internal/service/docker/mailhog/mailhog.go +++ b/internal/service/docker/mailhog/mailhog.go @@ -13,7 +13,7 @@ import ( ) // New will provide the standard object for the mailhog container. -func New(c *docker.Params, tlsCertPath string) docker.Service { +func New(c *docker.Params) docker.Service { serviceSpec := docker.Service{ Config: container.Config{ User: "0", @@ -47,7 +47,7 @@ func New(c *docker.Params, tlsCertPath string) docker.Service { NetworkConfig: network.NetworkingConfig{}, } - if tlsCertPath != "" { + if c.TLSCertPath != "" { serviceSpec.Config.Env = append(serviceSpec.Config.Env, "LAGOON_ROUTE=https://mailhog.docker.amazee.io") serviceSpec.Config.Labels["pygmy.url"] = fmt.Sprintf("https://mailhog.%s", c.Domain) } else { diff --git a/internal/service/docker/mailhog/mailhog_test.go b/internal/service/docker/mailhog/mailhog_test.go index 1b2e703f..d28757c7 100644 --- a/internal/service/docker/mailhog/mailhog_test.go +++ b/internal/service/docker/mailhog/mailhog_test.go @@ -20,7 +20,7 @@ func Example() { func Test(t *testing.T) { Convey("MailHog: Field equality tests...", t, func() { - obj := mailhog.New(&docker.Params{Domain: "docker.amazee.io"}) + obj := mailhog.New(&docker.Params{Domain: "docker.amazee.io", TLSCertPath: ""}) objPorts := mailhog.NewDefaultPorts() So(obj.Config.User, ShouldEqual, "0") So(obj.Config.Image, ShouldContainSubstring, "pygmystack/mailhog") From 5e983413ccdeb36da31629e4d8465b25e6176bd0 Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 23:25:36 +1000 Subject: [PATCH 5/7] cleanup Signed-off-by: Karl --- internal/service/docker/haproxy/haproxy_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/service/docker/haproxy/haproxy_test.go b/internal/service/docker/haproxy/haproxy_test.go index 1355ccab..5a0fbe40 100644 --- a/internal/service/docker/haproxy/haproxy_test.go +++ b/internal/service/docker/haproxy/haproxy_test.go @@ -13,13 +13,13 @@ import ( ) func Example() { - haproxy.New(&docker.Params{}, "") + haproxy.New(&docker.Params{}) haproxy.NewDefaultPorts() } func Test(t *testing.T) { Convey("HAProxy: Field equality tests...", t, func() { - obj := haproxy.New(&docker.Params{Domain: "docker.amazee.io"}, "/path/to/ssl/cert.pem") + obj := haproxy.New(&docker.Params{Domain: "docker.amazee.io", TLSCertPath: "/path/to/ssl/cert.pem"}) objPorts := haproxy.NewDefaultPorts() So(obj.Config.Image, ShouldContainSubstring, "pygmystack/haproxy") So(obj.Config.Labels["pygmy.defaults"], ShouldEqual, "true") From 2e9d9d89c89b804549c021d39c00c47a655af9df Mon Sep 17 00:00:00 2001 From: Karl Date: Tue, 12 Aug 2025 23:36:46 +1000 Subject: [PATCH 6/7] test fixes Signed-off-by: Karl --- internal/service/docker/haproxy/haproxy_test.go | 2 +- internal/service/docker/mailhog/mailhog_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/service/docker/haproxy/haproxy_test.go b/internal/service/docker/haproxy/haproxy_test.go index 5a0fbe40..302021bb 100644 --- a/internal/service/docker/haproxy/haproxy_test.go +++ b/internal/service/docker/haproxy/haproxy_test.go @@ -26,7 +26,7 @@ func Test(t *testing.T) { So(obj.Config.Labels["pygmy.enable"], ShouldEqual, "true") So(obj.Config.Labels["pygmy.name"], ShouldEqual, "amazeeio-haproxy") So(obj.Config.Labels["pygmy.network"], ShouldEqual, "amazeeio-network") - So(obj.Config.Labels["pygmy.url"], ShouldEqual, "docker.amazee.io/stats") + So(obj.Config.Labels["pygmy.url"], ShouldEqual, "http://docker.amazee.io/stats") So(obj.Config.Labels["pygmy.weight"], ShouldEqual, "14") So(obj.HostConfig.AutoRemove, ShouldBeFalse) So(fmt.Sprint(obj.HostConfig.Binds), ShouldEqual, fmt.Sprint([]string{"/var/run/docker.sock:/tmp/docker.sock", "/path/to/ssl/cert.pem:/app/server.pem:ro"})) diff --git a/internal/service/docker/mailhog/mailhog_test.go b/internal/service/docker/mailhog/mailhog_test.go index d28757c7..6323924a 100644 --- a/internal/service/docker/mailhog/mailhog_test.go +++ b/internal/service/docker/mailhog/mailhog_test.go @@ -25,7 +25,7 @@ func Test(t *testing.T) { So(obj.Config.User, ShouldEqual, "0") So(obj.Config.Image, ShouldContainSubstring, "pygmystack/mailhog") So(fmt.Sprint(obj.Config.ExposedPorts), ShouldEqual, fmt.Sprint(nat.PortSet{"80/tcp": struct{}{}, "1025/tcp": struct{}{}, "8025/tcp": struct{}{}})) - So(fmt.Sprint(obj.Config.Env), ShouldEqual, fmt.Sprint([]string{"MH_UI_BIND_ADDR=0.0.0.0:80", "MH_API_BIND_ADDR=0.0.0.0:80", "AMAZEEIO=AMAZEEIO", "AMAZEEIO_URL=mailhog.docker.amazee.io"})) + So(fmt.Sprint(obj.Config.Env), ShouldEqual, fmt.Sprint([]string{"MH_UI_BIND_ADDR=0.0.0.0:80", "MH_API_BIND_ADDR=0.0.0.0:80", "AMAZEEIO=AMAZEEIO", "AMAZEEIO_URL=mailhog.docker.amazee.io", "LAGOON_ROUTE=http://mailhog.docker.amazee.io"})) So(obj.Config.Labels["pygmy.defaults"], ShouldEqual, "true") So(obj.Config.Labels["pygmy.enable"], ShouldEqual, "true") So(obj.Config.Labels["pygmy.name"], ShouldEqual, "amazeeio-mailhog") From 66997b2f07577f34ba1eeb2ce632f00375c9167d Mon Sep 17 00:00:00 2001 From: Karl Date: Wed, 13 Aug 2025 22:04:04 +1000 Subject: [PATCH 7/7] Update README.md Signed-off-by: Karl --- README.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 70a3c509..fef8d4ec 100644 --- a/README.md +++ b/README.md @@ -149,22 +149,28 @@ A simple way to generate and manage local certificates is using `mkcert`, as it To generate a certificate pair for use with HAProxy, you typically use the default domain `*.docker.amazee.io`, but you can substitute any domain as needed for your local development environment: -1. **Install mkcert** - Follow instructions at [mkcert GitHub](https://github.com/FiloSottile/mkcert). - Example for macOS: +### 1. Install mkcert and nss + + **Linux**: + + Follow instructions at [mkcert GitHub](https://github.com/FiloSottile/mkcert) and [nss GitHub](https://github.com/nss-dev/nss). + + **macOS**: ```shell - brew install mkcert + brew install mkcert nss mkcert -install # generates and installs the local CA ``` -2. **Generate a wildcard certificate and key** - Run: +### 2. Generate a wildcard certificate and key + + Run: ```shell mkcert "*.docker.amazee.io" ``` This creates `_wildcard.docker.amazee.io.pem` (certificate) and `_wildcard.docker.amazee.io-key.pem` (private key). -3. **Combine certificate and key for HAProxy** +### 3. Combine certificate and key for HAProxy + Run: ```shell mkdir -p ~/pygmy/ @@ -175,7 +181,7 @@ To generate a certificate pair for use with HAProxy, you typically use the defau ``` pygmy up --tls-cert=/location_to/haproxy.pem ``` - or can be stored in the default location of `~/pygmy/server.pem`. + or can be stored in the default location of `~/pygmy/server.pem` - which will attempt to load every time pygmy is started. **Notes:**