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
| Klucz | Domyślnie | |
|---|---|---|
COMPOSE_PROFILES | edge,app,data,runner | które usługi działają. Zobacz cztery układy; external-runner jest dodatkiem do każdego z nich |
TZ | Europe/Warsaw | kotwiczy pracę z harmonogramu w czasie lokalnym |
REGISTRY | ghcr.io/algojudge | skąd pobierane są obrazy |
SERVER_TAG | 0 | ruchomy major, bez v. Zobacz Aktualizacja |
CLIENT_TAG | 0 | |
RUNNER_TAG | 0 | Runner oraz jego cztery obrazy lang-* |
EXTERNAL_RUNNER_TAG | 0 | własna wersja i własne repozytorium, więc własny tag |
POSTGRES_TAG | 18 | major przypięty celowo — 18 przeniósł katalog danych |
NGINX_TAG | 1.30-alpine | stabilna 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_SIZE | 20m | log każdego kontenera, ograniczany przez sam stos, a nie przez Twojego demona |
LOG_MAX_FILES | 5 | dockerowy sterownik local, który kompresuje to, co zrotuje |
Baza danych
| Klucz | Domyślnie | |
|---|---|---|
POSTGRES_DB | algojudge | |
POSTGRES_USER | algojudge | |
POSTGRES_PASSWORD | wymagane | |
MIGRATE_ON_START | true | staje się AJ_Database__MigrateOnStart Servera, które samo z siebie jest false. Ops je włącza, bo najpierw robi kopię |
Sieć
| Klucz | Domyślnie | |
|---|---|---|
HTTP_PORT | 80 | co publikuje dołączony nginx |
HTTPS_PORT | 443 | |
SERVER_PORT | 8080 | publikowany wyłącznie na pętli zwrotnej |
CLIENT_PORT | 8082 | publikowany 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_URL | puste | jego 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_NETWORKS | 172.28.0.0/24 | czyjemu słowu wierzyć w sprawie adresu odwiedzającego. Sieć, nie adres; none, gdy Server stoi bez proxy |
EDGE_SUBNET | 172.28.0.0/24 | sieć Compose, w której stoi dołączony nginx |
SERVER_STOP_GRACE | 40s | tyle, żeby Server zdążył odpowiedzieć na trzymane pobrania pracy. Podnieś razem z AJ_Poll__WaitSeconds, jeśli je podnosisz |
SERVER_LOG | Warning | nie 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
| Klucz | Domyślnie | |
|---|---|---|
STORAGE_KIND | postgres | postgres, filesystem albo s3. Tylko przy postgres zrzut bazy jest całym stanem instalacji |
STORAGE_PATH | /var/lib/algojudge/objects | tylko przy filesystem, na własnym wolumenie. Kopia musi go obejmować razem z bazą |
STORAGE_ENDPOINT | puste | tylko przy s3, a te cztery klucze są wymagane razem |
STORAGE_BUCKET | puste | |
STORAGE_ACCESS_KEY | puste | |
STORAGE_SECRET_KEY | puste | |
AJ_ADMIN_TOKEN | wymagane | staje się AJ_Admin__Token. Ustaw przed pierwszym startem |
Runner
| Klucz | Domyślnie | |
|---|---|---|
RUNNER_WORK_DIR | wymagane | bezwzglę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_PREFIX | runner | pod 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_CPUSET | puste | z 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_TYPES | standard-io@1,output-only@1 | co ten Runner oferuje do oceny. Wartość, która nie nazywa niczego — zabłąkany przecinek — jest odrzucana przy starcie |
RUNNER_TAGS | puste | pule. Czytane wyłącznie przy pierwszej rejestracji; nazwanie puli zabiera Runnera z kolejki ogólnej |
RUNNER_STOP_GRACE | 30s | ile 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_LOG | info | staje się RUST_LOG |
DOCKER_GID | 999 | grupa 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_URL | http://server:8080 | tylko 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.
| Klucz | Domyślnie | |
|---|---|---|
EXTERNAL_JUDGE_USERNAME | wymagane z profilem | konto w archiwum. Każde przekazane zgłoszenie idzie z niego i na nim zostaje |
EXTERNAL_JUDGE_PASSWORD | wymagane z profilem | odmawia 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_JUDGE | uva | które archiwum. Jeden proces obsługuje jednego sędziego; drugi to druga usługa |
EXTERNAL_RUNNER_NAME | external-runner-1 | cała nazwa, nie przedrostek: to jeden Runner, z własną tożsamością i własnym zatwierdzeniem |
EXTERNAL_PROBLEM_TYPES | puste | puste deklaruje własny typ archiwum. Literówka daje tu ciszę, a nie błąd |
EXTERNAL_RUNNER_TAGS | puste | pule, czytane wyłącznie przy pierwszej rejestracji |
EXTERNAL_RUNNER_LOG | info | staje się RUST_LOG |
EXTERNAL_RUNNER_STOP_GRACE | 60s | dwa 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.
| Klucz | Domyślnie | |
|---|---|---|
BACKUP_DIR | ./backups | |
BACKUP_PRESET | standard | minimal, standard albo extended |
BACKUP_KEEP_DAILY | z presetu | nadpisuje jego jedną część |
BACKUP_KEEP_WEEKLY | z presetu | |
BACKUP_KEEP_MONTHLY | z presetu | |
BACKUP_MIN_KEEP | 2 | nigdy nieusuwane, cokolwiek mówi budżet rozmiaru |
BACKUP_MAX_TOTAL_GB | wpisywane przez preflight.sh | 25% systemu plików, nigdy więcej niż 50% |
BACKUP_FREE_SPACE_RESERVE_GB | 10 | margines pozostawiany wolny po zrzucie |
BACKUP_VERIFY_FULL | false | odczytuje każdy blok z powrotem. Kosztuje pełną dekompresję przy każdej kopii |
Sprzątanie
| Klucz | Domyślnie | |
|---|---|---|
GC_TMP_RETENTION_DAYS | 7 | ile dni musi mieć katalog roboczy, zanim zostanie zebrany |
GC_PRUNE_IMAGES | true | usuwa 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.