/home/suroeste/public_html/payments.transportessuroeste.com/scripts
Edit: /home/suroeste/public_html/payments.transportessuroeste.com/scripts/deploy.sh (4127B)
#!/usr/bin/env bash
# ============================================================================
# TRANSPORTES SUROESTE - Deployment Script
# ============================================================================
# Usage: ./scripts/deploy.sh [environment]
# Environments: staging, production
# ============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
ENVIRONMENT="${1:-production}"
DATE=$(date +%Y%m%d_%H%M%S)
# Colors
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
RESET='\033[0m'
log() { echo -e "${CYAN}[$(date '+%H:%M:%S')]${RESET} $1"; }
ok() { echo -e "${GREEN}[OK]${RESET} $1"; }
warn() { echo -e "${YELLOW}[WARN]${RESET} $1"; }
err() { echo -e "${RED}[ERROR]${RESET} $1"; }
# ============================================================================
# Pre-flight checks
# ============================================================================
log "Starting deployment to ${YELLOW}${ENVIRONMENT}${RESET}..."
echo ""
# Check .env exists
if [ ! -f "${PROJECT_DIR}/.env" ]; then
err ".env file not found. Copy .env.example and configure."
exit 1
fi
ok ".env file found"
# Check Docker
if ! command -v docker &> /dev/null; then
err "Docker is not installed"
exit 1
fi
ok "Docker available: $(docker --version | head -1)"
# Check Docker Compose
if ! docker compose version &> /dev/null; then
err "Docker Compose is not available"
exit 1
fi
ok "Docker Compose available"
# Validate environment
if [[ "$ENVIRONMENT" != "staging" && "$ENVIRONMENT" != "production" ]]; then
err "Invalid environment: ${ENVIRONMENT}. Use 'staging' or 'production'."
exit 1
fi
# ============================================================================
# Backup before deploy
# ============================================================================
echo ""
log "Creating pre-deployment backup..."
if docker ps --format '{{.Names}}' | grep -q "^ts-mysql$"; then
bash "${SCRIPT_DIR}/backup.sh" || warn "Backup failed, continuing..."
else
warn "MySQL container not running, skipping backup"
fi
# ============================================================================
# Build and deploy
# ============================================================================
echo ""
log "Building containers..."
cd "$PROJECT_DIR"
COMPOSE_FILES="-f docker-compose.yml -f docker-compose.prod.yml"
# Build
docker compose ${COMPOSE_FILES} build --no-cache
ok "Build complete"
# Stop old containers
log "Stopping current services..."
docker compose ${COMPOSE_FILES} down --timeout 30
ok "Services stopped"
# Start new containers
log "Starting new services..."
docker compose ${COMPOSE_FILES} up -d
ok "Services started"
# ============================================================================
# Health check
# ============================================================================
echo ""
log "Waiting for services to be healthy..."
MAX_RETRIES=30
RETRY=0
while [ $RETRY -lt $MAX_RETRIES ]; do
RETRY=$((RETRY + 1))
if curl -sf http://localhost/api/v1/health > /dev/null 2>&1; then
ok "Health check passed"
break
fi
if [ $RETRY -eq $MAX_RETRIES ]; then
err "Health check failed after ${MAX_RETRIES} attempts"
warn "Rolling back..."
docker compose ${COMPOSE_FILES} logs --tail=50
exit 1
fi
sleep 2
done
# ============================================================================
# Summary
# ============================================================================
echo ""
echo -e "${GREEN}=============================================${RESET}"
echo -e "${GREEN} Deployment to ${ENVIRONMENT} complete!${RESET}"
echo -e "${GREEN}=============================================${RESET}"
echo ""
docker compose ${COMPOSE_FILES} ps
echo ""
log "Deployment finished at $(date)"