From 21324dd5ec0b102290f8869864e38eaf895e77a7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 23 Oct 2025 01:14:21 -0700 Subject: [PATCH] chore(scripts): add pg backup & restore scripts for dev --- biome.json | 3 +- pnpm-lock.yaml | 98 +++++++++++++++++++++++++++++++++ scripts/run/backup-postgres.sh | 41 ++++++++++++++ scripts/run/engine-postgres.sh | 17 +++++- scripts/run/nuke-postgres.sh | 33 +++++++++++ scripts/run/restore-postgres.sh | 56 +++++++++++++++++++ 6 files changed, 244 insertions(+), 4 deletions(-) create mode 100755 scripts/run/backup-postgres.sh create mode 100755 scripts/run/nuke-postgres.sh create mode 100755 scripts/run/restore-postgres.sh diff --git a/biome.json b/biome.json index f73b7b236e..e56369e5af 100644 --- a/biome.json +++ b/biome.json @@ -8,8 +8,7 @@ "!engine/artifacts", "!engine/sdks", "!engine/sdks/typescript/api-full", - "!engine/sdks/typescript/runner-protocol" - "!examples/snippets", + "!engine/sdks/typescript/runner-protocol", "!frontend", "!rivetkit-openapi/openapi.json", "!scripts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bda78540f..e5386fc7a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -537,6 +537,104 @@ importers: specifier: ^3.1.1 version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(@vitest/ui@3.1.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0) + examples/cursors: + dependencies: + rivetkit: + specifier: workspace:* + version: link:../../rivetkit-typescript/packages/rivetkit + devDependencies: + '@rivetkit/react': + specifier: workspace:* + version: link:../../rivetkit-typescript/packages/react + '@types/node': + specifier: ^22.13.9 + version: 22.18.1 + '@types/prompts': + specifier: ^2 + version: 2.4.9 + '@types/react': + specifier: ^18.2.0 + version: 18.3.24 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.7(@types/react@18.3.24) + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.7.0(vite@5.4.20(@types/node@22.18.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + tsx: + specifier: ^3.12.7 + version: 3.14.0 + typescript: + specifier: ^5.5.2 + version: 5.9.2 + vite: + specifier: ^5.0.0 + version: 5.4.20(@types/node@22.18.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0) + vitest: + specifier: ^3.1.1 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(@vitest/ui@3.1.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0) + + examples/cursors-raw-websocket: + dependencies: + rivetkit: + specifier: workspace:* + version: link:../../rivetkit-typescript/packages/rivetkit + devDependencies: + '@rivetkit/react': + specifier: workspace:* + version: link:../../rivetkit-typescript/packages/react + '@types/node': + specifier: ^22.13.9 + version: 22.18.1 + '@types/prompts': + specifier: ^2 + version: 2.4.9 + '@types/react': + specifier: ^18.2.0 + version: 18.3.24 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.7(@types/react@18.3.24) + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.7.0(vite@5.4.20(@types/node@22.18.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + tsx: + specifier: ^3.12.7 + version: 3.14.0 + typescript: + specifier: ^5.5.2 + version: 5.9.2 + vite: + specifier: ^5.0.0 + version: 5.4.20(@types/node@22.18.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0) + vitest: + specifier: ^3.1.1 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(@vitest/ui@3.1.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0) + examples/database: dependencies: '@rivetkit/react': diff --git a/scripts/run/backup-postgres.sh b/scripts/run/backup-postgres.sh new file mode 100755 index 0000000000..9704f94226 --- /dev/null +++ b/scripts/run/backup-postgres.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +CONTAINER_NAME="rivet-engine-postgres" + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + echo "Example: $0 /path/to/backup/postgres-backup.tar.gz" + exit 1 +fi + +BACKUP_PATH="$1" + +# Check if container exists +if ! docker ps --all --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + echo "error: container '${CONTAINER_NAME}' not found" + exit 1 +fi + +# Get the volume name +VOLUME_NAME=$(docker inspect "${CONTAINER_NAME}" --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Name}}{{end}}{{end}}') + +if [ -z "${VOLUME_NAME}" ]; then + echo "error: could not find postgres data volume for container '${CONTAINER_NAME}'" + exit 1 +fi + +echo "Backing up postgres data from volume '${VOLUME_NAME}'..." + +# Create backup directory if it doesn't exist +BACKUP_DIR="$(dirname "${BACKUP_PATH}")" +mkdir -p "${BACKUP_DIR}" + +# Backup the volume data +docker run --rm \ + -v "${VOLUME_NAME}":/data \ + -v "${BACKUP_DIR}":/backup \ + alpine \ + tar czf "/backup/$(basename "${BACKUP_PATH}")" -C /data . + +echo "Backup completed: ${BACKUP_PATH}" diff --git a/scripts/run/engine-postgres.sh b/scripts/run/engine-postgres.sh index 317263034a..f93511125d 100755 --- a/scripts/run/engine-postgres.sh +++ b/scripts/run/engine-postgres.sh @@ -11,8 +11,21 @@ fi if ! nc -z localhost 5432 >/dev/null 2>&1; then echo "Postgres is not reachable at localhost:5432." - echo "Hint: run scripts/dev/run-postgres.sh to start the local Postgres container." - exit 1 + echo "Starting postgres container..." + "${SCRIPT_DIR}/postgres.sh" + + echo "Waiting for postgres to be ready..." + for i in {1..30}; do + if nc -z localhost 5432 >/dev/null 2>&1; then + echo "Postgres is ready!" + break + fi + if [ $i -eq 30 ]; then + echo "error: postgres did not become ready in time" + exit 1 + fi + sleep 1 + done fi cd "${REPO_ROOT}" diff --git a/scripts/run/nuke-postgres.sh b/scripts/run/nuke-postgres.sh new file mode 100755 index 0000000000..7e6f098b94 --- /dev/null +++ b/scripts/run/nuke-postgres.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +CONTAINER_NAME="rivet-engine-postgres" + +echo "Nuking postgres container and data..." + +# Get the volume name before removing the container +VOLUME_NAME="" +if docker ps --all --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + VOLUME_NAME=$(docker inspect "${CONTAINER_NAME}" --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Name}}{{end}}{{end}}' 2>/dev/null || true) +fi + +# Stop and remove container +if docker ps --all --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + echo "Stopping and removing container '${CONTAINER_NAME}'..." + if docker ps --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + docker stop "${CONTAINER_NAME}" >/dev/null 2>&1 || true + fi + docker rm "${CONTAINER_NAME}" >/dev/null 2>&1 || true + echo "Container removed." +else + echo "Container '${CONTAINER_NAME}' not found." +fi + +# Remove volume if it exists +if [ -n "${VOLUME_NAME}" ]; then + echo "Removing volume '${VOLUME_NAME}'..." + docker volume rm "${VOLUME_NAME}" >/dev/null 2>&1 || true + echo "Volume removed." +fi + +echo "Postgres nuked successfully!" diff --git a/scripts/run/restore-postgres.sh b/scripts/run/restore-postgres.sh new file mode 100755 index 0000000000..bd2b50e0b4 --- /dev/null +++ b/scripts/run/restore-postgres.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +set -euo pipefail + +CONTAINER_NAME="rivet-engine-postgres" +POSTGRES_IMAGE="postgres:17" + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + echo "Example: $0 /path/to/backup/postgres-backup.tar.gz" + exit 1 +fi + +BACKUP_PATH="$1" + +if [ ! -f "${BACKUP_PATH}" ]; then + echo "error: backup file '${BACKUP_PATH}' not found" + exit 1 +fi + +# Stop and remove existing container if it exists +if docker ps --all --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + echo "Stopping and removing existing container '${CONTAINER_NAME}'..." + if docker ps --format '{{.Names}}' | grep -qw "${CONTAINER_NAME}"; then + docker stop "${CONTAINER_NAME}" >/dev/null 2>&1 || true + fi + docker rm "${CONTAINER_NAME}" >/dev/null 2>&1 || true +fi + +# Create a new volume +echo "Creating new volume..." +VOLUME_NAME=$(docker volume create) +echo "Created volume: ${VOLUME_NAME}" + +# Restore the data to the new volume +echo "Restoring data from '${BACKUP_PATH}'..." +BACKUP_DIR="$(dirname "${BACKUP_PATH}")" +docker run --rm \ + -v "${VOLUME_NAME}":/data \ + -v "${BACKUP_DIR}":/backup \ + alpine \ + tar xzf "/backup/$(basename "${BACKUP_PATH}")" -C /data + +# Create and start the container +echo "Starting container '${CONTAINER_NAME}'..." +docker run \ + --detach \ + --name "${CONTAINER_NAME}" \ + --publish 5432:5432 \ + --env POSTGRES_PASSWORD=postgres \ + --env POSTGRES_USER=postgres \ + --env POSTGRES_DB=postgres \ + -v "${VOLUME_NAME}":/var/lib/postgresql/data \ + "${POSTGRES_IMAGE}" + +echo "Restore completed successfully!" +echo "Container ID: $(docker ps -q -f name=${CONTAINER_NAME})"