caddy-l4
caddy-l4 copied to clipboard
pin quic-go version
Keep up with the upstream.
Fix #183 #184
Since we told xcaddy to compile caddy-l4 with the master branch of Caddy, the dependencies of the latest Caddy are always pulled no matter how we pinned it in the go.mod file of this project.
But this is not true. The deps are merged, and then Go find the minimum version of the common dependencies that meet both requirements. If Caddy depends on v1.5.0 of dep A, and caddy-l4 requires v1.9.0 of dep A, then Go (xcaddy) will pull v1.9.0 because it's the minimum that meets both. Go doesn't pull only Caddy's deps requirements just because it's Caddy. The way xcaddy works is by creating a new Go project from scratch that puts both Caddy and caddy-l4 as direct dependencies. In that final build, Caddy doesn't have a special position besides being the plugin ecosystem provider. The Go compiler doesn't give it special consideration just because it's Caddy.
Thanks for the correction, I got it wrong about the xcaddy's details.
Allow me to reconstruct the timeline, so we can make the things clear.
- At first, I checked the log of action https://github.com/mholt/caddy-l4/actions/runs/8604722335/job/23579439146 made by denpendabot , I was aware it has something to do with the quic-go library, and the version been pulled is not the version pinned in this project.
- I update the quic-go version to align with the caddy@master in commit
b4b846a(#185) with no good reason. I am misled by the previous experience. - The log of action https://github.com/mholt/caddy-l4/actions/runs/8777751011/job/24083148920?pr=185 tells me I got it wrong. (/home/runner/go/pkg/mod/github.com/caddyserver/caddy/[email protected]/listeners.go:516:4: unknown field RequireAddressValidation in struct literal of type quic.Config)
- I found out the RequireAddressValidation was deprecated in [email protected], and the source of problem is that the [email protected] does not compatible with it.
- Trying to bump the caddy version to the latest commit as a temporary fix, with the downgrading option been turned down (since I was getting it wrong about how the xcaddy works)
What is the situation
here is the thing the pipeline of this project is doing:
- xcaddy pull the caddy@master, introducing [email protected]
2024/04/08 18:09:42 [INFO] exec (timeout=0s): /opt/hostedtoolcache/go/1.21.9/x64/bin/go get -d -v github.com/caddyserver/caddy/v2@master go: downloading github.com/caddyserver/caddy/v2 v2.7.6-0.20240407023000-a4a64a6f6ea0 go: downloading github.com/quic-go/quic-go v0.42.0
- xcaddy pull this project, and using the direct dependency of this project to replace the caddy's version
go: trying upgrade to github.com/mholt/[email protected] go: accepting indirect upgrade from github.com/caddyserver/caddy/[email protected] to v2.7.6 go: upgraded github.com/caddyserver/caddy/v2 v2.7.6-0.20240407023000-a4a64a6f6ea0 => v2.7.6
- quic-go is not the direct dependency of caddy-l4, so it is not going to be downgraded to v0.41.0 as pinned in the go.mod file
- [email protected] does not compatible with [email protected]
What is the best move to fix the current pipeline?
To prove my point, here's my build of Caddy master with an old version (4 months old, December of 2023) this module which depends on Caddy v2.7.5 at the time:
$ xcaddy build master --with github.com/mholt/caddy-l4@78853879f66772f4363a3dbfcd7104e8672dbdb3
2024/04/23 17:13:06 [INFO] Temporary folder: buildenv_2024-04-23-1713.25185395
2024/04/23 17:13:06 [INFO] Writing main module: buildenv_2024-04-23-1713.25185395\main.go
package main
import (
caddycmd "github.com/caddyserver/caddy/v2/cmd"
// plug in Caddy modules here
_ "github.com/caddyserver/caddy/v2/modules/standard"
_ "github.com/mholt/caddy-l4"
)
func main() {
caddycmd.Main()
}
2024/04/23 17:13:06 [INFO] Initializing Go module
2024/04/23 17:13:06 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe mod init caddy
go: creating new go.mod: module caddy
go: to add module requirements and sums:
go mod tidy
2024/04/23 17:13:07 [INFO] Pinning versions
2024/04/23 17:13:07 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -d -v github.com/caddyserver/caddy/v2@master
go: added github.com/beorn7/perks v1.0.1
go: added github.com/caddyserver/caddy/v2 v2.7.6-0.20240423131257-868af6a06229
go: added github.com/caddyserver/certmagic v0.20.1-0.20240412214119-167015dd6570
go: added github.com/caddyserver/zerossl v0.1.2
go: added github.com/cespare/xxhash/v2 v2.2.0
go: added github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572
go: added github.com/google/pprof v0.0.0-20231212022811-ec68065c825e
go: added github.com/google/uuid v1.6.0
go: added github.com/klauspost/cpuid/v2 v2.2.7
go: added github.com/libdns/libdns v0.2.2
go: added github.com/mholt/acmez/v2 v2.0.0-beta.2
go: added github.com/miekg/dns v1.1.58
go: added github.com/onsi/ginkgo/v2 v2.13.2
go: added github.com/prometheus/client_golang v1.19.0
go: added github.com/prometheus/client_model v0.5.0
go: added github.com/prometheus/common v0.48.0
go: added github.com/prometheus/procfs v0.12.0
go: added github.com/quic-go/qpack v0.4.0
go: added github.com/quic-go/quic-go v0.42.0
go: added github.com/zeebo/blake3 v0.2.3
go: added go.uber.org/mock v0.4.0
go: added go.uber.org/multierr v1.11.0
go: added go.uber.org/zap v1.27.0
go: added go.uber.org/zap/exp v0.2.0
go: added golang.org/x/crypto v0.22.0
go: added golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8
go: added golang.org/x/mod v0.16.0
go: added golang.org/x/net v0.24.0
go: added golang.org/x/sys v0.19.0
go: added golang.org/x/term v0.19.0
go: added golang.org/x/text v0.14.0
go: added golang.org/x/time v0.5.0
go: added golang.org/x/tools v0.19.0
go: added google.golang.org/protobuf v1.33.0
2024/04/23 17:13:28 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -d -v github.com/mholt/caddy-l4@78853879f66772f4363a3dbfcd7104e8672dbdb3 github.com/caddyserver/caddy/v2@master
go: downloading github.com/mholt/caddy-l4 v0.0.0-20231204181340-78853879f667
go: downloading github.com/things-go/go-socks5 v0.0.4
go: downloading github.com/smallstep/certificates v0.25.3-rc5
go: downloading github.com/smallstep/truststore v0.13.0
go: downloading go.step.sm/crypto v0.42.1
go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2
go: downloading github.com/stoewer/go-strcase v1.3.0
go: downloading google.golang.org/grpc v1.62.1
go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c
go: downloading github.com/slackhq/nebula v1.7.2
go: downloading github.com/smallstep/pkcs7 v0.0.0-20231024181729-3b98ecc1ca81
go: downloading github.com/smallstep/scep v0.0.0-20231024192529-aee96d7ad34d
go: downloading github.com/go-jose/go-jose/v3 v3.0.3
go: downloading filippo.io/edwards25519 v1.1.0
go: downloading github.com/jackc/pgx/v4 v4.18.3
go: downloading github.com/Masterminds/semver/v3 v3.2.1
go: downloading github.com/huandu/xstrings v1.4.0
go: downloading github.com/imdario/mergo v0.3.16
go: downloading github.com/shopspring/decimal v1.3.1
go: downloading github.com/spf13/cast v1.5.1
go: downloading github.com/go-kit/kit v0.13.0
go: downloading github.com/dgraph-io/ristretto v0.1.1
go: downloading github.com/golang/protobuf v1.5.4
go: downloading github.com/klauspost/compress v1.17.1
go: downloading github.com/golang/glog v1.2.0
go: downloading github.com/go-kit/log v0.2.1
go: downloading github.com/go-logfmt/logfmt v0.6.0
go: upgraded github.com/Masterminds/semver/v3 v3.2.0 => v3.2.1
go: upgraded github.com/Microsoft/go-winio v0.6.0 => v0.6.1
go: upgraded github.com/dgraph-io/ristretto v0.1.0 => v0.1.1
go: upgraded github.com/huandu/xstrings v1.3.3 => v1.4.0
go: upgraded github.com/imdario/mergo v0.3.12 => v0.3.16
go: upgraded github.com/klauspost/compress v1.17.0 => v1.17.1
go: added github.com/mastercactapus/proxyprotocol v0.0.4
go: added github.com/mholt/caddy-l4 v0.0.0-20231204181340-78853879f667
go: upgraded github.com/shopspring/decimal v1.2.0 => v1.3.1
go: upgraded github.com/slackhq/nebula v1.6.1 => v1.7.2
go: upgraded github.com/spf13/cast v1.4.1 => v1.5.1
go: upgraded github.com/stoewer/go-strcase v1.2.0 => v1.3.0
go: added github.com/things-go/go-socks5 v0.0.4
2024/04/23 17:14:25 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -d -v
go: downloading github.com/go-chi/chi/v5 v5.0.12
go: downloading golang.org/x/sync v0.7.0
go: downloading github.com/yuin/goldmark v1.7.1
go: downloading github.com/fxamacker/cbor/v2 v2.6.0
go: downloading github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935
go: downloading github.com/go-logr/logr v1.4.1
2024/04/23 17:15:00 [INFO] Build environment ready
2024/04/23 17:15:00 [INFO] Building Caddy
2024/04/23 17:15:00 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe mod tidy -e
go: downloading github.com/stretchr/testify v1.9.0
go: downloading github.com/google/go-tpm-tools v0.4.2
go: downloading github.com/frankban/quicktest v1.14.4
go: downloading github.com/aws/aws-sdk-go-v2/config v1.26.6
go: downloading github.com/aws/aws-sdk-go-v2/service/kms v1.27.9
go: downloading cloud.google.com/go/kms v1.15.5
go: downloading github.com/aws/aws-sdk-go-v2 v1.24.1
go: downloading google.golang.org/api v0.157.0
go: downloading cloud.google.com/go v0.111.0
go: downloading github.com/aws/aws-sdk-go-v2/credentials v1.16.16
go: downloading github.com/aws/smithy-go v1.19.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7
go: downloading github.com/aws/aws-sdk-go-v2/service/sts v1.26.7
go: downloading github.com/aws/aws-sdk-go-v2/service/sso v1.18.7
go: downloading github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3
go: downloading github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11
go: downloading github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10
go: downloading cloud.google.com/go/iam v1.1.5
go: downloading google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10
go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10
go: downloading golang.org/x/oauth2 v0.16.0
2024/04/23 17:16:05 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe build -o ./caddy.exe -ldflags -w -s -trimpath
2024/04/23 17:19:14 [INFO] Build complete: .\caddy.exe
2024/04/23 17:19:14 [INFO] Cleaning up temporary folder: buildenv_2024-04-23-1713.25185395
$ ./caddy list-modules --versions
admin.api.load v2.7.6-0.20240423131257-868af6a06229
admin.api.metrics v2.7.6-0.20240423131257-868af6a06229
admin.api.pki v2.7.6-0.20240423131257-868af6a06229
admin.api.reverse_proxy v2.7.6-0.20240423131257-868af6a06229
caddy.adapters.caddyfile v2.7.6-0.20240423131257-868af6a06229
caddy.config_loaders.http v2.7.6-0.20240423131257-868af6a06229
caddy.filesystems v2.7.6-0.20240423131257-868af6a06229
caddy.listeners.http_redirect v2.7.6-0.20240423131257-868af6a06229
caddy.listeners.proxy_protocol v2.7.6-0.20240423131257-868af6a06229
caddy.listeners.tls v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.append v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.console v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.cookie v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.delete v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.hash v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.ip_mask v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.query v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.regexp v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.rename v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.filter.replace v2.7.6-0.20240423131257-868af6a06229
caddy.logging.encoders.json v2.7.6-0.20240423131257-868af6a06229
caddy.logging.writers.discard v2.7.6-0.20240423131257-868af6a06229
caddy.logging.writers.file v2.7.6-0.20240423131257-868af6a06229
caddy.logging.writers.net v2.7.6-0.20240423131257-868af6a06229
caddy.logging.writers.stderr v2.7.6-0.20240423131257-868af6a06229
caddy.logging.writers.stdout v2.7.6-0.20240423131257-868af6a06229
caddy.storage.file_system v2.7.6-0.20240423131257-868af6a06229
events v2.7.6-0.20240423131257-868af6a06229
http v2.7.6-0.20240423131257-868af6a06229
http.authentication.hashes.bcrypt v2.7.6-0.20240423131257-868af6a06229
http.authentication.providers.http_basic v2.7.6-0.20240423131257-868af6a06229
http.encoders.gzip v2.7.6-0.20240423131257-868af6a06229
http.encoders.zstd v2.7.6-0.20240423131257-868af6a06229
http.handlers.acme_server v2.7.6-0.20240423131257-868af6a06229
http.handlers.authentication v2.7.6-0.20240423131257-868af6a06229
http.handlers.copy_response v2.7.6-0.20240423131257-868af6a06229
http.handlers.copy_response_headers v2.7.6-0.20240423131257-868af6a06229
http.handlers.encode v2.7.6-0.20240423131257-868af6a06229
http.handlers.error v2.7.6-0.20240423131257-868af6a06229
http.handlers.file_server v2.7.6-0.20240423131257-868af6a06229
http.handlers.headers v2.7.6-0.20240423131257-868af6a06229
http.handlers.invoke v2.7.6-0.20240423131257-868af6a06229
http.handlers.log_append v2.7.6-0.20240423131257-868af6a06229
http.handlers.map v2.7.6-0.20240423131257-868af6a06229
http.handlers.metrics v2.7.6-0.20240423131257-868af6a06229
http.handlers.push v2.7.6-0.20240423131257-868af6a06229
http.handlers.request_body v2.7.6-0.20240423131257-868af6a06229
http.handlers.reverse_proxy v2.7.6-0.20240423131257-868af6a06229
http.handlers.rewrite v2.7.6-0.20240423131257-868af6a06229
http.handlers.static_response v2.7.6-0.20240423131257-868af6a06229
http.handlers.subroute v2.7.6-0.20240423131257-868af6a06229
http.handlers.templates v2.7.6-0.20240423131257-868af6a06229
http.handlers.tracing v2.7.6-0.20240423131257-868af6a06229
http.handlers.vars v2.7.6-0.20240423131257-868af6a06229
http.ip_sources.static v2.7.6-0.20240423131257-868af6a06229
http.matchers.client_ip v2.7.6-0.20240423131257-868af6a06229
http.matchers.expression v2.7.6-0.20240423131257-868af6a06229
http.matchers.file v2.7.6-0.20240423131257-868af6a06229
http.matchers.header v2.7.6-0.20240423131257-868af6a06229
http.matchers.header_regexp v2.7.6-0.20240423131257-868af6a06229
http.matchers.host v2.7.6-0.20240423131257-868af6a06229
http.matchers.method v2.7.6-0.20240423131257-868af6a06229
http.matchers.not v2.7.6-0.20240423131257-868af6a06229
http.matchers.path v2.7.6-0.20240423131257-868af6a06229
http.matchers.path_regexp v2.7.6-0.20240423131257-868af6a06229
http.matchers.protocol v2.7.6-0.20240423131257-868af6a06229
http.matchers.query v2.7.6-0.20240423131257-868af6a06229
http.matchers.remote_ip v2.7.6-0.20240423131257-868af6a06229
http.matchers.vars v2.7.6-0.20240423131257-868af6a06229
http.matchers.vars_regexp v2.7.6-0.20240423131257-868af6a06229
http.precompressed.br v2.7.6-0.20240423131257-868af6a06229
http.precompressed.gzip v2.7.6-0.20240423131257-868af6a06229
http.precompressed.zstd v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.client_ip_hash v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.cookie v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.first v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.header v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.ip_hash v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.least_conn v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.query v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.random v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.random_choose v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.round_robin v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.uri_hash v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.selection_policies.weighted_round_robin v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.transport.fastcgi v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.transport.http v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.upstreams.a v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.upstreams.multi v2.7.6-0.20240423131257-868af6a06229
http.reverse_proxy.upstreams.srv v2.7.6-0.20240423131257-868af6a06229
pki v2.7.6-0.20240423131257-868af6a06229
tls v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.file v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.http v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.inline v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.lazy v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.pki_intermediate v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.pki_root v2.7.6-0.20240423131257-868af6a06229
tls.ca_pool.source.storage v2.7.6-0.20240423131257-868af6a06229
tls.certificates.automate v2.7.6-0.20240423131257-868af6a06229
tls.certificates.load_files v2.7.6-0.20240423131257-868af6a06229
tls.certificates.load_folders v2.7.6-0.20240423131257-868af6a06229
tls.certificates.load_pem v2.7.6-0.20240423131257-868af6a06229
tls.certificates.load_storage v2.7.6-0.20240423131257-868af6a06229
tls.client_auth.verifier.leaf v2.7.6-0.20240423131257-868af6a06229
tls.get_certificate.http v2.7.6-0.20240423131257-868af6a06229
tls.get_certificate.tailscale v2.7.6-0.20240423131257-868af6a06229
tls.handshake_match.local_ip v2.7.6-0.20240423131257-868af6a06229
tls.handshake_match.remote_ip v2.7.6-0.20240423131257-868af6a06229
tls.handshake_match.sni v2.7.6-0.20240423131257-868af6a06229
tls.issuance.acme v2.7.6-0.20240423131257-868af6a06229
tls.issuance.internal v2.7.6-0.20240423131257-868af6a06229
tls.issuance.zerossl v2.7.6-0.20240423131257-868af6a06229
tls.leaf_cert_loader.file v2.7.6-0.20240423131257-868af6a06229
tls.leaf_cert_loader.folder v2.7.6-0.20240423131257-868af6a06229
tls.leaf_cert_loader.pem v2.7.6-0.20240423131257-868af6a06229
tls.leaf_cert_loader.storage v2.7.6-0.20240423131257-868af6a06229
tls.permission.http v2.7.6-0.20240423131257-868af6a06229
tls.stek.distributed v2.7.6-0.20240423131257-868af6a06229
tls.stek.standard v2.7.6-0.20240423131257-868af6a06229
Standard modules: 121
caddy.listeners.layer4 v0.0.0-20231204181340-78853879f667
layer4 v0.0.0-20231204181340-78853879f667
layer4.handlers.echo v0.0.0-20231204181340-78853879f667
layer4.handlers.proxy v0.0.0-20231204181340-78853879f667
layer4.handlers.proxy_protocol v0.0.0-20231204181340-78853879f667
layer4.handlers.socks5 v0.0.0-20231204181340-78853879f667
layer4.handlers.subroute v0.0.0-20231204181340-78853879f667
layer4.handlers.tee v0.0.0-20231204181340-78853879f667
layer4.handlers.throttle v0.0.0-20231204181340-78853879f667
layer4.handlers.tls v0.0.0-20231204181340-78853879f667
layer4.matchers.http v0.0.0-20231204181340-78853879f667
layer4.matchers.ip v0.0.0-20231204181340-78853879f667
layer4.matchers.local_ip v0.0.0-20231204181340-78853879f667
layer4.matchers.not v0.0.0-20231204181340-78853879f667
layer4.matchers.proxy_protocol v0.0.0-20231204181340-78853879f667
layer4.matchers.socks4 v0.0.0-20231204181340-78853879f667
layer4.matchers.socks5 v0.0.0-20231204181340-78853879f667
layer4.matchers.ssh v0.0.0-20231204181340-78853879f667
layer4.matchers.tls v0.0.0-20231204181340-78853879f667
layer4.matchers.xmpp v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.first v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.ip_hash v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.least_conn v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.random v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.random_choose v0.0.0-20231204181340-78853879f667
layer4.proxy.selection_policies.round_robin v0.0.0-20231204181340-78853879f667
tls.handshake_match.alpn v0.0.0-20231204181340-78853879f667
Non-standard modules: 27
Unknown modules: 0
As you can see, depending on an older Caddy did not break the build and produced an executable with caddy@master.
That said, you seem to be emotionally charged over the subject. I'm not the only co-maintainer of this repo, so I'll leave it to the other maintainers who want to jump in. I am a user of this module, so I still care.
As you can see, depending on an older Caddy did not break the build and produced an executable with caddy@master.
That said, you seem to be emotionally charged over the subject. I'm not the only co-maintainer of this repo, so I'll leave it to the other maintainers who want to jump in. I am a user of this module, so I still care.
I see, thanks for taking time sharing your experience and knowledge. I might still be poking around to see if I can come up with a better idea, and I will try my best to not disturb you.
Thanks for the discussion, I tend to agree with @mohammed90 -- but I hope this will not be an issue soon as we release Caddy v2.8.