This commit is contained in:
@@ -14,22 +14,9 @@ jobs:
|
|||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
- name: 📋 Log Workflow Start
|
- name: 📋 Log Workflow Start
|
||||||
run: |
|
run: |
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
echo "🚀 Starting deployment for ${{ github.repository }} (${{ github.ref }})"
|
||||||
echo "║ KLZ Cables Deployment Workflow Started ║"
|
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
echo "📋 Workflow Information:"
|
|
||||||
echo " • Repository: ${{ github.repository }}"
|
|
||||||
echo " • Branch: ${{ github.ref }}"
|
|
||||||
echo " • Commit: ${{ github.sha }}"
|
echo " • Commit: ${{ github.sha }}"
|
||||||
echo " • Actor: ${{ github.actor }}"
|
|
||||||
echo " • Run ID: ${{ github.run_id }}"
|
|
||||||
echo " • Timestamp: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
echo " • Timestamp: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||||
echo ""
|
|
||||||
echo "🔍 Environment Details:"
|
|
||||||
echo " • Runner OS: ${{ runner.os }}"
|
|
||||||
echo " • Workspace: ${{ github.workspace }}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -39,47 +26,15 @@ jobs:
|
|||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
- name: 🔐 Login to private registry
|
- name: 🔐 Login to private registry
|
||||||
run: |
|
run: |
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
echo "🔐 Authenticating with registry.infra.mintel.me..."
|
||||||
echo "║ Step: Registry Login ║"
|
echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
echo "🔐 Authenticating with private registry..."
|
|
||||||
echo " Registry: registry.infra.mintel.me"
|
|
||||||
echo " User: ${{ secrets.REGISTRY_USER != '' && '***' || 'NOT SET' }}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Execute login with error handling
|
|
||||||
if echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin 2>&1; then
|
|
||||||
echo "✅ Registry login successful"
|
|
||||||
else
|
|
||||||
echo "❌ Registry login failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
# LOGGING: Build Phase
|
# LOGGING: Build Phase
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
- name: 🏗️ Build Docker image
|
- name: 🏗️ Build Docker image
|
||||||
run: |
|
run: |
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
echo "🏗️ Building Docker image (linux/arm64)..."
|
||||||
echo "║ Step: Build Docker Image ║"
|
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
echo "🏗️ Building Docker image with buildx..."
|
|
||||||
echo " Platform: linux/arm64"
|
|
||||||
echo " Target: registry.infra.mintel.me/mintel/klz-cables.com:latest"
|
|
||||||
echo ""
|
|
||||||
echo "📦 Build Arguments (NEXT_PUBLIC_* only - baked into client bundle):"
|
|
||||||
echo " • NEXT_PUBLIC_BASE_URL: ${{ secrets.NEXT_PUBLIC_BASE_URL != '' && '***' || 'NOT SET' }}"
|
|
||||||
echo " • NEXT_PUBLIC_UMAMI_WEBSITE_ID: ${{ secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID != '' && '***' || 'NOT SET' }}"
|
|
||||||
echo " • NEXT_PUBLIC_UMAMI_SCRIPT_URL: ${{ secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL != '' && '***' || 'NOT SET' }}"
|
|
||||||
echo ""
|
|
||||||
echo "⏱️ Build started at: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Execute build with detailed logging
|
|
||||||
set -e
|
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
--pull \
|
--pull \
|
||||||
--platform linux/arm64 \
|
--platform linux/arm64 \
|
||||||
@@ -89,56 +44,20 @@ jobs:
|
|||||||
-t registry.infra.mintel.me/mintel/klz-cables.com:latest \
|
-t registry.infra.mintel.me/mintel/klz-cables.com:latest \
|
||||||
--push .
|
--push .
|
||||||
|
|
||||||
BUILD_EXIT_CODE=$?
|
|
||||||
if [ $BUILD_EXIT_CODE -eq 0 ]; then
|
|
||||||
echo ""
|
|
||||||
echo "✅ Build completed successfully at: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
|
||||||
echo ""
|
|
||||||
echo "📊 Image Details:"
|
|
||||||
IMAGE_SIZE=$(docker inspect registry.infra.mintel.me/mintel/klz-cables.com:latest --format='{{.Size}}')
|
|
||||||
IMAGE_SIZE_MB=$((IMAGE_SIZE / 1024 / 1024))
|
|
||||||
echo " • Size: ${IMAGE_SIZE_MB}MB"
|
|
||||||
docker inspect registry.infra.mintel.me/mintel/klz-cables.com:latest --format=' • Created: {{.Created}}'
|
|
||||||
docker inspect registry.infra.mintel.me/mintel/klz-cables.com:latest --format=' • Architecture: {{.Architecture}}'
|
|
||||||
else
|
|
||||||
echo ""
|
|
||||||
echo "❌ Build failed with exit code: $BUILD_EXIT_CODE"
|
|
||||||
exit $BUILD_EXIT_CODE
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
# LOGGING: Deployment Phase
|
# LOGGING: Deployment Phase
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
- name: 🚀 Deploy to production server
|
- name: 🚀 Deploy to production server
|
||||||
run: |
|
run: |
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
echo "🚀 Deploying to alpha.mintel.me..."
|
||||||
echo "║ Step: Deploy to Production Server ║"
|
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
echo "🚀 Starting deployment process..."
|
|
||||||
echo " Target Server: alpha.mintel.me"
|
|
||||||
echo " Deploy User: deploy (via sudo from root)"
|
|
||||||
echo " Target Path: /home/deploy/sites/klz-cables.com"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Setup SSH with logging
|
# Setup SSH
|
||||||
echo "🔐 Setting up SSH connection..."
|
|
||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
echo "${{ secrets.ALPHA_SSH_KEY }}" > ~/.ssh/id_ed25519
|
echo "${{ secrets.ALPHA_SSH_KEY }}" > ~/.ssh/id_ed25519
|
||||||
chmod 600 ~/.ssh/id_ed25519
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
|
|
||||||
echo "🔑 Adding host to known_hosts..."
|
|
||||||
ssh-keyscan -H alpha.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
ssh-keyscan -H alpha.mintel.me >> ~/.ssh/known_hosts 2>/dev/null
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "✅ Host key added successfully"
|
|
||||||
else
|
|
||||||
echo "⚠️ Warning: Could not add host key"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Create .env file content
|
# Create .env file content
|
||||||
echo "📝 Preparing environment configuration..."
|
|
||||||
cat > /tmp/klz-cables.env << EOF
|
cat > /tmp/klz-cables.env << EOF
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# KLZ Cables - Production Environment Configuration
|
# KLZ Cables - Production Environment Configuration
|
||||||
@@ -168,143 +87,48 @@ jobs:
|
|||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "✅ Environment file prepared"
|
# Upload .env and deploy
|
||||||
echo ""
|
scp -o StrictHostKeyChecking=accept-new /tmp/klz-cables.env root@alpha.mintel.me:/home/deploy/sites/klz-cables.com/.env
|
||||||
|
|
||||||
# Execute deployment commands with detailed logging
|
ssh -o StrictHostKeyChecking=accept-new root@alpha.mintel.me bash << EOF
|
||||||
echo "📡 Connecting to server and executing deployment..."
|
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Copy .env file to server
|
|
||||||
echo "📤 Uploading environment configuration..."
|
|
||||||
scp -o StrictHostKeyChecking=accept-new \
|
|
||||||
-o ServerAliveInterval=30 \
|
|
||||||
-o ServerAliveCountMax=3 \
|
|
||||||
-o ConnectTimeout=10 \
|
|
||||||
/tmp/klz-cables.env \
|
|
||||||
root@alpha.mintel.me:/home/deploy/sites/klz-cables.com/.env
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "✅ Environment file uploaded successfully"
|
|
||||||
else
|
|
||||||
echo "❌ Failed to upload environment file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# SSH to server and run deployment
|
|
||||||
echo "🚀 Executing deployment on server..."
|
|
||||||
ssh -o StrictHostKeyChecking=accept-new \
|
|
||||||
-o ServerAliveInterval=30 \
|
|
||||||
-o ServerAliveCountMax=3 \
|
|
||||||
-o ConnectTimeout=10 \
|
|
||||||
root@alpha.mintel.me bash << EOF
|
|
||||||
set -e
|
set -e
|
||||||
|
cd /home/deploy/sites/klz-cables.com
|
||||||
|
|
||||||
PROJECT_DIR="/home/deploy/sites/klz-cables.com"
|
|
||||||
cd "\$PROJECT_DIR"
|
|
||||||
|
|
||||||
echo "🔒 Securing environment file..."
|
|
||||||
chmod 600 .env
|
chmod 600 .env
|
||||||
chown deploy:deploy .env
|
chown deploy:deploy .env
|
||||||
|
|
||||||
echo "🔐 Logging into Docker registry..."
|
|
||||||
echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
||||||
|
|
||||||
echo "🔄 Pulling latest image..."
|
|
||||||
docker pull registry.infra.mintel.me/mintel/klz-cables.com:latest
|
docker pull registry.infra.mintel.me/mintel/klz-cables.com:latest
|
||||||
|
|
||||||
echo "🔄 Stopping existing containers..."
|
|
||||||
docker-compose down
|
docker-compose down
|
||||||
|
|
||||||
echo "🚀 Starting new containers..."
|
echo "🚀 Starting containers..."
|
||||||
docker-compose up -d
|
if ! docker-compose up -d --wait 2>/dev/null; then
|
||||||
|
docker-compose up -d
|
||||||
|
echo "⏳ Waiting for health check..."
|
||||||
|
sleep 15
|
||||||
|
fi
|
||||||
|
|
||||||
echo "⏳ Waiting for services to be healthy..."
|
if ! docker-compose ps | grep -q "healthy"; then
|
||||||
MAX_RETRIES=12
|
echo "❌ Health check failed"
|
||||||
RETRY_COUNT=0
|
|
||||||
until curl -s -f http://127.0.0.1:3000/health > /dev/null || [ \$RETRY_COUNT -eq \$MAX_RETRIES ]; do
|
|
||||||
echo " • Waiting for health check... (\$((RETRY_COUNT + 1))/\$MAX_RETRIES)"
|
|
||||||
# Log the output of curl for debugging if it fails
|
|
||||||
curl -v http://127.0.0.1:3000/health 2>&1 | grep -E "< HTTP/|* Connection" || true
|
|
||||||
sleep 5
|
|
||||||
RETRY_COUNT=\$((RETRY_COUNT + 1))
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ \$RETRY_COUNT -eq \$MAX_RETRIES ]; then
|
|
||||||
echo "❌ Health check failed after \$MAX_RETRIES retries"
|
|
||||||
echo "🔍 Container status:"
|
|
||||||
docker-compose ps
|
docker-compose ps
|
||||||
echo ""
|
docker-compose logs --tail=50
|
||||||
echo "🔍 Container logs:"
|
|
||||||
docker-compose logs --tail=100
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "✅ Health check passed!"
|
|
||||||
|
|
||||||
echo "🔍 Checking service status..."
|
|
||||||
docker-compose ps
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ Deployment complete!"
|
echo "✅ Deployment complete!"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
DEPLOY_EXIT_CODE=$?
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Clean up temporary env file
|
|
||||||
rm -f /tmp/klz-cables.env
|
rm -f /tmp/klz-cables.env
|
||||||
|
|
||||||
if [ $DEPLOY_EXIT_CODE -eq 0 ]; then
|
|
||||||
echo "✅ Deployment completed successfully at: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
|
||||||
else
|
|
||||||
echo "❌ Deployment failed with exit code: $DEPLOY_EXIT_CODE"
|
|
||||||
echo ""
|
|
||||||
echo "🔍 Troubleshooting Tips:"
|
|
||||||
echo " • Check server connectivity: ping alpha.mintel.me"
|
|
||||||
echo " • Verify SSH key permissions on server"
|
|
||||||
echo " • Check disk space on target server"
|
|
||||||
echo " • Review docker compose configuration"
|
|
||||||
echo " • Verify all required secrets are set in Gitea"
|
|
||||||
exit $DEPLOY_EXIT_CODE
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
# LOGGING: Workflow Summary
|
# LOGGING: Workflow Summary
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
- name: 📊 Workflow Summary
|
- name: 📊 Workflow Summary
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
echo "📊 Status: ${{ job.status }}"
|
||||||
echo "║ Workflow Summary ║"
|
echo "🎯 Target: alpha.mintel.me"
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
echo "📊 Final Status:"
|
|
||||||
echo " • Workflow: ${{ job.status }}"
|
|
||||||
echo " • Completed: $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
|
||||||
echo ""
|
|
||||||
echo "🎯 Deployment Target:"
|
|
||||||
echo " • Image: registry.infra.mintel.me/mintel/klz-cables.com:latest"
|
|
||||||
echo " • Server: alpha.mintel.me"
|
|
||||||
echo " • Service: klz-cables.com"
|
|
||||||
echo ""
|
|
||||||
echo "🔐 Security Notes:"
|
|
||||||
echo " • All secrets are masked (*** ) in logs"
|
|
||||||
echo " • SSH keys are created with 600 permissions"
|
|
||||||
echo " • Passwords are never displayed in plain text"
|
|
||||||
echo " • .env file is auto-generated from Gitea secrets"
|
|
||||||
echo " • .env file has 600 permissions on server"
|
|
||||||
echo ""
|
|
||||||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
|
||||||
if [ "${{ job.status }}" == "success" ]; then
|
|
||||||
echo "║ ✅ DEPLOYMENT SUCCESSFUL ║"
|
|
||||||
else
|
|
||||||
echo "║ ❌ DEPLOYMENT FAILED ║"
|
|
||||||
fi
|
|
||||||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
# NOTIFICATION: Gotify
|
# NOTIFICATION: Gotify
|
||||||
|
|||||||
Reference in New Issue
Block a user