mirror of
https://github.com/KohakuBlueleaf/KohakuHub.git
synced 2026-03-09 07:12:07 -05:00
100 lines
3.3 KiB
Bash
100 lines
3.3 KiB
Bash
#!/bin/sh
|
||
# Database initialization script for KohakuHub
|
||
# Creates both hub-api and LakeFS databases if they don't exist
|
||
# Runs before LakeFS starts
|
||
|
||
set -e
|
||
|
||
echo "=== KohakuHub Database Initialization ==="
|
||
|
||
# Extract PostgreSQL connection details from DATABASE_URL or individual vars
|
||
if [ -n "$KOHAKU_HUB_DATABASE_URL" ]; then
|
||
# Parse connection string: postgresql://user:pass@host:port/dbname
|
||
POSTGRES_USER=$(echo "$KOHAKU_HUB_DATABASE_URL" | sed -n 's|.*://\([^:]*\):.*|\1|p')
|
||
POSTGRES_PASSWORD=$(echo "$KOHAKU_HUB_DATABASE_URL" | sed -n 's|.*://[^:]*:\([^@]*\)@.*|\1|p')
|
||
POSTGRES_HOST=$(echo "$KOHAKU_HUB_DATABASE_URL" | sed -n 's|.*@\([^:]*\):.*|\1|p')
|
||
POSTGRES_PORT=$(echo "$KOHAKU_HUB_DATABASE_URL" | sed -n 's|.*:\([0-9]*\)/.*|\1|p')
|
||
POSTGRES_DB=$(echo "$KOHAKU_HUB_DATABASE_URL" | sed -n 's|.*/\([^?]*\).*|\1|p')
|
||
else
|
||
POSTGRES_USER="${POSTGRES_USER:-hub}"
|
||
POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-hubpass}"
|
||
POSTGRES_HOST="${POSTGRES_HOST:-postgres}"
|
||
POSTGRES_PORT="${POSTGRES_PORT:-5432}"
|
||
POSTGRES_DB="${POSTGRES_DB:-kohakuhub}"
|
||
fi
|
||
|
||
LAKEFS_DB="${LAKEFS_DB:-lakefs}"
|
||
|
||
echo "PostgreSQL Server: $POSTGRES_HOST:$POSTGRES_PORT"
|
||
echo "Hub-API Database: $POSTGRES_DB"
|
||
echo "LakeFS Database: $LAKEFS_DB"
|
||
echo
|
||
|
||
# Wait for PostgreSQL to be ready
|
||
echo "Waiting for PostgreSQL to be ready..."
|
||
max_attempts=30
|
||
attempt=0
|
||
|
||
while [ $attempt -lt $max_attempts ]; do
|
||
if PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d postgres -c "SELECT 1" >/dev/null 2>&1; then
|
||
echo "✓ PostgreSQL is ready"
|
||
break
|
||
fi
|
||
attempt=$((attempt + 1))
|
||
echo " Attempt $attempt/$max_attempts..."
|
||
sleep 2
|
||
done
|
||
|
||
if [ $attempt -eq $max_attempts ]; then
|
||
echo "✗ PostgreSQL is not ready after $max_attempts attempts"
|
||
echo "⚠ Continuing anyway, but LakeFS may fail to start..."
|
||
exit 0
|
||
fi
|
||
|
||
echo
|
||
|
||
# Function to check if database exists
|
||
db_exists() {
|
||
local dbname=$1
|
||
PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname='$dbname'" 2>/dev/null
|
||
}
|
||
|
||
# Function to create database
|
||
create_db() {
|
||
local dbname=$1
|
||
echo "Creating database '$dbname'..."
|
||
if PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d postgres -c "CREATE DATABASE $dbname;" >/dev/null 2>&1; then
|
||
echo "✓ Created database '$dbname'"
|
||
return 0
|
||
else
|
||
echo "⚠ Failed to create database '$dbname' (may already exist or insufficient permissions)"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Create hub-api database if it doesn't exist
|
||
echo "Checking hub-api database..."
|
||
if [ "$(db_exists "$POSTGRES_DB")" = "1" ]; then
|
||
echo "✓ Database '$POSTGRES_DB' already exists"
|
||
else
|
||
create_db "$POSTGRES_DB"
|
||
fi
|
||
|
||
echo
|
||
|
||
# Create LakeFS database if it doesn't exist (and it's different from hub-api db)
|
||
if [ "$LAKEFS_DB" != "$POSTGRES_DB" ]; then
|
||
echo "Checking LakeFS database..."
|
||
if [ "$(db_exists "$LAKEFS_DB")" = "1" ]; then
|
||
echo "✓ Database '$LAKEFS_DB' already exists"
|
||
else
|
||
create_db "$LAKEFS_DB"
|
||
fi
|
||
else
|
||
echo "ℹ Using same database for both hub-api and LakeFS: $POSTGRES_DB"
|
||
fi
|
||
|
||
echo
|
||
echo "=== Database initialization complete ==="
|
||
echo
|