# Supabase Setup - Official Method (setup2.sh) ## 📖 Overview `setup2.sh` เป็น setup script ที่ทำตามขั้นตอนจาก [Official Supabase Self-Hosting Guide](https://supabase.com/docs/guides/self-hosting/docker) อย่างเคร่งครัด ## 🔄 ความแตกต่างระหว่าง setup.sh และ setup2.sh | Feature | setup.sh (Custom) | setup2.sh (Official) | |---------|-------------------|----------------------| | **แหล่งที่มา** | ดาวน์โหลด config files แยก | Clone official Supabase repo | | **docker-compose.yml** | Custom version | Official version (latest) | | **การ generate secrets** | Manual instructions | ใช้ official `generate-keys.sh` | | **การอัปเดต** | Manual | ตาม official releases | | **Port configuration** | Pre-configured | Auto-adjusted | | **แนะนำสำหรับ** | Quick setup, custom config | Production, official support | ## ✅ Prerequisites ต้องติดตั้งก่อนรัน script: 1. **Git** - สำหรับ clone repository ```bash git --version ``` 2. **Docker & Docker Compose** ```bash docker --version docker compose version ``` 3. **OpenSSL** - สำหรับ generate secrets (มักติดตั้งมาแล้ว) ```bash openssl version ``` ## 🚀 วิธีใช้งาน ### 1. รัน Setup Script ```bash cd 02-supabase bash setup2.sh ``` Script จะทำสิ่งต่อไปนี้อัตโนมัติ: 1. ✅ ตรวจสอบ prerequisites (git, docker) 2. 📥 Clone Supabase repository (depth=1 เพื่อความเร็ว) 3. 📁 Copy official docker-compose.yml และ config files 4. 🔧 ปรับ ports ให้ไม่ชนกับ services อื่น: - Kong HTTP: `8100` (แทน 8000) - PostgreSQL: `5434` (แทน 5432) - Pooler: `6544` (แทน 6543) 5. 🌐 เพิ่ม `shared_data_network` configuration 6. 🔐 รัน official `generate-keys.sh` เพื่อสร้าง JWT secrets และ API keys 7. 📦 Pull Docker images ทั้งหมด 8. 🧹 ลบ temporary files ### 2. Review และแก้ไข .env หลังจากรัน script แล้ว ต้องแก้ไข `.env`: ```bash nano .env ``` **สิ่งที่ต้องแก้ไข:** ```bash # 1. Database Password (REQUIRED) POSTGRES_PASSWORD=your-super-secret-postgres-password # 2. Dashboard Credentials (REQUIRED) DASHBOARD_USERNAME=admin DASHBOARD_PASSWORD=your-secure-password-with-letters # ⚠️ Password ต้องมีตัวอักษรอย่างน้อย 1 ตัว (ห้ามใช้แต่ตัวเลข) # 3. Public URLs (ถ้าใช้ domain name) SUPABASE_PUBLIC_URL=http://your-domain:8100 API_EXTERNAL_URL=http://your-domain:8100 SITE_URL=http://your-domain:3000 # หรือใช้ localhost สำหรับ development SUPABASE_PUBLIC_URL=http://localhost:8100 API_EXTERNAL_URL=http://localhost:8100 SITE_URL=http://localhost:3000 ``` **ไม่ต้องแก้ (auto-generated แล้ว):** - `JWT_SECRET` ✅ - `ANON_KEY` ✅ - `SERVICE_ROLE_KEY` ✅ - `SECRET_KEY_BASE` ✅ - `VAULT_ENC_KEY` ✅ - `PG_META_CRYPTO_KEY` ✅ - `LOGFLARE_PUBLIC_ACCESS_TOKEN` ✅ - `LOGFLARE_PRIVATE_ACCESS_TOKEN` ✅ - `S3_PROTOCOL_ACCESS_KEY_ID` ✅ - `S3_PROTOCOL_ACCESS_KEY_SECRET` ✅ ### 3. สร้าง Network (ถ้ายังไม่มี) ```bash cd ../00-network bash create-network.sh ``` ### 4. Start Supabase ```bash cd ../02-supabase docker compose up -d ``` ### 5. ตรวจสอบ Services ```bash # ดู status ทั้งหมด docker compose ps # ดู logs docker compose logs -f # ดู logs ของ service เฉพาะ docker compose logs -f studio docker compose logs -f auth docker compose logs -f db ``` รอประมาณ 1-2 นาที จนทุก service มี status `Up (healthy)` ## 🌐 Access Points หลังจาก services ทั้งหมดรันแล้ว: | Service | URL | Credentials | |---------|-----|-------------| | **Studio Dashboard** | http://localhost:8100 | DASHBOARD_USERNAME / DASHBOARD_PASSWORD | | **REST API** | http://localhost:8100/rest/v1/ | ANON_KEY or SERVICE_ROLE_KEY | | **Auth API** | http://localhost:8100/auth/v1/ | ANON_KEY or SERVICE_ROLE_KEY | | **Storage API** | http://localhost:8100/storage/v1/ | ANON_KEY or SERVICE_ROLE_KEY | | **Realtime** | http://localhost:8100/realtime/v1/ | ANON_KEY | | **PostgreSQL** | localhost:5434 | postgres / POSTGRES_PASSWORD | | **Pooler (Session)** | localhost:5434 | postgres.your-tenant-id / POSTGRES_PASSWORD | | **Pooler (Transaction)** | localhost:6544 | postgres.your-tenant-id / POSTGRES_PASSWORD | ## 📝 ไฟล์และ Directories ที่สร้างขึ้น หลังจากรัน `setup2.sh`: ``` 02-supabase/ ├── docker-compose.yml # Official Supabase compose file ├── .env # Environment variables (with generated secrets) ├── .env.example.new # Backup of official .env.example ├── volumes/ # Configuration and data │ ├── api/ │ │ └── kong.yml # Kong API Gateway config │ ├── db/ # Database init scripts │ │ ├── realtime.sql │ │ ├── webhooks.sql │ │ ├── roles.sql │ │ ├── jwt.sql │ │ ├── _supabase.sql │ │ ├── logs.sql │ │ ├── pooler.sql │ │ └── data/ # PostgreSQL data (created on first run) │ ├── functions/ # Edge Functions │ │ └── main/ │ ├── logs/ │ │ └── vector.yml # Log collection config │ ├── pooler/ │ │ └── pooler.exs # Connection pooler config │ ├── storage/ # File storage (created on first run) │ └── snippets/ # SQL snippets └── utils/ └── generate-keys.sh # Official key generation script ``` ## 🔐 API Keys และ Secrets ### JWT Secret และ API Keys Script จะ auto-generate ให้: - **JWT_SECRET**: ใช้สำหรับ sign และ verify JWT tokens - **ANON_KEY**: Public API key (ใช้ใน client-side) - Role: `anon` - Expires: 5 years - **SERVICE_ROLE_KEY**: Private API key (ใช้ใน server-side) - Role: `service_role` - Bypass Row Level Security (RLS) - **ห้ามเปิดเผยใน client code!** ### ดู API Keys ```bash # ดู ANON_KEY grep ANON_KEY .env # ดู SERVICE_ROLE_KEY grep SERVICE_ROLE_KEY .env ``` ### Verify JWT Tokens ไปที่ [jwt.io](https://jwt.io) แล้ว: 1. Paste `ANON_KEY` หรือ `SERVICE_ROLE_KEY` 2. ใส่ `JWT_SECRET` ใน "Verify Signature" section 3. ตรวจสอบ payload และ expiration ## 🔄 การอัปเดต Supabase ### วิธีที่ 1: รัน setup2.sh ใหม่ ```bash cd 02-supabase # Backup .env ปัจจุบัน cp .env .env.backup # รัน setup2.sh ใหม่ bash setup2.sh # Restore .env settings ที่คุณแก้ไขไว้ # (JWT secrets จะถูก generate ใหม่) # Restart services docker compose down docker compose up -d ``` ### วิธีที่ 2: Update แบบ Manual ```bash # Pull latest images docker compose pull # Restart services docker compose down docker compose up -d ``` ### วิธีที่ 3: Update Service เฉพาะ ```bash # 1. ดู version ล่าสุดที่ Docker Hub # https://hub.docker.com/u/supabase # 2. แก้ไข docker-compose.yml # เช่น: image: supabase/studio:2026.02.16-sha-26c615c # 3. Pull และ restart docker compose pull studio docker compose up -d studio ``` ## 🛠️ Maintenance ### Backup Database ```bash # Backup docker exec supabase-db pg_dump -U postgres postgres > backup_$(date +%Y%m%d).sql # Restore docker exec -i supabase-db psql -U postgres postgres < backup_20260218.sql ``` ### Backup Storage ```bash # Backup storage files tar -czf storage_backup_$(date +%Y%m%d).tar.gz volumes/storage/ # Restore tar -xzf storage_backup_20260218.tar.gz ``` ### View Logs ```bash # All services docker compose logs -f # Specific service docker compose logs -f studio docker compose logs -f auth docker compose logs -f db docker compose logs -f kong ``` ### Restart Services ```bash # Restart all docker compose restart # Restart specific service docker compose restart studio docker compose restart auth ``` ## 🐛 Troubleshooting ### Services ไม่ start ```bash # ดู logs docker compose logs # ตรวจสอบ network docker network inspect shared_data_network # ตรวจสอบ .env cat .env | grep -v '^#' | grep -v '^$' ``` ### Database connection error ```bash # ตรวจสอบ database พร้อมหรือยัง docker exec supabase-db pg_isready -U postgres # ดู database logs docker compose logs db ``` ### Port conflicts ถ้า port ชน แก้ไขใน `.env`: ```bash KONG_HTTP_PORT=8101 POSTGRES_PORT=5435 POOLER_PROXY_PORT_TRANSACTION=6545 ``` แล้วแก้ใน `docker-compose.yml` ตรง ports mapping ด้วย ### "container supabase-vector exited (0)" ถ้าใช้ rootless Docker ให้แก้ไข `.env`: ```bash DOCKER_SOCKET_LOCATION=/run/user/1000/docker.sock ``` ## 🔒 Security Best Practices 1. **เปลี่ยน default passwords ทั้งหมด** - `POSTGRES_PASSWORD` - `DASHBOARD_PASSWORD` 2. **ใช้ HTTPS ใน production** - Setup Nginx Proxy Manager - ติดตั้ง SSL certificate 3. **Enable Row Level Security (RLS)** - สำหรับทุก table ที่มี sensitive data 4. **เก็บ SERVICE_ROLE_KEY ปลอดภัย** - ใช้เฉพาะ server-side - ห้ามเปิดเผยใน client code 5. **Backup เป็นประจำ** - Database - Storage files - .env file 6. **Monitor logs** - ตรวจสอบ suspicious activities - ใช้ Logflare analytics 7. **Update เป็นประจำ** - ติดตาม [Supabase Changelog](https://github.com/supabase/supabase/blob/master/docker/CHANGELOG.md) - Update images สำหรับ security patches ## 🗑️ Uninstall **⚠️ คำเตือน: จะลบข้อมูลทั้งหมด!** ```bash # Stop และลบ containers + volumes docker compose down -v # ลบ database data rm -rf volumes/db/data # ลบ storage data rm -rf volumes/storage # ลบทุกอย่าง (optional) cd .. rm -rf 02-supabase ``` ## 📚 เอกสารเพิ่มเติม - [Official Self-Hosting Guide](https://supabase.com/docs/guides/self-hosting/docker) - [Supabase Docker Changelog](https://github.com/supabase/supabase/blob/master/docker/CHANGELOG.md) - [Supabase GitHub](https://github.com/supabase/supabase) - [Docker Hub - Supabase Images](https://hub.docker.com/u/supabase) - [PostgREST Documentation](https://postgrest.org/) - [GoTrue (Auth) Documentation](https://github.com/supabase/gotrue) ## 💡 Tips 1. **ใช้ generate-keys.sh ใหม่เมื่อต้องการ** ```bash bash utils/generate-keys.sh ``` 2. **Test API ด้วย curl** ```bash # Get ANON_KEY from .env ANON_KEY=$(grep ANON_KEY .env | cut -d '=' -f2) # Test REST API curl http://localhost:8100/rest/v1/ \ -H "apikey: $ANON_KEY" \ -H "Authorization: Bearer $ANON_KEY" ``` 3. **Connect จาก client application** ```javascript import { createClient } from '@supabase/supabase-js' const supabase = createClient( 'http://localhost:8100', 'YOUR_ANON_KEY' ) ``` 4. **ใช้ Supabase CLI สำหรับ development** ```bash npm install -g supabase supabase link --project-ref your-project ``` ## 🆚 เมื่อไหร่ควรใช้ setup2.sh ใช้ **setup2.sh** เมื่อ: - ✅ ต้องการ official configuration ล่าสุด - ✅ ต้องการ update ง่ายตาม official releases - ✅ ต้องการใช้ official tools (generate-keys.sh) - ✅ Production deployment - ✅ ต้องการ official support ใช้ **setup.sh** เมื่อ: - ✅ ต้องการ quick setup - ✅ ต้องการ custom configuration - ✅ ต้องการ minimal setup - ✅ Development/testing เท่านั้น ## 📞 Support หากมีปัญหา: 1. ตรวจสอบ logs: `docker compose logs` 2. อ่าน [Troubleshooting Guide](https://supabase.com/docs/guides/self-hosting/docker#troubleshooting) 3. ดู [GitHub Discussions](https://github.com/supabase/supabase/discussions) 4. ตรวจสอบ [GitHub Issues](https://github.com/supabase/supabase/issues)