众所周知,ClassIsland 有一个集控功能,同时还有一个配套的集控服务器 ClassIsland.ManagementServer。被希沃集控折磨多了的我,也想尝尝集控的滋味(虽然好像只有我们班用),所以我就尝试部署这个集控服务器。但不幸的是,这个集控服务器已经暂停开发,而且功能不是很完善,看来后面踩坑是不可避免的了。
我为了方便管理,选择了使用 Docker 部署,但官方并未提供 Docker 镜像,所以我只能选择自己构建。在自己的设备上构建 Docker 镜像容易被网络问题折磨,不是很方便,所以我选择使用 GitHub Actions 构建。
因为我以前已经有两个项目使用过 GitHub Actions 构建,这部分的坑基本已经踩过了,参考以前写过的工作流和项目现有的工作流,稍微(实际上并非稍微)改一下就好了。需要注意的是,记得在仓库的 Settings → Actions → General → Workflow permissions 中选择 "Read repository contents and packages permissions",否则构建好的 Docker 镜像无法上传到 GHCR(GitHub Container Registry)。

镜像构建完后,就是拉取镜像然后执行 docker run,挂载好数据目录(我在 Dockerfile 中指定了工作目录 WORKDIR 为 /app,所以映射的容器内路径应当输入 /app/data)。网络模式我为了省事用了 host(但其实并非最佳实践),然后参照 appsettings.example.json 填好配置,把配置文件传进去。按照常理来讲,应该就能跑了。
但我是第一次用 MySQL,这里肯定要踩坑,所以我详细地讲一下数据库的配置。我使用 Navicat Premium 17 帮助我操作 MySQL,这样可以省下不少学习 SQL 命令的时间。首先需要注意的是,配置文件里的 Host 应当填写 MySQL 服务器的 IP 地址;然后在 MySQL 里创建数据库和用户,这里配置文件中的 Host 填写的应当是连接数据库的设备的 IP,还要记得给该用户分配对应的数据库和权限。我这里的 MySQL 和 ManagementServer 在同一台设备上,所以我可以都填写 127.0.0.1。配置文件里我 Uid 和 Database 都写的是 classisland_management,所以我应当创建一个数据库名为 classisland_management,用户名也应为 classisland_management。如果你比较有个性,用户名和数据库名不想写同一个,那么你需要注意:Uid 的值应该是你的 MySQL 用户名,Database 的值是你 MySQL 中数据库的名称。这里配数据库就折腾了我半天 (
但!是!如果真就这点挫折,根本就不算什么坑,我就不会发这个帖子了。
启动 Docker 镜像后就遇到了问题:数据库需要升级。按照常规思路,那就进入容器中用命令升级呗。但是提示完数据库需要升级后,程序就会退出,Docker 会认为程序崩溃了,然后立刻重启容器,根本没有时间进入容器用命令升级数据库。这里我也不想再折腾构建 Docker 镜像了,所以我从 Releases 里下载了 latest 标签的 x64 版本 Windows 程序,然后修改了一下 MySQL 的配置,直接在 Windows 上升级数据库。
本来想着升级后应该就能跑了吧?但并没这么简单。升级后 Docker 里的 ManagementServer 还是提示需要升级,所以我再次使用 Navicat Premium 17 查看了数据库,对比了检测数据库版本的代码,发现表 __EFMigrationsHistory 缺少了一个值。按理来讲,升级过程中如果版本对得上应该就不会缺少啊!所以我的第一反应是:Releases 里的 latest 可能还是旧版本代码,但 Docker 镜像是刚刚才打包的,数据库结构有一些变更。还好工作流里有构建的最新版 Windows 程序,下载以后用这个程序再升级就好了。
既然已经用了 Windows 了,就直接顺手用 setup.ps1 配置好了密码。登录后总算看到了久违的「ClassIsland 集控控制台」。我尝试导入 ClassIsland 的档案,但是响应 400,估计是没写完的功能,我只好迷迷糊糊地配好时间表就睡了。
(附上用手机配置的绝望画面)

第二天晚上,我再次登录控制台,准备配置课表,突然发现课表显示的时间不对。我先检查了课表分配的时间表是否正确,但是我只有一个时间表,也不该有问题啊!所以我又去看时间表,发现时间全部不对。我就试着随手改了一个,保存,刷新,结果又还原了。好嘛,这保存居然也有问题(浪费我 30 分钟宝贵的睡眠时间,艹)。
我试着抓了一下请求,然后用 Reqable 发送请求去配置时间,再刷新时间就对了,还好只是前端有一点点小毛病。
然后我又把其它的地方,包括课表都配好,满怀期待下载集控配置,用 ClassIsland 连接集控,又!但!是!

这又是什么鬼?这下我是真的没辙了,已放弃,如果有知道的大佬教一下吧 (
我猜是 2.0 版本和这个不兼容,或者估计就是 ManagementServer 没开发完。
恭喜你,浪费了宝贵的 10 分钟阅读这个帖子