## 1 平台部署

#### 1.1 部署流程：

1.把原来的服务器/data数据scp到新服务器的/data

在数据存放的机器上切换到相应目录并执行 scp ./data 用户名(新)@ip(新):/

2.把docker-compose.yml文件复制到新服务器

3.切换到yml文件所在目录，执行sudo docker-compose up -d



#### 1.2 docker-compose.yml

```
version: "3"
services:
  oj-redis:
    image: redis:4.0-alpine
    container_name: oj-redis
    restart: always
    volumes:
      - /data/data/redis:/data
  oj-postgres:
    image: postgres:10-alpine
    container_name: oj-postgres
    restart: always
    command: postgres -c max_connections=1000
    ports:
      - "127.0.0.1:12348:5432"
    volumes:
      - /data/data/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge
  judge-server:
    image: registry.cn-hangzhou.aliyuncs.com/wsl/judge_server
    container_name: judge-server
    restart: always
    read_only: true
    cap_drop:
      - SETPCAP
      - MKNOD
      - NET_BIND_SERVICE
      - SYS_CHROOT
      - SETFCAP
      - FSETID
    tmpfs:
      - /tmp
    volumes:
      - /data/backend/test_case:/test_case:ro
      - /data/judge_server/log:/log
      - /data/judge_server/run:/judger
    environment:
      - SERVICE_URL=http://judge-server:8080
      - BACKEND_URL=http://oj-backend:8000/api/judge_server_heartbeat/
      - TOKEN=DASETALENT
  oj-backend:
    image: registry.cn-hangzhou.aliyuncs.com/wsl/oj_backend
    container_name: oj-backend
    restart: always
    depends_on:
      - oj-redis
      - oj-postgres
      - judge-server
    volumes:
      - /data/data/backend:/data
      - /data/data/app:/app
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge
      - JUDGE_SERVER_TOKEN=DASETALENT
      # - FORCE_HTTPS=1
      # - STATIC_CDN_HOST=cdn.oj.com
    ports:
      - "0.0.0.0:80:8000"
      - "0.0.0.0:443:1443"
```



## 2 题目创建要求

#### 2.1 题面

题目表述准确无歧义

明确给出输入数据范围

#### 2.2 测试用例

题面中给出的sample不应出现在测试用例中

样例中，小样例比例不高于20%，中等规模样例40%~60%，剩下为接近数据最大范围的样例

#### 2.3 标程

出题应准备能够保证正确性的标准程序代码



## 3 验题要求

#### 3.1 不同语言

需要检查相同算法，不同的语言的结果是否相同。

避免出现如c语言可以通过，python实现的相同算法代码超时现象



#### 3.2 验题机制

至少两人验题

​	出题人提交标程测试，验证测试用例的正确性

​	非出题人按照做题的流程，阅读题面，检查是否有歧义、表述不清等问题；编写代码进行提交测试。

实现标程的其它语言版本，测试是否出现3.1中的问题，视情况可通过修改题目时间限制。





## 4 机试具体流程

机试前准备阶段

​		1.机试oj主平台上创建比赛，设置密码，关闭real time rank，设置不可见。创建一个新服务器

​		2.创建题目，满足2题目创建要求

​		3.验题，满足3验题要求，验题时需要打开可见，先确保设置了密码，验完及时恢复不可见状态

​		4.将主平台备份至新服务器，运行服务，并验证可用性。参考1平台部署部分。

考场快开始阶段

​		5.确认 密码已设置，real time rank为关闭，并且处于不可见状态

马上开始阶段

​		6.设置比赛为可见，让考生能够进入比赛输入密码页面

​		7.公布比赛密码

考试中

​		8.观测平台可用性，若出现服务异常，优先进入服务器，执行sudo docker-compose restart热重启，没恢复则进行操作9；若恢复则继续考试，不需要操作9

​		9.让考生进入备用服务器考试

考试结束（立刻要做的）

​		10.修改比赛密码，同时设置为不可见。



成绩统计

​		11.参考机试结束后续流程.pdf

​		其中连接数据库部分做出如下变化：

使用SSH通道：

<img src="image/image-20230328110921250.png" alt="image-20230328110921250" style="zoom:50%;" />

连接数据库：

<img src="image/image-20230328111052680.png" alt="image-20230328111052680" style="zoom:50%;" />

数据库、用户名、密码皆为onlinejudge



## 机试结束，手动去做一个永久快照。