#!/bin/bash # Sharenet Local Deployment Script # This script handles local development deployments set -e # Configuration APP_NAME="sharenet" DOCKER_COMPOSE_FILE="docker-compose.yml" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Pre-deployment checks pre_deployment_checks() { log_info "Running pre-deployment checks..." # Check if docker-compose.yml exists if [ ! -f "$DOCKER_COMPOSE_FILE" ]; then log_error "docker-compose.yml not found in current directory" log_error "Current directory: $(pwd)" exit 1 fi # Check if Docker is running if ! docker info >/dev/null 2>&1; then log_error "Docker is not running or not accessible" exit 1 fi # Check if docker-compose is available if ! command -v docker-compose >/dev/null 2>&1; then log_error "docker-compose is not installed or not in PATH" exit 1 fi log_success "Pre-deployment checks passed" } # Pull latest code (if in git repository) pull_latest_code() { if [ -d ".git" ]; then log_info "Pulling latest code from repository..." if git pull origin main 2>/dev/null || git pull origin master 2>/dev/null; then log_success "Code updated successfully" else log_warning "Could not pull latest code (not a git repository or no remote configured)" fi else log_info "Not a git repository, skipping code pull" fi } # Pull latest images pull_images() { log_info "Pulling latest Docker images..." if docker-compose pull; then log_success "Images pulled successfully" else log_error "Failed to pull images" exit 1 fi } # Stop existing containers stop_containers() { log_info "Stopping existing containers..." if docker-compose down; then log_success "Containers stopped successfully" else log_warning "Some containers may not have stopped cleanly" fi } # Start new containers start_containers() { log_info "Starting new containers..." if docker-compose up -d; then log_success "Containers started successfully" else log_error "Failed to start containers" log_error "Recent logs:" docker-compose logs --tail=20 exit 1 fi } # Verify deployment verify_deployment() { log_info "Verifying deployment..." # Wait for containers to start sleep 10 # Check if containers are running if docker-compose ps | grep -q "Up"; then log_success "Deployment successful! All containers are running." docker-compose ps else log_error "Deployment failed! Some containers are not running." docker-compose ps log_error "Recent logs:" docker-compose logs --tail=20 exit 1 fi } # Clean up old images cleanup_images() { log_info "Cleaning up old Docker images..." if docker image prune -f; then log_success "Old images cleaned up successfully" else log_warning "Image cleanup had some issues" fi } # Show service status show_status() { log_info "Current service status:" docker-compose ps echo log_info "Recent logs:" docker-compose logs --tail=10 } # Main deployment process main() { local command="${1:-deploy}" case "$command" in deploy) log_info "Starting local deployment for $APP_NAME..." pre_deployment_checks pull_latest_code pull_images stop_containers start_containers verify_deployment cleanup_images log_success "Local deployment completed successfully" ;; status) log_info "Checking service status..." if [ -f "$DOCKER_COMPOSE_FILE" ]; then show_status else log_error "docker-compose.yml not found in current directory" exit 1 fi ;; restart) log_info "Restarting services..." pre_deployment_checks stop_containers start_containers verify_deployment log_success "Services restarted successfully" ;; logs) log_info "Showing recent logs..." if [ -f "$DOCKER_COMPOSE_FILE" ]; then docker-compose logs --tail=50 -f else log_error "docker-compose.yml not found in current directory" exit 1 fi ;; *) log_error "Unknown command: $command" echo "Usage: $0 {deploy|status|restart|logs}" echo "" echo "Commands:" echo " deploy - Deploy the application (default)" echo " status - Show current service status" echo " restart - Restart all services" echo " logs - Show and follow recent logs" exit 1 ;; esac } # Handle interrupts gracefully trap 'log_error "Deployment interrupted"; exit 1' INT TERM # Run main function main "$@"