## Description The current state is default schema or public schema. This schema is accessible by default when user connects to the pg database. Hence create `appsmith` schema for Appsmith server to use. This is to avoid anyone accidentally modifying the appsmith data. ## Automation /ok-to-test tags="@tag.Sanity" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!IMPORTANT] > 🟣 🟣 🟣 Your tests are running. > Tests running at: <https://github.com/appsmithorg/appsmith/actions/runs/11111681323> > Commit: 32f91e8d7ce750e4a088996aff4abe6905aa982f > Workflow: `PR Automation test suite` > Tags: `@tag.Sanity` > Spec: `` > <hr>Mon, 30 Sep 2024 18:08:23 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit - **New Features** - Introduced a script to initialize the PostgreSQL database schema for Appsmith. - Added utilities for managing PostgreSQL database connections, including availability checks and parameter extraction. - Enhanced scripts for managing PostgreSQL connections and initialization. - Improved environment configuration for PostgreSQL database connections, including automatic password generation for local setups. - Updated JDBC URL handling to include schema parameters for PostgreSQL connections. - Added support for proxy configuration in the application setup. - **Bug Fixes** - Improved error handling and connection retry mechanisms for PostgreSQL setup. - **Documentation** - Updated comments and logging for better clarity on database operations. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
141 lines
5.0 KiB
Bash
Executable File
141 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
waitForPostgresAvailability() {
|
|
if [ -z "$PG_DB_HOST" ]; then
|
|
tlog "PostgreSQL host name is empty. Check env variables. Error. Exiting java setup"
|
|
exit 2
|
|
else
|
|
|
|
MAX_RETRIES=50
|
|
RETRYSECONDS=10
|
|
retry_count=0
|
|
while true; do
|
|
su postgres -c "pg_isready -h '${PG_DB_HOST}' -p '${PG_DB_PORT}'"
|
|
status=$?
|
|
|
|
case $status in
|
|
0)
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is ready."
|
|
break
|
|
;;
|
|
1)
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is rejecting connections e.g. due to being in recovery mode or not accepting connections eg. connections maxed out."
|
|
;;
|
|
2)
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is not responding or running."
|
|
;;
|
|
3)
|
|
tlog "The connection check failed e.g. due to network issues or incorrect parameters."
|
|
;;
|
|
*)
|
|
tlog "pg_isready exited with unexpected status code: $status"
|
|
break
|
|
;;
|
|
esac
|
|
|
|
retry_count=$((retry_count + 1))
|
|
if [ $retry_count -le $MAX_RETRIES ]; then
|
|
tlog "PostgreSQL connection failed. Retrying attempt $retry_count/$MAX_RETRIES in $RETRYSECONDS seconds..."
|
|
sleep $RETRYSECONDS
|
|
else
|
|
tlog "Exceeded maximum retry attempts ($MAX_RETRIES). Exiting."
|
|
# use exit code 2 to indicate that the script failed to connect to postgres and supervisor conf is set not to restart the program for 2.
|
|
exit 2
|
|
fi
|
|
|
|
done
|
|
fi
|
|
}
|
|
|
|
# for PostgreSQL, we use APPSMITH_DB_URL=postgresql://username:password@postgresserver:5432/dbname
|
|
# Args:
|
|
# conn_string (string): PostgreSQL connection string
|
|
# Returns:
|
|
# None
|
|
# Example:
|
|
# postgres syntax
|
|
# "postgresql://user:password@localhost:5432/appsmith"
|
|
# "postgresql://user:password@localhost/appsmith"
|
|
# "postgresql://user@localhost:5432/appsmith"
|
|
# "postgresql://user@localhost/appsmith"
|
|
extract_postgres_db_params() {
|
|
local conn_string=$1
|
|
|
|
# Use node to parse the URI and extract components
|
|
IFS=' ' read -r USER PASSWORD HOST PORT DB <<<"$(node -e "
|
|
const connectionString = process.argv[1];
|
|
const pgUri = connectionString.startsWith(\"postgresql://\")
|
|
? connectionString
|
|
: 'http://' + connectionString; //Prepend a fake scheme for URL parsing
|
|
const url = require('url');
|
|
const parsedUrl = new url.URL(pgUri);
|
|
|
|
// Extract the pathname and remove the leading '/'
|
|
const db = parsedUrl.pathname.substring(1);
|
|
|
|
// Default the port to 5432 if it's empty
|
|
const port = parsedUrl.port || '5432';
|
|
|
|
console.log(\`\${parsedUrl.username || '-'} \${parsedUrl.password || '-'} \${parsedUrl.hostname} \${port} \${db}\`);
|
|
" "$conn_string")"
|
|
|
|
# Now, set the environment variables
|
|
export PG_DB_USER="$USER"
|
|
export PG_DB_PASSWORD="$PASSWORD"
|
|
export PG_DB_HOST="$HOST"
|
|
export PG_DB_PORT="$PORT"
|
|
export PG_DB_NAME="$DB"
|
|
}
|
|
|
|
init_pg_db() {
|
|
# Create the appsmith schema
|
|
echo "Initializing PostgreSQL with schema..."
|
|
|
|
# Check if APPSMITH_DB_URL is a PostgreSQL URL
|
|
if [[ -n "$APPSMITH_DB_URL" && "$APPSMITH_DB_URL" == postgres*://* ]]; then
|
|
echo "APPSMITH_DB_URL is a valid PostgreSQL URL."
|
|
|
|
# Check if the DB_HOST is local (localhost or 127.0.0.1)
|
|
if [[ "$PG_DB_HOST" == "localhost" || "$PG_DB_HOST" == "127.0.0.1" ]]; then
|
|
|
|
# Check if the database exists
|
|
DB_CHECK=$(psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U postgres -d "postgres" -tAc "SELECT 1 FROM pg_database WHERE datname='$PG_DB_NAME'")
|
|
|
|
if [ "$DB_CHECK" != "1" ]; then
|
|
echo "Database $PG_DB_NAME does not exist. Creating database..."
|
|
psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U postgres -d "postgres" -c "CREATE DATABASE $PG_DB_NAME;"
|
|
else
|
|
echo "Database $PG_DB_NAME already exists."
|
|
fi
|
|
|
|
# Check if the schema exists
|
|
SCHEMA_CHECK=$(psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U postgres -d "$PG_DB_NAME" -tAc "SELECT 1 FROM information_schema.schemata WHERE schema_name='appsmith'")
|
|
|
|
# Create schema and user if not exists
|
|
if [ "$SCHEMA_CHECK" != "1" ]; then
|
|
echo "Creating user '$PG_DB_USER' with password "
|
|
psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U postgres -d "$PG_DB_NAME" -c "CREATE USER \"$PG_DB_USER\" WITH PASSWORD '$PG_DB_PASSWORD';"
|
|
|
|
echo "Schema 'appsmith' does not exist. Creating schema..."
|
|
psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U postgres -d "$PG_DB_NAME" -c "CREATE SCHEMA appsmith;"
|
|
fi
|
|
else
|
|
echo "Remote PostgreSQL detected, running as current user."
|
|
PGPASSWORD=$PG_DB_PASSWORD psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U "$PG_DB_USER" -d "$PG_DB_NAME" -c "CREATE SCHEMA IF NOT EXISTS appsmith;"
|
|
fi
|
|
|
|
# Check if the schema creation was successful
|
|
if [ $? -eq 0 ]; then
|
|
echo "Schema 'appsmith' created or already exists."
|
|
else
|
|
echo "Failed to create schema 'appsmith'."
|
|
exit 1
|
|
fi
|
|
echo "PostgreSQL initialization completed."
|
|
fi
|
|
}
|
|
|
|
# Example usage of the functions
|
|
# waitForPostgresAvailability
|
|
# extract_postgres_db_params "postgresql://user:password@localhost:5432/dbname"
|