Fix(judgehost): works with Debian12 + docker

This commit is contained in:
2025-04-07 20:32:38 +08:00
parent 320037ecdf
commit 83a95fe49c
12 changed files with 231 additions and 31 deletions

View File

@@ -2,7 +2,7 @@
## Usage
0. Install Arch Linux for domserver and **Debian 11** for judgehost.
0. Install Arch Linux for domserver and **Debian 12** for judgehost.
1. Fill in the vars in `group_vars`.
2. Fill in `domserver` and `judgehost` groups in `hosts` file.
3. Run `ansible-playbook playbooks/domserver`.
@@ -12,10 +12,18 @@
## Trouble shooting
### I give up
Just use Debian 12 + docker.
### Judgehost cannot startup
The cgroups v2 support had been patched since October, 2024. However the latest
release of domjudge is 8.3.1, which was published on September, 2024.
Therefore, before cgroups v2 patch came out as a stable release, we still have
to use a older release, like Debian 11, to make things work.
to use a older release, like Debian 12, to make things work.
### PHP syntax error
PHP version on Debian 11 is too old, use Debian 12 instead.

View File

@@ -1,3 +1,3 @@
---
domjudge_base_dir: /opt/domjudge/midterm
domserver_url: https://cp1.konchin.com
domjudge_base_dir: /opt/domjudge
domserver_url: https://cp1.konchin.com/

2
hosts
View File

@@ -7,7 +7,7 @@ localhost ansible_connection=local
[judgehost]
10.4.2.227
10.4.2.228
#10.4.2.228
[all:vars]
ansible_python_interpreter=/usr/bin/python3

View File

@@ -2,5 +2,6 @@
- name: Install judgehost
hosts: judgehost
roles:
- role: install_packages_debian11
- role: configure_judgehost_legacy
#- role: install_packages_debian
#- role: configure_judgehost_legacy
- role: configure_judgehost

View File

@@ -21,8 +21,11 @@ services:
CONTAINER_TIMEZONE: Asia/Taipei
restart: always
volumes:
- "restapi_secret:/opt/domjudge/domserver/etc/restapi.secret"
- "./config/php/domjudge.conf:/etc/php/8.2/fpm/pool.d/domjudge.conf"
depends_on:
- mariadb
ports:
- "127.0.0.1:8080:80"
volumes:
restapi_secret: {}

View File

@@ -1,6 +1,10 @@
---
- name: Reboot
ansible.builtin.reboot: {}
- name: Update grub
ansible.builtin.command: |
update-grub
changed_when: true
- name: Restart judgehost docker compose
community.docker.docker_compose_v2:
project_src: "{{ domjudge_base_dir }}"

View File

@@ -1,10 +1,23 @@
---
- name: Add boot parameters
- name: Add boot parameters (Archlinux)
ansible.builtin.lineinfile:
path: /boot/loader/entries/arch.conf
line: >-
options cgroup_enable=memory
notify: Reboot
when: ansible_facts['distribution'] == "Archlinux"
- name: Add boot parameters (Debian)
ansible.builtin.lineinfile:
path: /etc/default/grub
regexp: '^GRUB_CMDLINE_LINUX_DEFAULT='
line: >-
GRUB_CMDLINE_LINUX_DEFAULT="quiet
cgroup_enable=memory swapaccount=1 isolcpus=0
systemd.unified_cgroup_hierarchy=0"
notify:
- Update grub
- Reboot
when: ansible_facts['distribution'] == "Debian"
- name: Flush handlers
ansible.builtin.meta: flush_handlers

View File

@@ -0,0 +1,14 @@
---
- name: Update grub
ansible.builtin.command: |
update-grub
changed_when: true
- name: Reboot
ansible.builtin.reboot:
- name: Systemd daemon-reload
ansible.builtin.systemd_service:
daemon_reload: true
- name: Restart judgehost
ansible.builtin.systemd_service:
name: domjudge-judgehost.target
state: restarted

View File

