这是一个由cloudflare workers实现前后端,github actions提供评测的0成本OJ系统。(其实需要一个域名)
部署
你需要什么
1.一个cloudflare账号
2.一个github(注册教程自行搜寻)
3.本地电脑nodejs环境(可以使用中文镜像站)
4.一个自己的域名(域名解析服务器转到Cloudflare)
如何绑定域名至cloudflare可以参考官网的说明

1.配置本地环境
1.下载项目:
bash
git clone https://github.com/wanwusangzhigit/eoj.git
cd eoj
2.配置本地环境
bash
cd frontend
npm i
cd ..
cd backend
npm i
cd ..
3.全局安装cloudflare cli并登录
bash
npm i -g wrangler
wrangler login
2.部署前的准备
1.创建 Cloudflare D1 数据库
bash
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 ID 和 Client Secret。
3.创建CPOAUTH APP(无需CPOAUTH授权登录的无需配置)
前往cpoauth
CALLBACK URL:https://你的域名/api/v1/auth/cpoauth/callback
4.前往cloudflare创建workers(在构建下的workers和pages栏中)
创建workers,命名oj-backend,并在域中绑定域名
5.前往github创建评测仓库
- 在 GitHub 创建私有仓库(如
your-username/oj-judge) - 将judge-repo文件夹下的文件上传至仓库
- 在仓库 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,填入你的配置:
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.编译数据库
bash
cd backend
npx wrangler d1 migrations apply oj-database --remote
cd ..
2.构建前端
bash
cd frontend
npm run build:site
cd ..
3.部署后端
bash
cd backend
npx wrangler deploy
至此部署完成!
4.部署后的工作
1.你需要前往你的oj创建账户
2.访问https://你的域名/__seed初始化数据库并将第一位注册用户设置为超级管理员。
站点设置(管理页面)
部署后,管理员可在后台 站点设置 标签页配置:
| 设置项 | 说明 | 默认值 |
|---|---|---|
| 开启注册(后端wrangler.toml配置) | 关闭后新用户无法注册 | 开启 |
| 强制填写邮箱(网站设置) | 注册时邮箱为必填项 | 关闭 |
| 邮箱后缀限制(网站设置) | 允许的邮箱后缀(逗号分隔),留空不限制 | 空 |
站点自定义(前端config.yaml设置)
编辑 frontend/config.yaml:
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: "" # 首页标题,为空使用默认