Linting configs (PHPCS, ESLint, Stylelint), Forgejo CI pipeline, WordPress health check, PHP linter, strain migration tool, and Docker local dev environment. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
139 lines
4.4 KiB
Bash
Executable file
139 lines
4.4 KiB
Bash
Executable file
#!/bin/bash
|
|
# Weedops WordPress Health Check Script
|
|
# Checks site availability, database, plugins, and theme status
|
|
# Usage: ./wp-health-check.sh [site-url]
|
|
|
|
set -euo pipefail
|
|
|
|
SITE_URL="${1:-https://weedops.site}"
|
|
WP_PATH="${2:-/var/www/weedops}"
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
WARN=0
|
|
|
|
check_pass() { echo -e "${GREEN}[PASS]${NC} $1"; ((PASS++)); }
|
|
check_fail() { echo -e "${RED}[FAIL]${NC} $1"; ((FAIL++)); }
|
|
check_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; ((WARN++)); }
|
|
|
|
echo "========================================="
|
|
echo " Weedops WordPress Health Check"
|
|
echo " $(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
# 1. HTTP Response Check
|
|
echo "--- Site Availability ---"
|
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$SITE_URL" 2>/dev/null || echo "000")
|
|
if [ "$HTTP_CODE" = "200" ]; then
|
|
check_pass "Site responding with HTTP $HTTP_CODE"
|
|
elif [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "302" ]; then
|
|
check_warn "Site redirecting with HTTP $HTTP_CODE"
|
|
else
|
|
check_fail "Site returned HTTP $HTTP_CODE"
|
|
fi
|
|
|
|
# SSL Check
|
|
if echo "$SITE_URL" | grep -q "https"; then
|
|
SSL_EXPIRY=$(echo | openssl s_client -servername "$(echo "$SITE_URL" | sed 's|https://||')" -connect "$(echo "$SITE_URL" | sed 's|https://||')":443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
|
|
if [ -n "$SSL_EXPIRY" ]; then
|
|
check_pass "SSL certificate valid until: $SSL_EXPIRY"
|
|
else
|
|
check_warn "Could not verify SSL certificate"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 2. WP-CLI Checks (if available)
|
|
echo "--- WordPress Core ---"
|
|
if command -v wp &> /dev/null && [ -d "$WP_PATH" ]; then
|
|
WP_VERSION=$(wp core version --path="$WP_PATH" 2>/dev/null || echo "unknown")
|
|
if [ "$WP_VERSION" != "unknown" ]; then
|
|
check_pass "WordPress version: $WP_VERSION"
|
|
else
|
|
check_warn "Could not determine WordPress version"
|
|
fi
|
|
|
|
# Check for updates
|
|
UPDATE_COUNT=$(wp core check-update --path="$WP_PATH" --format=count 2>/dev/null || echo "0")
|
|
if [ "$UPDATE_COUNT" = "0" ]; then
|
|
check_pass "WordPress core is up to date"
|
|
else
|
|
check_warn "WordPress core update available"
|
|
fi
|
|
|
|
# Active theme
|
|
ACTIVE_THEME=$(wp theme list --path="$WP_PATH" --status=active --field=name 2>/dev/null || echo "unknown")
|
|
check_pass "Active theme: $ACTIVE_THEME"
|
|
|
|
# Plugin status
|
|
echo ""
|
|
echo "--- Plugins ---"
|
|
PLUGIN_UPDATES=$(wp plugin list --path="$WP_PATH" --update=available --format=count 2>/dev/null || echo "0")
|
|
if [ "$PLUGIN_UPDATES" = "0" ]; then
|
|
check_pass "All plugins up to date"
|
|
else
|
|
check_warn "$PLUGIN_UPDATES plugin(s) need updates"
|
|
fi
|
|
|
|
INACTIVE_PLUGINS=$(wp plugin list --path="$WP_PATH" --status=inactive --format=count 2>/dev/null || echo "0")
|
|
if [ "$INACTIVE_PLUGINS" != "0" ]; then
|
|
check_warn "$INACTIVE_PLUGINS inactive plugin(s) — consider removing"
|
|
fi
|
|
else
|
|
check_warn "WP-CLI not available or WP path not found — skipping core checks"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 3. Database connectivity
|
|
echo "--- Database ---"
|
|
if command -v wp &> /dev/null && [ -d "$WP_PATH" ]; then
|
|
if wp db check --path="$WP_PATH" &>/dev/null; then
|
|
check_pass "Database connection OK"
|
|
else
|
|
check_fail "Database connection failed"
|
|
fi
|
|
else
|
|
check_warn "Skipping DB check (WP-CLI not available)"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 4. Disk space
|
|
echo "--- Server ---"
|
|
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
|
|
if [ "$DISK_USAGE" -lt 80 ]; then
|
|
check_pass "Disk usage: ${DISK_USAGE}%"
|
|
elif [ "$DISK_USAGE" -lt 90 ]; then
|
|
check_warn "Disk usage: ${DISK_USAGE}% — getting full"
|
|
else
|
|
check_fail "Disk usage: ${DISK_USAGE}% — critical!"
|
|
fi
|
|
|
|
# PHP version
|
|
PHP_VER=$(php -v 2>/dev/null | head -1 | awk '{print $2}' || echo "unknown")
|
|
if [ "$PHP_VER" != "unknown" ]; then
|
|
check_pass "PHP version: $PHP_VER"
|
|
fi
|
|
|
|
# Memory
|
|
MEM_AVAIL=$(free -m | awk '/Mem:/ {printf "%.0f", $7/$2*100}')
|
|
if [ "$MEM_AVAIL" -gt 20 ]; then
|
|
check_pass "Available memory: ${MEM_AVAIL}%"
|
|
else
|
|
check_warn "Available memory: ${MEM_AVAIL}% — low"
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " Results: ${GREEN}${PASS} passed${NC}, ${YELLOW}${WARN} warnings${NC}, ${RED}${FAIL} failed${NC}"
|
|
echo "========================================="
|
|
|
|
# Exit with error if any failures
|
|
[ "$FAIL" -eq 0 ] && exit 0 || exit 1
|