Last active
July 12, 2025 16:08
-
-
Save matthewadams/37e9412d03bb3079c8dbd179c8f58c5e to your computer and use it in GitHub Desktop.
Node.js npx cli to create new Supabase cloud project & update local .env file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Creates a brand new supabase project and updates the .env to point to it. | |
# | |
# Prerequisites: | |
# | |
# * Required: npx | |
# | |
# * Required: A .env.min file with the following content: | |
# SUPABASE_ORG_ID=yourorgid | |
# SUPABASE_REGION=us-east-1 # or whatever | |
# SUPABASE_DB_PASSWORD=thenewdbpassword | |
# SUPABASE_ACCESS_TOKEN=sbp_youraccesstoken | |
# | |
# * Optional: A .env.template file with other .env content you want to include in the final .env file | |
set -e | |
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | |
export NOW="$(date -u +%Y%m%d%H%M%SZ)" | |
export DB="${DB:=db$NOW}" | |
export ENV_BAK=".env.pre-$DB" | |
export ENV_NEW=".env.$DB" | |
if [ -f "$SCRIPT_DIR/.env" ]; then | |
cp "$SCRIPT_DIR/.env" "$SCRIPT_DIR/$ENV_BAK" | |
echo "backed up $SCRIPT_DIR/.env to $SCRIPT_DIR/$ENV_BAK" >&2 | |
fi | |
PROJECTS="$(npx dotenvx run -f .env.min -q -- sh -c 'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects list --output json')" | |
if [ "$PROJECTS" != "null" ] && [ "$(echo "$PROJECTS" | npx fx .length)" = "2" ]; then | |
echo "already 2 projects!" >&2 | |
exit 1 | |
fi | |
if [ -f supabase/.temp/project-ref ]; then | |
npx dotenvx run -f "$SCRIPT_DIR/.env.min" -q -- sh -c \ | |
'npx supabase unlink --yes --output json' | |
echo 'unlinked existing project' >&2 | |
fi | |
json="$(npx dotenvx run -f "$SCRIPT_DIR/.env.min" -q -- sh -c \ | |
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects create $DB --db-password $SUPABASE_DB_PASSWORD --org-id $SUPABASE_ORG_ID --region $SUPABASE_REGION --output json')" | |
cp "$SCRIPT_DIR/.env.min" "$SCRIPT_DIR/$ENV_NEW" | |
SUPABASE_PROJECT_REF="$(echo "$json" | npx fx .id)" | |
echo "SUPABASE_PROJECT_REF=$SUPABASE_PROJECT_REF" >>"$SCRIPT_DIR/$ENV_NEW" | |
echo "created new project; ref: $SUPABASE_PROJECT_REF" >&2 | |
getApiKey() { | |
local id="$1" # anon or service_role | |
json="$(npx dotenvx run -f "$SCRIPT_DIR/$ENV_NEW" -q -- sh -c \ | |
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects api-keys --project-ref $SUPABASE_PROJECT_REF --output json')" | |
echo "$json" | npx fx 'this.filter(it => it.id == "'"$id"'")[0].api_key' | |
} | |
SUPABASE_ANON_KEY="$(getApiKey 'anon')" | |
SUPABASE_SERVICE_ROLE_KEY="$(getApiKey 'service_role')" | |
echo "SUPABASE_ANON_KEY=$SUPABASE_ANON_KEY" >>"$SCRIPT_DIR/$ENV_NEW" | |
echo "SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY" >>"$SCRIPT_DIR/$ENV_NEW" | |
if [ -f "$SCRIPT_DIR/.env.template" ]; then | |
cat "$SCRIPT_DIR/.env.template" >>"$SCRIPT_DIR/$ENV_NEW" | |
fi | |
cp "$SCRIPT_DIR/$ENV_NEW" "$SCRIPT_DIR/.env" | |
echo "generated new .env file: $SCRIPT_DIR/.env" >&2 | |
npx dotenvx run -f "$SCRIPT_DIR/.env" -q -- sh -c \ | |
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase link -p "$SUPABASE_DB_PASSWORD" --project-ref "$SUPABASE_PROJECT_REF"' | |
echo "linked new supabase project: $SUPABASE_PROJECT_REF" >&2 | |
rm -f "$SCRIPT_DIR/$ENV_NEW" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment