Dokumentacja AlgoJudge0.2

Wszystkie ustawienia w `.env`

Cała konfiguracja instalacji w jednej tabeli, wartości domyślne i trzy klucze, które domyślnej nie mają wcale.

Ta strona opisuje v0.1, a aktualna wersja to v0.2

Zostaje, bo instalacja, która wciąż działa na tej wersji, jej potrzebuje. Jeżeli masz nowszą, to, co tu napisano, może nie zadziałać. Aktualna wersja

Instalację konfiguruje jeden plik: .env, obok compose.yaml. Żaden plik Compose nie jest edytowany w żadnym ze wspieranych układów.

Sąsiednie strony tłumaczą ustawienia w kolejności, w jakiej się je napotyka. Ta jest referencją: wszystkie klucze w jednym miejscu, żeby dało się sprawdzić wartość znalezioną w cudzym .env.

Trzy klucze nie mają wartości domyślnej i bez nich stos nie wstanie

AJ_ADMIN_TOKEN, POSTGRES_PASSWORD i RUNNER_WORK_DIR. Compose odmawia startu, zamiast podstawić pusty łańcuch, i jest to zamierzone: token administratora, który po cichu zrobiłby się pusty, zostawiłby zamknięte /admin — a razem z nim jedyną drogę do ustawienia hasła administratora.

Co działa i skąd

KluczDomyślnie
COMPOSE_PROFILESedge,app,data,runnerktóre usługi działają. Zobacz cztery układy; external-runner jest dodatkiem do każdego z nich
TZEurope/Warsawkotwiczy pracę z harmonogramu w czasie lokalnym
REGISTRYghcr.io/algojudgeskąd pobierane są obrazy
SERVER_TAG0ruchomy major, bez v. Zobacz Aktualizacja
CLIENT_TAG0
RUNNER_TAG0Runner oraz jego cztery obrazy lang-*
EXTERNAL_RUNNER_TAG0własna wersja i własne repozytorium, więc własny tag
POSTGRES_TAG18major przypięty celowo — 18 przeniósł katalog danych
NGINX_TAG1.30-alpinestabilna linia nginksa: parzysty numer pomocniczy oznacza linię stabilną, nieparzysty — mainline. O tagu obrazu bazowego świadczy data ostatniego zbudowania, a nie to, że się pobiera
LOG_MAX_SIZE20mlog każdego kontenera, ograniczany przez sam stos, a nie przez Twojego demona
LOG_MAX_FILES5dockerowy sterownik local, który kompresuje to, co zrotuje

Baza danych

KluczDomyślnie
POSTGRES_DBalgojudge
POSTGRES_USERalgojudge
POSTGRES_PASSWORDwymagane
MIGRATE_ON_STARTtruestaje się AJ_Database__MigrateOnStart Servera, które samo z siebie jest false. Ops je włącza, bo najpierw robi kopię

Sieć

KluczDomyślnie
HTTP_PORT80co publikuje dołączony nginx
HTTPS_PORT443
SERVER_PORT8080publikowany wyłącznie na pętli zwrotnej
CLIENT_PORT8082publikowany wyłącznie na pętli zwrotnej
API_BASE_URL/adres Servera tak, jak sięga do niego przeglądarka. /, gdy jeden origin obsługuje obie połowy. Dwa originy muszą być tą samą witryną — jedna domena rejestrowalna, jeden schemat — inaczej nikt się nie zaloguje. Zobacz Własne reverse proxy
APP_BASE_URLpustejego odbicie lustrzane: adres aplikacji tak, jak sięga do niej przeglądarka. Puste jest właściwe przy jednym originie. Przy dwóch pozostawienie go pustym kończy logowanie federacyjne na gołym /activities, rozwiniętym względem originu API
TRUSTED_PROXY_NETWORKS172.28.0.0/24czyjemu słowu wierzyć w sprawie adresu odwiedzającego. Sieć, nie adres; none, gdy Server stoi bez proxy
EDGE_SUBNET172.28.0.0/24sieć Compose, w której stoi dołączony nginx
SERVER_STOP_GRACE40style, żeby Server zdążył odpowiedzieć na trzymane pobrania pracy. Podnieś razem z AJ_Poll__WaitSeconds, jeśli je podnosisz
SERVER_LOGWarningnie Information: na tym poziomie Server loguje każde wykonane zapytanie SQL, zmierzone na 91–98% wszystkiego, co zapisuje stos oceniający — ponad gigabajt przy zawodach z trzema tysiącami zgłoszeń, na dysku samej bazy

