add update nginx config to domain and create production setup docker

This commit is contained in:
2025-06-11 19:02:02 +07:00
parent 647aa51187
commit 0b211915f1
13 changed files with 1899 additions and 74 deletions

332
docker-deploy-prod.sh Executable file
View File

@@ -0,0 +1,332 @@
#!/bin/bash
# Script untuk deploy CKB Laravel Application ke production dengan domain bengkel.digitaloasis.xyz
# Usage: ./docker-deploy-prod.sh [build|deploy|ssl|status]
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
DOMAIN="bengkel.digitaloasis.xyz"
EMAIL="admin@digitaloasis.xyz"
COMPOSE_FILE="docker-compose.prod.yml"
ENV_FILE=".env"
# Default action
ACTION="deploy"
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
build)
ACTION="build"
shift
;;
deploy)
ACTION="deploy"
shift
;;
ssl)
ACTION="ssl"
shift
;;
status)
ACTION="status"
shift
;;
*)
echo "Unknown option $1"
echo "Usage: $0 [build|deploy|ssl|status]"
exit 1
;;
esac
done
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to check prerequisites
check_prerequisites() {
print_status "Checking prerequisites..."
# Check Docker
if ! docker info > /dev/null 2>&1; then
print_error "Docker is not running. Please start Docker first."
exit 1
fi
# Check Docker Compose
if ! docker-compose --version > /dev/null 2>&1; then
print_error "Docker Compose is not installed."
exit 1
fi
# Check if .env file exists
if [[ ! -f $ENV_FILE ]]; then
print_warning "Environment file not found. Creating from production template..."
if [[ -f docker/env.example.production ]]; then
cp docker/env.example.production $ENV_FILE
print_warning "⚠️ IMPORTANT: Edit $ENV_FILE and change all CHANGE_THIS_* passwords before continuing!"
print_status "Production template copied. Please configure:"
echo " - DB_PASSWORD and DB_ROOT_PASSWORD"
echo " - REDIS_PASSWORD"
echo " - MAIL_* settings"
echo " - AWS_* settings (if using S3)"
exit 1
else
print_error "Production environment template not found: docker/env.example.production"
exit 1
fi
fi
print_success "Prerequisites check passed!"
}
# Function to setup production environment
setup_production_env() {
print_status "Setting up production environment variables..."
# Update .env for production
sed -i "s|APP_ENV=.*|APP_ENV=production|g" $ENV_FILE
sed -i "s|APP_DEBUG=.*|APP_DEBUG=false|g" $ENV_FILE
sed -i "s|APP_URL=.*|APP_URL=https://$DOMAIN|g" $ENV_FILE
# Check if database credentials are set
if grep -q "DB_PASSWORD=password" $ENV_FILE; then
print_warning "Please update database credentials in $ENV_FILE for production!"
print_warning "Current settings are for development only."
fi
print_success "Production environment configured!"
}
# Function to build containers
build_containers() {
print_status "Building production containers..."
# Pull latest images
docker-compose -f $COMPOSE_FILE pull
# Build application container
docker-compose -f $COMPOSE_FILE build --no-cache app
print_success "Containers built successfully!"
}
# Function to deploy application
deploy_application() {
print_status "Deploying CKB Laravel Application to production..."
# Stop existing containers
print_status "Stopping existing containers..."
docker-compose -f $COMPOSE_FILE down || true
# Start database and redis first
print_status "Starting database and Redis..."
docker-compose -f $COMPOSE_FILE up -d db redis
# Wait for database to be ready
print_status "Waiting for database to be ready..."
sleep 20
# Start application
print_status "Starting application..."
docker-compose -f $COMPOSE_FILE up -d app
# Wait for application to be ready
sleep 15
# Run Laravel setup commands
print_status "Running Laravel setup commands..."
docker-compose -f $COMPOSE_FILE exec -T app php artisan key:generate --force || true
docker-compose -f $COMPOSE_FILE exec -T app php artisan migrate --force
docker-compose -f $COMPOSE_FILE exec -T app php artisan config:cache
docker-compose -f $COMPOSE_FILE exec -T app php artisan route:cache
docker-compose -f $COMPOSE_FILE exec -T app php artisan view:cache
docker-compose -f $COMPOSE_FILE exec -T app php artisan storage:link || true
# Start nginx proxy
print_status "Starting nginx proxy..."
docker-compose -f $COMPOSE_FILE up -d nginx-proxy
print_success "Application deployed successfully!"
}
# Function to setup SSL
setup_ssl() {
print_status "Setting up SSL certificate..."
if [[ -f docker-ssl-setup.sh ]]; then
chmod +x docker-ssl-setup.sh
./docker-ssl-setup.sh
else
print_error "SSL setup script not found!"
exit 1
fi
}
# Function to show deployment status
show_status() {
print_status "CKB Production Deployment Status"
echo "================================================"
# Show container status
print_status "Container Status:"
docker-compose -f $COMPOSE_FILE ps
echo ""
# Show application health
print_status "Application Health:"
if curl -s --max-time 10 http://localhost/health > /dev/null 2>&1; then
print_success "✅ Application is responding on HTTP"
else
print_warning "❌ Application not responding on HTTP"
fi
if curl -s --max-time 10 https://$DOMAIN/health > /dev/null 2>&1; then
print_success "✅ Application is responding on HTTPS"
else
print_warning "❌ Application not responding on HTTPS"
fi
# Show SSL certificate status
print_status "SSL Certificate Status:"
if openssl s_client -connect $DOMAIN:443 -servername $DOMAIN < /dev/null 2>/dev/null | openssl x509 -noout -dates 2>/dev/null; then
print_success "✅ SSL certificate is active"
else
print_warning "❌ SSL certificate not found or invalid"
fi
# Show disk usage
print_status "Docker Disk Usage:"
docker system df
echo ""
# Show logs summary
print_status "Recent Application Logs:"
docker-compose -f $COMPOSE_FILE logs --tail=10 app || true
echo ""
print_status "Access URLs:"
echo " 🌐 Application: https://$DOMAIN"
echo " 🔍 Health Check: https://$DOMAIN/health"
echo ""
print_status "Useful Commands:"
echo " - View logs: docker-compose -f $COMPOSE_FILE logs -f [service]"
echo " - Enter container: docker-compose -f $COMPOSE_FILE exec app bash"
echo " - Update SSL: ./docker-ssl-setup.sh"
echo " - Restart app: docker-compose -f $COMPOSE_FILE restart app"
}
# Function to backup before deployment
backup_before_deploy() {
print_status "Creating backup before deployment..."
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
# Backup database
if docker-compose -f $COMPOSE_FILE ps db | grep -q "Up"; then
print_status "Backing up database..."
docker-compose -f $COMPOSE_FILE exec -T db mysqldump -u root -p"${DB_ROOT_PASSWORD:-rootpassword}" "${DB_DATABASE:-ckb_production}" > "$BACKUP_DIR/database.sql"
print_success "Database backed up to $BACKUP_DIR/database.sql"
fi
# Backup storage
if [[ -d storage ]]; then
print_status "Backing up storage directory..."
tar -czf "$BACKUP_DIR/storage.tar.gz" storage/
print_success "Storage backed up to $BACKUP_DIR/storage.tar.gz"
fi
# Backup environment
if [[ -f $ENV_FILE ]]; then
cp $ENV_FILE "$BACKUP_DIR/env.backup"
print_success "Environment backed up to $BACKUP_DIR/env.backup"
fi
print_success "Backup completed in $BACKUP_DIR"
}
# Function to optimize for production
optimize_production() {
print_status "Optimizing application for production..."
# Laravel optimizations
docker-compose -f $COMPOSE_FILE exec -T app composer install --optimize-autoloader --no-dev --no-interaction
docker-compose -f $COMPOSE_FILE exec -T app php artisan config:cache
docker-compose -f $COMPOSE_FILE exec -T app php artisan route:cache
docker-compose -f $COMPOSE_FILE exec -T app php artisan view:cache
# Clean up Docker
docker system prune -f
print_success "Production optimization completed!"
}
# Main execution
echo "================================================"
print_status "🚀 CKB Production Deployment Script"
print_status "Domain: $DOMAIN"
print_status "Action: $ACTION"
echo "================================================"
echo ""
# Check prerequisites
check_prerequisites
case $ACTION in
build)
print_status "Building containers only..."
build_containers
print_success "✅ Build completed!"
;;
deploy)
print_status "Full deployment process..."
backup_before_deploy
setup_production_env
build_containers
deploy_application
optimize_production
print_success "✅ Deployment completed!"
echo ""
print_status "Next steps:"
echo "1. Setup SSL certificate: ./docker-deploy-prod.sh ssl"
echo "2. Check status: ./docker-deploy-prod.sh status"
;;
ssl)
print_status "Setting up SSL certificate..."
setup_ssl
print_success "✅ SSL setup completed!"
;;
status)
show_status
;;
esac
echo ""
print_success "✅ Production deployment script completed!"