Files
IOT_SIM/compose.yaml
T
xuyueandClaude Opus 5.5 14a82a3e24 AI 评阅:DeepSeek Flash 给老师评分项出建议分和评语,老师采纳后生效
- 学生提交时浏览器给每个窗体截图(运行时同一套 FormWindow 在屏幕外渲染),随提交保存
- 自动评分后进入 AI 评阅队列:按书上评价表给老师评分项打建议分、写评语(JSON 输出,服务器再校验、限制分数);
  发出的内容不含姓名学号;学生代码里像指令的文字一律当作品内容;学生又交了新的只评最新的
- 提示词按教材命名习惯校准("缩写_含义"、书上规定的控件名、界面上不用的标签保留默认名不扣分):
  教材参考答案 28/30,默认控件名且没有注释 15/30
- 评阅页:界面截图标签页、AI 建议卡片(采纳、重新评阅)、全部采纳(不覆盖老师已评的分)、评阅后又提交的提醒;
  成绩表显示"AI 建议,待确认";学生在老师确认前看不到 AI 的建议
- 规范提示移到 shared,服务端组装提示词时也用
- 配置 DEEPSEEK_API_KEY、AI_MODEL;部署说明提醒 NPM 调大请求体上限

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:37:50 +08:00

66 lines
2.3 KiB
YAML

# 部署:先在 .env 里写好 TEACHER_PASSWORD(参考 .env.example),再 docker compose up -d
# HTTPS 由 Nginx Proxy Manager 负责,它在 npm_proxy 网络里转发到 iot-sim:80;步骤见 deploy/README.md
services:
app:
image: iot-sim:latest
build: .
restart: unless-stopped
environment:
# 老师账号(只有一个);学生账号由老师在网页上导入名单
TEACHER_USERNAME: ${TEACHER_USERNAME:-admin}
TEACHER_PASSWORD: ${TEACHER_PASSWORD:?请在 .env 里设置 TEACHER_PASSWORD}
DATA_DIR: /data
# AI 评阅(DeepSeek);不设置密钥就不做 AI 评阅
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
AI_MODEL: ${AI_MODEL:-deepseek-flash}
# 以下可在 .env 里调整,说明见 deploy/README.md
SIM_MAX_RUNS: ${SIM_MAX_RUNS:-150}
SIM_HEAP_LIMIT_MB: ${SIM_HEAP_LIMIT_MB:-128}
SIM_CPU_LIMIT_SECONDS: ${SIM_CPU_LIMIT_SECONDS:-120}
SIM_MAX_RUN_MINUTES: ${SIM_MAX_RUN_MINUTES:-60}
# 容器文件系统只读,只有 /tmp(学生工程的临时目录)和数据卷可写
read_only: true
tmpfs:
- /tmp:size=1g
# 数据库(账号、班级、学生作品),重新部署不会丢
volumes:
- data:/data
cap_drop: [ALL]
security_opt:
- no-new-privileges:true
# bubblewrap 要创建用户命名空间、挂载新的 /proc,Docker 默认的 seccomp 规则和 /proc 遮罩会拦住它。
# 放开后,学生程序仍然在 bubblewrap 里:断网、看不到其他进程和文件、不是 root。
- seccomp=unconfined
- apparmor=unconfined
- systempaths=unconfined
# 整个平台的资源上限(两个班同时运行约需 1.5 GB),可在 .env 里用 APP_MEM_LIMIT 调整
mem_limit: ${APP_MEM_LIMIT:-4g}
pids_limit: 4096
expose: ["3000"]
networks: [default]
caddy:
image: caddy:2-alpine
restart: unless-stopped
depends_on: [app]
expose:
- 80
networks:
default:
npm_proxy:
# NPM 里转发到 http://iot-sim:80
aliases: [iot-sim]
volumes:
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
data:
caddy_data:
caddy_config:
networks:
npm_proxy:
external: true