Supabase Self-Hosted Stack
架构: Supabase + MinIO (内网)
状态: ✅ 生产就绪
版本: v3.0 (MinIO 内网化)
🌐 服务访问
公网 HTTPS
| 服务 | URL | 说明 |
|---|---|---|
| Supabase Storage | https://amiap.hzau.edu.cn/supa/storage/v1/ |
文件上传下载 API |
| Supabase API | https://amiap.hzau.edu.cn/supa/ |
Auth/REST/Realtime |
内网 Tailscale
| 服务 | URL | 说明 |
|---|---|---|
| MinIO S3 API | http://100.64.0.2:9000 |
对象存储 API |
| MinIO Console | http://100.64.0.2:9001 |
Web 管理界面 |
| Supabase Dashboard | http://100.64.0.2:18000 |
数据库管理 |
🚀 快速启动
cd /vol1/1000/docker_server/traefik/supabase-stack
# 启动所有服务
docker compose -f docker-compose.yml -f docker-compose.s3.yml up -d
# 测试 Storage API
python3 examples/test_https_storage.py
期望结果: 5/5 测试通过 ✅
📊 架构说明
存储流程
公网访问:
用户
↓ HTTPS
https://amiap.hzau.edu.cn/supa/storage/v1/
↓ Traefik → Kong Gateway
Supabase Storage Service
↓ 内部网络 (http://minio:9000)
MinIO 对象存储
↓
物理存储: /vol1/1000/s3
内网访问 (需要 Tailscale VPN):
管理员
↓
http://100.64.0.2:9000 (MinIO S3 API)
http://100.64.0.2:9001 (MinIO Console)
↓
MinIO 对象存储
↓
物理存储: /vol1/1000/s3
关键特性
✅ MinIO 内网化: 不暴露到公网
✅ 统一入口: 公网访问通过 Supabase Storage API
✅ 权限控制: 支持 RLS (Row Level Security)
✅ 安全隔离: 管理界面仅内网访问
🔐 MinIO 登录
Console: http://100.64.0.2:9001
凭证 (见 .env 文件):
- 用户名:
MINIO_ROOT_USER - 密码:
MINIO_ROOT_PASSWORD
💾 Supabase Storage API 使用
Python 示例
import requests
BASE_URL = 'https://amiap.hzau.edu.cn/supa'
API_KEY = 'your_anon_key' # 见 .env 文件
headers = {
'apikey': API_KEY,
'Authorization': f'Bearer {API_KEY}'
}
# 上传文件
with open('file.txt', 'rb') as f:
response = requests.post(
f'{BASE_URL}/storage/v1/object/bucket-name/file.txt',
headers={**headers, 'Content-Type': 'text/plain'},
data=f
)
# 下载文件
response = requests.get(
f'{BASE_URL}/storage/v1/object/bucket-name/file.txt',
headers=headers
)
content = response.content
JavaScript 示例
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
'https://amiap.hzau.edu.cn/supa',
'your_anon_key'
)
// 上传文件
const { data, error } = await supabase.storage
.from('bucket-name')
.upload('file.txt', file)
// 下载文件
const { data: fileData } = await supabase.storage
.from('bucket-name')
.download('file.txt')
📁 配置文件
supabase-stack/
├── docker-compose.yml # Supabase 主配置
├── docker-compose.s3.yml # MinIO 配置(内网)
├── .env # 环境变量和凭证
├── examples/
│ └── test_https_storage.py # Storage API 测试脚本
└── docs/
├── FINAL_ARCHITECTURE_MINIO_INTERNAL.md # 详细架构
├── MINIO_LOGIN_FIX.md # 登录问题修复
├── OPERATIONS_GUIDE.md # 运维指南
└── VUE_API_INTEGRATION.md # Vue.js 集成指南
🛠️ 常用命令
服务管理
# 启动
docker compose -f docker-compose.yml -f docker-compose.s3.yml up -d
# 停止
docker compose -f docker-compose.yml -f docker-compose.s3.yml down
# 重启
docker compose -f docker-compose.yml -f docker-compose.s3.yml restart
# 查看状态
docker ps | grep -E "supabase|minio"
日志查看
docker logs supabase-kong --tail 50
docker logs supabase-storage --tail 50
docker logs supabase-minio-1 --tail 50
docker logs supabase-auth --tail 50
测试验证
# Storage API 完整测试
python3 examples/test_https_storage.py
# MinIO 健康检查
curl -I http://100.64.0.2:9000/minio/health/live
# MinIO Console 访问
curl -I http://100.64.0.2:9001
# Supabase API 健康检查
curl -I https://amiap.hzau.edu.cn/supa/
🔍 故障排查
Storage API 返回 404
# 检查 Kong 状态
docker ps | grep kong
docker inspect supabase-kong --format='{{.State.Health.Status}}'
docker logs supabase-kong --tail 50
MinIO 内网无法访问
# 确认 Tailscale 连接
tailscale status
ping 100.64.0.2
# 检查 MinIO 容器和端口
docker ps | grep minio
docker port supabase-minio-1
文件上传失败
# 检查 Storage 服务
docker logs supabase-storage --tail 50
# 验证 Storage 到 MinIO 的连接
docker exec supabase-storage ping -c 1 minio
# 检查环境变量
docker exec supabase-storage env | grep -E "GLOBAL_S3|MINIO"
📚 详细文档
| 文档 | 说明 |
|---|---|
docs/FINAL_ARCHITECTURE_MINIO_INTERNAL.md |
MinIO 内网化详细架构 |
docs/MINIO_LOGIN_FIX.md |
MinIO Console 登录问题修复 |
docs/OPERATIONS_GUIDE.md |
运维指南 |
docs/VUE_API_INTEGRATION.md |
Vue.js 与 Supabase API 集成 |
docs/DEPLOYMENT_GUIDE.md |
部署指南 |
环境变量
关键配置在 .env 文件中:
# MinIO 凭证
MINIO_ROOT_USER=...
MINIO_ROOT_PASSWORD=...
# Supabase API Keys
ANON_KEY=...
SERVICE_ROLE_KEY=...
# S3 配置
GLOBAL_S3_BUCKET=stub
GLOBAL_S3_ENDPOINT=http://minio:9000
架构版本: v3.0 (MinIO 内网化)
最后更新: 2025-11-23
测试状态: ✅ 5/5 通过