EDGE_SUBNET i TRUSTED_PROXY_NETWORKS muszą się zgadzać. Domyślna para się zgadza. Zmiana jednego bez drugiego oznacza, że Server przestaje wierzyć proxy stojącemu przed nim, i każdy odwiedzający jest zapisywany jako przychodzący z tego proxy.

Przechowywanie i powierzchnia operatora

KluczDomyślnie
STORAGE_KINDpostgrespostgres, filesystem albo s3. Tylko przy postgres zrzut bazy jest całym stanem instalacji
STORAGE_PATH/var/lib/algojudge/objectstylko przy filesystem, na własnym wolumenie. Kopia musi go obejmować razem z bazą
STORAGE_ENDPOINTpustetylko przy s3, a te cztery klucze są wymagane razem
STORAGE_BUCKETpuste
STORAGE_ACCESS_KEYpuste
STORAGE_SECRET_KEYpuste
AJ_ADMIN_TOKENwymaganestaje się AJ_Admin__Token. Ustaw przed pierwszym startem

Runner

KluczDomyślnie
RUNNER_WORK_DIRwymaganebezwzględna ścieżka na hoście. Niech utworzy ją Compose — zakłada ją jako root, z prawami 0755, a tego właśnie trzeba: Runner zapisuje tam jako root, a każdy kontener zadania czyta ją jako uid 65534. Katalog ręcznie zamknięty przed innymi nie przechodzi drugiej połowy i wtedy każde zlecenie zgłasza Permission denied (os error 13). Ścieżka, której demon nie potrafi otworzyć, staje się pustym katalogiem, a nie błędem
RUNNER_NAME_PREFIXrunnerpod tym rejestruje się cała czwórka: to plus -1 do -4. Drugi host z własnymi Runnerami potrzebuje innego przedrostka, inaczej panel pokaże dwa wiersze o tej samej nazwie
RUNNER_1_CPUSET … RUNNER_4_CPUSETpustez których procesorów może korzystać każdy Runner. Puste zostawia rozmieszczenie planiście hosta. Podział, który warto zrobić, to jeden Runner na rdzeń fizyczny, z obydwoma jego wątkami — patrz Czego wymaga host
RUNNER_PROBLEM_TYPESstandard-io@1,output-only@1co ten Runner oferuje do oceny. Wartość, która nie nazywa niczego — zabłąkany przecinek — jest odrzucana przy starcie
RUNNER_TAGSpustepule. Czytane wyłącznie przy pierwszej rejestracji; nazwanie puli zabiera Runnera z kolejki ogólnej
RUNNER_STOP_GRACE30sile Docker czeka, zanim zabije Runnera. Po SIGTERM Runner oddaje swoje zlecenie, żeby inny wziął je od razu; skrócenie tego poniżej czasu, jakiego potrzebują te wywołania, zamienia zatrzymanie w zabicie, a zabity Runner zostawia zlecenie dzierżawie. Patrz Aktualizacja i wycofanie
RUNNER_LOGinfostaje się RUST_LOG
DOCKER_GID999grupa właściciela gniazda demona. 0 na Docker Desktop. Nic od niej nie zależy — usługa działa jako root — ale preflight.sh ostrzega, gdy jest zła
SERVER_URLhttp://server:8080tylko dla hosta bez kontenera server; /api/v1 jest dopisywane

