Barazo Docker Compose templates for self-hosting
barazo.forum
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."