Barazo Docker Compose templates for self-hosting barazo.forum
at main 154 lines 4.3 kB view raw
1#!/usr/bin/env bash 2# Barazo Smoke Test 3# 4# Validates that a running Barazo instance is healthy. 5# Run after deployment or upgrade to verify all services are working. 6# 7# Usage: 8# ./scripts/smoke-test.sh # Test local (docker compose ps) 9# ./scripts/smoke-test.sh https://forum.example.com # Test remote URL 10# 11# Exit codes: 12# 0 All checks passed 13# 1 One or more checks failed 14 15set -euo pipefail 16 17COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" 18REMOTE_URL="${1:-}" 19PASSED=0 20FAILED=0 21 22pass() { 23 echo " PASS: $1" 24 PASSED=$((PASSED + 1)) 25} 26 27fail() { 28 echo " FAIL: $1" 29 FAILED=$((FAILED + 1)) 30} 31 32echo "Barazo Smoke Test" 33echo "=================" 34echo "" 35 36# --- Docker Compose checks (local only) --- 37if [ -z "$REMOTE_URL" ]; then 38 echo "Local deployment checks:" 39 40 # Check all services are running 41 SERVICES=$(docker compose -f "$COMPOSE_FILE" ps --format json 2>/dev/null || echo "") 42 if [ -z "$SERVICES" ]; then 43 fail "Docker Compose services not running" 44 else 45 for SERVICE in postgres valkey barazo-api barazo-web caddy; do 46 STATUS=$(docker compose -f "$COMPOSE_FILE" ps --format json "$SERVICE" 2>/dev/null | grep -o '"Health":"[^"]*"' | head -1 || echo "") 47 if echo "$STATUS" | grep -q "healthy"; then 48 pass "$SERVICE is healthy" 49 elif docker compose -f "$COMPOSE_FILE" ps --format json "$SERVICE" 2>/dev/null | grep -q "running"; then 50 pass "$SERVICE is running (no healthcheck)" 51 else 52 fail "$SERVICE is not running or unhealthy" 53 fi 54 done 55 fi 56 57 echo "" 58 59 # Check PostgreSQL connection 60 echo "Database checks:" 61 if docker compose -f "$COMPOSE_FILE" exec -T postgres pg_isready -U "${POSTGRES_USER:-barazo}" &>/dev/null; then 62 pass "PostgreSQL is accepting connections" 63 else 64 fail "PostgreSQL is not accepting connections" 65 fi 66 67 # Check Valkey connection 68 if docker compose -f "$COMPOSE_FILE" exec -T valkey valkey-cli ping 2>/dev/null | grep -q "PONG"; then 69 pass "Valkey is responding" 70 else 71 fail "Valkey is not responding" 72 fi 73 74 echo "" 75fi 76 77# --- HTTP checks --- 78if [ -n "$REMOTE_URL" ]; then 79 BASE_URL="$REMOTE_URL" 80 echo "Remote deployment checks ($BASE_URL):" 81else 82 BASE_URL="http://localhost:3000" 83 echo "HTTP checks (via localhost):" 84fi 85 86# API health 87echo "" 88echo "API checks:" 89HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/api/health" 2>/dev/null || echo "000") 90if [ "$HTTP_CODE" = "200" ]; then 91 pass "API health endpoint returns 200" 92else 93 fail "API health endpoint returned $HTTP_CODE (expected 200)" 94fi 95 96# API health/ready should be blocked externally (403 from Caddy) or 200 internally 97if [ -n "$REMOTE_URL" ]; then 98 HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/api/health/ready" 2>/dev/null || echo "000") 99 if [ "$HTTP_CODE" = "403" ]; then 100 pass "/api/health/ready blocked externally (403)" 101 else 102 fail "/api/health/ready returned $HTTP_CODE (expected 403)" 103 fi 104fi 105 106# Frontend 107echo "" 108echo "Frontend checks:" 109if [ -n "$REMOTE_URL" ]; then 110 HOMEPAGE=$(curl -s "$BASE_URL" 2>/dev/null || echo "") 111else 112 HOMEPAGE=$(curl -s "http://localhost:3001" 2>/dev/null || echo "") 113fi 114 115if echo "$HOMEPAGE" | grep -qi "barazo\|html"; then 116 pass "Frontend returns HTML content" 117else 118 fail "Frontend did not return expected HTML" 119fi 120 121# SSL check (remote only) 122if [ -n "$REMOTE_URL" ] && [[ "$REMOTE_URL" == https://* ]]; then 123 echo "" 124 echo "SSL checks:" 125 DOMAIN=$(echo "$REMOTE_URL" | sed 's|https://||' | sed 's|/.*||') 126 SSL_EXPIRY=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2 || echo "") 127 if [ -n "$SSL_EXPIRY" ]; then 128 pass "SSL certificate valid (expires: $SSL_EXPIRY)" 129 else 130 fail "Could not verify SSL certificate" 131 fi 132 133 # HTTPS redirect 134 HTTP_REDIRECT=$(curl -s -o /dev/null -w "%{redirect_url}" "http://$DOMAIN" 2>/dev/null || echo "") 135 if [[ "$HTTP_REDIRECT" == https://* ]]; then 136 pass "HTTP redirects to HTTPS" 137 else 138 fail "HTTP does not redirect to HTTPS" 139 fi 140fi 141 142# --- Summary --- 143echo "" 144echo "=================" 145TOTAL=$((PASSED + FAILED)) 146echo "Results: $PASSED/$TOTAL passed" 147 148if [ "$FAILED" -gt 0 ]; then 149 echo "" 150 echo "$FAILED check(s) failed. Review the output above." 151 exit 1 152fi 153 154echo "All checks passed."