Files
Maison/arti-api/deploy-traefik.sh
2026-02-10 12:12:11 +01:00

161 lines
6.0 KiB
Bash
Executable File

#!/bin/bash
# Traefik v2 IngressRoute Deployment Script for Artifactory
# Deploys the complete artifactory stack with Traefik-based access control
set -e
echo "🚀 Deploying Artifactory with Traefik v2 IngressRoute..."
echo "=================================================="
echo ""
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
NAMESPACE="artifactory"
TRAEFIK_VERSION="simple" # Change to "full" for full-featured version
echo "📋 Configuration:"
echo " Namespace: $NAMESPACE"
echo " Internal Network: 192.168.100.0/24"
echo " Traefik Version: $TRAEFIK_VERSION"
echo ""
# Check prerequisites
echo "🔍 Checking prerequisites..."
if ! command -v kubectl &> /dev/null; then
echo -e "${RED}kubectl not found. Please install kubectl first.${NC}"
exit 1
fi
# Check if Traefik is running
TRAEFIK_PODS=$(kubectl get pods -A -l app.kubernetes.io/name=traefik --no-headers 2>/dev/null | wc -l)
if [ "$TRAEFIK_PODS" -eq 0 ]; then
echo -e "⚠️ ${YELLOW}Warning: No Traefik pods found. Make sure Traefik v2 is installed.${NC}"
echo " You can install Traefik with:"
echo " helm repo add traefik https://helm.traefik.io/traefik"
echo " helm install traefik traefik/traefik"
echo ""
fi
# Create namespace if it doesn't exist
echo "📦 Creating namespace..."
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
# Deploy the base services (without ingress)
echo "🏗️ Deploying base services..."
kubectl apply -f kubernetes.yaml -n $NAMESPACE 2>/dev/null || echo " Note: Base services might already exist"
# Wait for services to be ready
echo "⏳ Waiting for services to be ready..."
kubectl wait --for=condition=available --timeout=120s deployment/arti-api -n $NAMESPACE 2>/dev/null || echo " Arti-API deployment not found, continuing..."
# Deploy Traefik IngressRoute
echo "🌐 Deploying Traefik IngressRoute..."
if [ "$TRAEFIK_VERSION" = "full" ]; then
kubectl apply -f traefik-ingressroute.yaml
echo -e "${GREEN}Full-featured Traefik configuration deployed${NC}"
else
kubectl apply -f traefik-simple.yaml
echo -e "${GREEN}Simplified Traefik configuration deployed${NC}"
fi
# Check deployment status
echo ""
echo "📊 Deployment Status:"
echo " Deployments:"
kubectl get deployments -n $NAMESPACE 2>/dev/null | grep -E "(NAME|arti-api|chartmuseum|docker-registry|error-service)" || echo " No deployments found"
echo " Services:"
kubectl get services -n $NAMESPACE 2>/dev/null | grep -E "(NAME|arti-api|chartmuseum|docker-registry|error-service)" || echo " No services found"
echo " IngressRoutes:"
kubectl get ingressroute -n $NAMESPACE 2>/dev/null | grep -E "(NAME|arti|chart|registry)" || echo " No IngressRoutes found"
echo " Middlewares:"
kubectl get middleware -n $NAMESPACE 2>/dev/null | grep -E "(NAME|internal|external|block)" || echo " No middlewares found"
echo ""
# Get Traefik external IP/URL
TRAEFIK_SERVICE=$(kubectl get svc -A -l app.kubernetes.io/name=traefik --no-headers 2>/dev/null | head -1)
if [ -n "$TRAEFIK_SERVICE" ]; then
TRAEFIK_IP=$(echo $TRAEFIK_SERVICE | awk '{print $5}')
echo -e "🌐 ${BLUE}Traefik Service Info:${NC}"
echo " $TRAEFIK_SERVICE"
echo ""
fi
# Display access information
echo "🎯 Access Information:"
echo ""
echo -e "📱 ${GREEN}Service URLs:${NC}"
echo " 🔧 Arti-API: http://api.artifactory.local"
echo " 📚 API Docs: http://api.artifactory.local/docs"
echo " ⛵ Chart Museum: http://charts.artifactory.local"
echo " 🐳 Docker Registry: http://registry.artifactory.local"
echo ""
echo -e "🔐 ${YELLOW}Access Control:${NC}"
echo " 🏠 Internal Network (192.168.100.0/24): Full access to all endpoints"
echo " 🌐 External Network: Limited to health endpoints only"
echo ""
echo -e "${GREEN}Health Endpoints (External Access):${NC}"
echo " curl http://api.artifactory.local/health"
echo " curl http://charts.artifactory.local/health"
echo " curl http://registry.artifactory.local/v2/"
echo ""
echo -e "🚫 ${RED}Blocked Endpoints (External Access):${NC}"
echo " curl http://api.artifactory.local/users # Returns 403"
echo " curl http://charts.artifactory.local/api/charts # Returns 403"
echo " curl http://registry.artifactory.local/v2/myapp/ # Returns 403"
echo ""
echo -e "🏠 ${GREEN}Internal Network Examples (192.168.100.x):${NC}"
echo " curl http://api.artifactory.local/users # Full access"
echo " curl http://charts.artifactory.local/api/charts # Full access"
echo " docker login registry.artifactory.local # Full access"
echo ""
echo -e "🔧 ${BLUE}DNS Configuration:${NC}"
echo " Add these entries to your /etc/hosts or DNS server:"
echo " $TRAEFIK_IP api.artifactory.local"
echo " $TRAEFIK_IP charts.artifactory.local"
echo " $TRAEFIK_IP registry.artifactory.local"
echo ""
echo -e "📋 ${BLUE}Management Commands:${NC}"
echo " # View IngressRoute details:"
echo " kubectl describe ingressroute -n $NAMESPACE"
echo ""
echo " # Check middleware configuration:"
echo " kubectl get middleware -n $NAMESPACE -o yaml"
echo ""
echo " # View Traefik dashboard (if enabled):"
echo " kubectl port-forward -n traefik service/traefik 9000:9000"
echo " # Then access: http://localhost:9000/dashboard/"
echo ""
echo " # Test from internal network:"
echo " kubectl run test-internal --rm -i --tty --image=curlimages/curl -- sh"
echo ""
echo " # Clean up:"
echo " kubectl delete ingressroute,middleware,configmap,deployment,service -n $NAMESPACE -l app=error-service"
echo " kubectl delete -f traefik-${TRAEFIK_VERSION}.yaml"
echo ""
echo -e "🎉 ${GREEN}Traefik IngressRoute deployment completed!${NC}"
echo ""
echo -e "📖 ${BLUE}Next Steps:${NC}"
echo " 1. Configure DNS entries for the artifactory domains"
echo " 2. Test access from internal network (192.168.100.x)"
echo " 3. Verify external access is properly restricted"
echo " 4. Set up TLS certificates for production use"
echo " 5. Configure Traefik dashboard access if needed"