更新
SQLense 为什么用单容器架构
一个 code-server 容器服务全班,对比一人一容器方案,内存占用降低 90%。这就是 SQLense 的资源效率哲学。
一人一容器的问题
市面上很多编程教学平台采用「一人一容器」的方案:每位学生启动一个独立的 Docker 容器,内含完整的 code-server 进程和开发环境。
这听起来很干净,但实际运行时:
- 每个 code-server 进程常驻内存约 200-400MB
- 一个 30 人的班级需要 6-12GB 内存
- 服务器至少要 8C16G 配置,月费数百元
- 启动慢,学生等容器拉起要几十秒
- 教师管理 30 个容器的生命周期,运维复杂
SQLense 的做法:单容器 + 路由隔离
SQLense 只跑一个 code-server 容器,通过 X-Student-Id HTTP header 实现工作区隔离:
浏览器 → auth-proxy (nginx)
├─ auth_request → api-server 验证 JWT
└─ proxy_pass → code-server:8443
+ X-Student-Id: 2024001 ← 注入学号
code-server 内部根据 X-Student-Id 挂载对应的工作区目录(/workspaces/student_2024001),每位学生看到的文件互相隔离,但共享同一个 Node.js 进程。
资源对比
| 方案 | 30 人班级内存占用 | 最低服务器配置 | 月费估算 |
|---|---|---|---|
| 一人一容器 | 6-12 GB | 8C16G | 200-400 元 |
| SQLense 单容器 | 0.5-1 GB | 2C4G | 30-60 元 |
内存占用降低约 90%,起步成本降低约 80%。
不是牺牲隔离性换来的
单容器并不意味着不隔离:
- 文件隔离:每位学生的工作区是独立的目录,通过 code-server 的 workspace 机制隔离
- 数据库隔离:每位学生拥有独立的 PostgreSQL 数据库(
db_student_N)和角色(role_student_N),权限锁死在自己的库 - 认证隔离:auth-proxy 对每个请求做 JWT 验证,
X-Student-Id注入由服务端完成,学生无法伪造
适合谁
这套架构特别适合资源敏感型场景:
- 高校数据库课程:机房服务器预算有限,一台 2C4G 机器服务一个班
- 编程训练营:开班快、结课快,不想在基础设施上花太多钱
- 自主创业开办编程班:初期学员少,低成本起步,按需扩容
可扩展到其他学科
SQLense 的「单容器 + 路由隔离」架构不限于 SQL 教学。核心引擎与学科解耦,理论上任何能在 VS Code 中完成的教学场景都可以套用:
- Pythonense:预装 Python 扩展 + Jupyter,单容器服务全班
- AlgLense:算法可视化 + 在线判题,同样的隔离机制
- WebLense:前端开发教学,Live Server 扩展 + 浏览器预览
这就是我们称之为 Lense 架构的原因——它是一个可复用的教学平台框架,SQLense 只是第一个实例。