Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
ae01e69fc2
|
Vendored
+46
@@ -0,0 +1,46 @@
|
|||||||
|
{{- if .Values.httpRoute.enabled -}}
|
||||||
|
{{- $fullName := include "docs.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "docs.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
{{- toYaml .Values.httpRoute.parentRefs | nindent 4 }}
|
||||||
|
{{- with .Values.httpRoute.hostnames }}
|
||||||
|
hostnames:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.httpRoute.rules }}
|
||||||
|
- {{- with .matches }}
|
||||||
|
matches:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
backendRefs:
|
||||||
|
- name: {{ $fullName }}
|
||||||
|
port: {{ $svcPort }}
|
||||||
|
{{- end }}
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-{{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "docs.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "docs.selectorLabels" . | nindent 6 }}
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
@@ -46,8 +46,13 @@ service:
|
|||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
port: 8080
|
port: 8080
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: false
|
||||||
className: nginx
|
className: nginx
|
||||||
|
httpRoute:
|
||||||
|
enabled: false
|
||||||
|
parentRefs: []
|
||||||
|
hostnames: []
|
||||||
|
rules: []
|
||||||
persistence:
|
persistence:
|
||||||
enabled: false
|
enabled: false
|
||||||
size: 1G
|
size: 1G
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
{{- if .Values.httpRoute.enabled -}}
|
||||||
|
{{- $fullName := include "makai.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "makai.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
{{- toYaml .Values.httpRoute.parentRefs | nindent 4 }}
|
||||||
|
{{- with .Values.httpRoute.hostnames }}
|
||||||
|
hostnames:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.httpRoute.rules }}
|
||||||
|
- {{- with .matches }}
|
||||||
|
matches:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
backendRefs:
|
||||||
|
- name: {{ $fullName }}
|
||||||
|
port: {{ $svcPort }}
|
||||||
|
{{- end }}
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-{{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "makai.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "makai.selectorLabels" . | nindent 6 }}
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": {{ .Release.Namespace }}
|
||||||
|
{{- end }}
|
||||||
@@ -46,8 +46,13 @@ service:
|
|||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
port: 8080
|
port: 8080
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: false
|
||||||
className: nginx
|
className: nginx
|
||||||
|
httpRoute:
|
||||||
|
enabled: false
|
||||||
|
parentRefs: []
|
||||||
|
hostnames: []
|
||||||
|
rules: []
|
||||||
persistence:
|
persistence:
|
||||||
enabled: false
|
enabled: false
|
||||||
size: 1G
|
size: 1G
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ releases:
|
|||||||
condition: docs.enabled
|
condition: docs.enabled
|
||||||
values:
|
values:
|
||||||
- ../values/docs/values/values.yaml
|
- ../values/docs/values/values.yaml
|
||||||
|
- ../values/docs/values/values.yaml.gotmpl
|
||||||
- ../values/docs/values/values-{{ .Environment.Name }}.yaml
|
- ../values/docs/values/values-{{ .Environment.Name }}.yaml
|
||||||
postRenderer: ../bin/kustomizer
|
postRenderer: ../bin/kustomizer
|
||||||
postRendererArgs:
|
postRendererArgs:
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ releases:
|
|||||||
condition: gitea.enabled
|
condition: gitea.enabled
|
||||||
values:
|
values:
|
||||||
- ../values/gitea/values/values.yaml
|
- ../values/gitea/values/values.yaml
|
||||||
|
- ../values/gitea/values/values.yaml.gotmpl
|
||||||
- ../values/gitea/values/values-{{ .Environment.Name }}.yaml
|
- ../values/gitea/values/values-{{ .Environment.Name }}.yaml
|
||||||
postRenderer: ../bin/kustomizer
|
postRenderer: ../bin/kustomizer
|
||||||
postRendererArgs:
|
postRendererArgs:
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ releases:
|
|||||||
condition: makai.enabled
|
condition: makai.enabled
|
||||||
values:
|
values:
|
||||||
- ../values/makai/values/values.yaml
|
- ../values/makai/values/values.yaml
|
||||||
|
- ../values/makai/values/values.yaml.gotmpl
|
||||||
- ../values/makai/values/values-{{ .Environment.Name }}.yaml
|
- ../values/makai/values/values-{{ .Environment.Name }}.yaml
|
||||||
postRenderer: ../bin/kustomizer
|
postRenderer: ../bin/kustomizer
|
||||||
postRendererArgs:
|
postRendererArgs:
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ spec:
|
|||||||
managedNamespaceMetadata:
|
managedNamespaceMetadata:
|
||||||
labels:
|
labels:
|
||||||
component: sys
|
component: sys
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
- ApplyOutOfSyncOnly=true
|
- ApplyOutOfSyncOnly=true
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: argocd-server
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-internal
|
||||||
|
hostnames:
|
||||||
|
- argocd.{{ .Values.clusterConfig.domain }}
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: argocd-server
|
||||||
|
port: 80
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-argocd
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: argocd-server
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": argocd
|
||||||
|
{{- end }}
|
||||||
@@ -4,8 +4,11 @@ global:
|
|||||||
## Ref: https://github.com/argoproj/argo-cd
|
## Ref: https://github.com/argoproj/argo-cd
|
||||||
##
|
##
|
||||||
configs:
|
configs:
|
||||||
{{- if .Values.argocd.anyNamespaces.enabled }}
|
|
||||||
params:
|
params:
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
server.insecure: "true"
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.argocd.anyNamespaces.enabled }}
|
||||||
applicationsetcontroller.namespaces: "{{ .Values.argocd.anyNamespaces.glob }}"
|
applicationsetcontroller.namespaces: "{{ .Values.argocd.anyNamespaces.glob }}"
|
||||||
# TODO(kai): anyapp will disable PR review apps. Look into anyapp settings to fix it
|
# TODO(kai): anyapp will disable PR review apps. Look into anyapp settings to fix it
|
||||||
applicationsetcontroller.enable.scm.providers: "false"
|
applicationsetcontroller.enable.scm.providers: "false"
|
||||||
@@ -238,6 +241,9 @@ server:
|
|||||||
serviceMonitor:
|
serviceMonitor:
|
||||||
enabled: true
|
enabled: true
|
||||||
ingress:
|
ingress:
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
enabled: false
|
||||||
|
{{- else }}
|
||||||
enabled: true
|
enabled: true
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
annotations:
|
annotations:
|
||||||
@@ -254,6 +260,7 @@ server:
|
|||||||
- secretName: argocd-tls
|
- secretName: argocd-tls
|
||||||
hosts:
|
hosts:
|
||||||
- "argocd.{{ .Values.clusterConfig.domain }}"
|
- "argocd.{{ .Values.clusterConfig.domain }}"
|
||||||
|
{{- end }}
|
||||||
applicationSet:
|
applicationSet:
|
||||||
metrics:
|
metrics:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ spec:
|
|||||||
annotations:
|
annotations:
|
||||||
load-balancer.hetzner.cloud/location: hel1
|
load-balancer.hetzner.cloud/location: hel1
|
||||||
load-balancer.hetzner.cloud/type: lb11
|
load-balancer.hetzner.cloud/type: lb11
|
||||||
load-balancer.hetzner.cloud/name: load-balancer-2
|
load-balancer.hetzner.cloud/name: load-balancer-1
|
||||||
load-balancer.hetzner.cloud/use-private-ip: "true"
|
load-balancer.hetzner.cloud/use-private-ip: "true"
|
||||||
load-balancer.hetzner.cloud/uses-proxyprotocol: "true"
|
load-balancer.hetzner.cloud/uses-proxyprotocol: "true"
|
||||||
load-balancer.hetzner.cloud/http-redirect-https: "false"
|
load-balancer.hetzner.cloud/http-redirect-https: "false"
|
||||||
@@ -42,6 +42,36 @@ spec:
|
|||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
shared-gateway-access: "true"
|
shared-gateway-access: "true"
|
||||||
|
- name: https-hel1
|
||||||
|
protocol: HTTPS
|
||||||
|
port: 443
|
||||||
|
hostname: "*.hel1.oceanbox.io"
|
||||||
|
tls:
|
||||||
|
certificateRefs:
|
||||||
|
- group: ''
|
||||||
|
kind: Secret
|
||||||
|
name: wildcard-hel1-oceanbox-io
|
||||||
|
allowedRoutes:
|
||||||
|
namespaces:
|
||||||
|
from: Selector
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
|
- name: https-internal
|
||||||
|
protocol: HTTPS
|
||||||
|
port: 443
|
||||||
|
hostname: "*.adm.hel1.obx"
|
||||||
|
tls:
|
||||||
|
certificateRefs:
|
||||||
|
- group: ''
|
||||||
|
kind: Secret
|
||||||
|
name: wildcard-adm-hel1-obx
|
||||||
|
allowedRoutes:
|
||||||
|
namespaces:
|
||||||
|
from: Selector
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
- name: ssh
|
- name: ssh
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
port: 22
|
port: 22
|
||||||
@@ -65,4 +95,28 @@ spec:
|
|||||||
issuerRef:
|
issuerRef:
|
||||||
name: letsencrypt-prod-dns01
|
name: letsencrypt-prod-dns01
|
||||||
kind: ClusterIssuer
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: wildcard-hel1-oceanbox-io
|
||||||
|
spec:
|
||||||
|
secretName: wildcard-hel1-oceanbox-io
|
||||||
|
dnsNames:
|
||||||
|
- "*.hel1.oceanbox.io"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod-dns01
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: wildcard-adm-hel1-obx
|
||||||
|
spec:
|
||||||
|
secretName: wildcard-adm-hel1-obx
|
||||||
|
dnsNames:
|
||||||
|
- "*.adm.hel1.obx"
|
||||||
|
issuerRef:
|
||||||
|
name: ca-issuer
|
||||||
|
kind: ClusterIssuer
|
||||||
{{- end}}
|
{{- end}}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ spec:
|
|||||||
- name: HELMFILE_FILE_PATH
|
- name: HELMFILE_FILE_PATH
|
||||||
value: docs.yaml.gotmpl
|
value: docs.yaml.gotmpl
|
||||||
syncPolicy:
|
syncPolicy:
|
||||||
|
managedNamespaceMetadata:
|
||||||
|
labels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
- ApplyOutOfSyncOnly=true
|
- ApplyOutOfSyncOnly=true
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{{- /* HTTPRoute and CiliumNetworkPolicy are managed by the docs chart template */ -}}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
replicaCount: 1
|
||||||
|
image:
|
||||||
|
tag: "e9fd3fc6-debug"
|
||||||
|
env:
|
||||||
|
- name: APP_VERSION
|
||||||
|
value: "0.0.0"
|
||||||
|
- name: LOG_LEVEL
|
||||||
|
value: "1"
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: "nginx"
|
||||||
|
httpRoute:
|
||||||
|
enabled: true
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https
|
||||||
|
hostnames:
|
||||||
|
- docs.oceanbox.io
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
{{- else }}
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
className: "nginx"
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: letsencrypt-production
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
||||||
|
nginx.ingress.kubernetes.io/enable-cors: "true"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
oceanbox.io/expose: internal
|
||||||
|
hosts:
|
||||||
|
- host: docs.oceanbox.io
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- docs.oceanbox.io
|
||||||
|
secretName: docs-tls
|
||||||
|
{{- end }}
|
||||||
@@ -1,32 +1,38 @@
|
|||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: HTTPRoute
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
|
||||||
cert-manager.io/cluster-issuer: letsencrypt-production
|
|
||||||
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
|
||||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
|
||||||
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
|
|
||||||
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
|
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
|
||||||
nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,172.19.255.0/24,100.64.0.0/12
|
|
||||||
labels:
|
|
||||||
app.kubernetes.io/component: drupal
|
|
||||||
name: drupal
|
name: drupal
|
||||||
namespace: fornix
|
namespace: fornix
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
parentRefs:
|
||||||
rules:
|
- name: shared-gateway
|
||||||
- host: drupal.hel1.oceanbox.io
|
namespace: kube-system
|
||||||
http:
|
sectionName: https-hel1
|
||||||
paths:
|
hostnames:
|
||||||
- backend:
|
|
||||||
service:
|
|
||||||
name: drupal
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
path: /
|
|
||||||
pathType: Prefix
|
|
||||||
tls:
|
|
||||||
- hosts:
|
|
||||||
- drupal.hel1.oceanbox.io
|
- drupal.hel1.oceanbox.io
|
||||||
secretName: drupal-tls
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: drupal
|
||||||
|
port: 80
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-drupal
|
||||||
|
namespace: fornix
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: drupal
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": fornix
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ clusterConfig:
|
|||||||
patterns: []
|
patterns: []
|
||||||
cidr: []
|
cidr: []
|
||||||
nodes: []
|
nodes: []
|
||||||
|
gatewayAPI:
|
||||||
|
enabled: true
|
||||||
ingress_whitelist:
|
ingress_whitelist:
|
||||||
- 10.0.0.0/8
|
- 10.0.0.0/8
|
||||||
- 172.16.0.0/12
|
- 172.16.0.0/12
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ clusterConfig:
|
|||||||
- 192.168.0.0/16
|
- 192.168.0.0/16
|
||||||
- 172.19.255.0/24
|
- 172.19.255.0/24
|
||||||
- 100.64.0.0/12 # tailnet
|
- 100.64.0.0/12 # tailnet
|
||||||
|
gatewayAPI:
|
||||||
|
enabled: false
|
||||||
ingress_hostnetwork: false
|
ingress_hostnetwork: false
|
||||||
ingress_hostport: false
|
ingress_hostport: false
|
||||||
ingress_nodeport: true
|
ingress_nodeport: true
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ spec:
|
|||||||
targetRevision: main
|
targetRevision: main
|
||||||
ref: values
|
ref: values
|
||||||
syncPolicy:
|
syncPolicy:
|
||||||
|
managedNamespaceMetadata:
|
||||||
|
labels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
- ApplyOutOfSyncOnly=true
|
- ApplyOutOfSyncOnly=true
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: fornix
|
||||||
|
namespace: fornix
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-hel1
|
||||||
|
hostnames:
|
||||||
|
- fornix.hel1.oceanbox.io
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: fornix
|
||||||
|
port: 8085
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-fornix
|
||||||
|
namespace: fornix
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: fornix
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": fornix
|
||||||
@@ -3,7 +3,7 @@ drupalUrl: http://drupal
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: false
|
||||||
className: "nginx"
|
className: "nginx"
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: letsencrypt-production
|
cert-manager.io/cluster-issuer: letsencrypt-production
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ spec:
|
|||||||
managedNamespaceMetadata:
|
managedNamespaceMetadata:
|
||||||
labels:
|
labels:
|
||||||
component: sys
|
component: sys
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
- ApplyOutOfSyncOnly=true
|
- ApplyOutOfSyncOnly=true
|
||||||
|
|||||||
@@ -1,8 +1,48 @@
|
|||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: gatus
|
||||||
|
namespace: uptime
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-internal
|
||||||
|
hostnames:
|
||||||
|
- uptime.{{ .Values.clusterConfig.domain }}
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: gatus
|
||||||
|
port: 80
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-gatus
|
||||||
|
namespace: uptime
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: gatus
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": uptime
|
||||||
|
{{- else }}
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: ca-issuer
|
cert-manager.io/cluster-issuer: {{ .Values.clusterConfig.ingress_clusterissuer }}
|
||||||
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
||||||
nginx.ingress.kubernetes.io/cors-allow-headers: Content-Type, x-gatus-cache
|
nginx.ingress.kubernetes.io/cors-allow-headers: Content-Type, x-gatus-cache
|
||||||
nginx.ingress.kubernetes.io/enable-cors: "true"
|
nginx.ingress.kubernetes.io/enable-cors: "true"
|
||||||
@@ -15,7 +55,7 @@ metadata:
|
|||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
rules:
|
rules:
|
||||||
- host: uptime.adm.hel1.obx
|
- host: uptime.{{ .Values.clusterConfig.domain }}
|
||||||
http:
|
http:
|
||||||
paths:
|
paths:
|
||||||
- backend:
|
- backend:
|
||||||
@@ -27,5 +67,6 @@ spec:
|
|||||||
pathType: ImplementationSpecific
|
pathType: ImplementationSpecific
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- uptime.adm.hel1.obx
|
- uptime.{{ .Values.clusterConfig.domain }}
|
||||||
secretName: gatus-tls
|
secretName: gatus-tls
|
||||||
|
{{- end }}
|
||||||
|
|||||||
@@ -14,11 +14,36 @@ spec:
|
|||||||
- path:
|
- path:
|
||||||
type: PathPrefix
|
type: PathPrefix
|
||||||
value: "/"
|
value: "/"
|
||||||
|
timeouts:
|
||||||
|
request: 600s
|
||||||
|
backendRequest: 600s
|
||||||
backendRefs:
|
backendRefs:
|
||||||
- name: gitea-http
|
- name: gitea-http
|
||||||
port: 3000
|
port: 3000
|
||||||
|
|
||||||
---
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-gitea
|
||||||
|
namespace: gitea
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: gitea
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
- cidr: 10.0.0.0/8
|
||||||
|
- cidr: 172.16.0.0/12
|
||||||
|
- cidr: 192.168.0.0/16
|
||||||
|
- cidr: 172.19.255.0/24
|
||||||
|
- cidr: 100.64.0.0/12
|
||||||
|
- cidr: 185.125.160.4/32
|
||||||
|
- cidr: 37.27.203.38/32
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": gitea
|
||||||
|
---
|
||||||
apiVersion: gateway.networking.k8s.io/v1alpha2
|
apiVersion: gateway.networking.k8s.io/v1alpha2
|
||||||
kind: TCPRoute
|
kind: TCPRoute
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{{- /* Gateway API: disable ingress when cilium gateway is enabled (HTTPRoute is in manifests/gateway-routes.yaml) */ -}}
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
{{- else }}
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{{- /* HTTPRoute and CiliumNetworkPolicy are managed by the makai chart template */ -}}
|
||||||
@@ -28,6 +28,9 @@ spec:
|
|||||||
- name: HELMFILE_FILE_PATH
|
- name: HELMFILE_FILE_PATH
|
||||||
value: makai.yaml.gotmpl
|
value: makai.yaml.gotmpl
|
||||||
syncPolicy:
|
syncPolicy:
|
||||||
|
managedNamespaceMetadata:
|
||||||
|
labels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
- ApplyOutOfSyncOnly=true
|
- ApplyOutOfSyncOnly=true
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
replicaCount: 1
|
||||||
|
image:
|
||||||
|
tag: "d5e61949-debug"
|
||||||
|
env:
|
||||||
|
- name: APP_VERSION
|
||||||
|
value: "0.0.0"
|
||||||
|
- name: LOG_LEVEL
|
||||||
|
value: "1"
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: "nginx"
|
||||||
|
httpRoute:
|
||||||
|
enabled: true
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https
|
||||||
|
hostnames:
|
||||||
|
- makai.oceanbox.io
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
{{- else }}
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
className: "nginx"
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: letsencrypt-production
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
||||||
|
nginx.ingress.kubernetes.io/enable-cors: "true"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
oceanbox.io/expose: internal
|
||||||
|
hosts:
|
||||||
|
- host: makai.oceanbox.io
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- makai.oceanbox.io
|
||||||
|
secretName: makai-tls
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: grafana
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-internal
|
||||||
|
hostnames:
|
||||||
|
- grafana.{{ .Values.clusterConfig.domain }}
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: prometheus-grafana
|
||||||
|
port: 80
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: alertmanager
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-internal
|
||||||
|
hostnames:
|
||||||
|
- alertmanager.{{ .Values.clusterConfig.domain }}
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: prometheus-kube-prometheus-alertmanager
|
||||||
|
port: 9093
|
||||||
|
---
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: prometheus
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
- name: shared-gateway
|
||||||
|
namespace: kube-system
|
||||||
|
sectionName: https-internal
|
||||||
|
hostnames:
|
||||||
|
- prometheus.{{ .Values.clusterConfig.domain }}
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: prometheus-kube-prometheus-prometheus
|
||||||
|
port: 9090
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-grafana
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: grafana
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": prometheus
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-alertmanager
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: alertmanager
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": prometheus
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-prometheus
|
||||||
|
namespace: prometheus
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: prometheus
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
{{- range .Values.clusterConfig.ingress_whitelist }}
|
||||||
|
- cidr: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": prometheus
|
||||||
|
{{- end }}
|
||||||
@@ -26,6 +26,7 @@ spec:
|
|||||||
managedNamespaceMetadata:
|
managedNamespaceMetadata:
|
||||||
labels:
|
labels:
|
||||||
component: sys
|
component: sys
|
||||||
|
shared-gateway-access: "true"
|
||||||
syncOptions:
|
syncOptions:
|
||||||
- ServerSideApply=true
|
- ServerSideApply=true
|
||||||
- CreateNamespace=true
|
- CreateNamespace=true
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ alertmanager:
|
|||||||
storage: {}
|
storage: {}
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
enabled: false
|
||||||
|
{{- else }}
|
||||||
enabled: true
|
enabled: true
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
annotations:
|
annotations:
|
||||||
@@ -84,6 +87,7 @@ alertmanager:
|
|||||||
- secretName: alertmanager-general-tls
|
- secretName: alertmanager-general-tls
|
||||||
hosts:
|
hosts:
|
||||||
- alertmanager.{{ .Values.clusterConfig.domain }}
|
- alertmanager.{{ .Values.clusterConfig.domain }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
ingressPerReplica:
|
ingressPerReplica:
|
||||||
pathType: ImplementationSpecific
|
pathType: ImplementationSpecific
|
||||||
@@ -170,6 +174,9 @@ grafana:
|
|||||||
size: 10Gi
|
size: 10Gi
|
||||||
{{- end }}
|
{{- end }}
|
||||||
ingress:
|
ingress:
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
enabled: false
|
||||||
|
{{- else }}
|
||||||
enabled: true
|
enabled: true
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
annotations:
|
annotations:
|
||||||
@@ -188,6 +195,7 @@ grafana:
|
|||||||
- secretName: grafana-general-tls
|
- secretName: grafana-general-tls
|
||||||
hosts:
|
hosts:
|
||||||
- grafana.{{ .Values.clusterConfig.domain }}
|
- grafana.{{ .Values.clusterConfig.domain }}
|
||||||
|
{{- end }}
|
||||||
sidecar:
|
sidecar:
|
||||||
dashboards:
|
dashboards:
|
||||||
enabled: true
|
enabled: true
|
||||||
@@ -458,6 +466,9 @@ prometheus:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
|
{{- if .Values.clusterConfig.gatewayAPI.enabled }}
|
||||||
|
enabled: false
|
||||||
|
{{- else }}
|
||||||
enabled: true
|
enabled: true
|
||||||
ingressClassName: nginx
|
ingressClassName: nginx
|
||||||
annotations:
|
annotations:
|
||||||
@@ -478,6 +489,7 @@ prometheus:
|
|||||||
- secretName: prometheus-general-tls
|
- secretName: prometheus-general-tls
|
||||||
hosts:
|
hosts:
|
||||||
- prometheus.{{ .Values.clusterConfig.domain }}
|
- prometheus.{{ .Values.clusterConfig.domain }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
ingressPerReplica:
|
ingressPerReplica:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@@ -1,50 +1,41 @@
|
|||||||
apiVersion: networking.k8s.io/v1
|
# oauth2-proxy must be configured with --upstream=http://hubble-ui:80
|
||||||
kind: Ingress
|
# so that it proxies authenticated requests to hubble-ui.
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
|
||||||
nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2/start?rd=$escaped_request_uri
|
|
||||||
nginx.ingress.kubernetes.io/auth-url: https://$host/oauth2/auth
|
|
||||||
oceanbox.io/expose: internal
|
|
||||||
name: hubble-ui
|
name: hubble-ui
|
||||||
namespace: kube-system
|
namespace: kube-system
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: nginx
|
parentRefs:
|
||||||
rules:
|
- name: shared-gateway
|
||||||
- host: hubble.hel1.oceanbox.io
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- backend:
|
|
||||||
service:
|
|
||||||
name: hubble-ui
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
path: /
|
|
||||||
pathType: Prefix
|
|
||||||
---
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
annotations:
|
|
||||||
cert-manager.io/cluster-issuer: letsencrypt-production
|
|
||||||
nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
|
|
||||||
nginx.ingress.kubernetes.io/proxy-busy-buffers-size: 16k
|
|
||||||
oceanbox.io/expose: internal
|
|
||||||
name: hubble-ui-oauth2-proxy
|
|
||||||
namespace: kube-system
|
namespace: kube-system
|
||||||
spec:
|
sectionName: https-hel1
|
||||||
ingressClassName: nginx
|
hostnames:
|
||||||
rules:
|
|
||||||
- host: hubble.hel1.oceanbox.io
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- backend:
|
|
||||||
service:
|
|
||||||
name: oauth2-proxy
|
|
||||||
port:
|
|
||||||
name: http
|
|
||||||
path: /oauth2
|
|
||||||
pathType: Prefix
|
|
||||||
tls:
|
|
||||||
- hosts:
|
|
||||||
- hubble.hel1.oceanbox.io
|
- hubble.hel1.oceanbox.io
|
||||||
secretName: hubble-tls
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: "/"
|
||||||
|
backendRefs:
|
||||||
|
- name: oauth2-proxy
|
||||||
|
port: 80
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-gateway-to-hubble-ui
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: oauth2-proxy
|
||||||
|
ingress:
|
||||||
|
- fromCIDRSet:
|
||||||
|
- cidr: 10.0.0.0/8
|
||||||
|
- cidr: 172.16.0.0/12
|
||||||
|
- cidr: 192.168.0.0/16
|
||||||
|
- cidr: 100.64.0.0/12
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": kube-system
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: kube-system
|
||||||
|
labels:
|
||||||
|
shared-gateway-access: "true"
|
||||||
Reference in New Issue
Block a user