mirror of
https://github.com/block/buzz.git
synced 2026-11-03 07:51:22 +00:00
fix(dev): seed local community hosts
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co> Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
This commit is contained in:
parent
a0f8b9a2b1
commit
79fe9c406d
3
Justfile
3
Justfile
@@ -169,9 +169,10 @@ _ensure-services:
|
||||
echo " timed out"
|
||||
exit 1
|
||||
|
||||
# Apply database migrations if the dev database is running
|
||||
# Apply database migrations and seed the local dev community if the dev database is running
|
||||
_ensure-migrations: _ensure-services
|
||||
cargo run -p buzz-admin -- migrate
|
||||
./scripts/seed-local-community.sh
|
||||
|
||||
# Run clippy on the desktop Tauri Rust crate
|
||||
desktop-tauri-clippy: _ensure-sidecar-stubs
|
||||
|
||||
@@ -129,6 +129,7 @@ until postgres_accepting_connections; do
|
||||
done
|
||||
|
||||
"${REPO_ROOT}/bin/cargo" run -p buzz-admin -- migrate
|
||||
"${REPO_ROOT}/scripts/seed-local-community.sh"
|
||||
success "Database migrations complete"
|
||||
|
||||
# ---- Install desktop dependencies -------------------------------------------
|
||||
|
||||
91
scripts/seed-local-community.sh
Executable file
91
scripts/seed-local-community.sh
Executable file
@@ -0,0 +1,91 @@
|
||||
#!/usr/bin/env bash
|
||||
# Seed local dev host -> community rows for row-zero host binding.
|
||||
#
|
||||
# The relay intentionally fails closed when the request Host header is not in
|
||||
# `communities`. Local dev uses loopback hosts, so bootstrap must create those
|
||||
# rows after migrations before desktop/Tauri HTTP bridge calls can succeed.
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
cd "${REPO_ROOT}"
|
||||
|
||||
if [[ -f ".env" ]]; then
|
||||
set -o allexport
|
||||
# shellcheck disable=SC1091
|
||||
source .env
|
||||
set +o allexport
|
||||
fi
|
||||
|
||||
export PGHOST="${PGHOST:-localhost}"
|
||||
export PGPORT="${PGPORT:-5432}"
|
||||
export PGUSER="${PGUSER:-buzz}"
|
||||
export PGPASSWORD="${PGPASSWORD:-buzz_dev}"
|
||||
export PGDATABASE="${PGDATABASE:-buzz}"
|
||||
export RELAY_URL="${RELAY_URL:-ws://localhost:3000}"
|
||||
|
||||
hosts_sql=$(python3 - <<'PY'
|
||||
import os
|
||||
from urllib.parse import urlparse
|
||||
|
||||
relay_url = os.environ.get("RELAY_URL", "ws://localhost:3000")
|
||||
parsed = urlparse(relay_url)
|
||||
|
||||
host = (parsed.hostname or "").rstrip(".").lower()
|
||||
port = parsed.port
|
||||
scheme = parsed.scheme.lower()
|
||||
|
||||
def authority(host, port, scheme):
|
||||
if not host:
|
||||
return ""
|
||||
display_host = f"[{host}]" if ":" in host and not host.startswith("[") else host
|
||||
default_port = (scheme == "ws" and port == 80) or (scheme == "wss" and port == 443)
|
||||
if port and not default_port:
|
||||
return f"{display_host}:{port}"
|
||||
return display_host
|
||||
|
||||
primary = authority(host, port, scheme)
|
||||
hosts = []
|
||||
if primary:
|
||||
hosts.append(primary)
|
||||
|
||||
# Local desktop/dev tooling has historically used both localhost and 127.0.0.1.
|
||||
# Under row-zero host binding those are distinct hosts, so seed both loopback
|
||||
# spellings for local dev to avoid a fail-closed 404 when one side uses the
|
||||
# alternate authority. Non-loopback deployments seed only RELAY_URL's authority.
|
||||
if host in {"localhost", "127.0.0.1"} and port:
|
||||
hosts.extend([f"localhost:{port}", f"127.0.0.1:{port}"])
|
||||
|
||||
seen = []
|
||||
for h in hosts:
|
||||
if h and h not in seen:
|
||||
seen.append(h)
|
||||
|
||||
if not seen:
|
||||
raise SystemExit("could not derive a host from RELAY_URL")
|
||||
|
||||
print(",\n".join(f" ('{h.replace("'", "''")}')" for h in seen))
|
||||
PY
|
||||
)
|
||||
|
||||
sql="
|
||||
INSERT INTO communities (host)
|
||||
SELECT host
|
||||
FROM (VALUES
|
||||
${hosts_sql}
|
||||
) AS v(host)
|
||||
ON CONFLICT (lower(host)) DO NOTHING;
|
||||
"
|
||||
|
||||
if command -v psql >/dev/null 2>&1; then
|
||||
PGPASSWORD="${PGPASSWORD}" psql -h "${PGHOST}" -p "${PGPORT}" -U "${PGUSER}" -d "${PGDATABASE}" -v ON_ERROR_STOP=1 -c "${sql}"
|
||||
elif docker exec buzz-postgres psql --version >/dev/null 2>&1; then
|
||||
docker exec -i -e PGPASSWORD="${PGPASSWORD}" buzz-postgres \
|
||||
psql -U "${PGUSER}" -d "${PGDATABASE}" -v ON_ERROR_STOP=1 -c "${sql}"
|
||||
else
|
||||
echo "error: neither psql nor buzz-postgres docker psql is available" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Seeded local dev community host(s):"
|
||||
echo "${hosts_sql}" | sed -E "s/^ +\('(.+)'\),?$/ - \1/"
|
||||
Reference in New Issue
Block a user