0成本OJ系统

· · 科技·工程

这是一个由 Cloudflare Workers 实现前后端、GitHub Actions 提供评测的 0 成本 OJ 系统。(其实需要一个域名)

demo 地址

项目地址

部署

你需要什么

  1. 一个 Cloudflare 账号

  2. 一个 GitHub 账号(注册教程自行搜寻)

  3. 本地电脑 Node.js 环境(可以使用中文镜像站)

  4. 一个自己的域名(域名解析服务器转到 Cloudflare)

如何绑定域名至 Cloudflare 可以参考官网的说明

1. 配置本地环境

1. 下载项目:

git clone https://github.com/wanwusangzhigit/eoj.git
cd eoj

2. 安装依赖:

cd frontend
npm i
cd ..
cd backend
npm i
cd ..

3. 全局安装 Cloudflare CLI 并登录

npm i -g wrangler
wrangler login

2. 部署前的准备

1. 创建 Cloudflare D1 数据库

wrangler d1 create oj-database

执行后会输出 database_id,记录下来。

2. 创建 GitHub OAuth App(无需 GitHub 授权登录的无需配置)

前往 GitHub Developer Settings 创建 OAuth App:

字段
Application name OJ System
Homepage URL https://你的域名
Authorization callback URL https://你的域名/api/v1/auth/github/callback

记录 Client IDClient Secret

3. 创建 CPOAUTH APP(无需 CPOAUTH 授权登录的无需配置)

前往 cpoauth

CALLBACK URL:https://你的域名/api/v1/auth/cpoauth/callback

4. 前往 Cloudflare 创建 Workers(在构建下的 Workers 和 Pages 栏中)

创建 Workers,命名 oj-backend,并在域中绑定域名

5. 前往 GitHub 创建评测仓库

  1. 在 GitHub 创建私有仓库(如 your-username/oj-judge
  2. judge-repo 文件夹下的文件上传至仓库
  3. 在仓库 Settings > Secrets and variables > Actions 中添加:
Secret
WORKER_API Worker 完整 URL(如 https://oj.your-domain.com
CALLBACK_SECRET 随机生成并记录

6. 创建 GitHub Token

前往 GitHub,创建 Tokens(classic),并记录(至少需要代码读写、GitHub Actions 读写、GitHub Workflow 读写等权限)

7. 配置 wrangler.toml

编辑 backend/wrangler.toml,填入你的配置:

name = "oj-backend"
main = "src/index.ts"
compatibility_date = "2024-01-01"
account_id = "你的 Cloudflare Account ID"

[[d1_databases]]
binding = "DB"
database_name = "oj-database"
database_id = "上一步获取的 database_id"

[assets]
directory = "./public"
binding = "ASSETS"
not_found_handling = "single-page-application"

[vars]
GITHUB_CLIENT_ID = "你的 GitHub OAuth Client ID"
GITHUB_CLIENT_SECRET = "你的 GitHub OAuth Client Secret"
CPOAUTH_CLIENT_ID = "你的 CpOAuth Client ID"
CPOAUTH_CLIENT_SECRET = "你的 CpOAuth Client Secret"
JWT_SECRET = "用 openssl rand -base64 32 生成的密钥"
CALLBACK_SECRET = "你记录的 CALLBACK_SECRET"
GITHUB_TOKEN = "你的 GitHub Token(需 repo 权限,用于触发评测)"
JUDGE_REPO = "your-username/oj-judge"
FRONTEND_URL = "https://你的域名"
REGISTRATION_OPEN = "true"

3. 部署项目

1. 编译数据库

cd backend
npx wrangler d1 migrations apply oj-database --remote
cd ..

2. 构建前端

cd frontend
npm run build:site
cd ..

3. 部署后端

cd backend
npx wrangler deploy 

至此部署完成!

4. 部署后的工作

  1. 你需要前往你的 OJ 创建账户

  2. 访问 https://你的域名/__seed 初始化数据库并将第一位注册用户设置为超级管理员。

站点设置(管理页面)

部署后,管理员可在后台 站点设置 标签页配置:

设置项 说明 默认值
开启注册(后端 wrangler.toml 配置) 关闭后新用户无法注册 开启
强制填写邮箱(网站设置) 注册时邮箱为必填项 关闭
邮箱后缀限制(网站设置) 允许的邮箱后缀(逗号分隔),留空不限制

站点自定义(前端 config.yaml 设置)

编辑 frontend/config.yaml

site:
  name: "My OJ"              # 站点名称
  short_name: "MyOJ"          # 站点简称
  description: "My Online Judge"
  icon: "default"             # "default" 使用内置图标,或填入图标 URL
  favicon: "/favicon.svg"

footer:
  enabled: true
  text: ""                    # 自定义页脚文本(支持 HTML),为空则显示 © 年份 站点名
  links:                      # 页脚链接
    - name: "GitHub"
      url: "https://github.com/your-org"

login:
  hero_title: ""              # 登录页大标题,为空使用默认
  hero_subtitle: ""           # 登录页副标题,为空使用默认
  show_github: true           # 是否显示 GitHub 登录按钮
  show_cpoauth: true          # 是否显示 CpOAuth 登录按钮

home:
  title: ""                   # 首页标题,为空使用默认