#!/bin/bash # Simplified Gitea deployment script for testing # This version doesn't require database dependencies set -e # Configuration PROJECT_NAME="portfolio" CONTAINER_NAME="portfolio-app-simple" IMAGE_NAME="portfolio-app" PORT=3000 BACKUP_PORT=3001 LOG_FILE="./logs/gitea-deploy-simple.log" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Logging function log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE" } error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" } success() { echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE" } warning() { echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE" } # Check if running as root (skip in CI environments) if [[ $EUID -eq 0 ]] && [[ -z "$CI" ]]; then error "This script should not be run as root (use CI=true to override)" exit 1 fi # Check if Docker is running if ! docker info > /dev/null 2>&1; then error "Docker is not running. Please start Docker and try again." exit 1 fi # Check if we're in the right directory if [ ! -f "package.json" ] || [ ! -f "Dockerfile" ]; then error "Please run this script from the project root directory" exit 1 fi log "🚀 Starting simplified Gitea deployment for $PROJECT_NAME" # Step 1: Build Application log "🔨 Step 1: Building application..." # Build Next.js application log "📦 Building Next.js application..." npm run build || { error "Build failed" exit 1 } success "✅ Application built successfully" # Step 2: Docker Operations log "🐳 Step 2: Docker operations..." # Build Docker image log "🏗️ Building Docker image..." docker build -t "$IMAGE_NAME:latest" . || { error "Docker build failed" exit 1 } # Tag with timestamp TIMESTAMP=$(date +%Y%m%d-%H%M%S) docker tag "$IMAGE_NAME:latest" "$IMAGE_NAME:$TIMESTAMP" success "✅ Docker image built successfully" # Step 3: Deployment log "🚀 Step 3: Deploying application..." # Check if container is running if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null)" = "true" ]; then log "📦 Stopping existing container..." docker stop "$CONTAINER_NAME" || true docker rm "$CONTAINER_NAME" || true fi # Check if port is available if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null ; then warning "Port $PORT is in use. Trying backup port $BACKUP_PORT" DEPLOY_PORT=$BACKUP_PORT else DEPLOY_PORT=$PORT fi # Start new container with minimal environment variables log "🚀 Starting new container on port $DEPLOY_PORT..." docker run -d \ --name "$CONTAINER_NAME" \ --restart unless-stopped \ -p "$DEPLOY_PORT:3000" \ -e NODE_ENV=production \ -e NEXT_PUBLIC_BASE_URL=https://dk0.dev \ -e MY_EMAIL=contact@dk0.dev \ -e MY_INFO_EMAIL=info@dk0.dev \ -e MY_PASSWORD=test-password \ -e MY_INFO_PASSWORD=test-password \ -e ADMIN_BASIC_AUTH=admin:test123 \ -e LOG_LEVEL=info \ "$IMAGE_NAME:latest" || { error "Failed to start container" exit 1 } # Wait for container to be ready log "⏳ Waiting for container to be ready..." sleep 20 # Check if container is actually running if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null)" != "true" ]; then error "Container failed to start or crashed" log "Container logs:" docker logs "$CONTAINER_NAME" --tail=50 exit 1 fi # Health check log "🏥 Performing health check..." HEALTH_CHECK_TIMEOUT=180 HEALTH_CHECK_INTERVAL=5 ELAPSED=0 while [ $ELAPSED -lt $HEALTH_CHECK_TIMEOUT ]; do # Check if container is still running if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null)" != "true" ]; then error "Container stopped during health check" log "Container logs:" docker logs "$CONTAINER_NAME" --tail=50 exit 1 fi # Try health check endpoint if curl -f "http://localhost:$DEPLOY_PORT/api/health" > /dev/null 2>&1; then success "✅ Application is healthy!" break fi sleep $HEALTH_CHECK_INTERVAL ELAPSED=$((ELAPSED + HEALTH_CHECK_INTERVAL)) echo -n "." done if [ $ELAPSED -ge $HEALTH_CHECK_TIMEOUT ]; then error "Health check timeout. Application may not be running properly." log "Container status:" docker inspect "$CONTAINER_NAME" --format='{{.State.Status}} - {{.State.Health.Status}}' log "Container logs:" docker logs "$CONTAINER_NAME" --tail=100 exit 1 fi # Step 4: Verification log "✅ Step 4: Verifying deployment..." # Test main page if curl -f "http://localhost:$DEPLOY_PORT/" > /dev/null 2>&1; then success "✅ Main page is accessible" else error "❌ Main page is not accessible" exit 1 fi # Show container status log "📊 Container status:" docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # Show resource usage log "📈 Resource usage:" docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" "$CONTAINER_NAME" # Final success message success "🎉 Simplified Gitea deployment completed successfully!" log "🌐 Application is available at: http://localhost:$DEPLOY_PORT" log "🏥 Health check endpoint: http://localhost:$DEPLOY_PORT/api/health" log "📊 Container name: $CONTAINER_NAME" log "📝 Logs: docker logs $CONTAINER_NAME" # Update deployment log echo "$(date): Simplified Gitea deployment successful - Port: $DEPLOY_PORT - Image: $IMAGE_NAME:$TIMESTAMP" >> "$LOG_FILE" exit 0