编辑
2025-11-03
运维
00
请注意,本文编写于 76 天前,最后修改于 34 天前,其中某些信息可能已经过时。

目录

docker 下载(如果没有)
database.secret
judgehost.secret
docker-compose.yml
启动数据库
等待数据库完全就绪
启动 DOMServer
数据持久化设置
修改 docker-compose.yml 添加数据持久化
更新 judgehost 密码
获取管理员admin密码,用于登录web页面
重启(因为数据挂载更新还没生效)
进入 domserver 容器重置管理员密码 (可选)

服务器操作系统:ubuntu22.04(建议和我使用一样的)

先执行sudo apt update 更新

docker 下载(如果没有)

sh
sudo 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

在项目启动之前,还需要修改一个配置文件。

sh
sudo vim /etc/default/grub

找到 GRUB_CMDLINE_LINUX_DEFAULT 换成:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=0 cgroup_enable=memory swapaccount=1"

然后保存,重启

sh
sudo update-grub sudo reboot

当前在 dom 目录下

database.secret

输入自己的密码

MYSQL_ROOT_PASSWORD=@xxx114514 MYSQL_PASSWORD=xxx114514

judgehost.secret

JUDGEDAEMON_PASSWORD=xxx114514

docker-compose.yml

yml
version: "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 #评测机数量

启动数据库

bash
docker-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 "数据库已就绪!"

启动 DOMServer

bash
docker-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 "数据复制完成!"

修改 docker-compose.yml 添加数据持久化

yml
version: "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

更新 judgehost 密码

bash
# 获取自动生成的 judgehost 密码 echo "JUDGEDAEMON_PASSWORD=$(docker-compose exec domserver cat /opt/domjudge/domserver/etc/restapi.secret | awk 'END{print $4}')" > judgehost.secret

获取管理员admin密码,用于登录web页面

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

重启(因为数据挂载更新还没生效)

bash
docker-compose down docker-compose up -d

然后打开网页登录,账号是 admin

image.png

进入 domserver 容器重置管理员密码 (可选)

bash
echo "password=$(docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret)" > adm-psd.txt
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay