--- 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-node-address DNS_NAME=$(kubectl get node "${NODE_NAME}" -o jsonpath='{.metadata.labels.xray-node-address}') if [ -z "${DNS_NAME}" ]; then echo "ERROR: Node ${NODE_NAME} does not have label 'xray-node-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 </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 cat </dev/null; do if [ -f /shared/xray-api-port ]; then NEW_PORT=$(cat /shared/xray-api-port) if [ "$NEW_PORT" != "$API_PORT" ]; then echo "API port changed from $API_PORT to $NEW_PORT, restarting exporter" kill $EXPORTER_PID 2>/dev/null wait $EXPORTER_PID 2>/dev/null break fi fi sleep 5 done echo "Exporter stopped, restarting..." wait $EXPORTER_PID 2>/dev/null fi fi sleep 2 done 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 # Start main process in background ./main & MAIN_PID=$! # Detect xray API port BEFORE starting monitoring loop echo "Detecting xray API port..." for i in $(seq 1 60); do API_PORT=$(netstat -tlnp 2>/dev/null | grep xray | grep 127.0.0.1 | awk '{print $4}' | cut -d: -f2 | head -1) if [ -n "$API_PORT" ]; then echo "Found xray API port: $API_PORT" echo -n "$API_PORT" > /shared/xray-api-port break fi echo "Waiting for xray to start... ($i/60)" sleep 1 done if [ -z "$API_PORT" ]; then echo "WARNING: Could not detect xray API port after 60 seconds" fi # Start continuous port monitoring in background { LAST_PORT="$API_PORT" while true; do API_PORT=$(netstat -tlnp 2>/dev/null | grep xray | grep 127.0.0.1 | awk '{print $4}' | cut -d: -f2 | head -1) if [ -n "$API_PORT" ] && [ "$API_PORT" != "$LAST_PORT" ]; then echo "API port changed from $LAST_PORT to $API_PORT" echo -n "$API_PORT" > /shared/xray-api-port LAST_PORT="$API_PORT" fi sleep 5 # Check every 5 seconds done } & PORT_MONITOR_PID=$! # Wait for main process to finish wait $MAIN_PID # Clean up port monitor kill $PORT_MONITOR_PID 2>/dev/null