#!/bin/bash # CapacityReport Deployment Script # Run this script on offline machine to import images and start services set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" echo "==========================================" echo "CapacityReport Deployment" echo "==========================================" echo "" # Set permissions for dist directory and make scripts executable echo "Setting permissions..." chmod -R 0777 "$SCRIPT_DIR" 2>/dev/null || true find "$SCRIPT_DIR" -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod +x {} \; 2>/dev/null || true echo " Permissions set" echo "" # Check Docker if ! command -v docker &> /dev/null; then echo "Error: Docker not found, please install Docker" exit 1 fi # Check Docker Compose DOCKER_COMPOSE_CMD="" if docker compose version &> /dev/null; then DOCKER_COMPOSE_CMD="docker compose" elif command -v docker-compose &> /dev/null; then DOCKER_COMPOSE_CMD="docker-compose" else echo "Error: Docker Compose not found, please install Docker Compose" exit 1 fi # Check image file if [ ! -f "images/capacity-images.tar" ]; then echo "Error: Image file not found: images/capacity-images.tar" exit 1 fi echo "Step 1: Checking ports..." # 检查端口是否被占用 check_port() { local port=$1 local name=$2 local in_use=false # 尝试多种方法检查端口 if command -v lsof &> /dev/null; then if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then in_use=true fi elif command -v netstat &> /dev/null; then if netstat -tuln 2>/dev/null | grep -q ":$port "; then in_use=true fi elif command -v ss &> /dev/null; then if ss -tuln 2>/dev/null | grep -q ":$port "; then in_use=true fi fi if [ "$in_use" = true ]; then echo "Warning: Port $port ($name) is in use" read -p "Continue? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi fi } check_port 19081 "App" check_port 13306 "MySQL" echo "" echo "Step 2: Loading images..." docker load -i images/capacity-images.tar >/dev/null 2>&1 echo "" echo "Step 3: Verifying images..." if docker images | grep -q "capacity-report-app.*latest"; then echo " App image: OK" else echo " App image: FAILED" exit 1 fi if docker images | grep -q "capacity-mysql.*8.0.44"; then echo " MySQL image: OK" else echo " MySQL image: FAILED" exit 1 fi echo "" echo "Step 4: Creating directories..." mkdir -p cache logs chmod 777 cache logs 2>/dev/null || true echo "" echo "Step 5: Checking config..." if [ ! -f "Configure.json" ]; then echo " Creating default Configure.json..." cat > Configure.json << 'EOF' { "MySQL_DBInfo": { "host": "capacity-mysql", "port": 3306, "user": "root", "passwd": "gmcc123", "dbname": "CapacityReport" }, "ExtractField": [] } EOF else # Update config for Docker environment if command -v python3 &> /dev/null || command -v python &> /dev/null; then (command -v python3 >/dev/null && python3 || python) << 'PYEOF' import json import sys try: with open('Configure.json', 'r', encoding='utf-8') as f: config = json.load(f) db_info = config.get('MySQL_DBInfo', {}) needs_update = False if db_info.get('host') != 'capacity-mysql': db_info['host'] = 'capacity-mysql' needs_update = True if db_info.get('port') != 3306: db_info['port'] = 3306 needs_update = True if db_info.get('user') != 'root': db_info['user'] = 'root' needs_update = True if db_info.get('passwd') != 'gmcc123': db_info['passwd'] = 'gmcc123' needs_update = True if db_info.get('dbname') != 'CapacityReport': db_info['dbname'] = 'CapacityReport' needs_update = True if needs_update: with open('Configure.json', 'w', encoding='utf-8') as f: json.dump(config, f, ensure_ascii=False, indent=2) print(" Updated Configure.json") except: pass PYEOF fi fi if [ ! -f "ReportScript.sql" ]; then touch ReportScript.sql fi echo "" echo "Step 6: Starting services..." $DOCKER_COMPOSE_CMD down 2>/dev/null || true $DOCKER_COMPOSE_CMD up -d >/dev/null 2>&1 echo "" echo "Step 7: Waiting for services..." for i in {1..30}; do if docker exec capacity-mysql mysqladmin ping -h localhost -u root -pgmcc123 --silent 2>/dev/null; then echo " MySQL: Ready" break fi if [ $i -eq 30 ]; then echo " MySQL: Timeout" exit 1 fi sleep 2 done if command -v curl &> /dev/null; then for i in {1..30}; do if curl -f http://localhost:19081/health >/dev/null 2>&1; then echo " App: Ready" break fi if [ $i -eq 30 ]; then echo " App: Timeout" echo " Check logs: $DOCKER_COMPOSE_CMD logs capacity-app" exit 1 fi sleep 2 done else for i in {1..30}; do if docker ps --filter "name=capacity-report-app" --filter "status=running" --format "{{.Names}}" | grep -q "capacity-report-app"; then if docker inspect capacity-report-app --format='{{.State.Health.Status}}' 2>/dev/null | grep -q "healthy"; then echo " App: Ready" break elif [ $i -gt 10 ]; then echo " App: Running" break fi fi if [ $i -eq 30 ]; then echo " App: Timeout" exit 1 fi sleep 2 done fi echo "" echo "==========================================" echo "Deployment completed!" echo "==========================================" echo "" echo "Access: http://localhost:19081" echo "" echo "Commands:" echo " Logs: $DOCKER_COMPOSE_CMD logs -f" echo " Stop: $DOCKER_COMPOSE_CMD down" echo " Restart: $DOCKER_COMPOSE_CMD restart" echo " Status: $DOCKER_COMPOSE_CMD ps" echo "" echo "Database:" echo " Host: localhost" echo " Port: 13306" echo " User: root" echo " Password: gmcc123" echo " Database: CapacityReport" echo ""