Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e71bfdeff2 | ||
|
|
521c41ba49 | ||
|
|
58b59fbe43 | ||
|
|
c4d69fab0f | ||
|
|
63012f0dc6 | ||
|
|
d16641661c | ||
|
|
1569faef4b | ||
|
|
0911575775 | ||
|
|
79be70b84e | ||
|
|
dd21d961f3 | ||
|
|
8d36bbebea | ||
|
|
b0e3999ef2 |
@@ -52,6 +52,17 @@ type DNSSpec struct {
|
||||
// +kubebuilder:validation:Maximum=65535
|
||||
// +kubebuilder:default=53
|
||||
Port int32 `json:"port,omitempty"`
|
||||
// Conditions on the answer, all of which must hold for one record. For
|
||||
// CNAME the record is the first target, without the trailing dot.
|
||||
Conditions []DNSCondition `json:"conditions,omitempty"`
|
||||
}
|
||||
|
||||
// DNSCondition tests a DNS record with one of Kuma's string operators.
|
||||
type DNSCondition struct {
|
||||
// +kubebuilder:validation:Enum=equals;not_equals;contains;not_contains;starts_with;not_starts_with;ends_with;not_ends_with
|
||||
Operator string `json:"operator"`
|
||||
// +kubebuilder:validation:MinLength=1
|
||||
Value string `json:"value"`
|
||||
}
|
||||
|
||||
type PortSpec struct {
|
||||
|
||||
@@ -9,9 +9,29 @@ import (
|
||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DNSCondition) DeepCopyInto(out *DNSCondition) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSCondition.
|
||||
func (in *DNSCondition) DeepCopy() *DNSCondition {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DNSCondition)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DNSSpec) DeepCopyInto(out *DNSSpec) {
|
||||
*out = *in
|
||||
if in.Conditions != nil {
|
||||
in, out := &in.Conditions, &out.Conditions
|
||||
*out = make([]DNSCondition, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSSpec.
|
||||
@@ -176,7 +196,7 @@ func (in *KumaMonitorSpec) DeepCopyInto(out *KumaMonitorSpec) {
|
||||
if in.DNS != nil {
|
||||
in, out := &in.DNS, &out.DNS
|
||||
*out = new(DNSSpec)
|
||||
**out = **in
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Port != nil {
|
||||
in, out := &in.Port, &out.Port
|
||||
|
||||
@@ -51,6 +51,33 @@ spec:
|
||||
type: string
|
||||
dns:
|
||||
properties:
|
||||
conditions:
|
||||
description: |-
|
||||
Conditions on the answer, all of which must hold for one record. For
|
||||
CNAME the record is the first target, without the trailing dot.
|
||||
items:
|
||||
description: DNSCondition tests a DNS record with one of Kuma's
|
||||
string operators.
|
||||
properties:
|
||||
operator:
|
||||
enum:
|
||||
- equals
|
||||
- not_equals
|
||||
- contains
|
||||
- not_contains
|
||||
- starts_with
|
||||
- not_starts_with
|
||||
- ends_with
|
||||
- not_ends_with
|
||||
type: string
|
||||
value:
|
||||
minLength: 1
|
||||
type: string
|
||||
required:
|
||||
- operator
|
||||
- value
|
||||
type: object
|
||||
type: array
|
||||
hostname:
|
||||
minLength: 1
|
||||
type: string
|
||||
|
||||
@@ -11,6 +11,9 @@ import (
|
||||
// defaultMaxRedirects is Kuma's default for a monitor with no explicit value.
|
||||
const defaultMaxRedirects = 10
|
||||
|
||||
// dnsConditionVariable is the only condition variable of Kuma's dns type.
|
||||
const dnsConditionVariable = "record"
|
||||
|
||||
// OwnerKey is the value of the kuma-sync tag for a resource.
|
||||
func OwnerKey(km *v1.KumaMonitor) string {
|
||||
return km.Namespace + "/" + km.Name
|
||||
@@ -60,6 +63,11 @@ func Desired(km *v1.KumaMonitor) kumaclient.Monitor {
|
||||
m.DNSResolveType = d.ResolveType
|
||||
m.DNSResolveServer = d.ResolveServer
|
||||
m.Port = d.Port
|
||||
for _, c := range d.Conditions {
|
||||
m.DNSConditions = append(m.DNSConditions, kumaclient.Condition{
|
||||
Variable: dnsConditionVariable, Operator: c.Operator, Value: c.Value, AndOr: "and",
|
||||
})
|
||||
}
|
||||
}
|
||||
if p := s.Port; p != nil {
|
||||
m.Hostname = p.Hostname
|
||||
|
||||
@@ -50,6 +50,9 @@ func TestMappingAllTypes(t *testing.T) {
|
||||
jq.JSONQuery = &v1.JSONQuerySpec{Expression: "a.b", Operator: "contains", Expected: "z"}
|
||||
dns := base("dns")
|
||||
dns.DNS = &v1.DNSSpec{Hostname: "h.com", ResolveType: "AAAA", ResolveServer: "9.9.9.9", Port: 5353}
|
||||
dnsCond := base("dns")
|
||||
dnsCond.DNS = &v1.DNSSpec{Hostname: "c.com", ResolveType: "CNAME", ResolveServer: "9.9.9.9", Port: 53,
|
||||
Conditions: []v1.DNSCondition{{Operator: "equals", Value: "t.com"}, {Operator: "not_contains", Value: "x"}}}
|
||||
port := base("port")
|
||||
port.Port = &v1.PortSpec{Hostname: "p.com", Port: 443}
|
||||
paused := base("group")
|
||||
@@ -61,6 +64,12 @@ func TestMappingAllTypes(t *testing.T) {
|
||||
wantJQ.JSONPath, wantJQ.JSONPathOperator, wantJQ.ExpectedValue = "a.b", "contains", "z"
|
||||
wantDNS := common("dns")
|
||||
wantDNS.Hostname, wantDNS.DNSResolveType, wantDNS.DNSResolveServer, wantDNS.Port = "h.com", "AAAA", "9.9.9.9", 5353
|
||||
wantDNSCond := common("dns")
|
||||
wantDNSCond.Hostname, wantDNSCond.DNSResolveType, wantDNSCond.DNSResolveServer, wantDNSCond.Port = "c.com", "CNAME", "9.9.9.9", 53
|
||||
wantDNSCond.DNSConditions = []kumaclient.Condition{
|
||||
{Variable: "record", Operator: "equals", Value: "t.com", AndOr: "and"},
|
||||
{Variable: "record", Operator: "not_contains", Value: "x", AndOr: "and"},
|
||||
}
|
||||
wantPort := common("port")
|
||||
wantPort.Hostname, wantPort.Port = "p.com", 443
|
||||
wantPaused := common("group")
|
||||
@@ -76,6 +85,7 @@ func TestMappingAllTypes(t *testing.T) {
|
||||
{"keyword", kw, wantKW},
|
||||
{"json-query", jq, wantJQ},
|
||||
{"dns", dns, wantDNS},
|
||||
{"dns with conditions", dnsCond, wantDNSCond},
|
||||
{"port", port, wantPort},
|
||||
{"paused maps to inactive", paused, wantPaused},
|
||||
}
|
||||
|
||||
@@ -484,6 +484,11 @@ func toDomain(base monitor.Base, ownerKey string) (Monitor, error) {
|
||||
m.Port = int32(v.Port)
|
||||
m.DNSResolveType = string(v.ResolveType)
|
||||
m.DNSResolveServer = v.ResolverServer
|
||||
for _, c := range v.Conditions {
|
||||
m.DNSConditions = append(m.DNSConditions, Condition{
|
||||
Variable: c.Variable, Operator: c.Operator, Value: c.Value, AndOr: string(c.AndOr),
|
||||
})
|
||||
}
|
||||
case "port":
|
||||
var v monitor.TCPPort
|
||||
if err := base.As(&v); err != nil {
|
||||
@@ -566,6 +571,12 @@ func toWire(m Monitor, existing *monitor.Base) (monitor.Monitor, error) {
|
||||
v.Port = int(m.Port)
|
||||
v.ResolveType = monitor.DNSResolveType(m.DNSResolveType)
|
||||
v.ResolverServer = m.DNSResolveServer
|
||||
v.Conditions = nil
|
||||
for _, c := range m.DNSConditions {
|
||||
v.Conditions = append(v.Conditions, monitor.Condition{
|
||||
Variable: c.Variable, Operator: c.Operator, Value: c.Value, AndOr: monitor.ConditionOperator(c.AndOr),
|
||||
})
|
||||
}
|
||||
return v, nil
|
||||
case "port":
|
||||
v := &monitor.TCPPort{}
|
||||
|
||||
@@ -160,6 +160,7 @@ func TestCreateFieldsIntact(t *testing.T) {
|
||||
Type: "dns", Name: "dns", Description: "dns d", Active: true,
|
||||
Interval: 90, RetryInterval: 45, MaxRetries: 1, Parent: &gid, OwnerKey: "default/dns",
|
||||
Hostname: "example.com", DNSResolveType: "AAAA", DNSResolveServer: "1.1.1.1", Port: 53,
|
||||
DNSConditions: []Condition{{Variable: "record", Operator: "contains", Value: ":", AndOr: "and"}},
|
||||
}
|
||||
port := Monitor{
|
||||
Type: "port", Name: "port", Active: false,
|
||||
|
||||
@@ -64,6 +64,7 @@ func (m Monitor) clone() Monitor {
|
||||
m.Headers = maps.Clone(m.Headers)
|
||||
m.AcceptedStatusCodes = slices.Clone(m.AcceptedStatusCodes)
|
||||
m.NotificationIDs = slices.Clone(m.NotificationIDs)
|
||||
m.DNSConditions = slices.Clone(m.DNSConditions)
|
||||
if m.Parent != nil {
|
||||
p := *m.Parent
|
||||
m.Parent = &p
|
||||
@@ -96,6 +97,9 @@ func (m Monitor) Normalized() Monitor {
|
||||
if len(m.AcceptedStatusCodes) == 0 {
|
||||
m.AcceptedStatusCodes = nil
|
||||
}
|
||||
if len(m.DNSConditions) == 0 {
|
||||
m.DNSConditions = nil
|
||||
}
|
||||
if !isHTTPFamily(m.Type) {
|
||||
m.Timeout = 0
|
||||
return m
|
||||
@@ -112,6 +116,15 @@ func (m Monitor) Normalized() Monitor {
|
||||
return m
|
||||
}
|
||||
|
||||
// Condition is one flat Kuma monitor condition.
|
||||
type Condition struct {
|
||||
Variable string
|
||||
Operator string
|
||||
Value string
|
||||
// AndOr joins the condition to the previous one: "and" or "or".
|
||||
AndOr string
|
||||
}
|
||||
|
||||
// Monitor is the domain view of a Kuma monitor.
|
||||
type Monitor struct {
|
||||
ID int64
|
||||
@@ -149,6 +162,7 @@ type Monitor struct {
|
||||
Port int32
|
||||
DNSResolveType string
|
||||
DNSResolveServer string
|
||||
DNSConditions []Condition
|
||||
|
||||
// NotificationIDs are the Kuma notifications attached to the monitor.
|
||||
NotificationIDs []int64
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package kumaclient
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/breml/go-uptime-kuma-client/monitor"
|
||||
)
|
||||
|
||||
// The wire form must carry DNS conditions to Kuma and read them back unchanged.
|
||||
func TestDNSConditionsRoundTrip(t *testing.T) {
|
||||
m := Monitor{
|
||||
ID: 7, Type: "dns", Name: "d", Active: true, Interval: 60, RetryInterval: 60,
|
||||
Hostname: "a.example", DNSResolveType: "CNAME", DNSResolveServer: "1.1.1.1", Port: 53,
|
||||
DNSConditions: []Condition{{Variable: "record", Operator: "equals", Value: "t.example", AndOr: "and"}},
|
||||
OwnerKey: "ns/d",
|
||||
}
|
||||
w, err := toWire(m, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
raw, err := json.Marshal(w)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var wire struct {
|
||||
Conditions []map[string]string `json:"conditions"`
|
||||
}
|
||||
if err := json.Unmarshal(raw, &wire); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
wantWire := []map[string]string{{"type": "expression", "variable": "record", "operator": "equals", "value": "t.example", "andOr": "and"}}
|
||||
if !reflect.DeepEqual(wire.Conditions, wantWire) {
|
||||
t.Fatalf("wire conditions: got %v want %v", wire.Conditions, wantWire)
|
||||
}
|
||||
var base monitor.Base
|
||||
if err := json.Unmarshal(raw, &base); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got, err := toDomain(base, "ns/d")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(got.DNSConditions, m.DNSConditions) {
|
||||
t.Fatalf("read back: got %+v want %+v", got.DNSConditions, m.DNSConditions)
|
||||
}
|
||||
}
|
||||
|
||||
// Removing every condition must clear them in Kuma, not keep the stored ones.
|
||||
func TestDNSConditionsClearedOnUpdate(t *testing.T) {
|
||||
stored := []byte(`{"id":7,"type":"dns","name":"d","hostname":"a.example","dns_resolve_type":"CNAME",` +
|
||||
`"dns_resolve_server":"1.1.1.1","port":53,"conditions":[{"type":"expression","variable":"record","operator":"equals","value":"x","andOr":"and"}]}`)
|
||||
var existing monitor.Base
|
||||
if err := json.Unmarshal(stored, &existing); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
m := Monitor{ID: 7, Type: "dns", Name: "d", Hostname: "a.example", DNSResolveType: "CNAME", DNSResolveServer: "1.1.1.1", Port: 53}
|
||||
w, err := toWire(m, &existing)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
raw, _ := json.Marshal(w)
|
||||
var wire struct {
|
||||
Conditions []any `json:"conditions"`
|
||||
}
|
||||
_ = json.Unmarshal(raw, &wire)
|
||||
if wire.Conditions == nil || len(wire.Conditions) != 0 {
|
||||
t.Fatalf("conditions not cleared: %s", raw)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizedDNSConditions(t *testing.T) {
|
||||
m := Monitor{Type: "dns", DNSConditions: []Condition{}}.Normalized()
|
||||
if m.DNSConditions != nil {
|
||||
t.Errorf("empty conditions must normalize to nil")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks
|
||||
namespace: audiobookshelf
|
||||
spec:
|
||||
type: group
|
||||
displayName: Audiobooks
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-dns
|
||||
namespace: audiobookshelf
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Audiobookshelf DNS
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: audiobooks.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-http
|
||||
namespace: audiobookshelf
|
||||
spec:
|
||||
type: http
|
||||
displayName: Audiobookshelf HTTP
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://audiobooks.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-health
|
||||
namespace: audiobookshelf
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Audiobookshelf Health
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://audiobooks.renner.uno/healthcheck
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: OK
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-status
|
||||
namespace: audiobookshelf
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Audiobookshelf Server
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# initialized-server flag from the unauthenticated status endpoint
|
||||
url: https://audiobooks.renner.uno/status
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: isInit
|
||||
operator: "=="
|
||||
expected: "true"
|
||||
@@ -4,3 +4,4 @@ resources:
|
||||
- pvcs.yaml
|
||||
- deployment.yaml
|
||||
- ingress.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth
|
||||
namespace: authentik
|
||||
spec:
|
||||
type: group
|
||||
displayName: Authentik
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-dns
|
||||
namespace: authentik
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Authentik DNS
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: auth.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-http
|
||||
namespace: authentik
|
||||
spec:
|
||||
type: http
|
||||
displayName: Authentik HTTP
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://auth.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-live
|
||||
namespace: authentik
|
||||
spec:
|
||||
type: http
|
||||
displayName: Authentik Live
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated health endpoint, empty body
|
||||
url: https://auth.renner.uno/-/health/live/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-ready
|
||||
namespace: authentik
|
||||
spec:
|
||||
type: http
|
||||
displayName: Authentik Ready
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated readiness endpoint (database and cache), empty body
|
||||
url: https://auth.renner.uno/-/health/ready/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
@@ -17,3 +17,4 @@ resources:
|
||||
- cluster.yaml
|
||||
- scheduled-backup.yaml
|
||||
- hetzner-creds-externalsecret.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: status
|
||||
namespace: apps
|
||||
spec:
|
||||
type: group
|
||||
displayName: Status Page
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: status-dns
|
||||
namespace: apps
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Gatus DNS
|
||||
parentRef:
|
||||
name: status
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: status.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: status-http
|
||||
namespace: apps
|
||||
spec:
|
||||
type: http
|
||||
displayName: Gatus HTTP
|
||||
parentRef:
|
||||
name: status
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://status.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: status-health
|
||||
namespace: apps
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Gatus Health
|
||||
parentRef:
|
||||
name: status
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://status.renner.uno/health
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "UP"
|
||||
@@ -6,3 +6,4 @@ resources:
|
||||
- service.yaml
|
||||
- ingress.yaml
|
||||
- pvc.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-mcp
|
||||
namespace: gitea-mcp
|
||||
spec:
|
||||
type: group
|
||||
displayName: Gitea MCP
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-mcp-dns
|
||||
namespace: gitea-mcp
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Gitea MCP DNS
|
||||
parentRef:
|
||||
name: gitea-mcp
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: gitea-mcp.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-mcp-http
|
||||
namespace: gitea-mcp
|
||||
spec:
|
||||
type: http
|
||||
displayName: Gitea MCP HTTP
|
||||
parentRef:
|
||||
name: gitea-mcp
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://gitea-mcp.renner.uno/healthz
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-mcp-auth
|
||||
namespace: gitea-mcp
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Gitea MCP Endpoint
|
||||
parentRef:
|
||||
name: gitea-mcp
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# MCP endpoint answers and refuses unauthenticated calls
|
||||
url: https://gitea-mcp.renner.uno/mcp
|
||||
acceptedStatusCodes: ["401"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: authorization required
|
||||
@@ -4,3 +4,4 @@ resources:
|
||||
- deployment.yaml
|
||||
- service.yaml
|
||||
- ingress.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: group
|
||||
displayName: Gitea
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: git-dns
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: dns
|
||||
displayName: git.renner.uno DNS
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: git.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: git-http
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: http
|
||||
displayName: git.renner.uno HTTP
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://git.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: git-health
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: git.renner.uno Health
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated health endpoint (database and cache)
|
||||
url: https://git.renner.uno/api/healthz
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "pass"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-dns
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: dns
|
||||
displayName: gitea.renner.uno DNS
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: gitea.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-http
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: http
|
||||
displayName: gitea.renner.uno HTTP
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://gitea.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: gitea-health
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: gitea.renner.uno Health
|
||||
parentRef:
|
||||
name: gitea
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated health endpoint (database and cache)
|
||||
url: https://gitea.renner.uno/api/healthz
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "pass"
|
||||
@@ -16,6 +16,7 @@ resources:
|
||||
- networkpolicy.yaml
|
||||
# Nightly prune of old CI image builds (REN-1203).
|
||||
- package-retention.yaml
|
||||
- kumamonitors.yaml
|
||||
configMapGenerator:
|
||||
- name: gitea-package-retention
|
||||
namespace: gitea
|
||||
|
||||
@@ -171,6 +171,19 @@ spec:
|
||||
value: "true"
|
||||
- name: API_SERVER_HOST
|
||||
value: 0.0.0.0
|
||||
# Matrix: bot @hermes (MAS account, compatibility token on device
|
||||
# HERMESBOT in hermes-matrix); E2EE store under /opt/data/platforms/matrix.
|
||||
- name: MATRIX_HOMESERVER
|
||||
value: https://matrix.renner.uno
|
||||
- name: MATRIX_USER_ID
|
||||
value: "@hermes:matrix.renner.uno"
|
||||
- name: MATRIX_ALLOWED_USERS
|
||||
value: "@k.renner:matrix.renner.uno"
|
||||
- name: MATRIX_E2EE_MODE
|
||||
value: required
|
||||
# One-time cross-signing bootstrap writes the generated recovery key here (0600).
|
||||
- name: MATRIX_RECOVERY_KEY_OUTPUT_FILE
|
||||
value: /opt/data/platforms/matrix/recovery-key.txt
|
||||
# bao: log in with the pod's ServiceAccount token, role hermes
|
||||
# (kubernetes/infrastructure/openbao/policies/hermes.hcl).
|
||||
- name: BAO_ADDR
|
||||
@@ -197,6 +210,8 @@ spec:
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: hermes-api-key
|
||||
- secretRef:
|
||||
name: hermes-matrix
|
||||
ports:
|
||||
- name: dashboard
|
||||
containerPort: 9119
|
||||
|
||||
@@ -5,6 +5,7 @@ resources:
|
||||
- api-key.yaml
|
||||
- wiki-externalsecret.yaml
|
||||
- gitea-externalsecret.yaml
|
||||
- matrix-externalsecret.yaml
|
||||
- talos-serviceaccount.yaml
|
||||
- hermes.yaml
|
||||
- ingress.yaml
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Access token of @hermes:matrix.renner.uno (MAS compatibility token, device HERMESBOT).
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: hermes-matrix
|
||||
namespace: hermes
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
kind: ClusterSecretStore
|
||||
name: openbao
|
||||
target:
|
||||
name: hermes-matrix
|
||||
data:
|
||||
- secretKey: MATRIX_ACCESS_TOKEN
|
||||
remoteRef:
|
||||
key: apps/hermes/matrix
|
||||
property: access_token
|
||||
@@ -93,6 +93,39 @@ spec:
|
||||
memory: 16Mi
|
||||
limits:
|
||||
memory: 32Mi
|
||||
# `matrix_nabu_password` for the Matrix integration's bot @nabu
|
||||
# (homeassistant repo packages/matrix_assist.yaml), same filter-then-append
|
||||
# render as recorder_db_url above. Value is hex, nothing to escape.
|
||||
- name: render-matrix-password
|
||||
image: busybox:1.38@sha256:fd7dc98638c8e305f4dc34e979f1c0fdfdcaeb0fbf8fcff77ae834b6da3d7e6e
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
set -eu
|
||||
S=/config/secrets.yaml
|
||||
T=/config/.secrets.render.tmp
|
||||
[ -f "$S" ] || : > "$S"
|
||||
grep -v '^matrix_nabu_password:' "$S" > "$T" || true
|
||||
printf 'matrix_nabu_password: "%s"\n' "$NABU_PASSWORD" >> "$T"
|
||||
[ "$(wc -l < "$T")" -ge "$(wc -l < "$S")" ] || {
|
||||
echo "FATAL: rewrite would shrink secrets.yaml; aborting" >&2; exit 1; }
|
||||
chmod 600 "$T"
|
||||
mv "$T" "$S"
|
||||
echo "matrix_nabu_password rendered"
|
||||
env:
|
||||
- name: NABU_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef: {name: ha-matrix, key: nabu_password}
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /config
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 16Mi
|
||||
limits:
|
||||
memory: 32Mi
|
||||
containers:
|
||||
- name: home-assistant
|
||||
image: ghcr.io/home-assistant/home-assistant:2026.10.2 # {"$imagepolicy": "flux-system:home-assistant"}
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
type: group
|
||||
displayName: Home Assistant
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-dns
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Home Assistant DNS
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: home.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-http
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
type: http
|
||||
displayName: Home Assistant HTTP
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://home.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-api
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Home Assistant API
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# unauthenticated login-provider list, served by the HA core backend
|
||||
url: https://home.renner.uno/auth/providers
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: "providers[type=\"homeassistant\"].name"
|
||||
operator: "=="
|
||||
expected: "Home Assistant Local"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-web
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Home Assistant Web
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://home.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>Home Assistant</title>"
|
||||
@@ -11,6 +11,7 @@ resources:
|
||||
- prometheus-token-externalsecret.yaml
|
||||
- config-sync-token-externalsecret.yaml
|
||||
- config-sync-gitea-externalsecret.yaml
|
||||
- matrix-externalsecret.yaml
|
||||
- mosquitto-bootstrap.yaml
|
||||
# Former `health` probe credential. The broker no longer reads it (the
|
||||
# probes use the cert account mosquitto-probe, REN-953); removed with its
|
||||
@@ -53,6 +54,7 @@ resources:
|
||||
- mqtt-account-controller.yaml
|
||||
# Also mounted by shelly-manager (../home-assistant-iot), which runs after this.
|
||||
- shelly-manager-auth-externalsecret.yaml
|
||||
- kumamonitors.yaml
|
||||
configMapGenerator:
|
||||
# nginx config for the reverse-proxy sidecar. Hash suffix disabled so
|
||||
# the cm name stays stable; editing proxy.conf does not auto-roll the
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# Password of @nabu:matrix.renner.uno (MAS account), rendered into
|
||||
# /config/secrets.yaml by the render-matrix-password init container.
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: ha-matrix
|
||||
namespace: home-assistant
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
kind: ClusterSecretStore
|
||||
name: openbao
|
||||
target:
|
||||
name: ha-matrix
|
||||
data:
|
||||
- secretKey: nabu_password
|
||||
remoteRef:
|
||||
key: apps/home-assistant/matrix
|
||||
property: nabu_password
|
||||
@@ -0,0 +1,74 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich
|
||||
namespace: immich
|
||||
spec:
|
||||
type: group
|
||||
displayName: Immich
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich-dns
|
||||
namespace: immich
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Immich DNS
|
||||
parentRef:
|
||||
name: immich
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: immich.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich-http
|
||||
namespace: immich
|
||||
spec:
|
||||
type: http
|
||||
displayName: Immich HTTP
|
||||
parentRef:
|
||||
name: immich
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://immich.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich-api
|
||||
namespace: immich
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Immich API
|
||||
parentRef:
|
||||
name: immich
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://immich.renner.uno/api/server/ping
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: res
|
||||
operator: "=="
|
||||
expected: "pong"
|
||||
@@ -14,3 +14,4 @@ resources:
|
||||
- scheduled-backup.yaml
|
||||
- hetzner-creds-externalsecret.yaml
|
||||
- pvcs.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- crd-kumamonitors.yaml
|
||||
- externalsecret.yaml
|
||||
- rbac.yaml
|
||||
- deployment.yaml
|
||||
- monitors
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Audiobooks
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-health
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Audiobookshelf Health
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://audiobooks.renner.uno/healthcheck
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: OK
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: audiobooks-status
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Audiobookshelf Server
|
||||
parentRef:
|
||||
name: audiobooks
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# initialized-server flag from the unauthenticated status endpoint
|
||||
url: https://audiobooks.renner.uno/status
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: isInit
|
||||
operator: ==
|
||||
expected: "true"
|
||||
@@ -1,48 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Authentik
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-live
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: Authentik Live
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated health endpoint, empty body
|
||||
url: https://auth.renner.uno/-/health/live/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: auth-ready
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: Authentik Ready
|
||||
parentRef:
|
||||
name: auth
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated readiness endpoint (database and cache), empty body
|
||||
url: https://auth.renner.uno/-/health/ready/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
@@ -1,30 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Documents
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs-gate
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Documents Login
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 20
|
||||
http:
|
||||
# Paperless is fully behind the Authentik gate; asserts the login page the redirect chain ends on
|
||||
url: https://docs.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: <title>authentik</title>
|
||||
@@ -1,53 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Home Assistant
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-api
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Home Assistant API
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# unauthenticated login-provider list, served by the HA core backend
|
||||
url: https://home.renner.uno/auth/providers
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: providers[type="homeassistant"].name
|
||||
operator: ==
|
||||
expected: Home Assistant Local
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: home-web
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Home Assistant Web
|
||||
parentRef:
|
||||
name: home
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://home.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: <title>Home Assistant</title>
|
||||
@@ -1,31 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Immich
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: immich-api
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Immich API
|
||||
parentRef:
|
||||
name: immich
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://immich.renner.uno/api/server/ping
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: res
|
||||
operator: ==
|
||||
expected: pong
|
||||
@@ -1,10 +0,0 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- renner-uno.yaml
|
||||
- home.yaml
|
||||
- immich.yaml
|
||||
- auth.yaml
|
||||
- docs.yaml
|
||||
- audiobooks.yaml
|
||||
- third-party.yaml
|
||||
@@ -1,51 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Renner.uno Website
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-www
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: www.renner.uno
|
||||
parentRef:
|
||||
name: renner-uno
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://www.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: Familie Renner
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-apex
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: renner.uno
|
||||
parentRef:
|
||||
name: renner-uno
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# 301 to www, followed
|
||||
url: https://renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: Familie Renner
|
||||
@@ -1,87 +0,0 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: third-party
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: group
|
||||
displayName: Third-party
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-portal
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Portal
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
# root 302s to / to set a session cookie; Kuma keeps no cookies, so do not follow
|
||||
url: https://portal.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299", "302"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-tech
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Technician Portal
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
url: https://tech.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-www
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Website
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
# 301 to /index.html, followed
|
||||
url: https://www.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: turm1388
|
||||
namespace: kuma-sync
|
||||
spec:
|
||||
type: http
|
||||
displayName: Wohnen im Turm
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
url: https://turm1388.de/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
@@ -0,0 +1,73 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: llm
|
||||
namespace: ai
|
||||
spec:
|
||||
type: group
|
||||
displayName: LLM
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: llm-dns
|
||||
namespace: ai
|
||||
spec:
|
||||
type: dns
|
||||
displayName: LLM DNS
|
||||
parentRef:
|
||||
name: llm
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: llm.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: llm-http
|
||||
namespace: ai
|
||||
spec:
|
||||
type: http
|
||||
displayName: LLM HTTP
|
||||
parentRef:
|
||||
name: llm
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://llm.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: llm-gate
|
||||
namespace: ai
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: LLM Login
|
||||
parentRef:
|
||||
name: llm
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 20
|
||||
http:
|
||||
# fully behind the Authentik gate; asserts the login page the redirect chain ends on
|
||||
url: https://llm.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>authentik</title>"
|
||||
@@ -7,3 +7,4 @@ resources:
|
||||
- ingress.yaml
|
||||
- wiki-embed.yaml
|
||||
- wiki-embed-ingress.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -100,6 +100,21 @@ spec:
|
||||
name: synapse
|
||||
port:
|
||||
number: 8008
|
||||
# lk-jwt-service resolves the server via this file and verifies OpenID tokens at the path below.
|
||||
- path: /.well-known/matrix/server
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: synapse
|
||||
port:
|
||||
number: 8008
|
||||
- path: /_matrix/federation/v1/openid/userinfo
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: synapse
|
||||
port:
|
||||
number: 8008
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
|
||||
@@ -0,0 +1,361 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: group
|
||||
displayName: Matrix
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix-dns
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Synapse DNS
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: matrix.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix-http
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: http
|
||||
displayName: Synapse HTTP
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://matrix.renner.uno/_matrix/client/versions
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix-versions
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Synapse Client API
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://matrix.renner.uno/_matrix/client/versions
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: $count(versions)
|
||||
operator: ">"
|
||||
expected: "0"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix-well-known
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Matrix Client Discovery
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://matrix.renner.uno/.well-known/matrix/client
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: "`m.homeserver`.base_url"
|
||||
operator: "=="
|
||||
expected: "https://matrix.renner.uno/"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: matrix-login
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Matrix Login (MAS)
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# login path routed to MAS; asserts SSO is offered
|
||||
url: https://matrix.renner.uno/_matrix/client/v3/login
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: "\"m.login.sso\" in flows.type"
|
||||
operator: "=="
|
||||
expected: "true"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mas-dns
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: dns
|
||||
displayName: MAS DNS
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: account.matrix.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mas-http
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: http
|
||||
displayName: MAS HTTP
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://account.matrix.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mas-discovery
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: MAS OIDC Discovery
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://account.matrix.renner.uno/.well-known/openid-configuration
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: issuer
|
||||
operator: "=="
|
||||
expected: "https://account.matrix.renner.uno/"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: element-dns
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Element DNS
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: element.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: element-http
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: http
|
||||
displayName: Element HTTP
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://element.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: element-web
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Element Web
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://element.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>Element</title>"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: element-config
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Element Config
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://element.renner.uno/config.json
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: "default_server_config.`m.homeserver`.base_url"
|
||||
operator: "=="
|
||||
expected: "https://matrix.renner.uno"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: rtc-dns
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: dns
|
||||
displayName: MatrixRTC DNS
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: rtc.matrix.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: rtc-sfu
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: LiveKit SFU
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# LiveKit's health answer on its signalling port
|
||||
url: https://rtc.matrix.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "OK"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: rtc-jwt
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: http
|
||||
displayName: MatrixRTC Authorization Service
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx (an unauthenticated GET is rejected with 4xx)
|
||||
url: https://rtc.matrix.renner.uno/livekit/jwt/sfu/get
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: turn-dns
|
||||
namespace: matrix
|
||||
spec:
|
||||
type: dns
|
||||
displayName: TURN DNS
|
||||
parentRef:
|
||||
name: matrix
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: turn.matrix.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
@@ -5,9 +5,11 @@ resources:
|
||||
- synapse.yaml
|
||||
- mas.yaml
|
||||
- element.yaml
|
||||
- rtc.yaml
|
||||
- ingress.yaml
|
||||
# mx-pg CNPG Postgres + offsite Barman backup. The media store and signing
|
||||
# key are on synapse-data, backed up by Velero (matrix-daily).
|
||||
- cluster.yaml
|
||||
- scheduled-backup.yaml
|
||||
- hetzner-creds-externalsecret.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,387 @@
|
||||
# MatrixRTC backend for Element Call: LiveKit SFU + lk-jwt-service.
|
||||
# Generated once in-cluster; Synapse, LiveKit and lk-jwt-service read the same Secret.
|
||||
apiVersion: generators.external-secrets.io/v1alpha1
|
||||
kind: Password
|
||||
metadata:
|
||||
name: matrix-rtc
|
||||
namespace: matrix
|
||||
spec:
|
||||
length: 64
|
||||
digits: 16
|
||||
symbols: 0
|
||||
allowRepeat: true
|
||||
noUpper: false
|
||||
secretKeys:
|
||||
- livekit_secret
|
||||
- as_token
|
||||
- hs_token
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: matrix-rtc
|
||||
namespace: matrix
|
||||
spec:
|
||||
refreshPolicy: CreatedOnce
|
||||
target:
|
||||
name: matrix-rtc
|
||||
template:
|
||||
engineVersion: v2
|
||||
data:
|
||||
livekit_secret: "{{ .livekit_secret }}"
|
||||
# LIVEKIT_KEYS format "<key>: <secret>"; the key name is the fixed id matrix-rtc.
|
||||
livekit_keys: "matrix-rtc: {{ .livekit_secret }}"
|
||||
# Appservice registration: membership look-ups and the /rtc/livekit proxy only, no event traffic.
|
||||
registration.yaml: |
|
||||
id: lk-jwt-service
|
||||
url: null
|
||||
as_token: "{{ .as_token }}"
|
||||
hs_token: "{{ .hs_token }}"
|
||||
sender_localpart: _lk_jwt_service
|
||||
rate_limited: false
|
||||
namespaces:
|
||||
users:
|
||||
- exclusive: false
|
||||
regex: ".*"
|
||||
aliases: []
|
||||
rooms: []
|
||||
io.element.msc4502.scopes: ["urn:matrix:client:io.element.msc4502:rooms:is_joined"]
|
||||
io.element.msc4512.proxy_prefix: "rtc/livekit"
|
||||
io.element.msc4512.proxy_url: "http://lk-jwt-service:8080"
|
||||
dataFrom:
|
||||
- sourceRef:
|
||||
generatorRef:
|
||||
apiVersion: generators.external-secrets.io/v1alpha1
|
||||
kind: Password
|
||||
name: matrix-rtc
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: livekit-config
|
||||
namespace: matrix
|
||||
data:
|
||||
livekit.yaml: |
|
||||
port: 7880
|
||||
rtc:
|
||||
# Host candidates are the pod IPs (dual-stack, BGP-routed to the LAN).
|
||||
use_external_ip: false
|
||||
tcp_port: 7881
|
||||
udp_port: 7882
|
||||
turn:
|
||||
# TURN/TLS on turn.matrix.renner.uno:443; Traefik terminates TLS (IngressRouteTCP livekit-turn).
|
||||
enabled: true
|
||||
domain: turn.matrix.renner.uno
|
||||
tls_port: 443
|
||||
external_tls: true
|
||||
# The relay targets the SFU's own pod IP; LiveKit limits embedded-TURN relays to its own media ports.
|
||||
allow_restricted_peer_cidrs:
|
||||
- 10.0.0.0/8
|
||||
- fc00::/7
|
||||
room:
|
||||
# lk-jwt-service creates rooms for matrix.renner.uno users only.
|
||||
auto_create: false
|
||||
webhook:
|
||||
api_key: matrix-rtc
|
||||
urls:
|
||||
- http://lk-jwt-service:8080/sfu_webhook
|
||||
logging:
|
||||
level: info
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: livekit
|
||||
namespace: matrix
|
||||
annotations:
|
||||
configmap.reloader.stakater.com/reload: livekit-config
|
||||
secret.reloader.stakater.com/reload: matrix-rtc
|
||||
labels:
|
||||
app.kubernetes.io/name: livekit
|
||||
app.kubernetes.io/part-of: matrix
|
||||
spec:
|
||||
replicas: 1
|
||||
# One SFU: two pods would split a call's participants.
|
||||
strategy:
|
||||
type: Recreate
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: livekit
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: livekit
|
||||
app.kubernetes.io/part-of: matrix
|
||||
spec:
|
||||
automountServiceAccountToken: false
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65534
|
||||
runAsGroup: 65534
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: livekit
|
||||
image: livekit/livekit-server:v1.13.10@sha256:89ca9ce0791e18d6e03bf6e2c49ceb27e1c754eae8bd50c989386c1a5963791a
|
||||
args:
|
||||
- --config
|
||||
- /config/livekit.yaml
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
capabilities:
|
||||
drop: ["ALL"]
|
||||
env:
|
||||
- name: LIVEKIT_KEYS
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: matrix-rtc
|
||||
key: livekit_keys
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 7880
|
||||
- name: ice-tcp
|
||||
containerPort: 7881
|
||||
- name: ice-udp
|
||||
containerPort: 7882
|
||||
protocol: UDP
|
||||
- name: turn
|
||||
containerPort: 443
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 128Mi
|
||||
limits:
|
||||
memory: 1Gi
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
periodSeconds: 10
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
periodSeconds: 30
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 4
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /config
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: config
|
||||
configMap:
|
||||
name: livekit-config
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: livekit
|
||||
namespace: matrix
|
||||
spec:
|
||||
selector:
|
||||
app.kubernetes.io/name: livekit
|
||||
ports:
|
||||
- name: http
|
||||
port: 7880
|
||||
targetPort: http
|
||||
- name: turn
|
||||
port: 443
|
||||
targetPort: turn
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: lk-jwt-service
|
||||
namespace: matrix
|
||||
annotations:
|
||||
secret.reloader.stakater.com/reload: matrix-rtc
|
||||
labels:
|
||||
app.kubernetes.io/name: lk-jwt-service
|
||||
app.kubernetes.io/part-of: matrix
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: lk-jwt-service
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: lk-jwt-service
|
||||
app.kubernetes.io/part-of: matrix
|
||||
spec:
|
||||
automountServiceAccountToken: false
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65534
|
||||
runAsGroup: 65534
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: lk-jwt-service
|
||||
image: ghcr.io/element-hq/lk-jwt-service:0.9.0@sha256:d210fd778ba38b7e42e6fc64e8a24a7d66ccc3b938fb20d73bd713224af2dfea
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
capabilities:
|
||||
drop: ["ALL"]
|
||||
env:
|
||||
# Must equal matrix_rtc.transports[].url in synapse.yaml.
|
||||
- name: LIVEKIT_URL
|
||||
value: wss://rtc.matrix.renner.uno
|
||||
- name: LIVEKIT_KEY
|
||||
value: matrix-rtc
|
||||
- name: LIVEKIT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: matrix-rtc
|
||||
key: livekit_secret
|
||||
- name: LIVEKIT_FULL_ACCESS_HOMESERVERS
|
||||
value: matrix.renner.uno
|
||||
# Federation is off: no remote homeserver publishes on this SFU.
|
||||
- name: LIVEKIT_REMOTE_CAN_PUBLISH_HOMESERVERS
|
||||
value: ""
|
||||
- name: LIVEKIT_AS_REGISTRATION_FILE
|
||||
value: /registration/registration.yaml
|
||||
- name: LIVEKIT_HS_SERVER_NAME
|
||||
value: matrix.renner.uno
|
||||
- name: LIVEKIT_CS_API_URL_OVERRIDES
|
||||
value: matrix.renner.uno=http://synapse:8008
|
||||
- name: LIVEKIT_SANITY_CHECK_INTERVAL_SECONDS
|
||||
value: "60"
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8080
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 32Mi
|
||||
limits:
|
||||
memory: 256Mi
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: http
|
||||
periodSeconds: 10
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: http
|
||||
periodSeconds: 30
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 4
|
||||
volumeMounts:
|
||||
- name: registration
|
||||
mountPath: /registration
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: registration
|
||||
secret:
|
||||
secretName: matrix-rtc
|
||||
items:
|
||||
- key: registration.yaml
|
||||
path: registration.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: lk-jwt-service
|
||||
namespace: matrix
|
||||
spec:
|
||||
selector:
|
||||
app.kubernetes.io/name: lk-jwt-service
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: http
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: lk-jwt-strip
|
||||
namespace: matrix
|
||||
spec:
|
||||
stripPrefix:
|
||||
prefixes:
|
||||
- /livekit/jwt
|
||||
---
|
||||
# turn.matrix.renner.uno is listed here to be published and get a certificate; IngressRouteTCP livekit-turn serves it.
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: matrix-rtc
|
||||
namespace: matrix
|
||||
labels:
|
||||
dns.renner.uno/public: "true"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-cluster
|
||||
traefik.ingress.kubernetes.io/router.middlewares: matrix-lk-jwt-strip@kubernetescrd
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- rtc.matrix.renner.uno
|
||||
secretName: rtc-tls
|
||||
- hosts:
|
||||
- turn.matrix.renner.uno
|
||||
secretName: turn-tls
|
||||
rules:
|
||||
- host: rtc.matrix.renner.uno
|
||||
http:
|
||||
paths:
|
||||
# Client endpoints of lk-jwt-service (livekit_service_url); the rest of the service stays in-cluster.
|
||||
- path: /livekit/jwt/sfu/get
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: lk-jwt-service
|
||||
port:
|
||||
number: 8080
|
||||
- path: /livekit/jwt/get_token
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: lk-jwt-service
|
||||
port:
|
||||
number: 8080
|
||||
- path: /livekit/jwt/delegate_delayed_leave
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: lk-jwt-service
|
||||
port:
|
||||
number: 8080
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: livekit
|
||||
port:
|
||||
number: 7880
|
||||
- host: turn.matrix.renner.uno
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: livekit
|
||||
port:
|
||||
number: 7880
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRouteTCP
|
||||
metadata:
|
||||
name: livekit-turn
|
||||
namespace: matrix
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: HostSNI(`turn.matrix.renner.uno`)
|
||||
services:
|
||||
- name: livekit
|
||||
port: 443
|
||||
tls:
|
||||
secretName: turn-tls
|
||||
@@ -19,8 +19,15 @@ data:
|
||||
server_name: matrix.renner.uno
|
||||
public_baseurl: https://matrix.renner.uno/
|
||||
# Lets Element X and other clients discover the homeserver from the
|
||||
# server name. No server well-known: there is no federation to point at.
|
||||
# server name.
|
||||
serve_client_wellknown: true
|
||||
# Delegates to :443 so lk-jwt-service finds /_matrix/federation/v1/openid/userinfo (openid resource below).
|
||||
serve_server_wellknown: true
|
||||
# Element Call builds that still read the MatrixRTC transport from the well-known.
|
||||
extra_well_known_client_content:
|
||||
org.matrix.msc4143.rtc_foci:
|
||||
- type: livekit
|
||||
livekit_service_url: https://rtc.matrix.renner.uno/livekit/jwt
|
||||
pid_file: /tmp/homeserver.pid
|
||||
report_stats: false
|
||||
|
||||
@@ -34,7 +41,8 @@ data:
|
||||
bind_addresses: ["::"]
|
||||
x_forwarded: true
|
||||
resources:
|
||||
- names: [client]
|
||||
# openid: only the OpenID userinfo endpoint lk-jwt-service verifies call tokens with; no federation.
|
||||
- names: [client, openid]
|
||||
compress: false
|
||||
|
||||
# The password comes from PGPASSWORD (libpq reads it), so no credential
|
||||
@@ -73,6 +81,30 @@ data:
|
||||
experimental_features:
|
||||
msc4108_enabled: true
|
||||
msc4388_mode: open
|
||||
# MatrixRTC (Element Call): transports endpoint, sync state_after,
|
||||
# appservice membership look-ups and the /rtc/livekit proxy to lk-jwt-service.
|
||||
msc4143_enabled: true
|
||||
msc4222_enabled: true
|
||||
msc4502_enabled: true
|
||||
msc4512_enabled: true
|
||||
|
||||
# MatrixRTC transport (rtc.yaml). url must equal LIVEKIT_URL of lk-jwt-service.
|
||||
matrix_rtc:
|
||||
transports:
|
||||
- type: livekit
|
||||
url: wss://rtc.matrix.renner.uno
|
||||
livekit_service_url: https://rtc.matrix.renner.uno/livekit/jwt
|
||||
app_service_config_files:
|
||||
- /appservices/lk-jwt-service/registration.yaml
|
||||
# Call membership leaves via delayed events (MSC4140).
|
||||
max_event_delay_duration: 24h
|
||||
# Element Call self-hosting guide values: E2EE key sharing bursts and 5 s membership heartbeats.
|
||||
rc_message:
|
||||
per_second: 0.5
|
||||
burst_count: 30
|
||||
rc_delayed_event_mgmt:
|
||||
per_second: 1
|
||||
burst_count: 20
|
||||
|
||||
# Federation off.
|
||||
federation_domain_whitelist: []
|
||||
@@ -115,7 +147,7 @@ metadata:
|
||||
namespace: matrix
|
||||
annotations:
|
||||
configmap.reloader.stakater.com/reload: synapse-config,mas-config
|
||||
secret.reloader.stakater.com/reload: synapse-secrets
|
||||
secret.reloader.stakater.com/reload: synapse-secrets,matrix-rtc
|
||||
labels:
|
||||
app.kubernetes.io/name: synapse
|
||||
app.kubernetes.io/part-of: matrix
|
||||
@@ -263,6 +295,9 @@ spec:
|
||||
mountPath: /data
|
||||
- name: tmp
|
||||
mountPath: /tmp
|
||||
- name: appservice-lk-jwt
|
||||
mountPath: /appservices/lk-jwt-service
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: config
|
||||
configMap:
|
||||
@@ -295,6 +330,12 @@ spec:
|
||||
claimName: synapse-data
|
||||
- name: tmp
|
||||
emptyDir: {}
|
||||
- name: appservice-lk-jwt
|
||||
secret:
|
||||
secretName: matrix-rtc
|
||||
items:
|
||||
- key: registration.yaml
|
||||
path: registration.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
|
||||
@@ -0,0 +1,436 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: netbird-proxies
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: group
|
||||
displayName: NetBird Proxies
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: netbird-proxies-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: proxy.renner.uno DNS
|
||||
parentRef:
|
||||
name: netbird-proxies
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# target of the *.renner.uno wildcard
|
||||
hostname: proxy.renner.uno
|
||||
resolveType: AAAA
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-1
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: group
|
||||
displayName: proxy-1.renner.uno
|
||||
parentRef:
|
||||
name: netbird-proxies
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-1-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: proxy-1.renner.uno DNS
|
||||
parentRef:
|
||||
name: proxy-1
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
hostname: proxy-1.renner.uno
|
||||
resolveType: AAAA
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-1-http
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: proxy-1.renner.uno HTTP
|
||||
parentRef:
|
||||
name: proxy-1
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# pinned to this proxy; the Host header sets SNI, so the proxy routes status.renner.uno
|
||||
url: https://proxy-1.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
headers:
|
||||
Host: status.renner.uno
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-1-route
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: proxy-1.renner.uno Route
|
||||
parentRef:
|
||||
name: proxy-1
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# end to end through this proxy, the mesh and Traefik to Gatus
|
||||
url: https://proxy-1.renner.uno/health
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
headers:
|
||||
Host: status.renner.uno
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "UP"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-2
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: group
|
||||
displayName: proxy-2.renner.uno
|
||||
parentRef:
|
||||
name: netbird-proxies
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-2-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: proxy-2.renner.uno DNS
|
||||
parentRef:
|
||||
name: proxy-2
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
hostname: proxy-2.renner.uno
|
||||
resolveType: AAAA
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-2-dns-a
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: proxy-2.renner.uno DNS (IPv4)
|
||||
parentRef:
|
||||
name: proxy-2
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# the fleet's only IPv4 address
|
||||
hostname: proxy-2.renner.uno
|
||||
resolveType: A
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-2-http
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: proxy-2.renner.uno HTTP
|
||||
parentRef:
|
||||
name: proxy-2
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# pinned to this proxy; the Host header sets SNI, so the proxy routes status.renner.uno
|
||||
url: https://proxy-2.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
headers:
|
||||
Host: status.renner.uno
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: proxy-2-route
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: proxy-2.renner.uno Route
|
||||
parentRef:
|
||||
name: proxy-2
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# end to end through this proxy, the mesh and Traefik to Gatus
|
||||
url: https://proxy-2.renner.uno/health
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
headers:
|
||||
Host: status.renner.uno
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "UP"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-apex
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: group
|
||||
displayName: renner.uno Apex
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-apex-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: renner.uno DNS
|
||||
parentRef:
|
||||
name: renner-uno-apex
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# Cloudflare-proxied apex, not the wildcard
|
||||
hostname: renner.uno
|
||||
resolveType: AAAA
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-apex-http
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: renner.uno HTTP
|
||||
parentRef:
|
||||
name: renner-uno-apex
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-apex-redirect
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: renner.uno
|
||||
parentRef:
|
||||
name: renner-uno-apex
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# 301 to www, followed
|
||||
url: https://renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: Familie Renner
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: third-party
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: group
|
||||
displayName: Third-party
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-portal-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: MCB Portal DNS
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# no AAAA record
|
||||
hostname: portal.multi-circuit-boards.eu
|
||||
resolveType: A
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-portal
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Portal
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
# root 302s to / to set a session cookie; do not follow
|
||||
url: https://portal.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299", "302"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-tech-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: MCB Technician Portal DNS
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# no AAAA record
|
||||
hostname: tech.multi-circuit-boards.eu
|
||||
resolveType: A
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-tech
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Technician Portal
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
url: https://tech.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-www-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: MCB Website DNS
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# no AAAA record
|
||||
hostname: www.multi-circuit-boards.eu
|
||||
resolveType: A
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: mcb-www
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: MCB Website
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
# 301 to /index.html, followed
|
||||
url: https://www.multi-circuit-boards.eu/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: turm1388-dns
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Wohnen im Turm DNS
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
hostname: turm1388.de
|
||||
resolveType: AAAA
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: turm1388
|
||||
namespace: monitoring
|
||||
spec:
|
||||
type: http
|
||||
displayName: Wohnen im Turm
|
||||
parentRef:
|
||||
name: third-party
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 15
|
||||
http:
|
||||
url: https://turm1388.de/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
@@ -17,6 +17,7 @@ resources:
|
||||
- smartctl-exporter.yaml
|
||||
- intel-gpu-exporter.yaml
|
||||
- dashboards/
|
||||
- kumamonitors.yaml
|
||||
# prometheusrule-garage.yaml lives in ./monitoring-rules/ and is applied by a
|
||||
# separate Flux Kustomization that dependsOn `monitoring` — otherwise the
|
||||
# server-side dry-run of the PrometheusRule fails on a fresh cluster
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: music
|
||||
namespace: music-assistant
|
||||
spec:
|
||||
type: group
|
||||
displayName: Music Assistant
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: music-dns
|
||||
namespace: music-assistant
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Music Assistant DNS
|
||||
parentRef:
|
||||
name: music
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: music.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: music-http
|
||||
namespace: music-assistant
|
||||
spec:
|
||||
type: http
|
||||
displayName: Music Assistant HTTP
|
||||
parentRef:
|
||||
name: music
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://music.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: music-info
|
||||
namespace: music-assistant
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Music Assistant Server
|
||||
parentRef:
|
||||
name: music
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# unauthenticated server info
|
||||
url: https://music.renner.uno/info
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: $exists(server_version)
|
||||
operator: "=="
|
||||
expected: "true"
|
||||
@@ -6,3 +6,4 @@ resources:
|
||||
- configmap-net-reconcile.yaml
|
||||
- deployment.yaml
|
||||
- ingress.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: navidrome
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: group
|
||||
displayName: Navidrome
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: navidrome-dns
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Navidrome DNS
|
||||
parentRef:
|
||||
name: navidrome
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: navidrome.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: navidrome-http
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: http
|
||||
displayName: Navidrome HTTP
|
||||
parentRef:
|
||||
name: navidrome
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://navidrome.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: navidrome-subsonic
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: Navidrome Subsonic API
|
||||
parentRef:
|
||||
name: navidrome
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# ungated Subsonic path; without credentials it answers with a typed error
|
||||
url: https://navidrome.renner.uno/rest/ping.view?f=json
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: "`subsonic-response`.type"
|
||||
operator: "=="
|
||||
expected: "navidrome"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: lidarr
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: group
|
||||
displayName: Lidarr
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: lidarr-dns
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: dns
|
||||
displayName: Lidarr DNS
|
||||
parentRef:
|
||||
name: lidarr
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: lidarr.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: lidarr-http
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: http
|
||||
displayName: Lidarr HTTP
|
||||
parentRef:
|
||||
name: lidarr
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://lidarr.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: lidarr-gate
|
||||
namespace: navidrome
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Lidarr Login
|
||||
parentRef:
|
||||
name: lidarr
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 20
|
||||
http:
|
||||
# fully behind the Authentik gate; asserts the login page the redirect chain ends on
|
||||
url: https://lidarr.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>authentik</title>"
|
||||
@@ -6,3 +6,4 @@ resources:
|
||||
- ingress.yaml
|
||||
- lidarr.yaml
|
||||
- beets.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: group
|
||||
displayName: Documents
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs-dns
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: dns
|
||||
displayName: docs.renner.uno DNS
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: docs.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs-http
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: http
|
||||
displayName: docs.renner.uno HTTP
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://docs.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: docs-gate
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Documents Login
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 20
|
||||
http:
|
||||
# Paperless is fully behind the Authentik gate; asserts the login page the redirect chain ends on
|
||||
url: https://docs.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>authentik</title>"
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: paperless-dns
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: dns
|
||||
displayName: paperless.renner.uno DNS
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: paperless.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: paperless-http
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: http
|
||||
displayName: paperless.renner.uno HTTP
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://paperless.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: paperless-gate
|
||||
namespace: paperless
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: Paperless Login
|
||||
parentRef:
|
||||
name: docs
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 20
|
||||
http:
|
||||
# behind the Authentik gate; asserts the login page the redirect chain ends on
|
||||
url: https://paperless.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: "<title>authentik</title>"
|
||||
@@ -20,6 +20,7 @@ resources:
|
||||
- scheduled-backup.yaml
|
||||
- hetzner-creds-externalsecret.yaml
|
||||
- pvcs.yaml
|
||||
- kumamonitors.yaml
|
||||
configMapGenerator:
|
||||
# vsftpd config for the ftp-scanner deployment. The content-hash name
|
||||
# suffix is intentionally LEFT ENABLED (unlike home-assistant's nginx
|
||||
|
||||
@@ -182,7 +182,7 @@ spec:
|
||||
drop: ["ALL"]
|
||||
containers:
|
||||
- name: paperless
|
||||
image: ghcr.io/paperless-ngx/paperless-ngx:3.3.2 # {"$imagepolicy": "flux-system:paperless-ngx"}
|
||||
image: ghcr.io/paperless-ngx/paperless-ngx:3.3.3 # {"$imagepolicy": "flux-system:paperless-ngx"}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8000
|
||||
|
||||
@@ -53,7 +53,7 @@ spec:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: wiki
|
||||
image: gitea.renner.uno/konairius/wiki:build.1792404861 # {"$imagepolicy": "flux-system:wiki"}
|
||||
image: gitea.renner.uno/konairius/wiki:build.1792419299 # {"$imagepolicy": "flux-system:wiki"}
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno
|
||||
namespace: wordpress
|
||||
spec:
|
||||
type: group
|
||||
displayName: Renner.uno Website
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-www-dns
|
||||
namespace: wordpress
|
||||
spec:
|
||||
type: dns
|
||||
displayName: www.renner.uno DNS
|
||||
parentRef:
|
||||
name: renner-uno
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: www.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-www-http
|
||||
namespace: wordpress
|
||||
spec:
|
||||
type: http
|
||||
displayName: www.renner.uno HTTP
|
||||
parentRef:
|
||||
name: renner-uno
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://www.renner.uno/
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: renner-uno-www
|
||||
namespace: wordpress
|
||||
spec:
|
||||
type: keyword
|
||||
displayName: www.renner.uno
|
||||
parentRef:
|
||||
name: renner-uno
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
url: https://www.renner.uno/
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
keyword:
|
||||
keyword: Familie Renner
|
||||
@@ -6,3 +6,4 @@ resources:
|
||||
- pvc.yaml
|
||||
- deployment.yaml
|
||||
- ingress.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
@@ -21,3 +21,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -26,3 +26,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -31,3 +31,7 @@ spec:
|
||||
kind: Cluster
|
||||
failed: "has(status.phase) && status.phase.startsWith('Failed')"
|
||||
current: "has(status.phase) && (status.phase == 'Cluster in healthy state' || status.readyInstances > 0)"
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -17,3 +17,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: gitea # serves Gitea's API
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -25,3 +25,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -26,6 +26,11 @@ spec:
|
||||
- name: cnpg-object-stores # the ObjectStores its Cluster names
|
||||
- name: gitea # mqtt-account-controller's image is in Gitea's registry
|
||||
- name: influxdb # HA's InfluxDB integration writes there
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
|
||||
@@ -30,3 +30,7 @@ spec:
|
||||
kind: Cluster
|
||||
failed: "has(status.phase) && status.phase.startsWith('Failed')"
|
||||
current: "has(status.phase) && (status.phase == 'Cluster in healthy state' || status.readyInstances > 0)"
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -21,6 +21,11 @@ spec:
|
||||
dependsOn:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# kuma-sync controller: KumaMonitor -> Uptime Kuma monitors. Ships no KumaMonitor objects.
|
||||
# kuma-sync controller: KumaMonitor -> Uptime Kuma monitors. Ships no KumaMonitor objects;
|
||||
# they live with their app, the CRD in infrastructure/kuma-sync-crds.
|
||||
# healthCheckExprs: Flux has no status reader for ExternalSecret; fail only on the non-retrying reasons.
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
|
||||
@@ -20,3 +20,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -27,3 +27,7 @@ spec:
|
||||
kind: Cluster
|
||||
failed: "has(status.phase) && status.phase.startsWith('Failed')"
|
||||
current: "has(status.phase) && (status.phase == 'Cluster in healthy state' || status.readyInstances > 0)"
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -47,6 +47,11 @@ spec:
|
||||
dependsOn:
|
||||
- name: grafana-db
|
||||
- name: influxdb # its Job writes the grafana-influxdb-token Secret Grafana mounts
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
|
||||
@@ -26,3 +26,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -18,3 +18,8 @@ spec:
|
||||
- name: infrastructure
|
||||
- name: infrastructure-crds
|
||||
- name: infrastructure-ceph-cluster
|
||||
healthCheckExprs:
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -31,3 +31,7 @@ spec:
|
||||
kind: Cluster
|
||||
failed: "has(status.phase) && status.phase.startsWith('Failed')"
|
||||
current: "has(status.phase) && (status.phase == 'Cluster in healthy state' || status.readyInstances > 0)"
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -29,3 +29,7 @@ spec:
|
||||
kind: MariaDB
|
||||
failed: "has(status.conditions) && status.conditions.exists(c, c.type == 'Ready' && c.status == 'False' && c.reason == 'Failed')"
|
||||
current: "has(status.conditions) && status.conditions.exists(c, c.type == 'Ready' && c.status == 'True')"
|
||||
# KumaMonitor Ready tracks Uptime Kuma on the VPS, not this apply.
|
||||
- apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
current: "true"
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: crowdsec
|
||||
namespace: crowdsec
|
||||
spec:
|
||||
type: group
|
||||
displayName: CrowdSec LAPI
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: crowdsec-dns
|
||||
namespace: crowdsec
|
||||
spec:
|
||||
type: dns
|
||||
displayName: CrowdSec LAPI DNS
|
||||
parentRef:
|
||||
name: crowdsec
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
dns:
|
||||
# cluster services have no own record; they resolve through the *.renner.uno wildcard
|
||||
hostname: crowdsec.renner.uno
|
||||
resolveType: CNAME
|
||||
resolveServer: "2606:4700:4700::1111,1.1.1.1"
|
||||
conditions:
|
||||
- operator: equals
|
||||
value: proxy.renner.uno
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: crowdsec-http
|
||||
namespace: crowdsec
|
||||
spec:
|
||||
type: http
|
||||
displayName: CrowdSec LAPI HTTP
|
||||
parentRef:
|
||||
name: crowdsec
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# reachable: any answer from the backend below 5xx, redirects not followed
|
||||
url: https://crowdsec.renner.uno/health
|
||||
acceptedStatusCodes: ["200-499"]
|
||||
maxRedirects: 0
|
||||
expiryNotification: true
|
||||
---
|
||||
apiVersion: uptime.renner.uno/v1alpha1
|
||||
kind: KumaMonitor
|
||||
metadata:
|
||||
name: crowdsec-health
|
||||
namespace: crowdsec
|
||||
spec:
|
||||
type: json-query
|
||||
displayName: CrowdSec LAPI Health
|
||||
parentRef:
|
||||
name: crowdsec
|
||||
interval: 60
|
||||
retryInterval: 60
|
||||
maxRetries: 1
|
||||
timeout: 10
|
||||
http:
|
||||
# unauthenticated LAPI health endpoint the edge bouncers depend on
|
||||
url: https://crowdsec.renner.uno/health
|
||||
acceptedStatusCodes: ["200-299"]
|
||||
expiryNotification: true
|
||||
jsonQuery:
|
||||
expression: status
|
||||
operator: "=="
|
||||
expected: "up"
|
||||
@@ -5,3 +5,4 @@ resources:
|
||||
- helmrelease.yaml
|
||||
- crowdsec-bouncer-key-externalsecret.yaml
|
||||
- crowdsec-edge-bouncer-key-externalsecret.yaml
|
||||
- kumamonitors.yaml
|
||||
|
||||
+28
-1
@@ -3,8 +3,8 @@ apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.23.0
|
||||
kustomize.toolkit.fluxcd.io/prune: disabled
|
||||
controller-gen.kubebuilder.io/version: v0.23.0
|
||||
name: kumamonitors.uptime.renner.uno
|
||||
spec:
|
||||
group: uptime.renner.uno
|
||||
@@ -52,6 +52,33 @@ spec:
|
||||
type: string
|
||||
dns:
|
||||
properties:
|
||||
conditions:
|
||||
description: |-
|
||||
Conditions on the answer, all of which must hold for one record. For
|
||||
CNAME the record is the first target, without the trailing dot.
|
||||
items:
|
||||
description: DNSCondition tests a DNS record with one of Kuma's
|
||||
string operators.
|
||||
properties:
|
||||
operator:
|
||||
enum:
|
||||
- equals
|
||||
- not_equals
|
||||
- contains
|
||||
- not_contains
|
||||
- starts_with
|
||||
- not_starts_with
|
||||
- ends_with
|
||||
- not_ends_with
|
||||
type: string
|
||||
value:
|
||||
minLength: 1
|
||||
type: string
|
||||
required:
|
||||
- operator
|
||||
- value
|
||||
type: object
|
||||
type: array
|
||||
hostname:
|
||||
minLength: 1
|
||||
type: string
|
||||
@@ -0,0 +1,4 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- crd-kumamonitors.yaml
|
||||
@@ -25,6 +25,7 @@ resources:
|
||||
- external-secrets/
|
||||
- reloader/
|
||||
- admission-policies/
|
||||
- kuma-sync-crds/
|
||||
# The OpenBao ClusterSecretStore lives in post-crds/ (needs ESO's CRDs and
|
||||
# an initialized OpenBao; see kubernetes/MIGRATION-sops-openbao.md).
|
||||
# cnpg-barman-plugin/ lives in its own Flux Kustomization
|
||||
|
||||
@@ -137,3 +137,53 @@ spec:
|
||||
- ports:
|
||||
- port: "8443"
|
||||
protocol: TCP
|
||||
---
|
||||
# LiveKit media: ICE from clients straight to the pod IPs (LAN via the BGP-routed pod CIDR).
|
||||
apiVersion: cilium.io/v2
|
||||
kind: CiliumNetworkPolicy
|
||||
metadata:
|
||||
name: livekit-media
|
||||
namespace: matrix
|
||||
spec:
|
||||
endpointSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: livekit
|
||||
ingress:
|
||||
- fromEntities:
|
||||
- world
|
||||
toPorts:
|
||||
- ports:
|
||||
- port: "7881"
|
||||
protocol: TCP
|
||||
- port: "7882"
|
||||
protocol: UDP
|
||||
egress:
|
||||
# ICE connectivity checks and media to client candidates.
|
||||
- toEntities:
|
||||
- world
|
||||
toPorts:
|
||||
- ports:
|
||||
- port: "1"
|
||||
endPort: 65535
|
||||
protocol: UDP
|
||||
---
|
||||
# lk-jwt-service → matrix.renner.uno (server well-known, OpenID userinfo) and
|
||||
# rtc.matrix.renner.uno (LiveKit room API); both resolve to the Traefik VIP.
|
||||
apiVersion: cilium.io/v2
|
||||
kind: CiliumNetworkPolicy
|
||||
metadata:
|
||||
name: lk-jwt-service-egress
|
||||
namespace: matrix
|
||||
spec:
|
||||
endpointSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: lk-jwt-service
|
||||
egress:
|
||||
- toEndpoints:
|
||||
- matchLabels:
|
||||
"k8s:io.kubernetes.pod.namespace": ingress
|
||||
app.kubernetes.io/name: traefik
|
||||
toPorts:
|
||||
- ports:
|
||||
- port: "8443"
|
||||
protocol: TCP
|
||||
|
||||
Reference in New Issue
Block a user