Dokumentacja AlgoJudge0.1

Czym jest instalacja

Dziewięć usług, cztery układy i jeden plik Compose, który wybiera między nimi.

Instalacja AlgoJudge to stos Docker Compose. Dostarczamy go jako osobne repozytorium, AlgoJudge-Ops: klonujesz je, konfigurujesz przez plik .env i uruchamiasz.

To repozytorium nie zawiera kodu aplikacji i niczego nie buduje. Każdy obraz pobieramy z GHCR po tagu i właśnie dlatego aktualizacja sprowadza się do docker compose pull, a wycofanie do wskazania digestu. Pliki Compose, które budują ze źródeł, leżą w repozytoriach produktowych i są tam oznaczone jako deweloperskie; to co innego.

Instalacja prosi o tag `0`

Osiem obrazów jest opublikowanych i publicznych: docker compose pull nie wymaga logowania do rejestru, z żadnej maszyny. W .env.example stoi 0ruchoma wersja główna, którą przesuwa każde wydanie 0.x, razem ze zmianami niezgodnymi wstecz. Aktualizacja i wycofanie mówi, co to kosztuje i jak zamiast tego przypiąć konkretną wersję.

Usługi

Dziewięć usług i siedem nazw profili — Server i Client mają po dwie, dzięki czemu można podnieść jedną połowę bez drugiej.

UsługaProfileCzym jest
postgresdataPostgreSQL 18. Bez portu na hoście, w żadnym układzie
serverapp, serverAPI pod /api/v1, publikowane na 127.0.0.1:8080
clientapp, clientaplikacja w przeglądarce, publikowana na 127.0.0.1:8082
nginxedgeTLS, jeden origin dla obu połówek, porty 80 i 443
runner-1runner-4runnerjeden obraz, cztery tożsamości. Każdy ocenia jedno zgłoszenie naraz, w kontenerach siostrzanych
external-runnerexternal-runnerzamiast oceniać, przekazuje je do zewnętrznego archiwum. Nie ma go w domyślnym zestawie — patrz Zewnętrzny sędzia

Cztery to punkt odniesienia, a nie minimum. Tyle pasuje do ośmiu rdzeni fizycznych i zostawia cztery na całą resztę; na mniejszej maszynie uruchom mniej, bo więcej Runnerów niż rdzeni fizycznych nie przyspiesza oceniania, a psuje jego rzetelność. Tabelę znajdziesz w Czego wymaga host.

Niosą je trzy sieci Compose, żeby baza nie była osiągalna z krawędzi, a ruch oceniania dał się oddzielić od HTTP:

Server jako jedyny stoi we wszystkich trzech. PostgreSQL siedzi wyłącznie w backend i w żadnym układzie nie ma portu na hoście. Port do sieci publikuje tylko nginx; dwie publikacje na pętli zwrotnej wymienione wyżej są po to, żeby dało się użyć curl i podstawić własne proxy.

Sieć edge ma jawnie zapisaną podsieć, domyślnie 172.28.0.0/24. To nie kwestia porządku: Server odmawia startu, dopóki nie wskażesz mu, czyim słowom o adresie odwiedzającego ma wierzyć, a podsieci wylosowanej przez Dockera nie dałoby się nazwać.

Cztery układy

Wybierasz je przez COMPOSE_PROFILES w .env. Żaden nie wymaga edycji pliku Compose.

COMPOSE_PROFILES
T1edge,app,data,runnerjeden host, cały produkt. Domyślny
T2edge,app,data, a runner gdzie indziejRunnery na własnych maszynach
T3app,datawłasne reverse proxy z przodu
client,server,datapo jednej połowie, do debugowania i etapowych aktualizacji

external-runner to dodatek do każdego z nich, a nie piąty układ. Dopisz go obok runner albo daj mu osobną maszynę. Nie ma go w zestawie domyślnym, bo loguje się do zewnętrznego archiwum na tamtejsze konto — Zewnętrzny sędzia mówi, czego wymaga i czego za Ciebie nie zrobi.

Runner może działać na zupełnie innej maszynie

Każdy host z Runnerem klonuje to samo repozytorium i uruchamia COMPOSE_PROFILES=runner z trzema wartościami w swoim .env:

SERVER_URL=https://twoja.domena
RUNNER_NAME_PREFIX=lab-a       # inny na każdym hoście
RUNNER_WORK_DIR=/srv/algojudge/runner-work

Przedrostek nazywa wszystkie cztery — lab-a-1 do lab-a-4 — i musi się różnić między hostami, inaczej Runnery z dwóch maszyn pojawią się w panelu pod tymi samymi nazwami.

Każde połączenie nawiązuje sam Runner. Nie potrzebuje portu przychodzącego i pracuje zza domowego routera, bez własnego adresu. W compose.yaml celowo nie ma depends_on na Server: na hoście z samym Runnerem nie ma usługi Server, na której można by polegać — Runner sam ponawia próby połączenia.

Każdy Runner rejestruje się osobno i każdy wymaga osobnego zatwierdzenia, więc host z czterema Runnerami to cztery zatwierdzenia.

Dla instalacji publicznej zalecany jest układ T2

Dostęp do gniazda Dockera daje na hoście uprawnienia roota, a Runner potrzebuje tego gniazda, żeby uruchamiać kontenery zadań. W T1 na tym samym hoście stoi baza, więc kto wyrwie się z kontenera zadania, ląduje na maszynie ze wszystkimi zgłoszeniami i wszystkimi hashami haseł. Na hoście z samym Runnerem w najgorszym razie dostaje maszynę, na której nic nie ma.

Co działa obok stosu, a nie w nim

Instalacja potrzebuje dostawcy OIDC i żadne z dwóch wspieranych wdrożeń tożsamości nie jest usługą w compose.yaml. Działa obok tego stosu, pod własną nazwą hosta. Tożsamość to rozdział o wyborze i rejestracji dostawcy.

Dokąd dalej

Czego wymaga hostDocker, cgroup v2, dysk, logi
Pierwsza instalacjaod pustego katalogu do werdyktu
Prekonfiguracjajak postawić instalację bez klikania w panelu
TożsamośćKeycloak albo Authentik i jak zarejestrować dostawcę
Podłączenie platformy kursowejLTI 1.3 i ustawienie przeglądarki, od którego wszystko zależy
Gdzie trafiają plikitrzy magazyny i przenoszenie plików między nimi
Przerwa technicznajak wyłączyć instalację z ruchu, nie zatrzymując jej
Kopie zapasoweco obejmuje zrzut i co ze sobą niesie
Odtwarzaniejak wgrać kopię z powrotem
Aktualizacja i wycofaniei czego wycofanie nie cofa
Praca rutynowa i harmonogramsprzątanie, cron i to, czego nikt nie mówi
Własne reverse proxypięć reguł
Zewnętrzny sędziaprzekazywanie zadań do zewnętrznego archiwum
Wszystkie ustawienia w .envcałość w jednej tabeli
Kiedy coś nie działaawarie, które wyglądają na inne problemy

Kod źródłowy jest w AlgoJudge-Ops. Ten projekt jest na licencji MIT. Zobacz plik LICENSE. Ta dokumentacja jest na licencji CC BY 4.0.

Na tej stronie