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 migratePrimjenjuje schema.sql i izvješćuje o broju naredbi.
node scripts/db.mjs seedUbacuje ili osvježava katalog i demo organizaciju te zapisuje demo ključ u data/demo-key.txt s dozvolama 0600.
node scripts/db.mjs resetSamo 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 statusIspisuje mehanizam baze podataka, broj tablica i broj redaka svake neprazne tablice.
node scripts/db.mjs demo-keyIzdaje 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 portoviAPP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URLAPI 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 podatakaDATABASE_URL, REDIS_URLDATABASE_URL odabire spremište; REDIS_URL je rezerviran za red čekanja poslova i ne čita ga v1 putanja koda.
InferencijaINFERENCE_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č.
NaplataFX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETEvidencija se vodi u mikrojedinicama USD-a, a EUR se izvodi za prikaz po FX_EUR_USD.
E-poštaMAIL_FROM, MAIL_SMTP_HOST, MAIL_SMTP_PORT, MAIL_SMTP_SECURE, MAIL_SMTP_USER, MAIL_SMTP_PASS, MAIL_TIMEOUT_MS, MAIL_API_URL, MAIL_API_KEYPostavite MAIL_SMTP_HOST za SMTP, ili MAIL_API_URL s MAIL_FROM za HTTP relej, ili ništa.
SigurnostNODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENVNODE_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_.
RaznoLOG_LEVELLOG_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.