name: Deploy API-Ubigeo on: push: branches: [main] jobs: deploy: runs-on: self-hosted steps: - name: Checkout uses: actions/checkout@v4 - name: Backup current image run: | docker tag ubigeo-api:latest ubigeo-api:rollback 2>/dev/null || true - name: Sync source run: | rsync -a --delete \ --exclude='.git' \ --exclude='node_modules' \ --exclude='dist' \ --exclude='.env' \ ./ /home/deployer/api-ubigeo/ - name: Build image run: | cd /home/deployer/api-ubigeo docker build -t ubigeo-api:latest . - name: Deploy containers run: | cd /home/deployer/api-ubigeo docker compose -f docker-compose.production.yml down --remove-orphans docker compose -f docker-compose.production.yml up -d - name: Health check id: health continue-on-error: true run: | echo "Waiting for API-Ubigeo to start..." for i in $(seq 1 15); do sleep 3 HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3200/api/v1/health 2>/dev/null || echo "000") if [ "$HTTP_CODE" != "000" ] && [ "$HTTP_CODE" != "502" ] && [ "$HTTP_CODE" != "503" ]; then echo "✅ Health check passed after $((i*3))s (HTTP $HTTP_CODE)" exit 0 fi echo "Attempt $i/15 - not ready yet (HTTP $HTTP_CODE)..." done echo "❌ Health check failed after 45s" docker logs ubigeo-api --tail 50 exit 1 - name: Rollback on failure if: steps.health.outcome == 'failure' run: | echo "❌ Deploy failed, rolling back..." docker tag ubigeo-api:rollback ubigeo-api:latest 2>/dev/null || true cd /home/deployer/api-ubigeo docker compose -f docker-compose.production.yml up -d --force-recreate echo "🔄 Rollback complete" exit 1