在云服务器上私有部署 Supabase 完整指南

2025年10月21日

NEONITY

在云服务器上私有部署 Supabase 完整指南

Supabase 是一个开源的 Firebase 替代方案,提供了数据库、认证、实时订阅等功能。虽然 Supabase 提供了托管服务,但在某些场景下,你可能需要在自己的云服务器上进行私有部署。本指南将详细说明如何完成这一过程。

1. 环境准备

1.1 服务器要求

最低配置:

  • CPU: 2 核心
  • 内存: 4GB RAM
  • 存储: 20GB SSD
  • 操作系统: Ubuntu 20.04+ 或 CentOS 8+

推荐配置:

  • CPU: 4 核心
  • 内存: 8GB RAM
  • 存储: 50GB SSD
  • 网络: 稳定的网络连接

1.2 安装必要软件

# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装 Docker 和 Docker Compose
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker --version
docker-compose --version

2. 获取 Supabase 源码

# 克隆 Supabase 仓库
git clone --depth 1 https://github.com/supabase/supabase.git
cd supabase/docker

# 复制环境变量模板
cp .env.example .env

3. 配置环境变量

编辑 .env 文件,配置以下关键参数:

# 数据库配置
POSTGRES_PASSWORD=your_strong_password_here
POSTGRES_DB=postgres

# API 配置
API_EXTERNAL_URL=https://your-domain.com
SITE_URL=https://your-domain.com

# JWT 配置
JWT_SECRET=your_jwt_secret_here

# 邮件配置(可选)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
SMTP_ADMIN_EMAIL=admin@your-domain.com

# 存储配置
STORAGE_BACKEND=file
FILE_SIZE_LIMIT=52428800

# 安全配置
DISABLE_SIGNUP=false
ENABLE_EMAIL_SIGNUP=true
ENABLE_EMAIL_AUTOCONFIRM=false

4. 启动 Supabase 服务

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

5. 初始化数据库

# 等待数据库启动完成
sleep 30

# 运行数据库迁移
docker-compose exec postgres psql -U postgres -d postgres -f /docker-entrypoint-initdb.d/init-scripts/00-initial-schema.sql

6. 配置反向代理(Nginx)

创建 Nginx 配置文件:

server {
    listen 80;
    server_name your-domain.com;

    # 重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    # SSL 证书配置
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # Supabase API
    location /rest/v1/ {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Supabase Auth
    location /auth/v1/ {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Supabase Storage
    location /storage/v1/ {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Supabase Realtime
    location /realtime/v1/ {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Supabase Dashboard
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

7. 安全配置

7.1 防火墙设置

# 配置 UFW 防火墙
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

7.2 数据库安全

# 修改默认密码
docker-compose exec postgres psql -U postgres -c "ALTER USER postgres PASSWORD 'your_new_strong_password';"

# 创建应用专用用户
docker-compose exec postgres psql -U postgres -c "CREATE USER app_user WITH PASSWORD 'app_password';"
docker-compose exec postgres psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE postgres TO app_user;"

8. 监控和维护

8.1 设置日志轮转

# 创建日志轮转配置
sudo tee /etc/logrotate.d/docker-compose << EOF
/opt/supabase/docker/logs/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0644 root root
}
EOF

8.2 设置自动备份

#!/bin/bash
# 创建备份脚本
cat > /opt/supabase/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/supabase/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份数据库
docker-compose exec -T postgres pg_dump -U postgres postgres > $BACKUP_DIR/db_backup_$DATE.sql

# 备份存储文件
tar -czf $BACKUP_DIR/storage_backup_$DATE.tar.gz /opt/supabase/docker/volumes/storage

# 删除 7 天前的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
EOF

chmod +x /opt/supabase/backup.sh

# 设置定时任务
echo "0 2 * * * /opt/supabase/backup.sh" | crontab -

9. 性能优化

9.1 数据库优化

# 编辑 PostgreSQL 配置
docker-compose exec postgres psql -U postgres -c "
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET maintenance_work_mem = '64MB';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET wal_buffers = '16MB';
ALTER SYSTEM SET default_statistics_target = 100;
SELECT pg_reload_conf();
"

9.2 应用优化

# 在 docker-compose.yml 中添加资源限制
services:
  postgres:
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G
  
  api:
    deploy:
      resources:
        limits:
          memory: 1G
        reservations:
          memory: 512M

10. 故障排除

10.1 常见问题

问题 1: 服务启动失败

# 检查日志
docker-compose logs

# 检查端口占用
sudo netstat -tulpn | grep :3000

问题 2: 数据库连接失败

# 检查数据库状态
docker-compose exec postgres pg_isready -U postgres

# 重启数据库
docker-compose restart postgres

问题 3: 存储服务异常

# 检查存储卷
docker volume ls
docker volume inspect supabase_storage

10.2 健康检查

# 创建健康检查脚本
cat > /opt/supabase/health_check.sh << 'EOF'
#!/bin/bash
API_URL="http://localhost:3000/rest/v1/"
DB_URL="postgresql://postgres:password@localhost:5432/postgres"

# 检查 API 服务
if curl -f -s $API_URL > /dev/null; then
    echo "API 服务正常"
else
    echo "API 服务异常"
    exit 1
fi

# 检查数据库
if docker-compose exec -T postgres pg_isready -U postgres > /dev/null; then
    echo "数据库服务正常"
else
    echo "数据库服务异常"
    exit 1
fi
EOF

chmod +x /opt/supabase/health_check.sh

11. 升级和维护

11.1 升级 Supabase

# 停止服务
docker-compose down

# 备份数据
./backup.sh

# 拉取最新代码
git pull origin main

# 重新构建并启动
docker-compose up -d --build

11.2 定期维护

# 清理 Docker 资源
docker system prune -f

# 更新系统包
sudo apt update && sudo apt upgrade -y

# 重启服务(如果需要)
docker-compose restart

总结

通过以上步骤,你已经成功在云服务器上部署了私有化的 Supabase 实例。记住定期备份数据、监控服务状态,并根据实际使用情况调整配置参数。

私有部署 Supabase 让你能够:

  • 完全控制数据和隐私
  • 自定义配置和扩展功能
  • 避免供应商锁定
  • 降低长期使用成本

如果你在部署过程中遇到任何问题,建议查看 Supabase 官方文档或社区论坛获取更多帮助。