Samostojno gostovanje

Node in imenik z možnostjo pisanja sta vsa zahteva. Spodnje navedbe so bile prebrane iz datotek, navedenih ob njih; česar ni bilo mogoče potrditi, ni tukaj.

Vstopne točke

  • package.json zahteva Node >= 22.5. Shramba SQLite je Nodeov lastni modul node:sqlite.
  • Seznama odvisnosti ni prav nobenega: aplikacije, paketi, skripte in testi tečejo na standardni knjižnici Node, Dockerfile pa ne namesti ničesar.
  • Obstajajo trije procesi; vsak odpre bazo podatkov in ob zagonu izvede migracijo.
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

Shramba podatkov

DATABASE_URL=sqlite:./data/llmeu.db ne potrebuje strežnika, imenik in datoteka pa se ustvarita ob prvem odpiranju. Ročaj teče v načinu WAL s tujimi ključi vklopljenimi in 5-sekundnim časovnim omejitvijo zasedenosti.

packages/shared/src/db/schema.sql je shema. Je samo za ustvarjanje in idempotentna, zato je ponovno izvajanje varno; stolpec, dodan obstoječi tabeli, mora biti prav tako deklariran v koraku za dodajanje v packages/shared/src/db/index.mjs.

URL postgres:// izbere ločeno vejo adapterja. Ta veja zahteva paket pg, ki ni deklarirana odvisnost, in glava schema.sql pravi, da je treba pot Postgres obravnavati kot nepreverjeno, dokler ne obstajata pravi gonilnik in preizkušena migracija. Pot, ki jo izvaja ta repozitorij, je SQLite.

Operaterski CLI

node scripts/db.mjs prebere DATABASE_URL in ne potrebuje storitev. Ukazi:

Ukaz Kaj naredi
node scripts/db.mjs migrateUporabi schema.sql in poroča o številu stavkov.
node scripts/db.mjs seedVstavi ali osveži katalog in demo organizacijo ter zapiše demo ključ v data/demo-key.txt z dovoljenji 0600.
node scripts/db.mjs resetSamo za SQLite: odstrani datoteko baze in njena spremljevalca -wal in -shm, nato migrira in napolni. Na Postgresu zavrne.
node scripts/db.mjs statusIzpiše pogon, število tabel in število vrstic vsake neprazne tabele.
node scripts/db.mjs demo-keyIzdela nov ključ za demo organizacijo in ga izpiše enkrat.
node scripts/db.mjs passwd <email>Nastavi uporabnikovo geslo s strežnika in izbriše vse seje tega uporabnika. To je pot za obnovitev, ko ni nastavljenega poštnega transporta. Brez --password ustvari eno in ga izpiše enkrat.

Okolje

Združeno tako, kot jih združuje .env.example.

Skupina Spremenljivke Opombe
URL-ji in vrataAPP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URLVrata API privzeto so 8088, ne 8080. API_EMBED=false je za uvedbo, ki poganja API kot lasten proces; PUBLIC_API_URL je osnova, prikazana v odlomkih dokumentacije.
Shramba podatkovDATABASE_URL, REDIS_URLDATABASE_URL izbere shrambo; REDIS_URL je rezerviran za čakalno vrsto opravil in ga koda v1 ne bere.
InferencaINFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_*Glejte razdelek o inferenci spodaj; PARTNER_* zajema osnovni URL partnerja, območje, razred suverenosti in ključ API.
ObračunavanjeFX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETKnjiga se vodi v mikrodolarjih USD, EUR pa se za prikaz izračuna pri FX_EUR_USD.
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_KEYNastavite MAIL_SMTP_HOST za SMTP ali MAIL_API_URL z MAIL_FROM za HTTP posrednik, ali nobenega.
VarnostNODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENVNODE_ENV=production označi sejne piškotke kot Secure. LLMEU_IP_SALT doda sol zgoščenemu IP-ju odjemalca in ga je treba spremeniti za vsako uvedbo. LLMEU_KEY_ENV doda predpono llmeu_live_ ali llmeu_test_ generiranim ključem.
RaznoLOG_LEVELLOG_LEVEL nastavi najnižjo raven beleženja.

