|
1 | 1 | #!/usr/bin/env bash |
2 | | -# setup-server.sh — provision a surreal binary; no-op if already present |
| 2 | +# setup-server.sh — provision + start a surreal server on 127.0.0.1:$PORT |
| 3 | +# Idempotent: no-op if a server is already listening on the port. |
3 | 4 | set -euo pipefail |
4 | 5 |
|
5 | | -if command -v surreal &>/dev/null; then |
6 | | - echo "[setup-server] surreal found at $(command -v surreal) — nothing to do" |
7 | | - exit 0 |
8 | | -fi |
9 | | - |
10 | | -OS="$(uname -s)" |
| 6 | +PORT="${SURREALDB_PORT:-8000}" |
| 7 | +USER="${SURREALDB_USER:-root}" |
| 8 | +PASS="${SURREALDB_PASS:-root}" |
| 9 | +IMAGE="${SURREALDB_IMAGE:-surrealdb/surrealdb:latest}" |
| 10 | +READY_TIMEOUT="${SURREALDB_READY_TIMEOUT:-30}" |
11 | 11 |
|
12 | | -if [ "${CI:-}" = "true" ]; then |
13 | | - echo "[setup-server] CI environment — pulling surrealdb/surrealdb:latest via docker" |
14 | | - docker pull surrealdb/surrealdb:latest |
15 | | - mkdir -p "$HOME/.local/bin" |
16 | | - cat > "$HOME/.local/bin/surreal" <<'WRAPPER' |
17 | | -#!/usr/bin/env bash |
18 | | -exec docker run --rm -it \ |
19 | | - -p 8000:8000 \ |
20 | | - surrealdb/surrealdb:latest \ |
21 | | - "$@" |
22 | | -WRAPPER |
23 | | - chmod +x "$HOME/.local/bin/surreal" |
24 | | - echo "[setup-server] wrapper written to $HOME/.local/bin/surreal" |
25 | | - echo "[setup-server] ensure \$HOME/.local/bin is on PATH" |
| 12 | +# Already running? Done. |
| 13 | +if nc -z 127.0.0.1 "$PORT" 2>/dev/null; then |
| 14 | + echo "[setup-server] surreal already listening on :$PORT — nothing to do" |
26 | 15 | exit 0 |
27 | 16 | fi |
28 | 17 |
|
29 | | -if [ "$OS" = "Darwin" ]; then |
30 | | - echo "[setup-server] surreal not found — install with:" |
31 | | - echo " brew install surrealdb/tap/surreal" |
| 18 | +# Docker path: CI uses it; locally opt-in via SURREALDB_BACKEND=docker for CI parity. |
| 19 | +if [ "${CI:-}" = "true" ] || [ "${SURREALDB_BACKEND:-}" = "docker" ]; then |
| 20 | + echo "[setup-server] starting $IMAGE via docker on :$PORT" |
| 21 | + docker pull "$IMAGE" |
| 22 | + docker run -d --rm --name surreal-ci \ |
| 23 | + -p "$PORT:8000" \ |
| 24 | + "$IMAGE" \ |
| 25 | + start --user "$USER" --pass "$PASS" --bind 0.0.0.0:8000 memory |
| 26 | +# Local path: native binary if available. |
| 27 | +elif command -v surreal &>/dev/null; then |
| 28 | + echo "[setup-server] starting native surreal on :$PORT (pid logged to /tmp/surreal-$PORT.pid)" |
| 29 | + surreal start --user "$USER" --pass "$PASS" --bind "127.0.0.1:$PORT" memory \ |
| 30 | + > "/tmp/surreal-$PORT.log" 2>&1 & |
| 31 | + echo $! > "/tmp/surreal-$PORT.pid" |
| 32 | +# Local path: no binary. Tell the user how to get one. |
| 33 | +elif [ "$(uname -s)" = "Darwin" ]; then |
| 34 | + echo "[setup-server] surreal not found — install with:" >&2 |
| 35 | + echo " brew install surrealdb/tap/surreal" >&2 |
32 | 36 | exit 1 |
33 | 37 | else |
34 | | - echo "[setup-server] surreal not found — install with:" |
35 | | - echo " curl -sSf https://install.surrealdb.com | sh" |
| 38 | + echo "[setup-server] surreal not found — install with:" >&2 |
| 39 | + echo " curl -sSf https://install.surrealdb.com | sh" >&2 |
36 | 40 | exit 1 |
37 | 41 | fi |
| 42 | + |
| 43 | +# Wait for the port to accept connections. Bounded — failed startup shouldn't |
| 44 | +# hang the workflow indefinitely. |
| 45 | +echo "[setup-server] waiting for :$PORT (timeout ${READY_TIMEOUT}s)..." |
| 46 | +for _ in $(seq 1 "$READY_TIMEOUT"); do |
| 47 | + if nc -z 127.0.0.1 "$PORT" 2>/dev/null; then |
| 48 | + echo "[setup-server] ready" |
| 49 | + exit 0 |
| 50 | + fi |
| 51 | + sleep 1 |
| 52 | +done |
| 53 | + |
| 54 | +echo "[setup-server] timed out waiting for :$PORT" >&2 |
| 55 | +if [ "${CI:-}" = "true" ]; then |
| 56 | + docker logs surreal-ci 2>&1 | tail -50 >&2 || true |
| 57 | +fi |
| 58 | +exit 1 |
0 commit comments