cca4bda1fc
- deploy/deploy.sh: idempotent deploy script with dynamic port
allocation (3011..30200), flock-based concurrency, atomic
.postgrest-port/.nextjs-port writes, port cleanup of the previous
deploy + dev stack, nginx config rendering+reload, healthchecks
with rollback, optional image pruning
- deploy/docker-compose.yml + Dockerfile.nextjs: example stack
consuming ${POSTGREST_HOST_PORT} / ${NEXTJS_HOST_PORT} (kept as
reference; the repo's root docker-compose.yml is the source of
truth for the actual production stack)
- deploy/nginx.conf.template: /api/* -> PostgREST, /* -> Next.js
- deploy/.env.production.example: managed port block + preserved secrets
- deploy/healthcheck.sh: standalone health probe (cron-friendly)
- deploy/Makefile: deploy/status/health/logs/down/rollback targets
- deploy/GITEA_SETUP.md: webhook vs Actions runner instructions
- deploy/README.md + deploy/.gitignore
Note: .gitea/workflows/deploy.yml was deliberately not added — the
existing workflow at that path on Gitea main is the source of truth
and is left untouched.
55 lines
1.7 KiB
Bash
Executable File
55 lines
1.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# healthcheck.sh — standalone, callable from cron / monitoring
|
|
# =============================================================================
|
|
#
|
|
# Reads the current prod ports from .postgrest-port / .nextjs-port and curls
|
|
# each service. Exit code is the count of failed checks (0 = all healthy).
|
|
#
|
|
# Usage:
|
|
# ./healthcheck.sh
|
|
# ./healthcheck.sh --nginx # also check the fronted URL
|
|
# WORKSPACE=/srv/app ./healthcheck.sh
|
|
# =============================================================================
|
|
|
|
set -Eeuo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
WORKSPACE="${WORKSPACE:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
POSTGREST_PORT_FILE="${POSTGREST_PORT_FILE:-${WORKSPACE}/.postgrest-port}"
|
|
NEXTJS_PORT_FILE="${NEXTJS_PORT_FILE:-${WORKSPACE}/.nextjs-port}"
|
|
TIMEOUT="${HEALTHCHECK_TIMEOUT:-5}"
|
|
|
|
failures=0
|
|
|
|
check() {
|
|
local label="$1" url="$2"
|
|
if curl -fsS --max-time "$TIMEOUT" -o /dev/null "$url"; then
|
|
printf ' [ OK ] %-20s %s\n' "$label" "$url"
|
|
else
|
|
printf ' [FAIL] %-20s %s\n' "$label" "$url"
|
|
failures=$(( failures + 1 ))
|
|
fi
|
|
}
|
|
|
|
pgrest_port=$(tr -d '[:space:]' < "$POSTGREST_PORT_FILE" 2>/dev/null || echo "")
|
|
next_port=$(tr -d '[:space:]' < "$NEXTJS_PORT_FILE" 2>/dev/null || echo "")
|
|
|
|
if [[ -n "$pgrest_port" ]]; then
|
|
check "postgrest" "http://127.0.0.1:${pgrest_port}/"
|
|
else
|
|
printf ' [SKIP] postgrest (no .postgrest-port)\n'
|
|
fi
|
|
|
|
if [[ -n "$next_port" ]]; then
|
|
check "nextjs" "http://127.0.0.1:${next_port}/"
|
|
else
|
|
printf ' [SKIP] nextjs (no .nextjs-port)\n'
|
|
fi
|
|
|
|
if [[ "${1:-}" == "--nginx" ]]; then
|
|
check "nginx" "http://127.0.0.1/"
|
|
fi
|
|
|
|
exit "$failures"
|