Samostalno hostanje
Node i direktorij s pravom pisanja sve su što je potrebno. Tvrdnje u nastavku pročitane su iz datoteka navedenih pokraj njih; sve što nije moglo biti potvrđeno nije ovdje.
Ulazne točke
- package.json zahtijeva Node >= 22.5. SQLite pohrana je Nodeov vlastiti modul node:sqlite.
- Ne postoji nikakav popis ovisnosti: aplikacije, paketi, skripte i testovi rade na Nodeovoj standardnoj biblioteci, a Dockerfile ne instalira ništa.
- Postoje tri procesa; svaki otvara bazu podataka i pokreće migraciju pri pokretanju.
node apps/web/server/main.mjs # hub + console + embedded API
API_EMBED=false node apps/api/src/main.mjs # API only, no pages
node apps/worker/src/run.mjs # probes, latency, rollup, housekeeping
Pohrana podataka
DATABASE_URL=sqlite:./data/llmeu.db ne treba poslužitelj, a direktorij i datoteka stvaraju se pri prvom otvaranju. Upravljač radi u WAL načinu s uključenim stranim ključevima i vremenskim ograničenjem zauzetosti od 5 s.
packages/shared/src/db/schema.sql je shema. Ona je samo za stvaranje i idempotentna, pa je ponovno pokretanje sigurno; stupac dodan postojećoj tablici mora se također deklarirati u koraku dodavanja u packages/shared/src/db/index.mjs.
URL postgres:// koristi zasebnu granu adaptera. Ta grana zahtijeva paket pg, koji nije deklarirana ovisnost, a zaglavlje schema.sql kaže da se putanju Postgres tretira kao neprovjerenu dok ne postoje pravi upravljački program i testirana migracija. SQLite je putanja koju ovo spremište pokreće.
Operaterski CLI
node scripts/db.mjs čita DATABASE_URL i ne treba nikakve servise. Naredbe:
| Naredba | Što radi |
|---|---|
| node scripts/db.mjs migrate | Primjenjuje schema.sql i izvješćuje o broju naredbi. |
| node scripts/db.mjs seed | Ubacuje ili osvježava katalog i demo organizaciju te zapisuje demo ključ u data/demo-key.txt s dozvolama 0600. |
| node scripts/db.mjs reset | Samo za SQLite: uklanja datoteku baze podataka i njezine prateće datoteke -wal i -shm, zatim migrira i puni početnim podacima. Na Postgresu odbija. |
| node scripts/db.mjs status | Ispisuje mehanizam baze podataka, broj tablica i broj redaka svake neprazne tablice. |
| node scripts/db.mjs demo-key | Izdaje novi ključ za demo organizaciju i ispisuje ga jednom. |
| node scripts/db.mjs passwd <email> | Postavlja korisničku lozinku sa servera i briše svaku sesiju tog korisnika. To je put oporavka kada nije konfiguriran transport pošte. Bez --password generira je i ispisuje jednom. |
Okruženje
Grupirano onako kako ih grupira .env.example.
| Grupa | Varijable | Napomene |
|---|---|---|
| URL-ovi i portovi | APP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URL | API port standardno je 8088, a ne 8080. API_EMBED=false namijenjen je postavljanju koje pokreće API kao vlastiti proces; PUBLIC_API_URL osnovni je URL prikazan u isječcima dokumentacije. |
| Pohrana podataka | DATABASE_URL, REDIS_URL | DATABASE_URL odabire spremište; REDIS_URL je rezerviran za red čekanja poslova i ne čita ga v1 putanja koda. |
| Inferencija | INFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_* | Vidi odjeljak o inferenciji u nastavku; PARTNER_* pokriva osnovni URL partnera, regiju, klasu suverenosti i API ključ. |
| Naplata | FX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET | Evidencija se vodi u mikrojedinicama USD-a, a EUR se izvodi za prikaz po FX_EUR_USD. |
| E-pošta | MAIL_FROM, MAIL_SMTP_HOST, MAIL_SMTP_PORT, MAIL_SMTP_SECURE, MAIL_SMTP_USER, MAIL_SMTP_PASS, MAIL_TIMEOUT_MS, MAIL_API_URL, MAIL_API_KEY | Postavite MAIL_SMTP_HOST za SMTP, ili MAIL_API_URL s MAIL_FROM za HTTP relej, ili ništa. |
| Sigurnost | NODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENV | NODE_ENV=production označava sesijske kolačiće kao Secure. LLMEU_IP_SALT soli hashirani IP klijenta i treba ga promijeniti za svako postavljanje. LLMEU_KEY_ENV dodaje prefiks generiranim ključevima s llmeu_live_ ili llmeu_test_. |
| Razno | LOG_LEVEL | LOG_LEVEL postavlja minimalnu razinu zapisnika. |
Docker
Compose i slika su neobavezni: vlastiti paket testova spremišta ne zahtijeva Docker, a primarna putanja je lokalni proces bez servisa.
- Zadani profil pokreće web: portove 3000 i 8088, SQLite na volumenu llmeu-data na /app/data, ugrađeni API i provjeru stanja na /healthz.
- Ista slika pokreće radnika s node apps/worker/src/run.mjs, čekajući da web postane zdrav i dijeleći volumen llmeu-data.
- Dva dodatna profila isključena su prema zadanim postavkama: postgres (postgres:16-alpine) i redis (redis:7-alpine, rezerviran i ne čita ga putanja koda v1).
- Profil gpu pokreće vllm/vllm-openai s rezervacijom NVIDIA uređaja i montira utege samo za čitanje s hosta; nije omogućen prema zadanim postavkama jer bi tvrdnja o EU inferenciji bez GPU-a bila neistinita.
- Dockerfile je FROM node:24-alpine s tini, bez koraka izgradnje i bez instalacije ovisnosti, radi kao korisnik node, zapisuje samo pod /app/data, izlaže portove 3000 i 8088 te pokreće apps/web/server/main.mjs.
Sigurnosne kopije
node scripts/backup.mjs bez zastavica zapisuje ./backups/llmeu-<stamp>.db. SQLite se kopira s VACUUM INTO, nikada s cp, jer aktivna WAL baza podataka kopirana s cp može dati rascijepano ili zastarjelo stanje.
node scripts/backup.mjs # ./backups/llmeu-<stamp>.db
node scripts/backup.mjs --out /srv/backups/ # explicit destination
node scripts/backup.mjs --verify ./backups/llmeu-<stamp>.db
node scripts/backup.mjs --restore ./backups/llmeu-<stamp>.db --yes
node scripts/backup.mjs --list
Svaka SQLite sigurnosna kopija provjerava se prije nego skripta izvijesti o uspjehu: vraća se u privremenu kopiju, PRAGMA integrity_check mora vratiti ok, shema se ponovno primjenjuje i ispisuje se broj redaka za modele, organizacije i korisnike.
S URL-om postgres:// skripta koristi pg_dump --format=custom i treba pg_dump u PATH-u; ispis se ne može otvoriti kao baza podataka, pa njegovo brojanje redaka zahtijeva probni povrat.
E-pošta
Transakcijska pošta — ponovno postavljanje lozinke, provjera adrese, pozivnice — koristi MAIL_SMTP_* ili MAIL_API_URL s MAIL_FROM. Prijenos se odabire jednom pri pokretanju i prijavljuje na svakoj stranici kojoj je potrebna pošta.
Postavljanje bez ijednog od njih podržano je stanje: registracija, prijava, promjena lozinke, timovi i pozivnice rade, ali pošta za ponovno postavljanje lozinke i provjeru ne može se tamo obrađivati. Stranice to navode, a node scripts/db.mjs passwd <email> put je oporavka.
Backendovi za inferenciju
Redak endpointa navodi runtime i regiju, a registar backendova odabire adapter prema regiji, pa na endpoint može odgovoriti samo stroj u regiji koju navodi.
- INFERENCE_MOCK=true zadržava deterministički mock backend, kojemu nisu potrebni GPU ni težine.
- GPU_ENABLED=false isključuje upravljane backendove; uz GPU_ENABLED=true, VLLM_BASE_URL primjenjuje se na jednu regiju koju navodi VLLM_REGION.
- Postavljanje s više regija postavlja jednu varijablu po regiji, nazvanu prema slug-u regije (na primjer VLLM_BASE_URL_DE_FRA). Endpoint u regiji bez konfiguriranog backenda odbija se, umjesto da ga poslužuje stroj u drugoj regiji.
- Partnerski backendovi dolaze iz PARTNER_BASE_URL_<REGION> i uzimaju PARTNER_SOVEREIGNTY i PARTNER_API_KEY; poslužitelj dopušta partnersku upotrebu kada je postavljen PARTNER_BASE_URL.
Bez GPU-a odgovara mock backend. Njegova regija je dev-mock, a njegov izlaz navodi da je to mock backend, da nisu pokrenute nikakve stvarne težine i da vlastita inferencija zahtijeva VLLM_BASE_URL i zastavicu gpu_enabled. Uspjeh mocka koji bi izgledao stvarno bio bi jedina stvar koju ovaj proizvod nikada ne smije isporučiti.