diff --git a/.gitignore b/.gitignore index ec0645c..320d499 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ next-env.d.ts # uploads /public/uploads/ + +# db backups +/backups/ diff --git a/package.json b/package.json index ad50729..aa14bd8 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "db:migrate:deploy": "prisma migrate deploy", "db:seed": "tsx prisma/seed.ts", "db:studio": "prisma studio", - "db:reset": "prisma migrate reset --force" + "db:reset": "prisma migrate reset --force", + "db:backup": "sh scripts/db-backup.sh", + "db:restore": "sh scripts/db-restore.sh" }, "dependencies": { "@hookform/resolvers": "^3.9.1", diff --git a/scripts/db-backup.sh b/scripts/db-backup.sh new file mode 100755 index 0000000..92a7e3d --- /dev/null +++ b/scripts/db-backup.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# Usage: ./scripts/db-backup.sh [output-file] +# Uses DATABASE_URL from environment (or .env if present). +# Example — local: DATABASE_URL="postgresql://bonnamoon@localhost:5432/moonbase_dev" ./scripts/db-backup.sh +# Example — remote: ssh into NAS and run via docker exec (see README) + +set -e + +# Load .env if present and DATABASE_URL not already set +if [ -z "$DATABASE_URL" ] && [ -f ".env" ]; then + export $(grep -v '^#' .env | grep DATABASE_URL | xargs) +fi + +if [ -z "$DATABASE_URL" ]; then + echo "Error: DATABASE_URL is not set." + exit 1 +fi + +OUTFILE="${1:-backups/moonbase-$(date +%Y%m%d-%H%M%S).sql}" +mkdir -p "$(dirname "$OUTFILE")" + +echo "Backing up to $OUTFILE ..." +pg_dump "$DATABASE_URL" --no-owner --no-privileges -f "$OUTFILE" +echo "Done. $(du -sh "$OUTFILE" | cut -f1) written to $OUTFILE" diff --git a/scripts/db-restore.sh b/scripts/db-restore.sh new file mode 100755 index 0000000..959f4e9 --- /dev/null +++ b/scripts/db-restore.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# Usage: ./scripts/db-restore.sh +# Uses DATABASE_URL from environment (or .env if present). +# WARNING: drops and recreates the public schema — all existing data is replaced. + +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +INFILE="$1" + +if [ ! -f "$INFILE" ]; then + echo "Error: file not found: $INFILE" + exit 1 +fi + +# Load .env if present and DATABASE_URL not already set +if [ -z "$DATABASE_URL" ] && [ -f ".env" ]; then + export $(grep -v '^#' .env | grep DATABASE_URL | xargs) +fi + +if [ -z "$DATABASE_URL" ]; then + echo "Error: DATABASE_URL is not set." + exit 1 +fi + +echo "Restoring from $INFILE ..." +echo " -> dropping and recreating public schema..." +psql "$DATABASE_URL" -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" +echo " -> loading backup..." +psql "$DATABASE_URL" -f "$INFILE" -q +echo "Done."