# 🚀 课题组网站部署指南
## 📋 最终架构
### 公网 HTTPS 访问
```
https://amiap.hzau.edu.cn/
├── / → MinIO S3 API(对象存储)
│ └── /stub/ → 默认 bucket
│
├── /group/ → 🎨 Vue 课题组网站(主站)
│ ├── /group/ - 首页
│ ├── /group/members - 成员介绍
│ ├── /group/research - 研究方向
│ └── /group/... - 其他页面
│
├── /supa/ → Supabase 后端 API
│ ├── /supa/auth/v1 - 用户认证
│ ├── /supa/rest/v1 - 数据库 REST
│ └── /supa/storage/v1 - 文件存储
│
└── /ABM/ → ABM 数据库系统
```
### 内网访问(Tailscale VPN: 100.64.0.2)
```
http://100.64.0.2:18000 → Supabase Dashboard(后端管理)
http://100.64.0.2:9001 → MinIO Console(S3 管理)
```
---
## 🎨 Vue 课题组网站开发
### 1. 项目配置
#### vite.config.js
```javascript
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
base: '/group/', // ⚠️ 必须配置子路径
plugins: [vue()],
server: {
port: 5173
}
})
```
#### router/index.js
```javascript
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory('/group/'), // ⚠️ 必须配置子路径
routes: [
{
path: '/',
name: 'Home',
component: () => import('@/views/Home.vue')
},
{
path: '/members',
name: 'Members',
component: () => import('@/views/Members.vue')
},
{
path: '/research',
name: 'Research',
component: () => import('@/views/Research.vue')
},
{
path: '/publications',
name: 'Publications',
component: () => import('@/views/Publications.vue')
}
]
})
export default router
```
### 2. Supabase 集成
#### src/lib/supabase.js
```javascript
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'https://amiap.hzau.edu.cn/supa'
const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY
export const supabase = createClient(supabaseUrl, supabaseKey)
```
#### .env
```bash
VITE_SUPABASE_ANON_KEY=your-anon-key-here
```
#### 使用示例
```vue
```
### 3. 跳转链接配置
```vue
```
---
## 📦 MinIO S3 存储使用
### 直接上传到 S3(大文件)
```javascript
// 使用 AWS SDK
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
const s3Client = new S3Client({
endpoint: 'https://amiap.hzau.edu.cn', // 根路径
region: 'stub',
credentials: {
accessKeyId: import.meta.env.VITE_S3_ACCESS_KEY,
secretAccessKey: import.meta.env.VITE_S3_SECRET_KEY
},
forcePathStyle: true // ⚠️ 必须启用路径风格
})
async function uploadLargeFile(file) {
await s3Client.send(new PutObjectCommand({
Bucket: 'stub',
Key: `publications/${file.name}`,
Body: file,
ContentType: file.type
}))
// 文件 URL: https://amiap.hzau.edu.cn/stub/publications/file.pdf
return `https://amiap.hzau.edu.cn/stub/publications/${file.name}`
}
```
### 使用 Supabase Storage(小文件)
```javascript
// 推荐用于 < 50MB 的文件
const { data, error } = await supabase.storage
.from('documents')
.upload('research/paper.pdf', file)
// 获取公开 URL
const { data: { publicUrl } } = supabase.storage
.from('documents')
.getPublicUrl('research/paper.pdf')
```
---
## 🚀 部署流程
### 1. 开发环境
```bash
# 创建 Vue 项目
npm create vite@latest group-website -- --template vue
cd group-website
# 安装依赖
npm install @supabase/supabase-js
npm install @aws-sdk/client-s3 # 如果需要直接访问 S3
# 配置 vite.config.js 和 router(见上面)
# 本地开发
npm run dev
# 访问: http://localhost:5173/group/
```
### 2. 生产部署
```bash
# 构建
npm run build
# 部署到服务器
scp -r dist/* user@server:/vol1/1000/docker_server/traefik/web/group-site/dist/
# 或直接在服务器上
cd /vol1/1000/docker_server/traefik/web/group-site
rm -rf dist/*
# 复制构建产物到 dist/
# 重启服务
docker compose restart
```
### 3. 验证部署
```bash
# 访问网站
curl https://amiap.hzau.edu.cn/group/
# 查看日志
docker logs group-site
# 查看状态
docker ps | grep group-site
```
---
## 📊 数据库设计示例
### Supabase 表结构
```sql
-- 团队成员表
CREATE TABLE members (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(100) NOT NULL,
title VARCHAR(100),
email VARCHAR(100),
photo_url TEXT,
bio TEXT,
research_interests TEXT[],
join_date DATE,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW()
);
-- 研究成果表
CREATE TABLE publications (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
authors TEXT[],
journal VARCHAR(200),
year INTEGER,
doi VARCHAR(100),
pdf_url TEXT,
abstract TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 研究项目表
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(200) NOT NULL,
description TEXT,
status VARCHAR(50),
start_date DATE,
end_date DATE,
funding_source VARCHAR(200),
created_at TIMESTAMP DEFAULT NOW()
);
```
---
## 🎨 页面布局建议
### 首页 (/)
- 课题组介绍
- 最新动态
- 研究领域概览
- 快速链接
### 成员介绍 (/members)
- 导师信息
- 博士生/硕士生
- 校友网络
### 研究方向 (/research)
- 主要研究领域
- 正在进行的项目
- 技术路线
### 论文成果 (/publications)
- 按年份/类别分类
- 搜索和筛选
- 下载链接
### 管理入口(仅内网)
- Supabase Dashboard 链接
- MinIO Console 链接
- ABM 系统链接
---
## 🔧 常用命令
### 开发调试
```bash
npm run dev # 启动开发服务器
npm run build # 构建生产版本
npm run preview # 预览生产构建
```
### 服务器管理
```bash
# 查看所有服务
docker ps | grep -E '(minio|group|supabase)'
# 重启服务
cd /vol1/1000/docker_server/traefik/web/group-site
docker compose restart
# 查看日志
docker logs -f group-site
# 更新代码
cd /vol1/1000/docker_server/traefik/web/group-site
git pull # 如果使用 git
docker compose restart
```
---
## 📞 故障排查
### Vue 网站 404
- 检查 `base: '/group/'` 配置
- 检查 Nginx try_files 配置
- 清除浏览器缓存
### 静态资源加载失败
- 确认 vite.config.js 中 base 设置
- 检查文件权限:`chmod -R 755 dist/`
### Supabase API 调用失败
- 检查 CORS 配置
- 验证 API Key
- 查看浏览器控制台错误
### S3 上传失败
- 确认 forcePathStyle: true
- 检查 credentials
- 验证 bucket 存在
---
## 🎉 最终检查清单
部署前确认:
- [ ] vite.config.js 配置 `base: '/group/'`
- [ ] router 配置 `createWebHistory('/group/')`
- [ ] Supabase client 配置正确
- [ ] 环境变量已设置
- [ ] 测试所有路由
- [ ] 测试文件上传
- [ ] 测试 Supabase 查询
- [ ] 内网链接可访问
- [ ] 响应式设计检查
- [ ] 浏览器兼容性测试
---
**架构设计**: ✅
**配置完成**: ✅
**开发就绪**: ✅
**开始开发你的课题组网站吧!** 🚀
有任何问题,参考:
- FINAL_ARCHITECTURE_v2.md - 架构说明
- web/group-site/README.md - 部署配置