Files
2025-07-14 17:11:17 -05:00

384 lines
10 KiB
Bash

#!/bin/bash
# Discord Voice Translator v2 - Deployment Script
# Microservices Architecture with GPU-accelerated transcription
set -e # Exit on any error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
COMPOSE_FILE="docker-compose.yml"
ENV_FILE=".env"
SERVICES=("recorder" "audio-processor" "whisper-service" "translator" "transcriber" "dashboard" "postgres" "redis")
GPU_SERVICES=("whisper-service")
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to check if command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to check system requirements
check_requirements() {
print_status "Checking system requirements..."
# Check Docker
if ! command_exists docker; then
print_error "Docker is not installed. Please install Docker first."
exit 1
fi
# Check Docker Compose
if ! command_exists docker-compose && ! docker compose version >/dev/null 2>&1; then
print_error "Docker Compose is not installed. Please install Docker Compose first."
exit 1
fi
# Check NVIDIA runtime for GPU services
if docker info | grep -q "nvidia"; then
print_success "NVIDIA Docker runtime detected"
else
print_warning "NVIDIA Docker runtime not detected. GPU acceleration may not work."
fi
# Check if .env file exists
if [[ ! -f "$ENV_FILE" ]]; then
print_warning ".env file not found. Using .env.example as template."
if [[ -f ".env.example" ]]; then
cp .env.example .env
print_status "Created .env file from .env.example. Please configure it before running."
else
print_error ".env.example file not found. Please create environment configuration."
exit 1
fi
fi
print_success "System requirements check completed"
}
# Function to create necessary directories
create_directories() {
print_status "Creating data directories..."
directories=(
"data/audio/raw"
"data/audio/processed"
"data/database"
"data/redis"
"data/logs"
"data/models"
)
for dir in "${directories[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
print_status "Created directory: $dir"
fi
done
# Set proper permissions
chmod -R 755 data/
print_success "Data directories created"
}
# Function to pull required Docker images
pull_images() {
print_status "Pulling Docker images..."
# Pull other base images
docker pull postgres:15-alpine
docker pull redis:7-alpine
docker pull nginx:alpine
# Pull optional admin images
docker pull dpage/pgadmin4:latest
docker pull rediscommander/redis-commander:latest
print_success "Docker images pulled"
}
# Function to build services
build_services() {
print_status "Building microservices..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
# Build all services
$COMPOSE_CMD build --no-cache
print_success "Services built successfully"
}
# Function to start services
start_services() {
print_status "Starting services..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
# Start core services first
print_status "Starting data services (postgres, redis)..."
$COMPOSE_CMD up -d postgres redis
# Wait for database to be ready
print_status "Waiting for database to be ready..."
sleep 10
# Start processing services
print_status "Starting processing services..."
$COMPOSE_CMD up -d audio-processor whisper-service translator
# Wait for processing services to be ready
print_status "Waiting for processing services to be ready..."
sleep 5
# Start recorder and transcriber
print_status "Starting Discord bot services..."
$COMPOSE_CMD up -d recorder transcriber
# Start dashboard
print_status "Starting dashboard..."
$COMPOSE_CMD up -d dashboard
print_success "All services started successfully"
}
# Function to show service status
show_status() {
print_status "Service Status:"
echo "===================="
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD ps
echo ""
print_status "Service URLs:"
echo "===================="
echo "Dashboard: http://localhost:3010"
echo "Whisper Service: http://localhost:8001"
echo "Translator Service: http://localhost:8002"
echo "Database: localhost:5434"
echo "Redis: localhost:6379"
echo ""
print_status "Optional Admin Interfaces (use --profile admin):"
echo "PGAdmin: http://localhost:8085"
echo "Redis Commander: http://localhost:8086"
}
# Function to display help
show_help() {
echo "Discord Voice Translator v2 - Deployment Script"
echo "Usage: $0 [OPTION]"
echo ""
echo "Options:"
echo " start Start all services (default)"
echo " stop Stop all services"
echo " restart Restart all services"
echo " build Build all services"
echo " pull Pull Docker images"
echo " status Show service status"
echo " logs Show logs for all services"
echo " logs [service] Show logs for specific service"
echo " clean Stop and remove all containers and volumes"
echo " admin Start with admin interfaces (PGAdmin, Redis Commander)"
echo " proxy Start with nginx proxy"
echo " help Show this help message"
echo ""
echo "Examples:"
echo " $0 # Start all services"
echo " $0 start # Start all services"
echo " $0 admin # Start with admin interfaces"
echo " $0 logs whisper-service # Show logs for whisper service"
echo " $0 clean # Clean up everything"
}
# Function to show logs
show_logs() {
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
if [[ -n "$1" ]]; then
print_status "Showing logs for service: $1"
$COMPOSE_CMD logs -f "$1"
else
print_status "Showing logs for all services"
$COMPOSE_CMD logs -f
fi
}
# Function to stop services
stop_services() {
print_status "Stopping all services..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD down
print_success "All services stopped"
}
# Function to clean up
clean_up() {
print_warning "This will remove all containers, networks, and volumes. Are you sure? (y/N)"
read -r response
if [[ "$response" =~ ^[Yy]$ ]]; then
print_status "Cleaning up containers, networks, and volumes..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD down -v --remove-orphans
# Remove all related images
docker image prune -f
print_success "Cleanup completed"
else
print_status "Cleanup cancelled"
fi
}
# Function to restart services
restart_services() {
print_status "Restarting all services..."
stop_services
sleep 2
start_services
}
# Main script logic
main() {
# Parse command line arguments
case "${1:-start}" in
"start")
check_requirements
create_directories
pull_images
build_services
start_services
show_status
;;
"stop")
stop_services
;;
"restart")
restart_services
show_status
;;
"build")
check_requirements
build_services
;;
"pull")
pull_images
;;
"status")
show_status
;;
"logs")
show_logs "$2"
;;
"clean")
clean_up
;;
"admin")
check_requirements
create_directories
pull_images
build_services
print_status "Starting with admin interfaces..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD --profile admin up -d
show_status
;;
"proxy")
check_requirements
create_directories
pull_images
build_services
print_status "Starting with nginx proxy..."
# Use docker-compose or docker compose based on availability
if command_exists docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD --profile proxy up -d
show_status
;;
"help"|"-h"|"--help")
show_help
;;
*)
print_error "Unknown command: $1"
show_help
exit 1
;;
esac
}
# Run main function
main "$@"