服务器操作系统:ubuntu22.04(建议和我使用一样的)
先执行sudo apt update 更新
shsudo apt install -y docker-compose
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://98t8vkfg.mirror.aliyuncs.com",
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
在项目启动之前,还需要修改一个配置文件。
shsudo vim /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 换成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=0 cgroup_enable=memory swapaccount=1"
然后保存,重启
shsudo update-grub sudo reboot
当前在 dom 目录下
输入自己的密码
MYSQL_ROOT_PASSWORD=@xxx114514 MYSQL_PASSWORD=xxx114514
JUDGEDAEMON_PASSWORD=xxx114514
ymlversion: "3.9"
services:
dj-mariadb:
container_name: dj-mariadb
image: mariadb:10.5
restart: unless-stopped
ports:
- "13306:3306"
volumes:
- ./database:/var/lib/mysql
env_file: database.secret
environment:
- MYSQL_USER=domjudge
- MYSQL_DATABASE=domjudge
- CONTAINER_TIMEZONE=Asia/Shanghai
command: --max-connections=1024 --max-allowed-packet=1G --innodb-log-file-size=512M
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "--password=$$MYSQL_ROOT_PASSWORD"]
start_period: 30s
interval: 10s
timeout: 5s
retries: 10
domserver:
container_name: domserver
image: domjudge/domserver:8.3.1
restart: unless-stopped
ports:
- "80:80"
depends_on:
dj-mariadb:
condition: service_healthy
env_file: database.secret
environment:
- MYSQL_HOST=dj-mariadb
- MYSQL_USER=domjudge
- MYSQL_DATABASE=domjudge
- CONTAINER_TIMEZONE=Asia/Shanghai
volumes:
- ./backups:/opt/domjudge/domserver/backups
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
judgehost:
image: domjudge/judgehost:8.3.1
restart: unless-stopped
depends_on:
domserver:
condition: service_healthy
privileged: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
env_file: judgehost.secret
environment:
- DAEMON_ID=1
- CONTAINER_TIMEZONE=Asia/Shanghai
deploy:
replicas: 5 #评测机数量
bashdocker-compose up -d dj-mariadb
bash# 检查数据库健康状态
until docker-compose exec dj-mariadb mysqladmin ping -u root -p$(grep MYSQL_ROOT_PASSWORD database.secret | cut -d= -f2) --silent; do
echo "等待数据库启动..."
sleep 10
done
echo "数据库已就绪!"
bashdocker-compose up -d domserver
sh# 在 dom 目录下执行
# 创建必要的目录
mkdir -p database backups domserver_data/{public/images,public/flags,var}
# 从运行的容器中复制默认数据到宿主机
echo "正在复制 DOMServer 默认数据到宿主机..."
# 复制图片和标志文件
docker cp domserver:/opt/domjudge/domserver/webapp/public/images/. domserver_data/public/images/
docker cp domserver:/opt/domjudge/domserver/webapp/public/flags/. domserver_data/public/flags/
# 复制变量数据
docker cp domserver:/opt/domjudge/domserver/webapp/var/. domserver_data/var/
# 验证数据复制成功
echo "验证复制的数据:"
ls -la domserver_data/public/images/
ls -la domserver_data/public/flags/
echo "数据复制完成!"
ymlversion: "3.9"
services:
dj-mariadb:
container_name: dj-mariadb
image: mariadb:10.5
restart: unless-stopped
ports:
- "13306:3306"
volumes:
- ./database:/var/lib/mysql
env_file: database.secret
environment:
- MYSQL_USER=domjudge
- MYSQL_DATABASE=domjudge
- CONTAINER_TIMEZONE=Asia/Shanghai
command: --max-connections=1024 --max-allowed-packet=1G --innodb-log-file-size=512M
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "--password=$$MYSQL_ROOT_PASSWORD"]
start_period: 30s
interval: 10s
timeout: 5s
retries: 10
domserver:
container_name: domserver
image: domjudge/domserver:8.3.1
restart: unless-stopped
ports:
- "80:80"
depends_on:
dj-mariadb:
condition: service_healthy
env_file: database.secret
environment:
- MYSQL_HOST=dj-mariadb
- MYSQL_USER=domjudge
- MYSQL_DATABASE=domjudge
- CONTAINER_TIMEZONE=Asia/Shanghai
volumes:
- ./backups:/opt/domjudge/domserver/backups
- ./domserver_data/public/images:/opt/domjudge/domserver/webapp/public/images
- ./domserver_data/public/flags:/opt/domjudge/domserver/webapp/public/flags
- ./domserver_data/var:/opt/domjudge/domserver/webapp/var
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
judgehost:
image: domjudge/judgehost:8.3.1
restart: unless-stopped
depends_on:
domserver:
condition: service_healthy
privileged: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
env_file: judgehost.secret
environment:
- DAEMON_ID=1
- CONTAINER_TIMEZONE=Asia/Shanghai
deploy:
replicas: 5
bash# 获取自动生成的 judgehost 密码
echo "JUDGEDAEMON_PASSWORD=$(docker-compose exec domserver cat /opt/domjudge/domserver/etc/restapi.secret | awk 'END{print $4}')" > judgehost.secret
bash
# 获取管理员 admin 密码,用于登录 web 页面
docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret
# 可选:将管理员密码保存到文件
echo "$(docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret)" > adm-psd.txt

bashdocker-compose down docker-compose up -d
然后打开网页登录,账号是 admin

bash
echo "password=$(docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret)" > adm-psd.txt

