mirror of
https://github.com/hanzoai/ingress.git
synced 2026-10-20 15:07:40 +00:00
rebrand: strip "traefik" branding from the ingress controller
Removes all "traefik" branding/paths/env/comments from the shipping
surface while keeping load-bearing config schema and external deps intact.
Paths / binary:
- cmd/traefik/ -> cmd/ingress/ (traefik.go->ingress.go, etc.); merged out
the empty cmd/ingress/generate.go stub. Build refs updated in Dockerfile,
Makefile, .goreleaser.yml.tmpl, script/crossbinary-default.sh, README.
- contrib/systemd/traefik.service -> ingress.service (Hanzo Ingress unit,
/etc/ingress paths, hanzo-ingress binary).
- contrib/grafana/traefik*.json -> ingress*.json; metric queries
traefik_* -> ingress_* (now match the engine's ingress_ prefix) + titles.
- script/gcg/traefik-*.toml -> ingress-*.toml; Owner/Repo -> hanzoai/ingress.
Code/config branding (comments + non-schema strings):
- doc.go, mount.go, client/router.go, zap_backend.go, forward_backend.go,
register.go: "Traefik" -> "the ingress"/"Hanzo Ingress"; corrected the
annotation example to ingress.kubernetes.io/.
- ingress.sample.{toml,yml}: header + log + entryPoint example.
- pkg/config/dynamic/fixtures/sample.toml comment.
- pkg/redactor/testdata example+expected: /etc/traefik/traefik.toml ->
/etc/ingress/ingress.toml, TraefikLogsFile -> IngressLogsFile (both files
kept identical so the redactor golden test stays green).
- .golangci.yml importas aliases traefik* -> ingress* and the stale
crd/traefikio path -> crd/hanzoai; unused-var exclude ingressVersion.
- .dockerignore / .gitignore: drop stale /traefik artifacts.
- script/code-gen.sh: PROJECT_MODULE -> github.com/hanzoai/ingress,
v1alpha1 path -> crd/hanzoai, CRD output -> hanzo.ai_*.yaml /
01-ingress-crd.yml.
- script/deploy.sh: drop the upstream traefik-library-image push.
- Removed dead, disabled upstream docs-publish workflow
(.github/workflows/documentation.yaml, pushed to traefik/doc).
- LLM.md: rewrote rebrand notes; documented load-bearing "traefik" that
stays (external imports, hash-bound realm, upstream issue URL, license
attribution) and vendored upstream docs/webui/changelog as out of scope.
Load-bearing "traefik" intentionally KEPT (not branding):
- external Go modules github.com/traefik/{oxy,yaegi,grpc-web};
- digest_auth_test.go htdigest realm "traefik" (invalidates the hashes);
- consul_test.go upstream issue URL #8092 (provenance citation);
- LICENSE.md + boilerplate.go.tmpl Containous/Traefik Labs copyright
(MIT attribution; Hanzo AI appended);
- integration/ test fixtures (traefik/whoami images, rawdata-*.json
golden entrypoint names, nomad traefik.* tags) — test-only, semantics-
sensitive; out of scope for this pass.
Verify: `go build $(go list ./... | grep -v /webui)` passes; redactor /
config/dynamic / nomad / server/service tests pass. The webui go:embed
failure and the kubernetes/crd test (ingress.k8s.io group mismatch) are
pre-existing on main, not caused by this rebrand.
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
dist/
|
||||
!dist/**/traefik
|
||||
!dist/**/hanzo-ingress
|
||||
site/
|
||||
vendor/
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
name: Build and Publish Documentation
|
||||
|
||||
on:
|
||||
workflow_dispatch: {}
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- v*
|
||||
|
||||
env:
|
||||
STRUCTOR_VERSION: v1.13.2
|
||||
MIXTUS_VERSION: v0.4.1
|
||||
|
||||
jobs:
|
||||
|
||||
docs:
|
||||
name: Doc Process
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
# Disabled: requires upstream-specific tooling (structor, mixtus, seo-doc)
|
||||
# and GH_TOKEN_REPO secret. Re-enable when Hanzo docs pipeline is set up.
|
||||
if: false
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Install Structor ${{ env.STRUCTOR_VERSION }}
|
||||
run: curl -sSfL https://raw.githubusercontent.com/traefik/structor/master/godownloader.sh | sh -s -- -b $HOME/bin ${STRUCTOR_VERSION}
|
||||
|
||||
- name: Install Seo-doc
|
||||
run: curl -sSfL https://raw.githubusercontent.com/traefik/seo-doc/master/godownloader.sh | sh -s -- -b "${HOME}/bin"
|
||||
|
||||
- name: Install Mixtus ${{ env.MIXTUS_VERSION }}
|
||||
run: curl -sSfL https://raw.githubusercontent.com/traefik/mixtus/master/godownloader.sh | sh -s -- -b $HOME/bin ${MIXTUS_VERSION}
|
||||
|
||||
- name: Build documentation
|
||||
run: |
|
||||
STRUCTOR_LATEST_TAG=$(curl -s https://api.github.com/repos/traefik/traefik/releases/latest | jq -r '.tag_name')
|
||||
$HOME/bin/structor -o traefik -r traefik --dockerfile-url="https://raw.githubusercontent.com/traefik/traefik/v1.7/docs.Dockerfile" --menu.js-url="https://raw.githubusercontent.com/traefik/structor/master/traefik-menu.js.gotmpl" --rqts-url="https://raw.githubusercontent.com/traefik/structor/master/requirements-override.txt" --force-edit-url --exp-branch=master --debug
|
||||
|
||||
- name: Apply seo
|
||||
run: $HOME/bin/seo -path=./site -product=traefik
|
||||
|
||||
- name: Publish documentation
|
||||
run: $HOME/bin/mixtus --dst-doc-path="./traefik" --dst-owner=traefik --dst-repo-name=doc --git-user-email="[email protected]" --git-user-name=traefiker --src-doc-path="./site" --src-owner=traefik --src-repo-name=traefik
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_REPO }}
|
||||
+4
-4
@@ -8,16 +8,16 @@
|
||||
/site/
|
||||
/docs/site/
|
||||
/autogen/
|
||||
/traefik
|
||||
/traefik.toml
|
||||
/traefik.yml
|
||||
/hanzo-ingress
|
||||
/ingress.toml
|
||||
/ingress.yml
|
||||
*.log
|
||||
*.exe
|
||||
cover.out
|
||||
vendor/
|
||||
plugins-storage/
|
||||
plugins-local/
|
||||
traefik_changelog.md
|
||||
ingress_changelog.md
|
||||
integration/tailscale.secret
|
||||
integration/gateway-api-conformance-reports/**/experimental-dev-default-report.yaml
|
||||
hanzo-ingress
|
||||
|
||||
+8
-8
@@ -146,17 +146,17 @@ linters:
|
||||
- pkg: sigs.k8s.io/gateway-api/apis/v1alpha2
|
||||
alias: gatev1alpha2
|
||||
|
||||
# Traefik Kubernetes rewrites:
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/traefikio/v1alpha1
|
||||
alias: traefikv1alpha1
|
||||
# Ingress Kubernetes rewrites:
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/hanzoai/v1alpha1
|
||||
alias: ingressv1alpha1
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned
|
||||
alias: traefikclientset
|
||||
alias: ingressclientset
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/generated/informers/externalversions
|
||||
alias: traefikinformers
|
||||
alias: ingressinformers
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned/scheme
|
||||
alias: traefikscheme
|
||||
alias: ingressscheme
|
||||
- pkg: github.com/hanzoai/ingress/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned/fake
|
||||
alias: traefikcrdfake
|
||||
alias: ingresscrdfake
|
||||
misspell:
|
||||
locale: US
|
||||
revive:
|
||||
@@ -339,7 +339,7 @@ linters:
|
||||
- path: pkg/proxy/httputil/bufferpool.go
|
||||
text: 'SA6002: argument should be pointer-like to avoid allocations'
|
||||
- path: integration/integration_test.go
|
||||
text: 'var (gatewayAPIConformanceRunTest|traefikVersion) is unused'
|
||||
text: 'var (gatewayAPIConformanceRunTest|ingressVersion) is unused'
|
||||
- path: pkg/server/router/router.go
|
||||
text: 'appendAssign: append result not assigned to the same slice'
|
||||
linters:
|
||||
|
||||
@@ -10,7 +10,7 @@ dist: "./dist/[[ .GOOS ]]"
|
||||
builds:
|
||||
- binary: hanzo-ingress
|
||||
|
||||
main: ./cmd/traefik/
|
||||
main: ./cmd/ingress/
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
ldflags:
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.Version=${VERSION} \
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.Codename=hanzo \
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.BuildDate=$(date -u '+%Y-%m-%d_%I:%M:%S%p')" \
|
||||
-o /hanzo-ingress ./cmd/traefik
|
||||
-o /hanzo-ingress ./cmd/ingress
|
||||
|
||||
# ---- Stage 3: Runtime ----
|
||||
FROM alpine:3.23
|
||||
|
||||
@@ -38,26 +38,49 @@ ingress/
|
||||
- `Makefile` -- Build automation
|
||||
- `Dockerfile` -- Container build
|
||||
|
||||
## Rebrand Notes (v3.8.0)
|
||||
## Rebrand Notes
|
||||
|
||||
### External library constraints
|
||||
- `github.com/traefik/paerser` defines `DefaultRootName = "traefik"` and `DefaultNamePrefix = "TRAEFIK_"`.
|
||||
Config file flags (`-traefik.configfile`), env var prefix (`TRAEFIK_*`), and parser root name
|
||||
**must** stay as `traefik` to match the external library. These are NOT candidates for rebrand.
|
||||
- `github.com/traefik/yaegi`, `github.com/traefik/grpc-web`, `github.com/traefik/oxy` are external
|
||||
imports -- never touch their paths.
|
||||
The engine is fully de-traefik'd: the parser dependency was forked to
|
||||
`github.com/hanzoai/ingress-parser` (`DefaultRootName = "ingress"`,
|
||||
`DefaultNamePrefix = "INGRESS_"`), the config base paths are
|
||||
`/etc/ingress/ingress`, the Prometheus metric prefix is `ingress_`, and
|
||||
the CRD apiGroup is `hanzo.ai`. The standalone binary is built from
|
||||
`cmd/ingress` (was `cmd/traefik`) and ships as `hanzo-ingress`.
|
||||
|
||||
### Hash-bound test data
|
||||
- `pkg/middlewares/auth/digest_auth_test.go` contains htdigest hashes computed as
|
||||
`md5(user:realm:password)` where realm=`"traefik"`. Changing the realm invalidates the hash.
|
||||
These 10 references must stay.
|
||||
### Load-bearing "traefik" that intentionally STAYS
|
||||
These are the only remaining `traefik` strings outside the vendored
|
||||
upstream docs/changelog. They are NOT branding and must not be renamed:
|
||||
|
||||
- **External Go imports** — `github.com/traefik/yaegi`,
|
||||
`github.com/traefik/grpc-web`, `github.com/traefik/oxy` are real
|
||||
third-party modules (in `go.mod`/`go.sum` and the import lines that
|
||||
use them). Renaming breaks the build.
|
||||
- **Hash-bound test data** — `pkg/middlewares/auth/digest_auth_test.go`
|
||||
htdigest hashes are `md5(user:realm:password)` with realm `"traefik"`.
|
||||
Changing the realm invalidates the precomputed hashes (~10 refs).
|
||||
- **Upstream issue citation** — `integration/consul_test.go` links
|
||||
`https://github.com/traefik/traefik/issues/8092` as the provenance of
|
||||
a regression test. The issue only exists at that URL.
|
||||
|
||||
### Vendored upstream content (out of scope by nature)
|
||||
`docs/content/**`, `CHANGELOG.md`, `webui/**` (the dashboard SPA), and
|
||||
the `traefik.io_*.yaml` CRD reference dumps under `docs/` are imported
|
||||
upstream Traefik material kept for reference. They carry the bulk of the
|
||||
remaining `traefik` occurrences and do not ship in the runtime binary or
|
||||
image. Rebrand them only as part of a dedicated docs pass.
|
||||
|
||||
### Wire protocol changes (intentional)
|
||||
- `X-Traefik-Fast-Proxy` header renamed to `X-Ingress-Fast-Proxy`
|
||||
- `X-Traefik-Router` header renamed to `X-Ingress-Router`
|
||||
- Prometheus/InfluxDB metric prefix: `traefik.*` renamed to `ingress.*`
|
||||
(the bundled Grafana dashboards in `contrib/grafana/ingress*.json`
|
||||
query the `ingress_*` metric names accordingly)
|
||||
|
||||
### Pre-existing test failures (not caused by rebrand)
|
||||
### Pre-existing build/test issues (not caused by rebrand)
|
||||
- `webui/embed.go` `//go:embed static` fails until the dashboard assets
|
||||
are built (`make generate-webui`); `go build ./...` therefore needs the
|
||||
webui built first, or build the subset
|
||||
`go build $(go list ./... | grep -v /webui)`.
|
||||
- `pkg/muxer/http/Test_addRoute/Host_IPv6`: Go 1.26 broke IPv6 URL parsing
|
||||
- `pkg/middlewares/ratelimiter`: Timing-sensitive tests, flaky
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ webui/static/index.html:
|
||||
# Run only the production build, NOT `build:prod` (which chains
|
||||
# test+tsc+lint). Tests live in .github/workflows/test-unit.yaml;
|
||||
# coupling them to the image build means every npm flake takes
|
||||
# the image build with it. Decoupled per upstream Traefik practice.
|
||||
# the image build with it. Decoupled image build / test pipeline.
|
||||
docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' hanzo-ingress-webui pnpm build
|
||||
docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' hanzo-ingress-webui chown -R $(shell id -u):$(shell id -g) ./static
|
||||
printf 'For more information see `webui/readme.md`' > webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md
|
||||
@@ -67,7 +67,7 @@ binary: generate-webui dist
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.Version=$(VERSION) \
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.Codename=$(CODENAME) \
|
||||
-X github.com/hanzoai/ingress/v3/pkg/version.BuildDate=$(DATE)" \
|
||||
-installsuffix nocgo -o "./dist/${GOOS}/${GOARCH}/$(BIN_NAME)" ./cmd/traefik
|
||||
-installsuffix nocgo -o "./dist/${GOOS}/${GOARCH}/$(BIN_NAME)" ./cmd/ingress
|
||||
|
||||
binary-linux-arm64: export GOOS := linux
|
||||
binary-linux-arm64: export GOARCH := arm64
|
||||
|
||||
@@ -16,7 +16,7 @@ framework, which routes every JSON path through stdlib
|
||||
flag; manual builds should do the same:
|
||||
|
||||
```bash
|
||||
GOEXPERIMENT=jsonv2 CGO_ENABLED=0 go build ./cmd/traefik
|
||||
GOEXPERIMENT=jsonv2 CGO_ENABLED=0 go build ./cmd/ingress
|
||||
```
|
||||
|
||||
Without the experiment the binary still compiles and runs — zip falls
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ import "context"
|
||||
// management API every operator + admin tool uses.
|
||||
type Router interface {
|
||||
// Kind reports the backend identifier
|
||||
// (hanzo-ingress | traefik | envoy | nginx).
|
||||
// (hanzo-ingress | envoy | nginx).
|
||||
Kind() string
|
||||
|
||||
// UpsertVHost creates or replaces a virtual host. Idempotent.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
//go:generate go run ./internal/
|
||||
|
||||
package main
|
||||
|
||||
func main() {}
|
||||
@@ -64,7 +64,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "Official dashboard for Traefik on Kubernetes",
|
||||
"description": "Official dashboard for Hanzo Ingress on Kubernetes",
|
||||
"editable": false,
|
||||
"fiscalYearStartMonth": 0,
|
||||
"gnetId": 17347,
|
||||
@@ -143,13 +143,13 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "count(traefik_config_reloads_total)",
|
||||
"expr": "count(ingress_config_reloads_total)",
|
||||
"legendFormat": "__auto",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Traefik Instances",
|
||||
"title": "Ingress Instances",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
@@ -242,7 +242,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(rate(traefik_entrypoint_requests_total{entrypoint=~\"$entrypoint\"}[$interval])) by (entrypoint)",
|
||||
"expr": "sum(rate(ingress_entrypoint_requests_total{entrypoint=~\"$entrypoint\"}[$interval])) by (entrypoint)",
|
||||
"legendFormat": "{{entrypoint}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -340,7 +340,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "(sum(rate(traefik_entrypoint_request_duration_seconds_bucket{le=\"0.3\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method) + \n sum(rate(traefik_entrypoint_request_duration_seconds_bucket{le=\"1.2\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)) / 2 / \n sum(rate(traefik_entrypoint_request_duration_seconds_count{code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)\n",
|
||||
"expr": "(sum(rate(ingress_entrypoint_request_duration_seconds_bucket{le=\"0.3\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method) + \n sum(rate(ingress_entrypoint_request_duration_seconds_bucket{le=\"1.2\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)) / 2 / \n sum(rate(ingress_entrypoint_request_duration_seconds_count{code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)\n",
|
||||
"legendFormat": "{{method}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -408,7 +408,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(rate(traefik_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) by (method, code)",
|
||||
"expr": "sum(rate(ingress_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) by (method, code)",
|
||||
"legendFormat": "{{method}}[{{code}}]",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -507,7 +507,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n traefik_service_request_duration_seconds_sum{service=~\"$service.*\",protocol=\"http\"} / \n traefik_service_request_duration_seconds_count{service=~\"$service.*\",protocol=\"http\"},\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)\n\n",
|
||||
"expr": "topk(15,\n label_replace(\n ingress_service_request_duration_seconds_sum{service=~\"$service.*\",protocol=\"http\"} / \n ingress_service_request_duration_seconds_count{service=~\"$service.*\",protocol=\"http\"},\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)\n\n",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -606,7 +606,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -711,7 +711,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(traefik_service_request_duration_seconds_bucket{le=\"1.2\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(traefik_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\"\n)",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(ingress_service_request_duration_seconds_bucket{le=\"1.2\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(ingress_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\"\n)",
|
||||
"legendFormat": "{{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -806,7 +806,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(traefik_service_request_duration_seconds_bucket{le=\"0.3\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(traefik_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\"\n)",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(ingress_service_request_duration_seconds_bucket{le=\"0.3\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(ingress_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\"\n)",
|
||||
"legendFormat": "{{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -922,7 +922,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code=~\"2..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code=~\"2..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1022,7 +1022,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code=~\"5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code=~\"5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1122,7 +1122,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code!~\"2..|5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code!~\"2..|5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1222,7 +1222,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(traefik_service_requests_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(ingress_service_requests_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "{{method}} on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1322,7 +1322,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(traefik_service_responses_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(ingress_service_responses_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^@]+)@.*\")\n)",
|
||||
"legendFormat": "{{method}} on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1421,7 +1421,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(traefik_open_connections{entrypoint=~\"$entrypoint\"}) by (entrypoint)\n",
|
||||
"expr": "sum(ingress_open_connections{entrypoint=~\"$entrypoint\"}) by (entrypoint)\n",
|
||||
"legendFormat": "{{entrypoint}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1461,14 +1461,14 @@
|
||||
"type": "prometheus",
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"definition": "label_values(traefik_open_connections, entrypoint)",
|
||||
"definition": "label_values(ingress_open_connections, entrypoint)",
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"multi": false,
|
||||
"name": "entrypoint",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values(traefik_open_connections, entrypoint)",
|
||||
"query": "label_values(ingress_open_connections, entrypoint)",
|
||||
"refId": "StandardVariableQuery"
|
||||
},
|
||||
"refresh": 1,
|
||||
@@ -1546,14 +1546,14 @@
|
||||
"type": "prometheus",
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"definition": "label_values(traefik_service_requests_total, service)",
|
||||
"definition": "label_values(ingress_service_requests_total, service)",
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"multi": false,
|
||||
"name": "service",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values(traefik_service_requests_total, service)",
|
||||
"query": "label_values(ingress_service_requests_total, service)",
|
||||
"refId": "StandardVariableQuery"
|
||||
},
|
||||
"refresh": 2,
|
||||
@@ -1570,7 +1570,7 @@
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Traefik Official Kubernetes Dashboard",
|
||||
"title": "Hanzo Ingress Official Kubernetes Dashboard",
|
||||
"uid": "n5bu_kv4k",
|
||||
"version": 7,
|
||||
"weekStart": ""
|
||||
@@ -64,7 +64,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "Official dashboard for Standalone Traefik",
|
||||
"description": "Official dashboard for Hanzo Ingress",
|
||||
"editable": false,
|
||||
"fiscalYearStartMonth": 0,
|
||||
"gnetId": 17346,
|
||||
@@ -143,13 +143,13 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "count(traefik_config_reloads_total)",
|
||||
"expr": "count(ingress_config_reloads_total)",
|
||||
"legendFormat": "__auto",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Traefik Instances",
|
||||
"title": "Ingress Instances",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
@@ -242,7 +242,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(rate(traefik_entrypoint_requests_total{entrypoint=~\"$entrypoint\"}[$interval])) by (entrypoint)",
|
||||
"expr": "sum(rate(ingress_entrypoint_requests_total{entrypoint=~\"$entrypoint\"}[$interval])) by (entrypoint)",
|
||||
"legendFormat": "{{entrypoint}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -340,7 +340,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "(sum(rate(traefik_entrypoint_request_duration_seconds_bucket{le=\"0.3\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method) + \n sum(rate(traefik_entrypoint_request_duration_seconds_bucket{le=\"1.2\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)) / 2 / \n sum(rate(traefik_entrypoint_request_duration_seconds_count{code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)\n",
|
||||
"expr": "(sum(rate(ingress_entrypoint_request_duration_seconds_bucket{le=\"0.3\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method) + \n sum(rate(ingress_entrypoint_request_duration_seconds_bucket{le=\"1.2\",code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)) / 2 / \n sum(rate(ingress_entrypoint_request_duration_seconds_count{code=\"200\",entrypoint=~\"$entrypoint\"}[$interval])) by (method)\n",
|
||||
"legendFormat": "{{method}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -408,7 +408,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(rate(traefik_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) by (method, code)",
|
||||
"expr": "sum(rate(ingress_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) by (method, code)",
|
||||
"legendFormat": "{{method}}[{{code}}]",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -507,7 +507,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n traefik_service_request_duration_seconds_sum{service=~\"$service.*\",protocol=\"http\"} / \n traefik_service_request_duration_seconds_count{service=~\"$service.*\",protocol=\"http\"},\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)\n\n",
|
||||
"expr": "topk(15,\n label_replace(\n ingress_service_request_duration_seconds_sum{service=~\"$service.*\",protocol=\"http\"} / \n ingress_service_request_duration_seconds_count{service=~\"$service.*\",protocol=\"http\"},\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)\n\n",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -606,7 +606,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -710,7 +710,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(traefik_service_request_duration_seconds_bucket{le=\"1.2\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(traefik_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\"\n)",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(ingress_service_request_duration_seconds_bucket{le=\"1.2\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(ingress_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\"\n)",
|
||||
"legendFormat": "{{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -804,7 +804,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(traefik_service_request_duration_seconds_bucket{le=\"0.3\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(traefik_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\"\n)",
|
||||
"expr": "label_replace(\n 1 - (sum by (service)\n (rate(ingress_service_request_duration_seconds_bucket{le=\"0.3\",service=~\"$service.*\"}[$interval])) / sum by (service) \n (rate(ingress_service_request_duration_seconds_count{service=~\"$service.*\"}[$interval]))\n ) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\"\n)",
|
||||
"legendFormat": "{{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -916,7 +916,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code=~\"2..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code=~\"2..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1015,7 +1015,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code=~\"5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code=~\"5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1114,7 +1114,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(traefik_service_requests_total{service=~\"$service.*\",code!~\"2..|5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method,code) \n (rate(ingress_service_requests_total{service=~\"$service.*\",code!~\"2..|5..\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "{{method}}[{{code}}] on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1213,7 +1213,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(traefik_service_requests_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(ingress_service_requests_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "{{method}} on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1312,7 +1312,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(traefik_service_responses_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"expr": "topk(15,\n label_replace(\n sum by (service,method) \n (rate(ingress_service_responses_bytes_total{service=~\"$service.*\",protocol=\"http\"}[$interval])) > 0,\n \"service\", \"$1\", \"service\", \"([^-]+-[^-]+).*\")\n)",
|
||||
"legendFormat": "{{method}} on {{service}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1410,7 +1410,7 @@
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"editorMode": "code",
|
||||
"expr": "sum(traefik_open_connections{entrypoint=~\"$entrypoint\"}) by (entrypoint)\n",
|
||||
"expr": "sum(ingress_open_connections{entrypoint=~\"$entrypoint\"}) by (entrypoint)\n",
|
||||
"legendFormat": "{{entrypoint}}",
|
||||
"range": true,
|
||||
"refId": "A"
|
||||
@@ -1517,14 +1517,14 @@
|
||||
"type": "prometheus",
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"definition": "label_values(traefik_open_connections, entrypoint)",
|
||||
"definition": "label_values(ingress_open_connections, entrypoint)",
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"multi": false,
|
||||
"name": "entrypoint",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values(traefik_open_connections, entrypoint)",
|
||||
"query": "label_values(ingress_open_connections, entrypoint)",
|
||||
"refId": "StandardVariableQuery"
|
||||
},
|
||||
"refresh": 1,
|
||||
@@ -1539,14 +1539,14 @@
|
||||
"type": "prometheus",
|
||||
"uid": "${DS_PROMETHEUS}"
|
||||
},
|
||||
"definition": "label_values(traefik_service_requests_total, service)",
|
||||
"definition": "label_values(ingress_service_requests_total, service)",
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"multi": false,
|
||||
"name": "service",
|
||||
"options": [],
|
||||
"query": {
|
||||
"query": "label_values(traefik_service_requests_total, service)",
|
||||
"query": "label_values(ingress_service_requests_total, service)",
|
||||
"refId": "StandardVariableQuery"
|
||||
},
|
||||
"refresh": 2,
|
||||
@@ -1563,7 +1563,7 @@
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Traefik Official Standalone Dashboard",
|
||||
"title": "Hanzo Ingress Dashboard",
|
||||
"uid": "n5bu_kv45",
|
||||
"version": 7,
|
||||
"weekStart": ""
|
||||
@@ -1,18 +1,18 @@
|
||||
[Unit]
|
||||
Description=Traefik
|
||||
Documentation=https://doc.traefik.io/traefik/
|
||||
Description=Hanzo Ingress
|
||||
Documentation=https://github.com/hanzoai/ingress
|
||||
#After=network-online.target
|
||||
#AssertFileIsExecutable=/usr/bin/traefik
|
||||
#AssertPathExists=/etc/traefik/traefik.toml
|
||||
#AssertFileIsExecutable=/usr/bin/hanzo-ingress
|
||||
#AssertPathExists=/etc/ingress/ingress.toml
|
||||
|
||||
[Service]
|
||||
# Run traefik as its own user (create new user with: useradd -r -s /bin/false -U -M traefik)
|
||||
#User=traefik
|
||||
# Run the ingress as its own user (create new user with: useradd -r -s /bin/false -U -M ingress)
|
||||
#User=ingress
|
||||
#AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||
|
||||
# configure service behavior
|
||||
Type=notify
|
||||
#ExecStart=/usr/bin/traefik --configFile=/etc/traefik/traefik.toml
|
||||
#ExecStart=/usr/bin/hanzo-ingress --configFile=/etc/ingress/ingress.toml
|
||||
Restart=always
|
||||
WatchdogSec=1s
|
||||
|
||||
@@ -31,7 +31,7 @@ WatchdogSec=1s
|
||||
#ProtectControlGroups=true
|
||||
|
||||
# allow writing of acme.json
|
||||
#ReadWritePaths=/etc/traefik/acme.json
|
||||
#ReadWritePaths=/etc/ingress/acme.json
|
||||
# depending on log and entrypoint configuration, you may need to allow writing to other paths, too
|
||||
|
||||
# limit number of processes in this unit
|
||||
@@ -4,7 +4,7 @@
|
||||
// the Hanzo Ingress subsystem.
|
||||
//
|
||||
// The mount logic ships under the `cloud` build tag so the standalone
|
||||
// cmd/traefik binary (the full hanzo-ingress reverse proxy that runs
|
||||
// cmd/ingress binary (the full hanzo-ingress reverse proxy that runs
|
||||
// at the k8s cluster edge) builds without pulling hanzoai/cloud +
|
||||
// hanzoai/zip into its dependency tree. Build with `-tags=cloud` to
|
||||
// compile the Mount.
|
||||
|
||||
+4
-6
@@ -1,8 +1,6 @@
|
||||
################################################################
|
||||
#
|
||||
# Configuration sample for Traefik v2.
|
||||
#
|
||||
# For Traefik v1: https://github.com/traefik/traefik/blob/v1.7/traefik.sample.toml
|
||||
# Configuration sample for Hanzo Ingress.
|
||||
#
|
||||
################################################################
|
||||
|
||||
@@ -29,10 +27,10 @@
|
||||
address = ":443"
|
||||
|
||||
################################################################
|
||||
# Traefik logs configuration
|
||||
# Ingress logs configuration
|
||||
################################################################
|
||||
|
||||
# Traefik logs
|
||||
# Ingress logs
|
||||
# Enabled by default and log to stdout
|
||||
#
|
||||
# Optional
|
||||
@@ -82,7 +80,7 @@
|
||||
# filePath = "/path/to/log/log.txt"
|
||||
|
||||
# Format is either "json", "common", or "genericCLF".
|
||||
# - "common": Traefik's extended CLF format (default)
|
||||
# - "common": the ingress' extended CLF format (default)
|
||||
# - "genericCLF": Standard CLF format compatible with standard log analyzers
|
||||
# - "json": JSON format for structured logging
|
||||
#
|
||||
|
||||
+5
-7
@@ -1,8 +1,6 @@
|
||||
################################################################
|
||||
#
|
||||
# Configuration sample for Traefik v2.
|
||||
#
|
||||
# For Traefik v1: https://github.com/traefik/traefik/blob/v1.7/traefik.sample.toml
|
||||
# Configuration sample for Hanzo Ingress.
|
||||
#
|
||||
################################################################
|
||||
|
||||
@@ -29,10 +27,10 @@ entryPoints:
|
||||
address: :443
|
||||
|
||||
################################################################
|
||||
# Traefik logs configuration
|
||||
# Ingress logs configuration
|
||||
################################################################
|
||||
|
||||
# Traefik logs
|
||||
# Ingress logs
|
||||
# Enabled by default and log to stdout
|
||||
#
|
||||
# Optional
|
||||
@@ -80,7 +78,7 @@ entryPoints:
|
||||
# filePath: /path/to/log/log.txt
|
||||
|
||||
# Format is either "json", "common", or "genericCLF".
|
||||
# - "common": Traefik's extended CLF format (default)
|
||||
# - "common": the ingress' extended CLF format (default)
|
||||
# - "genericCLF": Standard CLF format compatible with standard log analyzers
|
||||
# - "json": JSON format for structured logging
|
||||
#
|
||||
@@ -124,7 +122,7 @@ entryPoints:
|
||||
# Optional
|
||||
# Default: "ingress"
|
||||
#
|
||||
# entryPoint: traefik
|
||||
# entryPoint: ingress
|
||||
|
||||
################################################################
|
||||
# Docker configuration backend
|
||||
|
||||
@@ -282,7 +282,7 @@ func (s *WebsocketSuite) TestBasicAuth() {
|
||||
defer conn.Close()
|
||||
|
||||
user, password, _ := r.BasicAuth()
|
||||
assert.Equal(s.T(), "traefiker", user)
|
||||
assert.Equal(s.T(), "ingressuser", user)
|
||||
assert.Equal(s.T(), "secret", password)
|
||||
|
||||
for {
|
||||
@@ -309,7 +309,7 @@ func (s *WebsocketSuite) TestBasicAuth() {
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
config, err := websocket.NewConfig("ws://127.0.0.1:8000/ws", "ws://127.0.0.1:8000")
|
||||
auth := "traefiker:secret"
|
||||
auth := "ingressuser:secret"
|
||||
config.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(auth)))
|
||||
|
||||
assert.NoError(s.T(), err)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
// Hanzo Ingress.
|
||||
//
|
||||
// Architecturally, the full reverse-proxy / TLS / provider machinery
|
||||
// lives in `cmd/traefik` and stays out-of-process at the cluster edge —
|
||||
// lives in `cmd/ingress` and stays out-of-process at the cluster edge —
|
||||
// nothing about that changes. What Mount provides is the small
|
||||
// in-process slice the unified cloud binary needs: a healthz endpoint
|
||||
// (so probes work even when the edge proxy is reloading) and a
|
||||
@@ -83,7 +83,7 @@ func Mount(app *zip.App, deps cloud.Deps) error {
|
||||
// static config. We do NOT import pkg/config/static into the cloud
|
||||
// build path — that pulls in the entire provider tree (Kubernetes,
|
||||
// Docker, AWS, Consul, …). The full config still lives in
|
||||
// cmd/traefik/cmd.go for the standalone binary.
|
||||
// cmd/ingress/ingress.go for the standalone binary.
|
||||
type runtimeConfig struct {
|
||||
Entrypoints []string
|
||||
Providers []string
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# This file is not meant as a usable Traefik configuration.
|
||||
# This file is not meant as a usable Ingress configuration.
|
||||
# It is only used in tests as a sample for serialization.
|
||||
[global]
|
||||
checkNewVersion = true
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
kschema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||
)
|
||||
|
||||
// GroupName is the group name for the hanzoai Traefik-fork CRDs
|
||||
// GroupName is the group name for the hanzoai Ingress CRDs
|
||||
// (Middleware, IngressRoute, TLSOption, ServersTransport, etc.).
|
||||
//
|
||||
// Was "ingress.k8s.io" — but every cluster installs the CRDs under
|
||||
@@ -20,7 +20,7 @@ import (
|
||||
//
|
||||
// Result: every rewrite/headers/redirect Middleware referenced by a
|
||||
// standard K8s Ingress via the
|
||||
// `traefik.ingress.kubernetes.io/router.middlewares` annotation was
|
||||
// `ingress.kubernetes.io/router.middlewares` annotation was
|
||||
// silently ignored — the route still landed at the backend but no
|
||||
// rewrite ever ran. Latent for any deployment using middleware-based
|
||||
// path rewrites.
|
||||
|
||||
Vendored
+2
-2
@@ -3,7 +3,7 @@
|
||||
"Debug": false,
|
||||
"CheckNewVersion": true,
|
||||
"AccessLogsFile": "",
|
||||
"TraefikLogsFile": "",
|
||||
"IngressLogsFile": "",
|
||||
"Level": "ERROR",
|
||||
"EntryPoints": {
|
||||
"http": {
|
||||
@@ -75,5 +75,5 @@
|
||||
"Eureka": null,
|
||||
"ECS": null,
|
||||
"DynamoDB": null,
|
||||
"ConfigFile": "/etc/traefik/traefik.toml"
|
||||
"ConfigFile": "/etc/ingress/ingress.toml"
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -3,7 +3,7 @@
|
||||
"Debug": false,
|
||||
"CheckNewVersion": true,
|
||||
"AccessLogsFile": "",
|
||||
"TraefikLogsFile": "",
|
||||
"IngressLogsFile": "",
|
||||
"Level": "ERROR",
|
||||
"EntryPoints": {
|
||||
"http": {
|
||||
@@ -75,5 +75,5 @@
|
||||
"Eureka": null,
|
||||
"ECS": null,
|
||||
"DynamoDB": null,
|
||||
"ConfigFile": "/etc/traefik/traefik.toml"
|
||||
"ConfigFile": "/etc/ingress/ingress.toml"
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
// and forwards. The gateway-relay speaks the luxfi/zap Forward protocol,
|
||||
// not zaphttp, so this needs forward.Forwarder, not zaphttp.Transport.
|
||||
//
|
||||
// TLS termination is unaffected: Traefik still terminates the client TLS at
|
||||
// TLS termination is unaffected: the ingress still terminates the client TLS at
|
||||
// the edge. This only changes what happens to the DECRYPTED request for the
|
||||
// matched AI routes — it leaves the edge as a Forward envelope to the
|
||||
// gateway-relay over ZAP.
|
||||
@@ -232,7 +232,7 @@ func (f *forwardBackendRoundTripper) RoundTrip(req *http.Request) (*http.Respons
|
||||
//
|
||||
// The caller's *http.Request is NOT mutated: a shallow copy with a cloned,
|
||||
// scrubbed Header is returned, since a RoundTripper must not modify the
|
||||
// request it is given (Traefik may reuse/retry it).
|
||||
// request it is given (the ingress may reuse/retry it).
|
||||
func stripEdgeIdentity(req *http.Request) *http.Request {
|
||||
clone := req.Clone(req.Context())
|
||||
clone.Header.Del(forward.HeaderOrgID) // X-Org-Id
|
||||
|
||||
@@ -110,7 +110,7 @@ func TestForwardBackendRoundTripper_AIRouteTunnelsOverZAP(t *testing.T) {
|
||||
t.Fatal("matched AI route fell through to next transport; must tunnel over ZAP")
|
||||
}
|
||||
|
||||
// The RoundTripper must NOT mutate the request it was given (Traefik may
|
||||
// The RoundTripper must NOT mutate the request it was given (the ingress may
|
||||
// reuse/retry it): stripEdgeIdentity clones, so the caller's request still
|
||||
// carries its original identity header here.
|
||||
if got := req.Header.Get(forward.HeaderOrgID); got != "evil-org" {
|
||||
|
||||
@@ -78,10 +78,10 @@ func parseZapBackendList(raw string) []string {
|
||||
//
|
||||
// 1. Exact host:port match against allowlist entries. Works when
|
||||
// IngressRoute backends point at a stable in-cluster address that
|
||||
// Traefik does NOT resolve before dialing.
|
||||
// the ingress does NOT resolve before dialing.
|
||||
// 2. Port-only fallback: if any allowlist entry's port matches the
|
||||
// request's port, route through ZAP-HTTP regardless of host.
|
||||
// Traefik resolves Service DNS to a Pod IP before invoking the
|
||||
// The ingress resolves Service DNS to a Pod IP before invoking the
|
||||
// transport (req.URL.Host becomes 10.x.x.x:port at this layer);
|
||||
// pinning the dial to (resolved-IP, port) lets the ZAP transport
|
||||
// reach the same pod the regular transport would have. Operators
|
||||
@@ -144,7 +144,7 @@ func (z *zapBackendRoundTripper) transportFor(addr string) *zaphttp.Transport {
|
||||
return actual.(*zaphttp.Transport)
|
||||
}
|
||||
|
||||
// backendAddr returns the upstream host:port for the request. Traefik
|
||||
// backendAddr returns the upstream host:port for the request. The ingress
|
||||
// rewrites req.URL to point at the chosen backend before invoking the
|
||||
// transport, so URL.Host is the source of truth. Falls back to req.Host
|
||||
// if URL.Host is empty (defensive; this is not expected in practice).
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2020 Containous SAS; 2020-YEAR Traefik Labs
|
||||
Copyright (c) 2016-2020 Containous SAS; 2020-2025 Traefik Labs; 2025-YEAR Hanzo AI Inc
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
+7
-7
@@ -2,8 +2,8 @@
|
||||
|
||||
set -e -o pipefail
|
||||
|
||||
PROJECT_MODULE="github.com/traefik/traefik"
|
||||
MODULE_VERSION="v3"
|
||||
PROJECT_MODULE="github.com/hanzoai/ingress"
|
||||
MODULE_VERSION=""
|
||||
KUBE_VERSION=v0.34.3
|
||||
CURRENT_DIR="$(pwd)"
|
||||
|
||||
@@ -14,7 +14,7 @@ CODEGEN_PKG="$(go env GOPATH)/pkg/mod/k8s.io/code-generator@${KUBE_VERSION}"
|
||||
# shellcheck disable=SC1091 # Cannot check source of this file
|
||||
source "${CODEGEN_PKG}/kube_codegen.sh"
|
||||
|
||||
echo "# Generating Traefik clientset and deepcopy code ..."
|
||||
echo "# Generating Ingress clientset and deepcopy code ..."
|
||||
kube::codegen::gen_helpers \
|
||||
--boilerplate "$(dirname "${BASH_SOURCE[0]}")/boilerplate.go.tmpl" \
|
||||
"${CURRENT_DIR}"
|
||||
@@ -23,18 +23,18 @@ kube::codegen::gen_client \
|
||||
--with-applyconfig \
|
||||
--with-watch \
|
||||
--output-dir "${CURRENT_DIR}/pkg/provider/kubernetes/crd/generated" \
|
||||
--output-pkg "${PROJECT_MODULE}/${MODULE_VERSION}/pkg/provider/kubernetes/crd/generated" \
|
||||
--output-pkg "${PROJECT_MODULE}${MODULE_VERSION:+/$MODULE_VERSION}/pkg/provider/kubernetes/crd/generated" \
|
||||
--boilerplate "$(dirname "${BASH_SOURCE[0]}")/boilerplate.go.tmpl" \
|
||||
"${CURRENT_DIR}/pkg/provider/kubernetes/crd"
|
||||
|
||||
echo "# Generating the CRD definitions for the documentation ..."
|
||||
controller-gen crd:crdVersions=v1 \
|
||||
paths={./pkg/provider/kubernetes/crd/traefikio/v1alpha1/...} \
|
||||
paths={./pkg/provider/kubernetes/crd/hanzoai/v1alpha1/...} \
|
||||
output:dir=./docs/content/reference/dynamic-configuration/
|
||||
|
||||
echo "# Concatenate the CRD definitions for publication and integration tests ..."
|
||||
cat "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/traefik.io_*.yaml > "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
|
||||
cp -f "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml "${CURRENT_DIR}"/integration/fixtures/k8s/01-traefik-crd.yml
|
||||
cat "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/hanzo.ai_*.yaml > "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
|
||||
cp -f "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml "${CURRENT_DIR}"/integration/fixtures/k8s/01-ingress-crd.yml
|
||||
|
||||
# Remove leading '---' from the concatenated file (files with multiple resources should not start with ---)
|
||||
sed -i '1{/^---$/d;}' "${CURRENT_DIR}"/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
|
||||
|
||||
@@ -6,7 +6,7 @@ if [ -z "$VERSION" ]; then
|
||||
fi
|
||||
|
||||
if [ -z "$CODENAME" ]; then
|
||||
CODENAME=cheddar
|
||||
CODENAME=hanzo
|
||||
fi
|
||||
|
||||
if [ -z "$DATE" ]; then
|
||||
@@ -15,7 +15,7 @@ fi
|
||||
|
||||
echo "Building ${VERSION} ${CODENAME} ${DATE}"
|
||||
|
||||
GIT_REPO_URL='github.com/traefik/traefik/pkg/version'
|
||||
GIT_REPO_URL='github.com/hanzoai/ingress/v3/pkg/version'
|
||||
GO_BUILD_CMD="go build -ldflags"
|
||||
GO_BUILD_OPT="-s -w -X ${GIT_REPO_URL}.Version=${VERSION} -X ${GIT_REPO_URL}.Codename=${CODENAME} -X ${GIT_REPO_URL}.BuildDate=${DATE}"
|
||||
|
||||
@@ -29,7 +29,7 @@ for OS in "${OS_PLATFORM_ARG[@]}"; do
|
||||
fi
|
||||
for ARCH in "${OS_ARCH_ARG[@]}"; do
|
||||
echo "Building binary for ${OS}/${ARCH}..."
|
||||
GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/traefik_${OS}-${ARCH}${BIN_EXT}" ./cmd/traefik/
|
||||
GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/hanzo-ingress_${OS}-${ARCH}${BIN_EXT}" ./cmd/ingress/
|
||||
done
|
||||
done
|
||||
|
||||
@@ -39,6 +39,6 @@ OS_ARCH_ARG=(arm64)
|
||||
for OS in "${OS_PLATFORM_ARG[@]}"; do
|
||||
for ARCH in "${OS_ARCH_ARG[@]}"; do
|
||||
echo "Building binary for ${OS}/${ARCH}..."
|
||||
GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/traefik_${OS}-${ARCH}" ./cmd/traefik/
|
||||
GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/hanzo-ingress_${OS}-${ARCH}" ./cmd/ingress/
|
||||
done
|
||||
done
|
||||
|
||||
+5
-19
@@ -8,25 +8,11 @@ else
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git config --global user.email "${TRAEFIKER_EMAIL}"
|
||||
git config --global user.name "Traefiker"
|
||||
git config --global user.email "${HANZO_DEPLOYER_EMAIL}"
|
||||
git config --global user.name "Hanzo Deployer"
|
||||
|
||||
# load ssh key
|
||||
eval "$(ssh-agent -s)"
|
||||
chmod 600 ~/.ssh/traefiker_rsa
|
||||
ssh-add ~/.ssh/traefiker_rsa
|
||||
|
||||
# update traefik-library-image repo (official Docker image)
|
||||
echo "Updating traefik-library-imag repo..."
|
||||
git clone [email protected]:traefik/traefik-library-image.git
|
||||
cd traefik-library-image
|
||||
./updatev2.sh "${VERSION}"
|
||||
git add -A
|
||||
echo "${VERSION}" | git commit --file -
|
||||
echo "${VERSION}" | git tag -a "${VERSION}" --file -
|
||||
git push -q --follow-tags -u origin master > /dev/null 2>&1
|
||||
|
||||
cd ..
|
||||
rm -Rf traefik-library-image/
|
||||
# Image publishing is handled by .github/workflows/build.yaml, which builds
|
||||
# multi-arch images and pushes them to ghcr.io/hanzoai/ingress. There is no
|
||||
# separate library-image repo to update.
|
||||
|
||||
echo "Deployed"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Owner = "traefik"
|
||||
RepositoryName = "traefik"
|
||||
Owner = "hanzoai"
|
||||
RepositoryName = "ingress"
|
||||
|
||||
OutputType = "file"
|
||||
FileName = "traefik_changelog.md"
|
||||
FileName = "ingress_changelog.md"
|
||||
|
||||
# example new bugfix v3.6.9
|
||||
CurrentRef = "v3.6"
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
Owner = "traefik"
|
||||
RepositoryName = "traefik"
|
||||
Owner = "hanzoai"
|
||||
RepositoryName = "ingress"
|
||||
|
||||
OutputType = "file"
|
||||
FileName = "traefik_changelog.md"
|
||||
FileName = "ingress_changelog.md"
|
||||
|
||||
# example final release of v3.6.0
|
||||
CurrentRef = "v3.6"
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
Owner = "traefik"
|
||||
RepositoryName = "traefik"
|
||||
Owner = "hanzoai"
|
||||
RepositoryName = "ingress"
|
||||
|
||||
OutputType = "file"
|
||||
FileName = "traefik_changelog.md"
|
||||
FileName = "ingress_changelog.md"
|
||||
|
||||
# example final release of v3.6.0
|
||||
CurrentRef = "v3.6.0-rc1"
|
||||
@@ -1,8 +1,8 @@
|
||||
Owner = "traefik"
|
||||
RepositoryName = "traefik"
|
||||
Owner = "hanzoai"
|
||||
RepositoryName = "ingress"
|
||||
|
||||
OutputType = "file"
|
||||
FileName = "traefik_changelog.md"
|
||||
FileName = "ingress_changelog.md"
|
||||
|
||||
# example RC1 of v3.6.0-rc1
|
||||
CurrentRef = "master"
|
||||
@@ -1,8 +1,8 @@
|
||||
Owner = "traefik"
|
||||
RepositoryName = "traefik"
|
||||
Owner = "hanzoai"
|
||||
RepositoryName = "ingress"
|
||||
|
||||
OutputType = "file"
|
||||
FileName = "traefik_changelog.md"
|
||||
FileName = "ingress_changelog.md"
|
||||
|
||||
# example rc2 of v3.5.0
|
||||
CurrentRef = "v3.5"
|
||||
@@ -5,27 +5,27 @@ Installation: https://github.com/ldez/gcg#how-to-install
|
||||
## Generates Changelog for a Bug Fix Release
|
||||
|
||||
```bash
|
||||
gcg --config-file=./script/gcg/traefik-bugfix.toml
|
||||
gcg --config-file=./script/gcg/ingress-bugfix.toml
|
||||
```
|
||||
|
||||
## Generates Changelog for a Final Release
|
||||
|
||||
```bash
|
||||
gcg --config-file=./script/gcg/traefik-final-release-part1.toml
|
||||
gcg --config-file=./script/gcg/ingress-final-release-part1.toml
|
||||
```
|
||||
|
||||
```bash
|
||||
gcg --config-file=./script/gcg/traefik-final-release-part2.toml
|
||||
gcg --config-file=./script/gcg/ingress-final-release-part2.toml
|
||||
```
|
||||
|
||||
## Generates Changelog for the first RC of a Version
|
||||
|
||||
```bash
|
||||
gcg --config-file=./script/gcg/traefik-rc-first.toml
|
||||
gcg --config-file=./script/gcg/ingress-rc-first.toml
|
||||
```
|
||||
|
||||
## Generates Changelog for a RC of a Version
|
||||
|
||||
```bash
|
||||
gcg --config-file=./script/gcg/traefik-rc-new.toml
|
||||
gcg --config-file=./script/gcg/ingress-rc-new.toml
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user