Compare commits
34 Commits
auto-updat
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c26fdfa914 | |||
| ddf438e903 | |||
| 3c95524bd1 | |||
| 6b7e35e7c8 | |||
| 7d17a5931c | |||
| 921cb50ddc | |||
| 598d2f80f6 | |||
| 9792dd799b | |||
| 9267f25278 | |||
| 812c37cfe7 | |||
|
|
a6a50c3c13 | ||
|
|
2ff8f9efe8 | ||
|
|
477708190d | ||
|
|
53d5723141 | ||
|
|
101d97eb51 | ||
|
|
4241c81fc0 | ||
|
|
bb9ce21bb4 | ||
|
|
95913c3f73 | ||
|
|
737604f466 | ||
|
|
2bb7ad6959 | ||
|
|
b2a77a6572 | ||
| fc1bc1a65e | |||
| a2114327cf | |||
| 5c886d7604 | |||
| ebcb6dde23 | |||
| c6f3528174 | |||
| a3c0c6bce0 | |||
| ae30d8e898 | |||
| 2dd9eb544b | |||
| 5d7882fb96 | |||
| 5065061eea | |||
| dccfa0ca7b | |||
|
|
883139964e | ||
| 74c2e2230c |
@@ -30,21 +30,29 @@ jobs:
|
|||||||
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
|
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
|
||||||
|
|
||||||
- name: Terraform Init
|
- name: Terraform Init
|
||||||
|
env:
|
||||||
|
TF_VAR_authentik_token: ${{ secrets.AUTHENTIK_TOKEN }}
|
||||||
run: terraform init
|
run: terraform init
|
||||||
working-directory: ./terraform/authentik
|
working-directory: ./terraform/authentik
|
||||||
|
|
||||||
- name: Terraform Format
|
- name: Terraform Format
|
||||||
|
env:
|
||||||
|
TF_VAR_authentik_token: ${{ secrets.AUTHENTIK_TOKEN }}
|
||||||
run: terraform fmt -check
|
run: terraform fmt -check
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
working-directory: ./terraform/authentik
|
working-directory: ./terraform/authentik
|
||||||
|
|
||||||
- name: Terraform Apply
|
- name: Terraform Apply
|
||||||
|
env:
|
||||||
|
TF_VAR_authentik_token: ${{ secrets.AUTHENTIK_TOKEN }}
|
||||||
run: terraform apply -var-file proxy-apps.tfvars -var-file oauth2-apps.tfvars -var-file terraform.tfvars -var-file groups.tfvars -input=false -auto-approve -parallelism=100
|
run: terraform apply -var-file proxy-apps.tfvars -var-file oauth2-apps.tfvars -var-file terraform.tfvars -var-file groups.tfvars -input=false -auto-approve -parallelism=100
|
||||||
working-directory: ./terraform/authentik
|
working-directory: ./terraform/authentik
|
||||||
|
|
||||||
- name: Generate Wiki Content
|
- name: Generate Wiki Content
|
||||||
if: success()
|
if: success()
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
env:
|
||||||
|
TF_VAR_authentik_token: ${{ secrets.AUTHENTIK_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
echo "📋 Starting Wiki generation..."
|
echo "📋 Starting Wiki generation..."
|
||||||
cd ./terraform/authentik
|
cd ./terraform/authentik
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
image:
|
image:
|
||||||
tag: 10.10.7
|
tag: 10.11.4
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "2Gi"
|
memory: "2Gi"
|
||||||
@@ -36,8 +36,40 @@ ingress:
|
|||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
|
- host: us.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: ch.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: jp.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: spb.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: cy.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: am.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: de.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
- host: it.hexor.cy
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
tls:
|
tls:
|
||||||
- secretName: jellyfin-tls
|
- secretName: jellyfin-tls
|
||||||
hosts:
|
hosts:
|
||||||
- 'jf.hexor.cy'
|
- '*.hexor.cy'
|
||||||
|
|
||||||
|
|||||||
212
k8s/apps/pasarguard/configmap-scripts-ingress.yaml
Normal file
212
k8s/apps/pasarguard/configmap-scripts-ingress.yaml
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-scripts-ingress
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
data:
|
||||||
|
init-uuid-ingress.sh: |
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
echo "Started"
|
||||||
|
# NODE_NAME is already set via environment variable
|
||||||
|
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
|
||||||
|
|
||||||
|
# Get DNS name from node label xray-public-address
|
||||||
|
DNS_NAME=$(kubectl get node "${NODE_NAME}" -o jsonpath='{.metadata.labels.xray-public-address}')
|
||||||
|
|
||||||
|
if [ -z "${DNS_NAME}" ]; then
|
||||||
|
echo "ERROR: Node ${NODE_NAME} does not have label 'xray-public-address'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Node: ${NODE_NAME}"
|
||||||
|
echo "DNS Name from label: ${DNS_NAME}"
|
||||||
|
|
||||||
|
# Use DNS name for ConfigMap name to ensure uniqueness
|
||||||
|
CONFIGMAP_NAME="node-uuid-ingress-${DNS_NAME//./-}"
|
||||||
|
|
||||||
|
echo "Checking ConfigMap: ${CONFIGMAP_NAME}"
|
||||||
|
|
||||||
|
# Check if ConfigMap exists and get UUID
|
||||||
|
if kubectl get configmap "${CONFIGMAP_NAME}" -n "${NAMESPACE}" &>/dev/null; then
|
||||||
|
echo "ConfigMap exists, reading UUID..."
|
||||||
|
API_KEY=$(kubectl get configmap "${CONFIGMAP_NAME}" -n "${NAMESPACE}" -o jsonpath='{.data.API_KEY}')
|
||||||
|
|
||||||
|
if [ -z "${API_KEY}" ]; then
|
||||||
|
echo "UUID not found in ConfigMap, generating new one..."
|
||||||
|
API_KEY=$(cat /proc/sys/kernel/random/uuid)
|
||||||
|
kubectl patch configmap "${CONFIGMAP_NAME}" -n "${NAMESPACE}" --type merge -p "{\"data\":{\"API_KEY\":\"${API_KEY}\"}}"
|
||||||
|
else
|
||||||
|
echo "Using existing UUID from ConfigMap"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "ConfigMap does not exist, creating new one..."
|
||||||
|
API_KEY=$(cat /proc/sys/kernel/random/uuid)
|
||||||
|
kubectl create configmap "${CONFIGMAP_NAME}" -n "${NAMESPACE}" \
|
||||||
|
--from-literal=API_KEY="${API_KEY}" \
|
||||||
|
--from-literal=NODE_NAME="${NODE_NAME}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save UUID and node info to shared volume for the main container
|
||||||
|
echo -n "${API_KEY}" > /shared/api-key
|
||||||
|
echo -n "${NODE_NAME}" > /shared/node-name
|
||||||
|
echo -n "${CONFIGMAP_NAME}" > /shared/configmap-name
|
||||||
|
echo "UUID initialized: ${API_KEY}"
|
||||||
|
echo "Node name: ${NODE_NAME}"
|
||||||
|
echo "ConfigMap: ${CONFIGMAP_NAME}"
|
||||||
|
|
||||||
|
# Create Certificate for this node using DNS name from label
|
||||||
|
CERT_NAME="pasarguard-node-ingress-${DNS_NAME//./-}"
|
||||||
|
|
||||||
|
echo "Creating Certificate: ${CERT_NAME} for ${DNS_NAME}"
|
||||||
|
|
||||||
|
# Check if Certificate already exists
|
||||||
|
if ! kubectl get certificate "${CERT_NAME}" -n "${NAMESPACE}" &>/dev/null; then
|
||||||
|
echo "Certificate does not exist, creating..."
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: ${CERT_NAME}
|
||||||
|
namespace: ${NAMESPACE}
|
||||||
|
spec:
|
||||||
|
secretName: ${CERT_NAME}-tls
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt
|
||||||
|
kind: ClusterIssuer
|
||||||
|
dnsNames:
|
||||||
|
- ${DNS_NAME}
|
||||||
|
EOF
|
||||||
|
else
|
||||||
|
echo "Certificate already exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wait for certificate to be ready
|
||||||
|
|
||||||
|
echo "Waiting for certificate to be ready..."
|
||||||
|
for i in {1..600}; do
|
||||||
|
if kubectl get secret "${CERT_NAME}-tls" -n "${NAMESPACE}" &>/dev/null; then
|
||||||
|
echo "Certificate secret is ready!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo "Waiting for certificate... ($i/600)"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! kubectl get secret "${CERT_NAME}-tls" -n "${NAMESPACE}" &>/dev/null; then
|
||||||
|
echo "WARNING: Certificate secret not ready after 600 seconds"
|
||||||
|
else
|
||||||
|
# Extract certificate and key from secret to shared volume
|
||||||
|
echo "Extracting certificate and key..."
|
||||||
|
kubectl get secret "${CERT_NAME}-tls" -n "${NAMESPACE}" -o jsonpath='{.data.tls\.crt}' | base64 -d > /shared/tls.crt
|
||||||
|
kubectl get secret "${CERT_NAME}-tls" -n "${NAMESPACE}" -o jsonpath='{.data.tls\.key}' | base64 -d > /shared/tls.key
|
||||||
|
echo "Certificate and key extracted successfully."
|
||||||
|
cat /shared/tls.crt
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create ClusterIP Service for this node (pod selector based)
|
||||||
|
NODE_SHORT_NAME="${NODE_NAME%%.*}"
|
||||||
|
SERVICE_NAME="${NODE_SHORT_NAME}-ingress"
|
||||||
|
|
||||||
|
echo "Creating Service: ${SERVICE_NAME} for node ${NODE_NAME} (short: ${NODE_SHORT_NAME})"
|
||||||
|
|
||||||
|
# Create Service with pod selector including node name
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: ${SERVICE_NAME}
|
||||||
|
namespace: ${NAMESPACE}
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
node: ${NODE_NAME}
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
node-name: ${NODE_SHORT_NAME}
|
||||||
|
ports:
|
||||||
|
- name: proxy
|
||||||
|
port: 443
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 443
|
||||||
|
- name: api
|
||||||
|
port: 62050
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 62050
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Service created: ${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local"
|
||||||
|
|
||||||
|
# Create IngressRouteTCP for this DNS name with TLS passthrough
|
||||||
|
INGRESS_NAME="pasarguard-tcp-${DNS_NAME//./-}"
|
||||||
|
|
||||||
|
echo "Creating IngressRouteTCP: ${INGRESS_NAME} for ${DNS_NAME}"
|
||||||
|
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: IngressRouteTCP
|
||||||
|
metadata:
|
||||||
|
name: ${INGRESS_NAME}
|
||||||
|
namespace: ${NAMESPACE}
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
node: ${NODE_NAME}
|
||||||
|
spec:
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
routes:
|
||||||
|
- match: HostSNI(\`${DNS_NAME}\`)
|
||||||
|
services:
|
||||||
|
- name: ${SERVICE_NAME}
|
||||||
|
port: 443
|
||||||
|
tls:
|
||||||
|
passthrough: true
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "IngressRouteTCP created: ${INGRESS_NAME}"
|
||||||
|
echo "Traffic to ${DNS_NAME}:443 will be routed to ${SERVICE_NAME}:443"
|
||||||
|
|
||||||
|
# Create second IngressRouteTCP for API port 62051
|
||||||
|
INGRESS_API_NAME="pasarguard-api-${DNS_NAME//./-}"
|
||||||
|
|
||||||
|
echo "Creating IngressRouteTCP for API: ${INGRESS_API_NAME} for ${DNS_NAME}:62051"
|
||||||
|
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: IngressRouteTCP
|
||||||
|
metadata:
|
||||||
|
name: ${INGRESS_API_NAME}
|
||||||
|
namespace: ${NAMESPACE}
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
node: ${NODE_NAME}
|
||||||
|
spec:
|
||||||
|
entryPoints:
|
||||||
|
- pasarguard-api
|
||||||
|
routes:
|
||||||
|
- match: HostSNI(\`${DNS_NAME}\`)
|
||||||
|
services:
|
||||||
|
- name: ${SERVICE_NAME}
|
||||||
|
port: 62050
|
||||||
|
tls:
|
||||||
|
passthrough: true
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "IngressRouteTCP API created: ${INGRESS_API_NAME}"
|
||||||
|
echo "Traffic to ${DNS_NAME}:62051 will be routed to ${SERVICE_NAME}:62050"
|
||||||
|
|
||||||
|
pasarguard-start.sh: |
|
||||||
|
#!/bin/sh
|
||||||
|
# Read API_KEY from shared volume created by init container
|
||||||
|
if [ -f /shared/api-key ]; then
|
||||||
|
export API_KEY=$(cat /shared/api-key)
|
||||||
|
echo "Loaded API_KEY from shared volume"
|
||||||
|
else
|
||||||
|
echo "WARNING: API_KEY file not found, using default"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd /app
|
||||||
|
exec ./main
|
||||||
211
k8s/apps/pasarguard/daemonset-ingress.yaml
Normal file
211
k8s/apps/pasarguard/daemonset-ingress.yaml
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress-configmap
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["configmaps"]
|
||||||
|
verbs: ["get", "list", "create", "update", "patch"]
|
||||||
|
- apiGroups: ["cert-manager.io"]
|
||||||
|
resources: ["certificates"]
|
||||||
|
verbs: ["get", "list", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["secrets"]
|
||||||
|
verbs: ["get", "list"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["services", "endpoints"]
|
||||||
|
verbs: ["get", "list", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: ["traefik.io", "traefik.containo.us"]
|
||||||
|
resources: ["ingressroutetcps"]
|
||||||
|
verbs: ["get", "list", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["pods"]
|
||||||
|
verbs: ["get", "list", "patch", "update"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress-configmap
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: pasarguard-node-ingress-configmap
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: pasarguard-node-ingress
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRole
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress-reader
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["nodes"]
|
||||||
|
verbs: ["get", "list"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress-reader
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: ClusterRole
|
||||||
|
name: pasarguard-node-ingress-reader
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: pasarguard-node-ingress
|
||||||
|
namespace: pasarguard
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: DaemonSet
|
||||||
|
metadata:
|
||||||
|
name: pasarguard-node-ingress
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
revisionHistoryLimit: 3
|
||||||
|
updateStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: pasarguard-node-ingress
|
||||||
|
spec:
|
||||||
|
serviceAccountName: pasarguard-node-ingress
|
||||||
|
affinity:
|
||||||
|
nodeAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
nodeSelectorTerms:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: xray-public-address
|
||||||
|
operator: Exists
|
||||||
|
initContainers:
|
||||||
|
- name: label-pod
|
||||||
|
image: bitnami/kubectl:latest
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
- name: NODE_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
# Add node label to pod
|
||||||
|
NODE_SHORT=$(echo ${NODE_NAME} | cut -d. -f1)
|
||||||
|
kubectl label pod ${POD_NAME} -n ${POD_NAMESPACE} node-name=${NODE_SHORT} --overwrite
|
||||||
|
- name: init-uuid
|
||||||
|
image: bitnami/kubectl:latest
|
||||||
|
env:
|
||||||
|
- name: GODEBUG
|
||||||
|
value: "x509sha1=1"
|
||||||
|
- name: NODE_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- /scripts/init-uuid-ingress.sh
|
||||||
|
volumeMounts:
|
||||||
|
- name: shared-data
|
||||||
|
mountPath: /shared
|
||||||
|
- name: scripts
|
||||||
|
mountPath: /scripts
|
||||||
|
containers:
|
||||||
|
- name: pasarguard-node
|
||||||
|
image: 'pasarguard/node:v0.1.3'
|
||||||
|
imagePullPolicy: Always
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- /scripts/pasarguard-start.sh
|
||||||
|
ports:
|
||||||
|
- name: api
|
||||||
|
containerPort: 62050
|
||||||
|
protocol: TCP
|
||||||
|
- name: proxy
|
||||||
|
containerPort: 443
|
||||||
|
protocol: TCP
|
||||||
|
env:
|
||||||
|
- name: NODE_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
- name: NODE_HOST
|
||||||
|
value: "0.0.0.0"
|
||||||
|
- name: SERVICE_PORT
|
||||||
|
value: "62050"
|
||||||
|
- name: SERVICE_PROTOCOL
|
||||||
|
value: "grpc"
|
||||||
|
- name: DEBUG
|
||||||
|
value: "true"
|
||||||
|
- name: SSL_CERT_FILE
|
||||||
|
value: "/shared/tls.crt"
|
||||||
|
- name: SSL_KEY_FILE
|
||||||
|
value: "/shared/tls.key"
|
||||||
|
- name: XRAY_EXECUTABLE_PATH
|
||||||
|
value: "/usr/local/bin/xray"
|
||||||
|
- name: XRAY_ASSETS_PATH
|
||||||
|
value: "/usr/local/share/xray"
|
||||||
|
- name: API_KEY
|
||||||
|
value: "change-this-to-a-secure-uuid"
|
||||||
|
livenessProbe:
|
||||||
|
tcpSocket:
|
||||||
|
port: 62050
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 3
|
||||||
|
readinessProbe:
|
||||||
|
tcpSocket:
|
||||||
|
port: 62050
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 3
|
||||||
|
failureThreshold: 3
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "128Mi"
|
||||||
|
cpu: "100m"
|
||||||
|
limits:
|
||||||
|
memory: "512Mi"
|
||||||
|
cpu: "750m"
|
||||||
|
volumeMounts:
|
||||||
|
- name: shared-data
|
||||||
|
mountPath: /shared
|
||||||
|
readOnly: false
|
||||||
|
- name: scripts
|
||||||
|
mountPath: /scripts
|
||||||
|
volumes:
|
||||||
|
- name: shared-data
|
||||||
|
emptyDir: {}
|
||||||
|
- name: scripts
|
||||||
|
configMap:
|
||||||
|
name: pasarguard-scripts-ingress
|
||||||
|
defaultMode: 0755
|
||||||
@@ -112,47 +112,8 @@ spec:
|
|||||||
- name: scripts
|
- name: scripts
|
||||||
mountPath: /scripts
|
mountPath: /scripts
|
||||||
containers:
|
containers:
|
||||||
- name: xray-exporter
|
|
||||||
image: alpine:3.18
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
command:
|
|
||||||
- /bin/sh
|
|
||||||
- /scripts/exporter-start.sh
|
|
||||||
ports:
|
|
||||||
- name: metrics
|
|
||||||
containerPort: 9550
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /scrape
|
|
||||||
port: metrics
|
|
||||||
initialDelaySeconds: 60
|
|
||||||
periodSeconds: 30
|
|
||||||
timeoutSeconds: 10
|
|
||||||
failureThreshold: 3
|
|
||||||
readinessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /scrape
|
|
||||||
port: metrics
|
|
||||||
initialDelaySeconds: 45
|
|
||||||
periodSeconds: 10
|
|
||||||
timeoutSeconds: 5
|
|
||||||
failureThreshold: 3
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
memory: "64Mi"
|
|
||||||
cpu: "50m"
|
|
||||||
limits:
|
|
||||||
memory: "128Mi"
|
|
||||||
cpu: "150m"
|
|
||||||
volumeMounts:
|
|
||||||
- name: shared-data
|
|
||||||
mountPath: /shared
|
|
||||||
readOnly: true
|
|
||||||
- name: scripts
|
|
||||||
mountPath: /scripts
|
|
||||||
- name: pasarguard-node
|
- name: pasarguard-node
|
||||||
image: 'pasarguard/node:v0.1.1'
|
image: 'pasarguard/node:v0.1.3'
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
@@ -211,6 +172,46 @@ spec:
|
|||||||
readOnly: false
|
readOnly: false
|
||||||
- name: scripts
|
- name: scripts
|
||||||
mountPath: /scripts
|
mountPath: /scripts
|
||||||
|
|
||||||
|
- name: xray-exporter
|
||||||
|
image: alpine:3.18
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- /scripts/exporter-start.sh
|
||||||
|
ports:
|
||||||
|
- name: metrics
|
||||||
|
containerPort: 9550
|
||||||
|
protocol: TCP
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /scrape
|
||||||
|
port: metrics
|
||||||
|
initialDelaySeconds: 60
|
||||||
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 10
|
||||||
|
failureThreshold: 3
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /scrape
|
||||||
|
port: metrics
|
||||||
|
initialDelaySeconds: 45
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 3
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "64Mi"
|
||||||
|
cpu: "50m"
|
||||||
|
limits:
|
||||||
|
memory: "128Mi"
|
||||||
|
cpu: "150m"
|
||||||
|
volumeMounts:
|
||||||
|
- name: shared-data
|
||||||
|
mountPath: /shared
|
||||||
|
readOnly: true
|
||||||
|
- name: scripts
|
||||||
|
mountPath: /scripts
|
||||||
volumes:
|
volumes:
|
||||||
- name: shared-data
|
- name: shared-data
|
||||||
emptyDir: {}
|
emptyDir: {}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ spec:
|
|||||||
mountPath: /templates/subscription
|
mountPath: /templates/subscription
|
||||||
containers:
|
containers:
|
||||||
- name: pasarguard-web
|
- name: pasarguard-web
|
||||||
image: 'pasarguard/panel:v1.7.2'
|
image: 'pasarguard/panel:latest'
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
|
|||||||
@@ -9,3 +9,6 @@ resources:
|
|||||||
- ./certificate.yaml
|
- ./certificate.yaml
|
||||||
- ./configmap-scripts.yaml
|
- ./configmap-scripts.yaml
|
||||||
- ./servicemonitor.yaml
|
- ./servicemonitor.yaml
|
||||||
|
- ./configmap-scripts-ingress.yaml
|
||||||
|
# - ./daemonset-ingress.yaml
|
||||||
|
# - ./traefik-pasarguard-entrypoint.yaml
|
||||||
|
|||||||
66
k8s/apps/pasarguard/traefik-pasarguard-entrypoint.yaml
Normal file
66
k8s/apps/pasarguard/traefik-pasarguard-entrypoint.yaml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: traefik
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: traefik
|
||||||
|
args:
|
||||||
|
- --entryPoints.metrics.address=:9100/tcp
|
||||||
|
- --entryPoints.traefik.address=:8080/tcp
|
||||||
|
- --entryPoints.web.address=:8000/tcp
|
||||||
|
- --entryPoints.websecure.address=:8443/tcp
|
||||||
|
- --entryPoints.pasarguard-api.address=:62051/tcp
|
||||||
|
- --api.dashboard=true
|
||||||
|
- --ping=true
|
||||||
|
- --metrics.prometheus=true
|
||||||
|
- --metrics.prometheus.entrypoint=metrics
|
||||||
|
- --providers.kubernetescrd
|
||||||
|
- --providers.kubernetescrd.allowEmptyServices=true
|
||||||
|
- --providers.kubernetesingress
|
||||||
|
- --providers.kubernetesingress.allowEmptyServices=true
|
||||||
|
- --providers.kubernetesingress.ingressendpoint.publishedservice=kube-system/traefik
|
||||||
|
- --entryPoints.websecure.http.tls=true
|
||||||
|
- --log.level=INFO
|
||||||
|
- --entryPoints.web.transport.respondingTimeouts.readTimeout=0s
|
||||||
|
- --entryPoints.websecure.transport.respondingTimeouts.readTimeout=0s
|
||||||
|
ports:
|
||||||
|
- containerPort: 9100
|
||||||
|
name: metrics
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 8080
|
||||||
|
name: traefik
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 8000
|
||||||
|
name: web
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 8443
|
||||||
|
name: websecure
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 62051
|
||||||
|
name: pasarguard-api
|
||||||
|
protocol: TCP
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: traefik
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: web
|
||||||
|
port: 80
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: web
|
||||||
|
- name: websecure
|
||||||
|
port: 443
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: websecure
|
||||||
|
- name: pasarguard-api
|
||||||
|
port: 62051
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: pasarguard-api
|
||||||
@@ -30,7 +30,7 @@ spec:
|
|||||||
name: get-id-bot
|
name: get-id-bot
|
||||||
env:
|
env:
|
||||||
- name: RUST_LOG
|
- name: RUST_LOG
|
||||||
value: "info"
|
value: "info,teloxide::error_handlers=off"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,3 +7,4 @@ resources:
|
|||||||
- get-id-bot.yaml
|
- get-id-bot.yaml
|
||||||
- external-secrets.yaml
|
- external-secrets.yaml
|
||||||
- desubot.yaml
|
- desubot.yaml
|
||||||
|
- restart-job.yaml
|
||||||
|
|||||||
56
k8s/apps/tg-bots/restart-job.yaml
Normal file
56
k8s/apps/tg-bots/restart-job.yaml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: tg-bots-restart-sa
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: tg-bots-restart-role
|
||||||
|
rules:
|
||||||
|
- apiGroups: ["apps"]
|
||||||
|
resources: ["deployments"]
|
||||||
|
verbs: ["get", "patch"]
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: tg-bots-restart-rb
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: tg-bots-restart-sa
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: tg-bots-restart-role
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: CronJob
|
||||||
|
metadata:
|
||||||
|
name: tg-bots-daily-restart
|
||||||
|
spec:
|
||||||
|
schedule: "0 4 * * *" # every day at 04:00
|
||||||
|
jobTemplate:
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
serviceAccountName: tg-bots-restart-sa
|
||||||
|
restartPolicy: OnFailure
|
||||||
|
containers:
|
||||||
|
- name: kubectl
|
||||||
|
image: bitnami/kubectl:latest
|
||||||
|
env:
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
kubectl -n "$POD_NAMESPACE" rollout restart deployment/desubot
|
||||||
|
kubectl -n "$POD_NAMESPACE" rollout restart deployment/get-id-bot
|
||||||
@@ -121,6 +121,8 @@ spec:
|
|||||||
{{ .pasarguard }}
|
{{ .pasarguard }}
|
||||||
USER_remnawave: |-
|
USER_remnawave: |-
|
||||||
{{ .remnawave }}
|
{{ .remnawave }}
|
||||||
|
USER_umami: |-
|
||||||
|
{{ .umami }}
|
||||||
data:
|
data:
|
||||||
- secretKey: authentik
|
- secretKey: authentik
|
||||||
sourceRef:
|
sourceRef:
|
||||||
@@ -232,3 +234,14 @@ spec:
|
|||||||
metadataPolicy: None
|
metadataPolicy: None
|
||||||
key: 2a9deb39-ef22-433e-a1be-df1555625e22
|
key: 2a9deb39-ef22-433e-a1be-df1555625e22
|
||||||
property: fields[10].value
|
property: fields[10].value
|
||||||
|
- secretKey: umami
|
||||||
|
sourceRef:
|
||||||
|
storeRef:
|
||||||
|
name: vaultwarden-login
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
metadataPolicy: None
|
||||||
|
key: 2a9deb39-ef22-433e-a1be-df1555625e22
|
||||||
|
property: fields[11].value
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
image:
|
image:
|
||||||
tag: "9.9"
|
tag: "latest"
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
env:
|
env:
|
||||||
email: "postgres@hexor.cy"
|
email: "postgres@hexor.cy"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ spec:
|
|||||||
serviceAccountName: system-upgrade
|
serviceAccountName: system-upgrade
|
||||||
upgrade:
|
upgrade:
|
||||||
image: rancher/k3s-upgrade
|
image: rancher/k3s-upgrade
|
||||||
version: v1.34.1+k3s1
|
version: v1.34.2+k3s1
|
||||||
---
|
---
|
||||||
# Agent plan
|
# Agent plan
|
||||||
apiVersion: upgrade.cattle.io/v1
|
apiVersion: upgrade.cattle.io/v1
|
||||||
@@ -39,5 +39,5 @@ spec:
|
|||||||
serviceAccountName: system-upgrade
|
serviceAccountName: system-upgrade
|
||||||
upgrade:
|
upgrade:
|
||||||
image: rancher/k3s-upgrade
|
image: rancher/k3s-upgrade
|
||||||
version: v1.34.1+k3s1
|
version: v1.34.2+k3s1
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,6 @@ terraform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider "authentik" {
|
provider "authentik" {
|
||||||
url = "https://idm.hexor.cy"
|
url = var.authentik_url
|
||||||
token = "qXcuoCg77JaRgqnU6rqIIBa8MBJ4UNyLPTL89dZI8zeC2jfaWqQ7k56BJs8F"
|
token = var.authentik_token
|
||||||
}
|
}
|
||||||
@@ -129,12 +129,12 @@ EOT
|
|||||||
access_groups = ["admins"]
|
access_groups = ["admins"]
|
||||||
}
|
}
|
||||||
|
|
||||||
"syncthing-master" = {
|
"syncthing-router" = {
|
||||||
name = "Syncthing-master"
|
name = "Syncthing"
|
||||||
slug = "syncthing-master"
|
slug = "syncthing"
|
||||||
group = "Media and Storage"
|
group = "Media and Storage"
|
||||||
external_host = "https://ss.hexor.cy"
|
external_host = "https://ss.hexor.cy"
|
||||||
internal_host = "https://syncthing-master.syncthing.svc:8384"
|
internal_host = "http://syncthing-router.syncthing.svc:80"
|
||||||
internal_host_ssl_validation = false
|
internal_host_ssl_validation = false
|
||||||
meta_description = ""
|
meta_description = ""
|
||||||
meta_icon = "https://img.icons8.com/?size=100&id=Id4NcEcXcYzF&format=png&color=000000"
|
meta_icon = "https://img.icons8.com/?size=100&id=Id4NcEcXcYzF&format=png&color=000000"
|
||||||
@@ -198,7 +198,7 @@ EOT
|
|||||||
skip_path_regex = <<-EOT
|
skip_path_regex = <<-EOT
|
||||||
/sub/
|
/sub/
|
||||||
/dashboard/
|
/dashboard/
|
||||||
/
|
/api/
|
||||||
EOT
|
EOT
|
||||||
meta_icon = "https://img.icons8.com/?size=100&id=fqAD3lAB6zTe&format=png&color=000000"
|
meta_icon = "https://img.icons8.com/?size=100&id=fqAD3lAB6zTe&format=png&color=000000"
|
||||||
mode = "proxy"
|
mode = "proxy"
|
||||||
|
|||||||
@@ -166,3 +166,9 @@ variable "authentik_url" {
|
|||||||
type = string
|
type = string
|
||||||
default = "https://idm.hexor.cy"
|
default = "https://idm.hexor.cy"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "authentik_token" {
|
||||||
|
description = "Authentik API token (set via TF_VAR_authentik_token env var)"
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user