230 lines
6.4 KiB
Bash
230 lines
6.4 KiB
Bash
#!/bin/bash
|
||
# Bifrost Helm Chart Installation Script
|
||
# This script helps you install Bifrost with different configurations
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Print colored output
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ ${NC}$1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✓ ${NC}$1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠ ${NC}$1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}✗ ${NC}$1"
|
||
}
|
||
|
||
# Print banner
|
||
print_banner() {
|
||
echo ""
|
||
echo -e "${BLUE}╔═══════════════════════════════════════════╗${NC}"
|
||
echo -e "${BLUE}║ ║${NC}"
|
||
echo -e "${BLUE}║ Bifrost Helm Chart Installer ║${NC}"
|
||
echo -e "${BLUE}║ ║${NC}"
|
||
echo -e "${BLUE}╚═══════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
}
|
||
|
||
# Check prerequisites
|
||
check_prerequisites() {
|
||
print_info "Checking prerequisites..."
|
||
|
||
if ! command -v helm &> /dev/null; then
|
||
print_error "Helm is not installed. Please install Helm 3.2.0 or later."
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v kubectl &> /dev/null; then
|
||
print_error "kubectl is not installed. Please install kubectl."
|
||
exit 1
|
||
fi
|
||
|
||
# Check kubectl connection
|
||
if ! kubectl cluster-info &> /dev/null; then
|
||
print_error "Cannot connect to Kubernetes cluster. Please check your kubeconfig."
|
||
exit 1
|
||
fi
|
||
|
||
print_success "All prerequisites met"
|
||
}
|
||
|
||
# Show menu
|
||
show_menu() {
|
||
echo ""
|
||
echo "Select a deployment configuration:"
|
||
echo ""
|
||
echo " 1) SQLite only (simple, local development)"
|
||
echo " 2) PostgreSQL only (production-ready database)"
|
||
echo " 3) PostgreSQL + Weaviate (semantic caching with Weaviate)"
|
||
echo " 4) PostgreSQL + Redis (semantic caching with Redis)"
|
||
echo " 5) SQLite + Weaviate (local dev with semantic caching)"
|
||
echo " 6) SQLite + Redis (local dev with Redis caching)"
|
||
echo " 7) External PostgreSQL (use your own database)"
|
||
echo " 8) Production HA (high-availability setup)"
|
||
echo " 9) Custom (use your own values file)"
|
||
echo ""
|
||
echo " 0) Exit"
|
||
echo ""
|
||
}
|
||
|
||
# Get user input
|
||
get_input() {
|
||
read -p "Enter your choice [0-9]: " choice
|
||
case $choice in
|
||
1) CONFIG="sqlite-only" ;;
|
||
2) CONFIG="postgres-only" ;;
|
||
3) CONFIG="postgres-weaviate" ;;
|
||
4) CONFIG="postgres-redis" ;;
|
||
5) CONFIG="sqlite-weaviate" ;;
|
||
6) CONFIG="sqlite-redis" ;;
|
||
7) CONFIG="external-postgres" ;;
|
||
8) CONFIG="production-ha" ;;
|
||
9) CONFIG="custom" ;;
|
||
0) exit 0 ;;
|
||
*)
|
||
print_error "Invalid choice. Please try again."
|
||
return 1
|
||
;;
|
||
esac
|
||
return 0
|
||
}
|
||
|
||
# Get release name
|
||
get_release_name() {
|
||
read -p "Enter release name (default: bifrost): " RELEASE_NAME
|
||
RELEASE_NAME=${RELEASE_NAME:-bifrost}
|
||
}
|
||
|
||
# Get namespace
|
||
get_namespace() {
|
||
read -p "Enter namespace (default: default): " NAMESPACE
|
||
NAMESPACE=${NAMESPACE:-default}
|
||
|
||
# Check if namespace exists
|
||
if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then
|
||
read -p "Namespace '$NAMESPACE' does not exist. Create it? (y/n): " CREATE_NS
|
||
if [[ "$CREATE_NS" =~ ^[Yy]$ ]]; then
|
||
kubectl create namespace "$NAMESPACE"
|
||
print_success "Namespace '$NAMESPACE' created"
|
||
else
|
||
print_error "Installation aborted"
|
||
exit 1
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# Get custom values file
|
||
get_custom_values() {
|
||
read -p "Enter path to custom values file: " CUSTOM_VALUES
|
||
if [[ ! -f "$CUSTOM_VALUES" ]]; then
|
||
print_error "File not found: $CUSTOM_VALUES"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Install chart
|
||
install_chart() {
|
||
local values_file=""
|
||
|
||
if [[ "$CONFIG" == "custom" ]]; then
|
||
# Validate that CUSTOM_VALUES is non-empty
|
||
if [[ -z "$CUSTOM_VALUES" ]]; then
|
||
print_error "Custom values file path is empty"
|
||
exit 1
|
||
fi
|
||
values_file="$CUSTOM_VALUES"
|
||
# Validate that the custom values file exists and is a regular file
|
||
if [[ ! -f "$values_file" ]]; then
|
||
print_error "Custom values file does not exist or is not a regular file: $values_file"
|
||
exit 1
|
||
fi
|
||
else
|
||
values_file="${CHART_DIR}/values-examples/${CONFIG}.yaml"
|
||
# Validate that the predefined values file exists
|
||
if [[ ! -f "$values_file" ]]; then
|
||
print_error "Values file does not exist: $values_file"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
print_info "Installing Bifrost..."
|
||
print_info "Release: $RELEASE_NAME"
|
||
print_info "Namespace: $NAMESPACE"
|
||
print_info "Configuration: $CONFIG"
|
||
echo ""
|
||
|
||
# Ask for confirmation
|
||
read -p "Proceed with installation? (y/n): " CONFIRM
|
||
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
||
print_warning "Installation cancelled"
|
||
exit 0
|
||
fi
|
||
|
||
# Run helm install with explicit chart directory
|
||
if helm install "$RELEASE_NAME" "$CHART_DIR" \
|
||
--namespace "$NAMESPACE" \
|
||
-f "$values_file" \
|
||
--create-namespace; then
|
||
|
||
print_success "Bifrost installed successfully!"
|
||
echo ""
|
||
print_info "To check the status:"
|
||
echo " helm status $RELEASE_NAME -n $NAMESPACE"
|
||
echo ""
|
||
print_info "To get the application URL:"
|
||
echo " kubectl --namespace $NAMESPACE port-forward svc/$RELEASE_NAME 8080:8080"
|
||
echo " Then visit: http://localhost:8080"
|
||
echo ""
|
||
print_info "To view logs:"
|
||
echo " kubectl logs -l app.kubernetes.io/name=bifrost -n $NAMESPACE -f"
|
||
echo ""
|
||
else
|
||
print_error "Installation failed"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Main function
|
||
main() {
|
||
print_banner
|
||
check_prerequisites
|
||
|
||
while true; do
|
||
show_menu
|
||
if get_input; then
|
||
break
|
||
fi
|
||
done
|
||
|
||
get_release_name
|
||
get_namespace
|
||
|
||
if [[ "$CONFIG" == "custom" ]]; then
|
||
get_custom_values
|
||
fi
|
||
|
||
# Set explicit chart directory (parent of scripts directory)
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
CHART_DIR="$SCRIPT_DIR/.."
|
||
|
||
install_chart
|
||
}
|
||
|
||
# Run main function
|
||
main
|
||
|