StHack/scoreboard
GitHub: StHack/scoreboard
一个专为CTF竞赛打造的记分板系统,提供队伍排名、解题日志、自动化部署和赛后数据导出能力。
Stars: 3 | Forks: 1
# Sthack CTF 排行榜界面
## 开发环境
要启动一个完整的开发环境,请执行以下步骤:
### 步骤 1 - 准备 Docker 和数据库
#### 初始化脚本
运行 `./init.sh -d`,该脚本将设置 Docker 并创建默认配置到 `.env` 文件中,同时也会包含 mongo-express(用于检查数据)
注意:默认情况下,会将上一年的数据种子写入 MongoDB 数据库(参见[样本数据](#sample-data)),如果要使用其他年份的数据,请更新 `docker-compose.yml`
注意:你也可以指定参数 `-u your_username`(和可选的 `-p your_password` 如果你想指定密码)来生成一个默认的管理员用户
#### 手动步骤
1. 根据需要手动创建 `.env` 文件
MONGO_DATABASE=sthack-scoreboard
MONGO_USERNAME=sthack-admin
MONGO_PASSWORD=sthack-password
ME_USERNAME=sthack-me-admin
ME_PASSWORD=sthack-me-password
2. 然后运行 `docker compose --profile dev up -d` 启动数据库
3. 创建文件 `server/.env` 并包含以下内容
NODE_ENV=development
NODE_PATH=./
APP_MONGO=mongodb://sthack-admin:sthack-password@localhost:27017 # 使用上一步 `.env` 中设置的相同值更新
APP_MONGO_DB=sthack-scoreboard
APP_REDIS=redis://localhost:6379
APP_SALT=thisismysalt
# 可选,仅在你有有效值时指定
APP_DISCORD_TOKEN=XXXXXXXXXXXXX
APP_DISCORD_CHANNEL=XXXXXXXX
4. 运行 npm 命令 `npm i` 恢复包
5. 运行 npm 命令 `npm run start` 启动所有服务,然后访问 `http://localhost:3000` 进入应用,或 `http://localhost:8081` 进入 mongo-express,或 `http://localhost:8001` 进入 Redinsight
6. (可选):你可以使用 npm 脚本 `npm run -w server create-admin -- --user my_user --password my_password` 或使用初始化脚本(见上文)创建第一个管理员用户
### 样本数据
提供了多个样本数据文件夹以方便开发。这些数据来自 Sthack 活动的运行,但我们已经移除了敏感数据(用户密码及其提交内容)。
注意:样本数据(2021 数据集)中所有用户的密码均设置为 `azerty123`
### Node NPM
当前所需的 Node 版本为 24(建议使用 nvm),我们使用了 [npm workspaces 功能](https://docs.npmjs.com/cli/v10/using-npm/workspaces),因此你可以从根目录同时运行服务器和客户端。
如果只需要对其中一个执行命令,需要添加 `-w server` 或 `-w client`。例如:`npm i -w client react@latest`
### Docker Compose
Docker 是运行此项目的主要工具,你需要有一个有效且最新的实例来运行它(参见[初始化脚本](#init-script)自动安装)。Compose 文件使用了 [profile 功能](https://docs.docker.com/compose/profiles/),默认情况下不指定 profile 则没有任何服务可用。有两个 profile 可用:`dev` 和 `prod`,因此对于所有你要运行的 docker compose 命令,都需要指定要使用的 profile,例如:`docker compose --profile dev up -d`
此外,默认情况下所有数据都存储在命名卷中,因此如果你想清理所有数据,最简单的方法是使用命令 `docker compose --profile "*" down -v`,它会停止并移除所有容器及其关联卷。
## 生产环境细节
### 构建生产版本并准备虚拟机
```
git clone git@github.com:StHack/scoreboard.git
cd ./scoreboard
./init.sh -u your_username # specify the username you want for the first admin (recommended)
```
### CTFtime
已实现 CTFtime 的 Feed 规范,参见:
- 对于**队伍排名 Feed**,指定端点:`/api/ctftime/team`
- 对于**捕获日志 Feed**,指定端点:`/api/ctftime/capture`
### Discord 通知
为了支持 Discord 通知,我们使用 Webhook 功能,因此你需要为新频道设置 Webhook,从中可以获取 `channel_id` 和 `token`。然后你可以使用它们运行初始化脚本,例如:
```
./init.sh -u your_username -t discord_token -c discord_channel
```
或手动更新 `.env` 文件,添加变量 `APP_DISCORD_TOKEN` 和 `APP_DISCORD_CHANNEL`,然后使用 `sudo docker compose --profile prod up -d` 重启服务。
```
@wchannel = 1369236898719076402
@wtoken = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
### # webhook
### POST https://discord.com/api/webhooks/{{wchannel}}/{{wtoken}}
User-Agent: Sthack Bot - CTF interface notifier
Content-Type: application/json
{
"content": "Test message 💥"
}
```
### 活动期间修复代码问题
如果在活动期间发生需要代码修复的重大问题,请按以下流程操作:
1. 在本地进行修复并测试
2. 提交并推送
3. 通过 SSH 登录到机器并运行 `git pull`
4. 然后重新运行 `./init.sh` 或 `sudo docker compose --profile prod build && sudo docker compose --profile prod up -d`
### 活动期间的 MongoDB 调试
```
sudo docker compose exec mongo mongosh -u "sthack-admin" -p "sthack-password"
# mongo 命令
show dbs
use sthack-scoreboard
show collections
db.achievements.find()
db.achievements.deleteMany({})
db.users.updateOne({ username: "your_username" }, { $set: { roles: ['user','admin'] } })
# 导入数据
mongoimport messages.json -d test -c messages -u "sthack-admin" -p "sthack-password" --authenticationDatabase admin --jsonArray --drop
```
### 活动结束后
不要忘记进行最终导出并将其提交到此 Git 仓库。为此,请运行以下命令:
```
sudo docker compose --profile prod exec mongo /backups/_mongo_exports.sh
git add *
ssh-keygen -t ed25519 -C email@email.com
cat ~/.ssh/id_ed25519.pub
# 将此密钥推送到 GitHub 设置 -> https://github.com/settings/keys
git config user.name ""
git config user.email email@email.com
git commit -m "feat: add $(date +%Y) edition data"
git push
## 检索仅供员工分析的敏感数据
sudo docker compose --profile prod logs > logs.log
sudo docker compose --profile prod logs website > logs-website.log
## 从你的计算机
git pull
sudo scp -i ~/.ssh/sthack_id_ed25519 nagarian@XX.XX.XX.XX:/home/nagarian/scoreboard/backups/$(date +%Y)/attempts-uncensored.json .
sudo scp -i ~/.ssh/sthack_id_ed25519 nagarian@XX.XX.XX.XX:/home/nagarian/scoreboard/backups/$(date +%Y)/surveys-uncensored.json .
sudo scp -i ~/.ssh/sthack_id_ed25519 nagarian@XX.XX.XX.XX:/home/nagarian/scoreboard/logs.log backups/$(date +%Y)/
sudo scp -i ~/.ssh/sthack_id_ed25519 nagarian@XX.XX.XX.XX:/home/nagarian/scoreboard/logs-website.log backups/$(date +%Y)/
```
### 2026 年服务器使用
```
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/root 48G 8.7G 39G 19% /
# tmpfs 7.9G 0 7.9G 0% /dev/shm
# tmpfs 3.2G 1.3M 3.2G 1% /run
# efivarfs 256K 32K 220K 13% /sys/firmware/efi/efivars
# tmpfs 7.9G 0 7.9G 0% /tmp
# none 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
# none .0M 0 1.0M 0% /run/credentials/systemd-resolved.service
# /dev/sda13 989M 54M 868M 6% /boot
# /dev/sda15 105M 6.3M 99M 7% /boot/efi
# none 1.0M 0 1.0M 0% /run/credentials/systemd-networkd.service
# none 1.0M 0 1.0M 0% /run/credentials/serial-getty@ttyS0.service
# none 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service
# tmpfs 1.6G 8.0K 1.6G 1% /run/user/1001
df -h /var/lib/docker
# Filesystem Size Used Avail Use% Mounted on
# /dev/root 48G 8.7G 39G 19% /
```
## 测试
为了运行 Playwright 测试,你需要创建一个特定的管理员账户:
```
username: 'user42',
password: 'user42',
team: 'admin',
```
标签:Discord集成, Docker, GNU通用公共许可证, MITM代理, MongoDB, Node.js, Redinsight, Redis, 初始化脚本, 前端, 后端, 安全管理, 安全防御评估, 开发环境, 挑战管理, 搜索引擎查询, 数据库, 样本数据, 特征检测, 监控工具, 管理员用户, 管理界面, 自动化攻击, 计分板, 请求拦截, 赛事管理