name: Deploy to Hostinger on: push: branches: [ main ] permissions: contents: read concurrency: group: deploy-pr-vision cancel-in-progress: true jobs: ci: name: Pre-deploy CI uses: ./.github/workflows/ci.yml deploy: name: Deploy (rsync to Hostinger PROD) needs: ci runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up SSH key run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_deploy chmod 600 ~/.ssh/id_deploy ssh-keyscan -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_HOST }}" >> ~/.ssh/known_hosts 2>/dev/null - name: rsync plugin to PROD run: | rsync -az --delete \ --exclude='.git' \ --exclude='.github' \ --exclude='tests' \ --exclude='phpunit.xml.dist' \ --exclude='composer.json' \ --exclude='composer.lock' \ --exclude='vendor' \ --exclude='phpcs.xml.dist' \ --exclude='*.md' \ -e "ssh -p ${{ secrets.SSH_PORT }} -i ~/.ssh/id_deploy -o StrictHostKeyChecking=no" \ ./ \ "${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:~/domains/peptiderepo.com/public_html/wp-content/plugins/pr-vision/" - name: Purge LiteSpeed cache run: | ssh -p "${{ secrets.SSH_PORT }}" \ -i ~/.ssh/id_deploy \ -o StrictHostKeyChecking=no \ "${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}" \ 'wp --path=~/domains/peptiderepo.com/public_html litespeed-purge all 2>/dev/null || true' - name: Health check (expect 200 or 403) run: | STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ --max-time 15 \ "https://peptiderepo.com/wp-admin/admin.php?page=pr-vision" \ -L --user-agent "GitHub-Actions-Deploy-Health-Check/1.0") echo "HTTP status: $STATUS" if [ "$STATUS" = "200" ] || [ "$STATUS" = "403" ]; then echo "Health check passed." else echo "Health check FAILED with status $STATUS" exit 1 fi