Dokumentacja AlgoJudge0.1

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.

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_CPUSETRUNNER_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