Runner zewnętrzny

Czytaj tylko wtedy, gdy external-runner jest w COMPOSE_PROFILES. Zobacz Zewnętrzny sędzia.

KluczDomyślnie
EXTERNAL_JUDGE_USERNAMEwymagane z profilemkonto w archiwum. Każde przekazane zgłoszenie idzie z niego i na nim zostaje
EXTERNAL_JUDGE_PASSWORDwymagane z profilemodmawia tego preflight.sh, a nie compose.yaml: Compose interpoluje cały plik, zanim zastosuje profile, więc oznaczenie tego klucza jako wymaganego zepsułoby każdy układ, który tej usługi nie uruchamia
EXTERNAL_JUDGEuvaktóre archiwum. Jeden proces obsługuje jednego sędziego; drugi to druga usługa
EXTERNAL_RUNNER_NAMEexternal-runner-1cała nazwa, nie przedrostek: to jeden Runner, z własną tożsamością i własnym zatwierdzeniem
EXTERNAL_PROBLEM_TYPESpustepuste deklaruje własny typ archiwum. Literówka daje tu ciszę, a nie błąd
EXTERNAL_RUNNER_TAGSpustepule, czytane wyłącznie przy pierwszej rejestracji
EXTERNAL_RUNNER_LOGinfostaje się RUST_LOG
EXTERNAL_RUNNER_STOP_GRACE60sdwa razy tyle co u Runnera oceniającego, bo oddaje do dwudziestu zgłoszeń w toku, po jednym wywołaniu na każde

Jego dzierżawy ani odstępów odpytywania celowo nie udostępniamy: sprawdzają się nawzajem przy starcie, domyślne wartości obrazu spełniają wszystkie te warunki, a zmiana w dobrej wierze — łagodniejsze odpytywanie cudzego archiwum — jest właśnie tą, która to psuje. Dzierżawa, która mogłaby wygasnąć między dwoma odnowieniami, to zgłoszenie, które archiwum dostanie dwa razy.

Kopie zapasowe

W całości opisane na stronie Kopie zapasowe; tutaj jest sama lista kluczy.

KluczDomyślnie
BACKUP_DIR./backups
BACKUP_PRESETstandardminimal, standard albo extended
BACKUP_KEEP_DAILYz presetunadpisuje jego jedną część
BACKUP_KEEP_WEEKLYz presetu
BACKUP_KEEP_MONTHLYz presetu
BACKUP_MIN_KEEP2nigdy nieusuwane, cokolwiek mówi budżet rozmiaru
BACKUP_MAX_TOTAL_GBwpisywane przez preflight.sh25% systemu plików, nigdy więcej niż 50%
BACKUP_FREE_SPACE_RESERVE_GB10margines pozostawiany wolny po zrzucie
BACKUP_VERIFY_FULLfalseodczytuje każdy blok z powrotem. Kosztuje pełną dekompresję przy każdej kopii

Sprzątanie

KluczDomyślnie
GC_TMP_RETENTION_DAYS7ile dni musi mieć katalog roboczy, zanim zostanie zebrany
GC_PRUNE_IMAGEStrueusuwa nieużywane obrazy tego projektu. Wyłącznie tego projektu

Czego nie ma w .env

Część ustawień jest wpisana w compose.yaml, bo instalacja nie ma powodu ich zmieniać: środowisko, w jakim działa Server, domyślny identyfikator przechowywania, miejsce podmontowania prekonfiguracji, własna ścieżka robocza Runnera wewnątrz jego kontenera oraz cztery obrazy językowe, budowane z REGISTRY i RUNNER_TAG.

Server czyta znacznie więcej niż powyższe klucze — całość jest na stronie Konfiguracja Servera. Ops ustawia to, czego wymaga instalacja, a resztę zostawia na domyślnych wartościach Servera.

Na tej stronie