182 lines
6.1 KiB
Bash
Executable file
182 lines
6.1 KiB
Bash
Executable file
#!/bin/bash
|
|
# Deploy LinkML Schema to PostgreSQL Database
|
|
#
|
|
# This script:
|
|
# 1. Runs the SQL migration to create LinkML tables
|
|
# 2. Syncs the LinkML schema files to the server
|
|
# 3. Runs the Python loader to populate the database
|
|
# 4. Restarts the Postgres API service
|
|
#
|
|
# Usage: ./deploy-linkml.sh [--skip-migration] [--skip-sync] [--skip-load]
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
SERVER="91.98.224.44"
|
|
REMOTE_USER="root"
|
|
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
LINKML_DIR="$PROJECT_ROOT/schemas/20251121/linkml"
|
|
SQL_DIR="$PROJECT_ROOT/infrastructure/sql"
|
|
SCRIPTS_DIR="$PROJECT_ROOT/scripts"
|
|
|
|
# Parse arguments
|
|
SKIP_MIGRATION=false
|
|
SKIP_SYNC=false
|
|
SKIP_LOAD=false
|
|
|
|
for arg in "$@"; do
|
|
case $arg in
|
|
--skip-migration)
|
|
SKIP_MIGRATION=true
|
|
;;
|
|
--skip-sync)
|
|
SKIP_SYNC=true
|
|
;;
|
|
--skip-load)
|
|
SKIP_LOAD=true
|
|
;;
|
|
--help|-h)
|
|
echo "Usage: $0 [--skip-migration] [--skip-sync] [--skip-load]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --skip-migration Skip running SQL migration"
|
|
echo " --skip-sync Skip syncing LinkML files to server"
|
|
echo " --skip-load Skip running Python loader"
|
|
exit 0
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo " LinkML Schema Deployment to PostgreSQL"
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo ""
|
|
echo "Server: $SERVER"
|
|
echo "LinkML Source: $LINKML_DIR"
|
|
echo ""
|
|
|
|
# Check SSH connectivity
|
|
echo "🔗 Testing SSH connection..."
|
|
if ! ssh -o ConnectTimeout=5 "$REMOTE_USER@$SERVER" "echo 'Connected'" 2>/dev/null; then
|
|
echo "❌ Cannot connect to $SERVER"
|
|
exit 1
|
|
fi
|
|
echo " ✅ Connected"
|
|
echo ""
|
|
|
|
# Step 1: Run SQL migration
|
|
if [ "$SKIP_MIGRATION" = false ]; then
|
|
echo "📦 Step 1: Running SQL migration..."
|
|
|
|
if [ -f "$SQL_DIR/001_linkml_schema.sql" ]; then
|
|
# Copy migration file to server
|
|
scp "$SQL_DIR/001_linkml_schema.sql" "$REMOTE_USER@$SERVER:/tmp/"
|
|
|
|
# Run migration
|
|
ssh "$REMOTE_USER@$SERVER" "sudo -u postgres psql -d glam -f /tmp/001_linkml_schema.sql"
|
|
|
|
echo " ✅ Migration complete"
|
|
else
|
|
echo " ⚠️ Migration file not found: $SQL_DIR/001_linkml_schema.sql"
|
|
fi
|
|
echo ""
|
|
else
|
|
echo "⏭️ Skipping SQL migration"
|
|
echo ""
|
|
fi
|
|
|
|
# Step 2: Sync LinkML files
|
|
if [ "$SKIP_SYNC" = false ]; then
|
|
echo "📁 Step 2: Syncing LinkML schema files..."
|
|
|
|
rsync -avz --progress --delete \
|
|
--include="*.yaml" \
|
|
--include="*/" \
|
|
--exclude="__pycache__" \
|
|
--exclude=".DS_Store" \
|
|
"$LINKML_DIR/" \
|
|
"$REMOTE_USER@$SERVER:/mnt/data/linkml/"
|
|
|
|
echo " ✅ Sync complete"
|
|
echo ""
|
|
else
|
|
echo "⏭️ Skipping LinkML file sync"
|
|
echo ""
|
|
fi
|
|
|
|
# Step 3: Sync and run Python loader
|
|
if [ "$SKIP_LOAD" = false ]; then
|
|
echo "🐍 Step 3: Running Python loader..."
|
|
|
|
# Copy loader script to server
|
|
scp "$SCRIPTS_DIR/load_linkml_to_postgres.py" "$REMOTE_USER@$SERVER:/tmp/"
|
|
|
|
# Install dependencies if needed and run loader
|
|
ssh "$REMOTE_USER@$SERVER" << 'EOF'
|
|
cd /var/lib/glam/api
|
|
|
|
# Activate virtual environment
|
|
source venv/bin/activate
|
|
|
|
# Install dependencies if needed
|
|
pip install pyyaml asyncpg --quiet
|
|
|
|
# Run loader
|
|
export DATABASE_URL="postgresql://glam_api:glam_secret_2025@localhost:5432/glam"
|
|
python /tmp/load_linkml_to_postgres.py \
|
|
--version 20251121 \
|
|
--schema-dir /mnt/data/linkml \
|
|
--schema-name heritage_custodian
|
|
EOF
|
|
|
|
echo " ✅ Loader complete"
|
|
echo ""
|
|
else
|
|
echo "⏭️ Skipping Python loader"
|
|
echo ""
|
|
fi
|
|
|
|
# Step 4: Sync updated API code and restart service
|
|
echo "🔄 Step 4: Updating Postgres API..."
|
|
|
|
# Copy updated main.py to the correct location
|
|
scp "$PROJECT_ROOT/backend/postgres/main.py" "$REMOTE_USER@$SERVER:/opt/glam-backend/postgres/main.py"
|
|
|
|
# Restart the service
|
|
ssh "$REMOTE_USER@$SERVER" "systemctl restart glam-postgres-api"
|
|
|
|
echo " ✅ API updated"
|
|
echo ""
|
|
|
|
# Step 5: Verify deployment
|
|
echo "🔍 Step 5: Verifying deployment..."
|
|
|
|
# Check if tables exist
|
|
TABLES=$(ssh "$REMOTE_USER@$SERVER" "sudo -u postgres psql -d glam -t -c \"SELECT COUNT(*) FROM information_schema.tables WHERE table_name LIKE 'linkml_%'\"" | tr -d ' ')
|
|
echo " LinkML tables: $TABLES"
|
|
|
|
# Check if data is loaded
|
|
CLASSES=$(ssh "$REMOTE_USER@$SERVER" "sudo -u postgres psql -d glam -t -c \"SELECT COUNT(*) FROM linkml_classes\" 2>/dev/null || echo '0'" | tr -d ' ')
|
|
SLOTS=$(ssh "$REMOTE_USER@$SERVER" "sudo -u postgres psql -d glam -t -c \"SELECT COUNT(*) FROM linkml_slots\" 2>/dev/null || echo '0'" | tr -d ' ')
|
|
ENUMS=$(ssh "$REMOTE_USER@$SERVER" "sudo -u postgres psql -d glam -t -c \"SELECT COUNT(*) FROM linkml_enums\" 2>/dev/null || echo '0'" | tr -d ' ')
|
|
|
|
echo " Classes loaded: $CLASSES"
|
|
echo " Slots loaded: $SLOTS"
|
|
echo " Enums loaded: $ENUMS"
|
|
echo ""
|
|
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo " Deployment Complete!"
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo ""
|
|
echo "API Endpoints:"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/versions"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/classes"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/slots"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/enums"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/search?q=Custodian"
|
|
echo " https://bronhouder.nl/api/postgres/linkml/hierarchy"
|
|
echo ""
|
|
echo "Test with:"
|
|
echo " curl https://bronhouder.nl/api/postgres/linkml/versions"
|
|
echo ""
|