DMOJをMac(Apple Silicon)で動かす方法|Dockerでローカルオンラインジャッジ環境を構築
競プロなどでお馴染みのオンラインジャッジをローカルで動かしたくなったので、色々調べてみました。ここでは、DMOJというOSSのオンラインジャッジシステムをApple Silicon搭載のMacで動作させたのでメモを残しておきます。
DMOJをMacで動かす
今回は、以下の記事を参考に環境を構築してみました。
Githubリポジトリも用意してくれていたのですがApple Silicon(Arm)ではうまく動かなかったので、一部修正したリポジトリを以下に置きました。
https://github.com/aruaru0/dmoj_docker
全体構成
全体構成は、元記事に書かれている通りで、オンラインジャッジシステム(app), redis, mysql, nginx, そして、judgeサーバー(python, c++, go)をDockerを使って起動します。
nginx
|
app
|
+------+------+
| |
redis mysql
|
judge

judgeサーバーは提出されたコードを実際にコンパイル・実行する役割を持っています。C++ / Python / Go などの実行環境がこのコンテナに含まれています。
リポジトリは、docker composeを使って、これらのサーバーを一気に立ち上げるものになります。
動かすにはDockerが必要になるので、Docker Desktopをダウンロードしインストール・起動しておく必要があります。
https://www.docker.com/ja-jp/get-started
環境構築の仕方
以下のコマンドでリポジトリをクローンします
git clone https://github.com/aruaru0/dmoj_docker.git次に、dockerフォルダに移動します。
cd dmoj_docker/dockerこのフォルダでbuildを実行します
docker compose buildbuildでエラーがなければ以下のコマンドで立ち上げます。
docker compose up -d起動できたら、setup.shを実行して環境構築は完了です
bash scripts/setup.shトラブらなければ、これだけで環境構築は完了です。
使い方
起動
起動は以下のコマンドです
docker compose up -d終了
終了は以下のコマンドになります。
docker compose down管理ページを開く
http://localhost:8081/admin にアクセスすることで管理画面を開くことができます。ユーザ名、パスワードともに初期設定はadminです。なお、setup.shを実行した時に登録したユーザーアカウントでログインしてもOKです。

問題文の追加について
問題文の追加はProblemsから行います。数式もLatex形式で入力することができます。こちらの詳細については、以下の記事を参考にしてください。
なお、問題のテストベクタはdmoj_docker/problemsのフォルダに置く必要があります。このフォルダにProblem Codeと同じ名前のフォルダ名を作成し、init.ymlとテストベクタを格納したzipファイルを配置します。
init.ymlは、以下のようなものになります。
archive: hello.zip
checker: standard
test_cases:
- batched:
- in: hello.1.in
out: hello.1.out
- in: hello.2.in
out: hello.2.out
- in: hello.3.in
out: hello.3.out
points: 100- archive : テストベクタを格納したZIPファイル
- test_cases: テストケースを記載したものです。入力(in:)と期待値(out:)が最低限必要です。
- batched: テストケースを1塊にしたものです。全体がOKで点数をつける場合にはこちらが良いです。

詳しくはDMOJ Docsを参照してください。色々機能があります。例えば、浮動小数点誤差を許容するなどの設定も可能です。
https://docs.dmoj.ca/#/problem_format/problem_format
リポジトリのproblems/helloworldにサンプルを置きましたのでこちらを参考にしてみてください(この問題は初期化した後は登録されていないので問題を作成して登録してみてください。problem codeをhelloworldにすれば追加できます)

helloworldのサンプルは、文字列を入力すると、”hello world, xxxx”と返せという問題です。
その他
各ユーザーはhttp://localhost:8081に接続し、ユーザー登録することになります。サーバーのIPアドレス(http://IPアドレス:8081)にアクセスしてもらえば、LAN内のPCから接続できるので、ミニコンテストみたいなのをローカルで開催するのに便利です。
クローンしたリポジトリと同じく、ユーザー登録時のメールアドレスによるチェックはスキップしています(ローカルでやる場合はこの方が楽なので)。
まとめ
DMOJをMacで動かす方法について解説しました。実際に使ってみて気づいたのはエラー発生時に原因が分かりにくいということです。docker compose logsなどで、サーバーエラーを追跡する必要があるので、トラブルがあった場合はちょっと対応が面倒でした。

