#!/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=" echo "" echo " 2. Dashboard Credentials:" echo " DASHBOARD_USERNAME=" echo " DASHBOARD_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 ""