Add the deploy script for the media stack
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
The `deploy.sh` script in this repository is used to automatically rollout an \*arr stack on kubernetes.
|
||||||
|
|
||||||
|
Detailed instructions about this stack can be found in it's [own repository](https://git.96-fromsofia.net/k8s/media-stack).
|
||||||
225
deploy.sh
Executable file
225
deploy.sh
Executable file
@@ -0,0 +1,225 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Media Stack Deployment Script
|
||||||
|
# Deploys all components in the correct order
|
||||||
|
# Supports optional VPN tunneling via Gluetun
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
NAMESPACE="media"
|
||||||
|
USE_VPN=false
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --vpn Deploy qBittorrent, Prowlarr, and Dispatcharr with VPN sidecar"
|
||||||
|
echo " --no-vpn Deploy without VPN (default)"
|
||||||
|
echo " --help Show this help message"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 # Deploy without VPN"
|
||||||
|
echo " $0 --vpn # Deploy with VPN tunneling"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_vpn() {
|
||||||
|
echo -e "${BLUE}[VPN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--vpn)
|
||||||
|
USE_VPN=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-vpn)
|
||||||
|
USE_VPN=false
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--help)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unknown option: $1"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check if kubectl is available
|
||||||
|
if ! command -v kubectl &> /dev/null; then
|
||||||
|
log_error "kubectl not found. Please install kubectl first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check cluster connectivity
|
||||||
|
if ! kubectl cluster-info &> /dev/null; then
|
||||||
|
log_error "Cannot connect to Kubernetes cluster. Check your kubeconfig."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# VPN-specific checks
|
||||||
|
if [ "$USE_VPN" = true ]; then
|
||||||
|
log_vpn "VPN mode enabled - checking prerequisites..."
|
||||||
|
|
||||||
|
# Check if secret file has been modified
|
||||||
|
if grep -q "YOUR_WIREGUARD_PRIVATE_KEY_HERE" "$SCRIPT_DIR/base/vpn/mullvad-secret.yaml"; then
|
||||||
|
log_error "You must edit base/vpn/mullvad-secret.yaml with your Mullvad credentials!"
|
||||||
|
echo ""
|
||||||
|
echo "Steps to get your credentials:"
|
||||||
|
echo "1. Go to https://mullvad.net/en/account/wireguard-config"
|
||||||
|
echo "2. Generate a new WireGuard configuration"
|
||||||
|
echo "3. Download the .conf file and extract:"
|
||||||
|
echo " - PrivateKey → WIREGUARD_PRIVATE_KEY"
|
||||||
|
echo " - Address (IPv4) → WIREGUARD_ADDRESSES"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_vpn "Mullvad credentials found in secret file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Starting Media Stack deployment..."
|
||||||
|
if [ "$USE_VPN" = true ]; then
|
||||||
|
log_vpn "VPN tunneling will be enabled for: qBittorrent, Prowlarr, Dispatcharr"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 1: Create namespace
|
||||||
|
log_info "Creating namespace..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/namespace.yaml"
|
||||||
|
|
||||||
|
# Step 2: Create storage resources
|
||||||
|
log_info "Creating storage resources (PVs)..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/nfs-storage.yaml"
|
||||||
|
|
||||||
|
# Step 3: Create ConfigMaps
|
||||||
|
log_info "Creating ConfigMap..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/configmap.yaml"
|
||||||
|
|
||||||
|
if [ "$USE_VPN" = true ]; then
|
||||||
|
log_vpn "Creating Gluetun VPN ConfigMap..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/gluetun-config.yaml"
|
||||||
|
|
||||||
|
log_vpn "Creating qBittorrent init script ConfigMap..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/qbittorrent-init-configmap.yaml"
|
||||||
|
|
||||||
|
log_vpn "Creating Mullvad VPN Secret..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/mullvad-secret.yaml"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 4: Create PVCs
|
||||||
|
log_info "Creating Persistent Volume Claims..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/pvcs.yaml"
|
||||||
|
|
||||||
|
# Wait for PVCs to bind
|
||||||
|
log_info "Waiting for PVCs to bind..."
|
||||||
|
sleep 5
|
||||||
|
kubectl get pvc -n "$NAMESPACE"
|
||||||
|
|
||||||
|
# Step 5: Deploy applications
|
||||||
|
if [ "$USE_VPN" = true ]; then
|
||||||
|
log_vpn "Deploying Prowlarr with VPN sidecar..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/prowlarr-vpn.yaml"
|
||||||
|
|
||||||
|
log_vpn "Deploying qBittorrent with VPN sidecar..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/qbittorrent-vpn.yaml"
|
||||||
|
|
||||||
|
log_vpn "Deploying Dispatcharr with VPN sidecar..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/vpn/dispatcharr-vpn.yaml"
|
||||||
|
else
|
||||||
|
log_info "Deploying Prowlarr..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/prowlarr.yaml"
|
||||||
|
|
||||||
|
log_info "Deploying qBittorrent..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/qbittorrent.yaml"
|
||||||
|
|
||||||
|
log_info "Deploying Dispatcharr..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/dispatcharr.yaml"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# These apps don't need VPN
|
||||||
|
log_info "Deploying Sonarr..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/sonarr.yaml"
|
||||||
|
|
||||||
|
log_info "Deploying Radarr..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/radarr.yaml"
|
||||||
|
|
||||||
|
log_info "Deploying Lidarr..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/lidarr.yaml"
|
||||||
|
|
||||||
|
log_info "Deploying Jellyfin..."
|
||||||
|
kubectl apply -f "$SCRIPT_DIR/base/jellyfin.yaml"
|
||||||
|
|
||||||
|
# Wait for deployments
|
||||||
|
log_info "Waiting for all deployments to be ready..."
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
# Show status
|
||||||
|
echo ""
|
||||||
|
log_info "Deployment complete! Checking status..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
kubectl get deployments -n "$NAMESPACE"
|
||||||
|
echo ""
|
||||||
|
kubectl get pods -n "$NAMESPACE"
|
||||||
|
echo ""
|
||||||
|
kubectl get svc -n "$NAMESPACE"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log_info "============================================="
|
||||||
|
log_info "Media Stack deployed successfully!"
|
||||||
|
log_info "============================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ "$USE_VPN" = true ]; then
|
||||||
|
log_vpn "VPN Status:"
|
||||||
|
echo " The following services are tunneled through Mullvad VPN:"
|
||||||
|
echo " - qBittorrent (all torrent traffic)"
|
||||||
|
echo " - Prowlarr (indexer connections)"
|
||||||
|
echo " - Dispatcharr (IPTV streams)"
|
||||||
|
echo ""
|
||||||
|
echo " To check VPN connectivity:"
|
||||||
|
echo " kubectl logs -n media deployment/qbittorrent -c gluetun | grep -i 'ip'"
|
||||||
|
echo ""
|
||||||
|
echo " To verify your VPN IP:"
|
||||||
|
echo " kubectl exec -n media deployment/qbittorrent -c qbittorrent -- curl -s ifconfig.me"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Access your services at:"
|
||||||
|
echo " Jellyfin: http://<worker-node-ip>:30096"
|
||||||
|
echo " Sonarr: http://<worker-node-ip>:30989"
|
||||||
|
echo " Radarr: http://<worker-node-ip>:30878"
|
||||||
|
echo " Lidarr: http://<worker-node-ip>:30686"
|
||||||
|
echo " Prowlarr: http://<worker-node-ip>:30696"
|
||||||
|
echo " qBittorrent: http://<worker-node-ip>:30080"
|
||||||
|
echo " Dispatcharr: http://<worker-node-ip>:30191"
|
||||||
|
echo ""
|
||||||
|
log_warn "Remember to check qBittorrent logs for the temporary password:"
|
||||||
|
echo " kubectl logs -n media deployment/qbittorrent -c qbittorrent | grep -i password"
|
||||||
|
echo ""
|
||||||
|
log_info "See README.md for post-deployment configuration steps."
|
||||||
Reference in New Issue
Block a user