Files
2026-03-03 00:41:48 +07:00

355 lines
18 KiB
Bash

#!/bin/bash
# Supabase Setup Script (Official Method)
# Based on: https://supabase.com/docs/guides/self-hosting/docker
# This script follows the official Supabase self-hosting guide
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEMP_DIR="$SCRIPT_DIR/temp"
PROJECT_DIR="$SCRIPT_DIR"
echo "🚀 Setting up Supabase (Official Method)..."
echo ""
# Check prerequisites
echo "📋 Checking prerequisites..."
if ! command -v git &> /dev/null; then
echo "❌ Error: git is not installed. Please install git first."
exit 1
fi
if ! command -v docker &> /dev/null; then
echo "❌ Error: docker is not installed. Please install Docker first."
exit 1
fi
if ! docker compose version &> /dev/null; then
echo "❌ Error: docker compose is not available. Please install Docker Compose."
exit 1
fi
echo "✅ Prerequisites check passed"
echo ""
# Step 1: Clone Supabase repository
echo "📥 Step 1: Cloning Supabase repository..."
if [ -d "$TEMP_DIR" ]; then
echo " Removing existing temp directory..."
rm -rf "$TEMP_DIR"
fi
git clone --depth 1 https://github.com/supabase/supabase "$TEMP_DIR"
echo "✅ Repository cloned"
echo ""
# Step 2: Copy docker files
echo "📁 Step 2: Copying Docker configuration files..."
# Copy docker-compose.yml and related files
cp -f "$TEMP_DIR/docker/docker-compose.yml" "$PROJECT_DIR/"
echo " ✓ docker-compose.yml"
# Copy volumes directory structure and config files
if [ -d "$PROJECT_DIR/volumes" ]; then
echo " Backing up existing volumes directory..."
mv "$PROJECT_DIR/volumes" "$PROJECT_DIR/volumes.backup.$(date +%Y%m%d_%H%M%S)"
fi
mkdir -p "$PROJECT_DIR/volumes"
cp -rf "$TEMP_DIR/docker/volumes" "$PROJECT_DIR/"
echo " ✓ volumes/ (config files)"
# Copy utils directory (contains generate-keys.sh)
if [ -d "$PROJECT_DIR/utils" ]; then
rm -rf "$PROJECT_DIR/utils"
fi
cp -rf "$TEMP_DIR/docker/utils" "$PROJECT_DIR/"
chmod +x "$PROJECT_DIR/utils/generate-keys.sh"
echo " ✓ utils/ (including generate-keys.sh)"
# Copy .env.example if .env doesn't exist
if [ ! -f "$PROJECT_DIR/.env" ]; then
echo " Creating .env from official .env.example..."
cp "$TEMP_DIR/docker/.env.example" "$PROJECT_DIR/.env"
echo " ✓ .env (from official template)"
else
echo " ⚠️ .env already exists, skipping. Backup created as .env.example.new"
cp "$TEMP_DIR/docker/.env.example" "$PROJECT_DIR/.env.example.new"
fi
echo "✅ Files copied"
echo ""
# Step 3: Update ports to avoid conflicts
echo "🔧 Step 3: Updating ports to avoid conflicts with existing services..."
# Update Kong ports in docker-compose.yml
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' 's/\${KONG_HTTP_PORT}:8000/8100:8000/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/\${KONG_HTTPS_PORT}:8443/8443:8443/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/\${POSTGRES_PORT}:5432/5434:5432/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/\${POOLER_PROXY_PORT_TRANSACTION}:6543/6544:6543/g' "$PROJECT_DIR/docker-compose.yml"
else
# Linux
sed -i 's/\${KONG_HTTP_PORT}:8000/8100:8000/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/\${KONG_HTTPS_PORT}:8443/8443:8443/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/\${POSTGRES_PORT}:5432/5434:5432/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/\${POOLER_PROXY_PORT_TRANSACTION}:6543/6544:6543/g' "$PROJECT_DIR/docker-compose.yml"
fi
# Update .env with custom ports
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' 's/KONG_HTTP_PORT=8000/KONG_HTTP_PORT=8100/g' "$PROJECT_DIR/.env"
sed -i '' 's/POSTGRES_PORT=5432/POSTGRES_PORT=5434/g' "$PROJECT_DIR/.env"
sed -i '' 's/POOLER_PROXY_PORT_TRANSACTION=6543/POOLER_PROXY_PORT_TRANSACTION=6544/g' "$PROJECT_DIR/.env"
else
sed -i 's/KONG_HTTP_PORT=8000/KONG_HTTP_PORT=8100/g' "$PROJECT_DIR/.env"
sed -i 's/POSTGRES_PORT=5432/POSTGRES_PORT=5434/g' "$PROJECT_DIR/.env"
sed -i 's/POOLER_PROXY_PORT_TRANSACTION=6543/POOLER_PROXY_PORT_TRANSACTION=6544/g' "$PROJECT_DIR/.env"
fi
echo " ✓ Kong HTTP port: 8100 (instead of 8000)"
echo " ✓ PostgreSQL port: 5434 (instead of 5432)"
echo " ✓ Pooler port: 6544 (instead of 6543)"
echo "✅ Ports updated"
echo ""
# Step 3.5: Update service names to use sdp- prefix
echo "🔧 Step 3.5: Updating service names to use sdp- prefix..."
# Update docker-compose.yml - add sdp- prefix to all service names
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' 's/^ studio:/ sdp-studio:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ kong:/ sdp-kong:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ auth:/ sdp-auth:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ rest:/ sdp-rest:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ realtime:/ sdp-realtime:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ storage:/ sdp-storage:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ imgproxy:/ sdp-imgproxy:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ meta:/ sdp-meta:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ functions:/ sdp-functions:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ analytics:/ sdp-analytics:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ db:/ sdp-db:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ vector:/ sdp-vector:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/^ supavisor:/ sdp-supavisor:/g' "$PROJECT_DIR/docker-compose.yml"
# Update container names
sed -i '' 's/container_name: supabase-studio/container_name: sdp-supabase-studio/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-kong/container_name: sdp-supabase-kong/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-auth/container_name: sdp-supabase-auth/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-rest/container_name: sdp-supabase-rest/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: realtime-dev.supabase-realtime/container_name: sdp-realtime-dev.supabase-realtime/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-storage/container_name: sdp-supabase-storage/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-imgproxy/container_name: sdp-supabase-imgproxy/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-meta/container_name: sdp-supabase-meta/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-edge-functions/container_name: sdp-supabase-edge-functions/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-analytics/container_name: sdp-supabase-analytics/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-db/container_name: sdp-supabase-db/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-vector/container_name: sdp-supabase-vector/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/container_name: supabase-pooler/container_name: sdp-supabase-pooler/g' "$PROJECT_DIR/docker-compose.yml"
# Update depends_on references
sed -i '' 's/ analytics:/ sdp-analytics:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/ db:/ sdp-db:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/ rest:/ sdp-rest:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/ imgproxy:/ sdp-imgproxy:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's/ vector:/ sdp-vector:/g' "$PROJECT_DIR/docker-compose.yml"
# Update environment variable URLs
sed -i '' 's|http://meta:8080|http://sdp-meta:8080|g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's|http://kong:8000|http://sdp-kong:8000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's|http://analytics:4000|http://sdp-analytics:4000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's|http://rest:3000|http://sdp-rest:3000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i '' 's|http://imgproxy:5001|http://sdp-imgproxy:5001|g' "$PROJECT_DIR/docker-compose.yml"
else
# Linux
sed -i 's/^ studio:/ sdp-studio:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ kong:/ sdp-kong:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ auth:/ sdp-auth:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ rest:/ sdp-rest:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ realtime:/ sdp-realtime:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ storage:/ sdp-storage:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ imgproxy:/ sdp-imgproxy:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ meta:/ sdp-meta:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ functions:/ sdp-functions:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ analytics:/ sdp-analytics:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ db:/ sdp-db:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ vector:/ sdp-vector:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/^ supavisor:/ sdp-supavisor:/g' "$PROJECT_DIR/docker-compose.yml"
# Update container names
sed -i 's/container_name: supabase-studio/container_name: sdp-supabase-studio/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-kong/container_name: sdp-supabase-kong/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-auth/container_name: sdp-supabase-auth/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-rest/container_name: sdp-supabase-rest/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: realtime-dev.supabase-realtime/container_name: sdp-realtime-dev.supabase-realtime/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-storage/container_name: sdp-supabase-storage/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-imgproxy/container_name: sdp-supabase-imgproxy/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-meta/container_name: sdp-supabase-meta/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-edge-functions/container_name: sdp-supabase-edge-functions/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-analytics/container_name: sdp-supabase-analytics/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-db/container_name: sdp-supabase-db/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-vector/container_name: sdp-supabase-vector/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/container_name: supabase-pooler/container_name: sdp-supabase-pooler/g' "$PROJECT_DIR/docker-compose.yml"
# Update depends_on references
sed -i 's/ analytics:/ sdp-analytics:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/ db:/ sdp-db:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/ rest:/ sdp-rest:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/ imgproxy:/ sdp-imgproxy:/g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's/ vector:/ sdp-vector:/g' "$PROJECT_DIR/docker-compose.yml"
# Update environment variable URLs
sed -i 's|http://meta:8080|http://sdp-meta:8080|g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's|http://kong:8000|http://sdp-kong:8000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's|http://analytics:4000|http://sdp-analytics:4000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's|http://rest:3000|http://sdp-rest:3000|g' "$PROJECT_DIR/docker-compose.yml"
sed -i 's|http://imgproxy:5001|http://sdp-imgproxy:5001|g' "$PROJECT_DIR/docker-compose.yml"
fi
echo " ✓ docker-compose.yml updated"
# Update kong.yml - replace service names with sdp- prefix
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' 's|http://auth:|http://sdp-auth:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://rest:|http://sdp-rest:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://realtime-dev\.supabase-realtime:|http://sdp-realtime-dev.supabase-realtime:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://storage:|http://sdp-storage:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://functions:|http://sdp-functions:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://analytics:|http://sdp-analytics:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://meta:|http://sdp-meta:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i '' 's|http://studio:|http://sdp-studio:|g' "$PROJECT_DIR/volumes/api/kong.yml"
else
# Linux
sed -i 's|http://auth:|http://sdp-auth:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://rest:|http://sdp-rest:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://realtime-dev\.supabase-realtime:|http://sdp-realtime-dev.supabase-realtime:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://storage:|http://sdp-storage:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://functions:|http://sdp-functions:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://analytics:|http://sdp-analytics:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://meta:|http://sdp-meta:|g' "$PROJECT_DIR/volumes/api/kong.yml"
sed -i 's|http://studio:|http://sdp-studio:|g' "$PROJECT_DIR/volumes/api/kong.yml"
fi
echo " ✓ kong.yml updated"
# Update vector.yml - replace service names with sdp- prefix
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' 's|http://analytics:|http://sdp-analytics:|g' "$PROJECT_DIR/volumes/logs/vector.yml"
else
# Linux
sed -i 's|http://analytics:|http://sdp-analytics:|g' "$PROJECT_DIR/volumes/logs/vector.yml"
sed -i 's|supabase|sdp-|g' "$PROJECT_DIR/volumes/logs/vector.yml"
sed -i 's|realtime-dev.sdp--realtime|sdp-realtime-dev.supabase-realtime|g' "$PROJECT_DIR/volumes/logs/vector.yml"
fi
echo " ✓ vector.yml updated"
echo "✅ Service names updated in config files"
echo ""
# Step 4: Add external network configuration
echo "🌐 Step 4: Configuring external network..."
cat >> "$PROJECT_DIR/docker-compose.yml" << 'EOF'
# External network configuration for integration with other services
networks:
default:
name: shared_data_network
external: true
EOF
echo "✅ Network configured"
echo ""
# Step 5: Generate secrets
echo "🔐 Step 5: Generating secrets and API keys..."
echo ""
echo " Running official generate-keys.sh script..."
echo " (This will update your .env file with secure random keys)"
echo ""
cd "$PROJECT_DIR"
bash ./utils/generate-keys.sh
echo ""
echo "✅ Secrets generated"
echo ""
# Step 6: Pull Docker images
echo "📦 Step 6: Pulling Docker images..."
docker compose pull
echo "✅ Images pulled"
echo ""
# Cleanup
echo "🧹 Cleaning up temporary files..."
rm -rf "$TEMP_DIR"
echo "✅ Cleanup complete"
echo ""
# Final instructions
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ Supabase setup completed successfully!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📝 IMPORTANT: Review and update the following in .env file:"
echo ""
echo " 1. Database Password:"
echo " POSTGRES_PASSWORD=<your-secure-password>"
echo ""
echo " 2. Dashboard Credentials:"
echo " DASHBOARD_USERNAME=<your-username>"
echo " DASHBOARD_PASSWORD=<your-secure-password>"
echo " (Password must include at least one letter)"
echo ""
echo " 3. Public URLs (if using domain):"
echo " SUPABASE_PUBLIC_URL=http://your-domain:8100"
echo " API_EXTERNAL_URL=http://your-domain:8100"
echo " SITE_URL=http://your-domain:3000"
echo ""
echo " Note: JWT secrets and API keys have been auto-generated"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🚀 Next steps:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo " 1. Review .env file:"
echo " nano .env"
echo ""
echo " 2. Ensure shared_data_network exists:"
echo " cd ../00-network && bash create-network.sh"
echo ""
echo " 3. Start Supabase:"
echo " cd ../02-supabase"
echo " docker compose up -d"
echo ""
echo " 4. Check service status:"
echo " docker compose ps"
echo ""
echo " 5. View logs:"
echo " docker compose logs -f"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🌐 Access Points (after starting):"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo " Studio: http://localhost:8100"
echo " API Gateway: http://localhost:8100"
echo " PostgreSQL: localhost:5434"
echo " Pooler: localhost:6544"
echo ""
echo " REST API: http://localhost:8100/rest/v1/"
echo " Auth API: http://localhost:8100/auth/v1/"
echo " Storage API: http://localhost:8100/storage/v1/"
echo " Realtime: http://localhost:8100/realtime/v1/"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📚 Documentation: https://supabase.com/docs/guides/self-hosting/docker"
echo ""