Docker

Compose in slika sta neobvezna: lastna zbirka repozitorija ne zahteva Dockerja, glavna pot pa je lokalni proces brez storitev.

  • Privzeti profil zažene web: vrata 3000 in 8088, SQLite na volumnu llmeu-data v /app/data, vgrajeni API in preverjanje zdravja na /healthz.
  • Ista slika zažene worker z node apps/worker/src/run.mjs, počaka, da web postane zdrav, in si deli volumen llmeu-data.
  • Dva dodatna profila sta privzeto izklopljena: postgres (postgres:16-alpine) in redis (redis:7-alpine, rezerviran in ga pot kode v1 ne bere).
  • Profil gpu zažene vllm/vllm-openai z rezervacijo naprave NVIDIA in pripne uteži samo za branje z gostitelja; privzeto ni omogočen, ker bi bila trditev o inferenci EU brez GPU neresnična.
  • Dockerfile je FROM node:24-alpine s tini, brez koraka gradnje in brez nameščanja odvisnosti, teče kot uporabnik node, piše samo pod /app/data, izpostavi 3000 in 8088 ter zažene apps/web/server/main.mjs.

Varnostne kopije

node scripts/backup.mjs brez zastavic zapiše ./backups/llmeu-<stamp>.db. SQLite se kopira z VACUUM INTO, nikoli s cp, ker lahko živa baza WAL, kopirana s cp, da raztrgano ali zastarelo 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

Vsaka varnostna kopija SQLite se preveri, preden skript sporoči uspeh: obnovi se v začasno kopijo, PRAGMA integrity_check mora vrniti ok, shema se ponovno uporabi in izpišejo se števci vrstic za modele, organizacije in uporabnike.

Z URL-jem postgres:// skript uporabi pg_dump --format=custom in potrebuje pg_dump v PATH; izpisa ni mogoče odpreti kot bazo, zato je za štetje vrstic potreben poskusni obnovitev.

Pošta

Transakcijska pošta – ponastavitev gesla, preverjanje naslova, povabila – uporablja MAIL_SMTP_* ali MAIL_API_URL z MAIL_FROM. Prenašalnik se izbere enkrat ob zagonu in se prikaže na vsaki strani, ki potrebuje pošto.

Uvedba z nobenim od obeh je podprto stanje: registracija, prijava, sprememba gesla, ekipe in povabila delujejo, vendar pošte za ponastavitev gesla in preverjanje tam ni mogoče obdelati. Strani to navajajo, in node scripts/db.mjs passwd <email> je pot za obnovitev.

Zaledja za inferenco

Vrstica končne točke navaja izvajalno okolje in območje, register zaledij pa izbere adapter glede na območje, zato lahko na končno točko odgovori le stroj v območju, ki ga navaja.

  • INFERENCE_MOCK=true ohrani deterministično mock zaledje, ki ne potrebuje GPU niti uteži.
  • GPU_ENABLED=false izključi upravljana zaledja; pri GPU_ENABLED=true se VLLM_BASE_URL uporablja za edino območje, ki ga navaja VLLM_REGION.
  • Uvedba z več območji nastavi eno spremenljivko na območje, imenovano po oznaki območja (na primer VLLM_BASE_URL_DE_FRA). Končna točka v območju brez konfiguriranega zaledja je zavrnjena, namesto da bi jo oskrboval stroj v drugem območju.
  • Partnerska zaledja izhajajo iz PARTNER_BASE_URL_<REGION> in prevzamejo PARTNER_SOVEREIGNTY in PARTNER_API_KEY; strežnik dovoli uporabo partnerja, ko je nastavljen PARTNER_BASE_URL.

Brez GPU odgovarja mock zaledje. Njegovo območje je dev-mock, njegov izhod pa navaja, da je to mock zaledje, da niso tekle prave uteži in da lastna inferenca potrebuje VLLM_BASE_URL in zastavico gpu_enabled. Lažen uspeh, ki bi bil videti resničen, bi bil edina stvar, ki je ta izdelek ne sme nikoli izdati.