diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 2da78029..abfeb214 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -11,49 +11,240 @@ jobs: runs-on: docker steps: + # ═══════════════════════════════════════════════════════════════════════════════ + # LOGGING: Workflow Start - Full Transparency + # ═══════════════════════════════════════════════════════════════════════════════ + - name: 📋 Log Workflow Start + run: | + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ KLZ Cables Deployment Workflow Started ║" + echo "╚══════════════════════════════════════════════════════════════════════════════╝" + echo "" + echo "📋 Workflow Information:" + echo " • Repository: ${{ github.repository }}" + echo " • Branch: ${{ github.ref }}" + 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 "" + echo "🔍 Environment Details:" + echo " • Runner OS: ${{ runner.os }}" + echo " • Workspace: ${{ github.workspace }}" + echo "" + - name: Checkout repository uses: actions/checkout@v4 - - name: Login to private registry + # ═══════════════════════════════════════════════════════════════════════════════ + # LOGGING: Registry Login Phase + # ═══════════════════════════════════════════════════════════════════════════════ + - name: 🔐 Login to private registry run: | - echo "${{ secrets.REGISTRY_PASS }}" | \ - docker login registry.infra.mintel.me \ - -u "${{ secrets.REGISTRY_USER }}" --password-stdin + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ Step: Registry Login ║" + 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 "" - - name: Build Docker image + # ═══════════════════════════════════════════════════════════════════════════════ + # LOGGING: Build Phase + # ═══════════════════════════════════════════════════════════════════════════════ + - name: 🏗️ Build Docker image run: | + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + 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:" + echo " • NEXT_PUBLIC_UMAMI_WEBSITE_ID: ${{ secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID != '' && '***' || 'NOT SET' }}" + echo " • NEXT_PUBLIC_SENTRY_DSN: ${{ secrets.SENTRY_DSN != '' && '***' || '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 \ --pull \ --platform linux/arm64 \ --build-arg NEXT_PUBLIC_UMAMI_WEBSITE_ID="${{ secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID }}" \ - --build-arg NEXT_PUBLIC_UMAMI_SCRIPT_URL="${{ secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL }}" \ --build-arg NEXT_PUBLIC_SENTRY_DSN="${{ secrets.SENTRY_DSN }}" \ -t registry.infra.mintel.me/mintel/klz-cables.com:latest \ --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:" + docker inspect registry.infra.mintel.me/mintel/klz-cables.com:latest --format=' • Size: {{.Size | div 1024 | div 1024}}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 "" - # Alternative ohne Buildx (wenn du kein Multi-Platform brauchst): - # docker build \ - # --pull \ - # --build-arg ... \ - # -t registry.infra.mintel.me/mintel/klz-cables.com:latest . - # docker push registry.infra.mintel.me/mintel/klz-cables.com:latest - - - name: Deploy to production server + # ═══════════════════════════════════════════════════════════════════════════════ + # LOGGING: Deployment Phase + # ═══════════════════════════════════════════════════════════════════════════════ + - name: 🚀 Deploy to production server run: | + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ Step: Deploy to Production Server ║" + echo "╚══════════════════════════════════════════════════════════════════════════════╝" + echo "" + echo "🚀 Starting deployment process..." + echo " Target Server: alpha.mintel.me" + echo " Deploy User: deploy" + echo " Target Path: /home/deploy/sites/klz-cables.com" + echo "" + + # Setup SSH with logging + echo "🔐 Setting up SSH connection..." mkdir -p ~/.ssh echo "${{ secrets.ALPHA_SSH_KEY }}" > ~/.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 - - # Use SSH with connection keepalive and execute commands directly + if [ $? -eq 0 ]; then + echo "✅ Host key added successfully" + else + echo "⚠️ Warning: Could not add host key" + fi + echo "" + + # Execute deployment commands with detailed logging + echo "📡 Connecting to server and executing deployment commands..." + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + # Execute remote commands with error handling and logging ssh -o StrictHostKeyChecking=accept-new \ -o ServerAliveInterval=30 \ -o ServerAliveCountMax=3 \ -o ConnectTimeout=10 \ deploy@alpha.mintel.me \ - "echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin && \ - cd /home/deploy/sites/klz-cables.com && \ - docker compose pull && \ - docker compose up -d --force-recreate --remove-orphans && \ - docker image prune -f" \ No newline at end of file + "set -e + echo '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━' + echo '📡 Remote Deployment Started' + echo '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━' + echo '' + + echo '🔐 Logging into registry on remote server...' + echo '${{ secrets.REGISTRY_PASS }}' | docker login registry.infra.mintel.me -u '${{ secrets.REGISTRY_USER }}' --password-stdin + if [ \$? -eq 0 ]; then + echo '✅ Remote registry login successful' + else + echo '❌ Remote registry login failed' + exit 1 + fi + echo '' + + echo '📂 Changing to deployment directory...' + cd /home/deploy/sites/klz-cables.com + echo '✅ Current directory: \$(pwd)' + echo '' + + echo '📥 Pulling latest images...' + docker compose pull + if [ \$? -eq 0 ]; then + echo '✅ Image pull completed' + else + echo '❌ Image pull failed' + exit 1 + fi + echo '' + + echo '🔄 Starting containers with force-recreate...' + docker compose up -d --force-recreate --remove-orphans + if [ \$? -eq 0 ]; then + echo '✅ Containers started successfully' + else + echo '❌ Container startup failed' + exit 1 + fi + echo '' + + echo '🧹 Cleaning up old images...' + docker image prune -f + echo '✅ Cleanup completed' + echo '' + + echo '📊 Container Status:' + docker compose ps --format 'table {{.Name}}\t{{.State}}\t{{.Status}}' + echo '' + + echo '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━' + echo '✅ Remote Deployment Completed Successfully' + echo '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━' + " 2>&1 + + DEPLOY_EXIT_CODE=$? + echo "" + + 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" + exit $DEPLOY_EXIT_CODE + fi + echo "" + + # ═══════════════════════════════════════════════════════════════════════════════ + # LOGGING: Workflow Summary + # ═══════════════════════════════════════════════════════════════════════════════ + - name: 📊 Workflow Summary + if: always() + run: | + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ Workflow Summary ║" + 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 "" + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + if [ "${{ job.status }}" == "success" ]; then + echo "║ ✅ DEPLOYMENT SUCCESSFUL ║" + else + echo "║ ❌ DEPLOYMENT FAILED ║" + fi + echo "╚══════════════════════════════════════════════════════════════════════════════╝"