197 lines
No EOL
5.3 KiB
Bash
Executable file
197 lines
No EOL
5.3 KiB
Bash
Executable file
#!/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 "$@" |