Files
Gan, Jimmy 6c0d5a4e63 Initial commit: Clean Mold Cost Calculator application
- Flask-based mold cost calculation application
- PostgreSQL database with SQLAlchemy ORM
- Docker/Podman containerization
- Comprehensive documentation in docs/
- Clean, organized codebase without obsolete files
- Production-ready deployment configuration
- Enhanced pytest configuration with coverage reporting
- Master/Development branch structure
2025-06-24 02:30:09 +08:00

161 lines
5.0 KiB
Bash
Executable File

#!/bin/bash
set -e
# Function to check internet connectivity
check_internet() {
if ! curl -s --connect-timeout 5 https://registry-1.docker.io/v2/ > /dev/null; then
echo "⚠️ No internet connection to Docker Hub - will use local images only"
return 1
fi
return 0
}
# Function to pull image with retries
pull_image() {
local image=$1
local max_attempts=3
local attempt=1
local wait_time=5
while [ $attempt -le $max_attempts ]; do
echo "📥 Attempting to pull $image (Attempt $attempt/$max_attempts)..."
if podman pull $image; then
echo "✅ Successfully pulled $image"
return 0
fi
echo "⚠️ Pull attempt $attempt failed. Waiting before retry..."
sleep $wait_time
attempt=$((attempt + 1))
wait_time=$((wait_time * 2))
done
return 1
}
# Function to clean up while preserving base images
cleanup_with_preserve() {
echo "🧹 Cleaning up while preserving base images..."
# Save the base image IDs if they exist
local python_image_id=$(podman images -q python:3.12-slim)
local postgres_image_id=$(podman images -q postgres:16-alpine)
# Run system prune
podman system prune -af
# If we had base images, pull them again
if [ ! -z "$python_image_id" ]; then
echo "🔄 Restoring Python base image..."
pull_image python:3.12-slim
fi
if [ ! -z "$postgres_image_id" ]; then
echo "🔄 Restoring PostgreSQL base image..."
pull_image postgres:16-alpine
fi
}
echo "🚀 Starting local deployment process..."
# Check available disk space
echo "💾 Checking disk space..."
AVAILABLE_SPACE=$(df -h . | awk 'NR==2 {print $4}' | tr -d 'G' | tr -d 'i')
if [ "$AVAILABLE_SPACE" -lt 10 ]; then
echo "⚠️ Low disk space detected (${AVAILABLE_SPACE}G available). Cleaning up..."
cleanup_with_preserve
echo "✅ Cleanup complete"
fi
# Check for required base images
echo "🔍 Checking for required base images..."
for image in "python:3.12-slim" "postgres:16-alpine"; do
if podman images | grep -q "$image"; then
echo "✅ $image found locally"
else
echo "⚠️ $image not found locally"
if ! check_internet; then
echo "⚠️ No internet connection - attempting to build without base image"
else
echo "📦 Pulling $image from Docker Hub..."
if ! pull_image "$image"; then
echo "⚠️ Failed to pull $image - attempting to build without it"
fi
fi
fi
done
# Create necessary directories and set permissions
echo "📁 Setting up directories..."
mkdir -p instance logs db_data db_backups
chmod -R 777 instance logs db_data db_backups
# Generate a secure secret key if not exists
if [ ! -f .env ]; then
echo "🔑 Generating new secret key..."
echo "SECRET_KEY=$(openssl rand -hex 32)" > .env
echo "DATABASE_URL=postgresql://mold_user:mold_password@db:5432/mold_cost_calculator" >> .env
fi
# Clear template cache
echo "🧹 Clearing template cache..."
find . -type d -name "__pycache__" -exec rm -r {} +
find . -type f -name "*.pyc" -delete
# Stop and remove existing containers
echo "🧹 Cleaning up existing containers..."
podman-compose down 2>/dev/null || true
# Build the containers with retry logic
echo "📦 Building containers..."
max_build_attempts=3
build_attempt=1
while [ $build_attempt -le $max_build_attempts ]; do
echo "🏗️ Build attempt $build_attempt/$max_build_attempts..."
if podman-compose build; then
echo "✅ Build successful"
break
fi
if [ $build_attempt -eq $max_build_attempts ]; then
echo "❌ Build failed after $max_build_attempts attempts"
exit 1
fi
echo "⚠️ Build attempt $build_attempt failed. Waiting before retry..."
sleep $((build_attempt * 5))
build_attempt=$((build_attempt + 1))
done
# Start the containers
echo "🚀 Starting containers..."
podman-compose up -d
# Wait for database to be ready
echo "⏳ Waiting for database to be ready..."
max_wait=30
wait_count=0
while [ $wait_count -lt $max_wait ]; do
if podman exec mold_cost_db pg_isready -U mold_user -d mold_cost_calculator >/dev/null 2>&1; then
echo "✅ Database is ready"
break
fi
echo "⏳ Waiting for database... ($((wait_count + 1))/$max_wait)"
sleep 1
wait_count=$((wait_count + 1))
done
if [ $wait_count -eq $max_wait ]; then
echo "❌ Database failed to start within timeout"
echo "📝 Checking container logs..."
podman-compose logs db
exit 1
fi
# Check if the containers are running
if podman-compose ps | grep -q "Up"; then
echo "✅ Deployment complete!"
echo "🌐 Application is available at: http://localhost:5003"
echo "📝 To view logs: podman-compose logs"
echo "📝 To view app logs: podman-compose logs web"
echo "📝 To view db logs: podman-compose logs db"
echo "🛑 To stop: podman-compose down"
else
echo "❌ Containers failed to start. Check logs with: podman-compose logs"
exit 1
fi