@@ -1,4 +1,138 @@
---
- name: Show domjudge base dir
- name: Run ./configure
tags: [make]
ansible.builtin.command: >-
./configure
--with-baseurl={{ domserver_url }}
--prefix={{ domjudge_base_dir }}
args:
chdir: "{{ domjudge_base_dir }}"
become: true
become_user: domjudge
changed_when: true
register: debug
- name: Debug
tags: [make]
ansible.builtin.debug:
var: domjudge_base_dir
var: debug.stdout_lines
- name: Run make judgehost
tags: [make]
ansible.builtin.command: |
make judgehost
args:
chdir: "{{ domjudge_base_dir }}"
become: true
become_user: domjudge
register: debug
- name: Debug
tags: [make]
ansible.builtin.debug:
var: debug.stdout_lines
- name: Run make install-judgehost
tags: [make]
ansible.builtin.command: |
make install-judgehost
args:
chdir: "{{ domjudge_base_dir }}"
notify:
- Systemd daemon-reload
register: debug
- name: Debug
tags: [make]
ansible.builtin.debug:
var: debug.stdout_lines
- name: Create domjudge-run group
tags: [make]
ansible.builtin.group:
name: domjudge-run
- name: Add domjudge-run user
tags: [make]
ansible.builtin.user:
name: domjudge-run
home: /nonexistent
group: domjudge-run
shell: /bin/false
- name: Add domjudge-run-0 user
tags: [make]
ansible.builtin.user:
name: domjudge-run-0
home: /nonexistent
group: domjudge-run
shell: /bin/false
- name: Copy sudoers-domjudge
tags: [make]
ansible.builtin.copy:
src: "{{ domjudge_base_dir }}/etc/sudoers-domjudge"
dest: /etc/sudoers.d/sudoers-domjudge
remote_src: true
mode: '0440'
owner: root
group: root
- name: Run misc-tools/dj_make_chroot
ansible.builtin.command: |
./misc-tools/dj_make_chroot
args:
chdir: "{{ domjudge_base_dir }}"
- name: Modify boot options
ansible.builtin.lineinfile:
path: /etc/default/grub
regexp: '^GRUB_CMDLINE_LINUX_DEFAULT='
line: >-
GRUB_CMDLINE_LINUX_DEFAULT="quiet
cgroup_enable=memory swapaccount=1 isolcpus=0
systemd.unified_cgroup_hierarchy=0"
notify:
- Update grub
- Reboot
- name: Flush handlers
ansible.builtin.meta: flush_handlers
- name: Fetch judgehost password
tags: [make]
community.docker.docker_compose_v2_exec:
project_src: "{{ domjudge_base_dir }}"
service: domserver
command: >-
sed -nr 's/^.*\W+judgehost\W+(.+)$/\1/p'
/opt/domjudge/domserver/etc/restapi.secret
delegate_to: "{{ groups['domserver'] | first }}"
run_once: true
register: fetch_reg
- name: Set judgehost facts
tags: [make]
ansible.builtin.set_fact:
domserver_url: "{{ domserver_url }}"
judgehost_password: "{{ fetch_reg['stdout'] }}"
run_once: true
- name: Show judgehost password
tags: [make]
ansible.builtin.debug:
var: judgehost_password
- name: Install restapi.secret
tags: [make]
ansible.builtin.copy:
content: >-
default {{ domserver_url }}/api judgehost {{ judgehost_password }}
dest: "{{ domjudge_base_dir }}/judgehost/etc/restapi.secret"
mode: '0640'
owner: domjudge
group: domjudge
- name: Flush handlers
tags: [make]
ansible.builtin.meta: flush_handlers
- name: Enable and start domjudge-judgehost.target
tags: [make]
ansible.builtin.systemd_service:
name: domjudge-judgehost.target
state: started
enabled: true

View File

@@ -1,25 +1,43 @@
- name: Download domjudge tarball
ansible.builtin.get_url:
url: "{{ domjudge_tarball_url }}"
dest: /opt/
mode: '0644'
owner: root
group: root
register: downloaded_tarball
- name: Install domjudge directory
ansible.builtin.file:
path: "{{ domjudge_base_dir }}"
path: "{{ domjudge_base_dir | dirname }}"
state: directory
recurse: true
mode: '0700'
owner: root
group: root
- name: Extract domjudge tarball
ansible.builtin.unarchive:
src: "{{ downloaded_tarball.dest }}"
dest: "{{ domjudge_base_dir }}"
remote_src: true
register: domjudge_extracted
- name: Set new domjudge_base_dir
ansible.builtin.set_fact:
domjudge_base_dir: "{{ domjudge_extracted.dest }}"
mode: '0750'
owner: domjudge
group: domjudge
- name: Install domjudge by tarball
block:
- name: Create tmp for domjudge tarball
ansible.builtin.file:
path: /run/domjudge
state: directory
mode: '0755'
owner: root
group: root
- name: Download domjudge tarball
ansible.builtin.get_url:
url: "{{ domjudge_tarball_url }}"
dest: /run/domjudge/
mode: '0644'
owner: domjudge
group: domjudge
register: downloaded_tarball
- name: Extract domjudge tarball
ansible.builtin.unarchive:
src: "{{ downloaded_tarball.dest }}"
dest: /run/domjudge/
remote_src: true
owner: domjudge
group: domjudge
register: domjudge_extracted
- name: Set new domjudge_base_dir
ansible.builtin.set_fact:
domjudge_extracted_dir: "{{ domjudge_extracted.dest }}/domjudge-{{ judgehost_version }}"
- name: Move content to domjudge base directory
ansible.builtin.shell: |
echo "{{ domjudge_extracted_dir }}"
echo "{{ domjudge_base_dir }}"
mv {{ domjudge_extracted_dir }} {{ domjudge_base_dir }}
args:
creates: "{{ domjudge_base_dir }}"

View File

@@ -1,5 +1,10 @@
---
- name: Add domjudge user
ansible.builtin.user:
name: domjudge
create_home: true
- name: Import domjudge download
ansible.builtin.import_tasks: download.yml
- name: Import domjudge configure
ansible.builtin.import_tasks: configure.yml
notify: Restart judgehost