Vlastný hosting

Node a zapisovateľný adresár sú celou požiadavkou. Nasledujúce tvrdenia boli prečítané zo súborov uvedených vedľa nich; čokoľvek, čo nebolo možné potvrdiť, tu nie je.

Vstupné body

  • package.json vyžaduje Node >= 22.5. Úložisko SQLite je vlastný modul node:sqlite v Node.
  • Neexistuje žiadny zoznam závislostí: aplikácie, balíky, skripty a testy bežia na štandardnej knižnici Node a Dockerfile nič neinštaluje.
  • Existujú tri procesy; každý otvára databázu a spúšťa migráciu pri štarte.
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

Úložisko dát

DATABASE_URL=sqlite:./data/llmeu.db nepotrebuje server a adresár a súbor sa vytvoria pri prvom otvorení. Handle beží v režime WAL so zapnutými cudzími kľúčmi a 5 s časovým limitom obsadenosti.

packages/shared/src/db/schema.sql je schéma. Je iba na vytvorenie a idempotentná, takže opätovné spustenie je bezpečné; stĺpec pridaný do existujúcej tabuľky musí byť tiež deklarovaný v aditívnom kroku v packages/shared/src/db/index.mjs.

URL postgres:// zaberá samostatnú vetvu adaptéra. Táto vetva vyžaduje balík pg, ktorý nie je deklarovanou závislosťou, a hlavička schema.sql hovorí, že cestu Postgres treba považovať za neoverenú, kým neexistuje skutočný ovládač a testovaná migrácia. SQLite je cesta, ktorú toto úložisko používa.

Operátorské CLI

node scripts/db.mjs číta DATABASE_URL a nepotrebuje žiadne služby. Príkazy:

Príkaz Čo robí
node scripts/db.mjs migrateAplikuje schema.sql a hlási počet príkazov.
node scripts/db.mjs seedVloží alebo obnoví katalóg a demo organizáciu a zapíše demo kľúč do data/demo-key.txt s právami 0600.
node scripts/db.mjs resetIba pre SQLite: odstráni databázový súbor a jeho sprievodné súbory -wal a -shm, potom migruje a naplní. Na Postgres to odmietne.
node scripts/db.mjs statusVypíše engine, počet tabuliek a počet riadkov každej neprázdnej tabuľky.
node scripts/db.mjs demo-keyVydá nový kľúč pre demo organizáciu a raz ho vypíše.
node scripts/db.mjs passwd <email>Nastaví heslo používateľa zo servera a vymaže všetky relácie tohto používateľa. Toto je cesta obnovy, keď nie je nakonfigurovaný poštový transport. Bez --password vygeneruje jedno a raz ho vypíše.

Prostredie

Zoskupené tak, ako ich zoskupuje .env.example.

Skupina Premenné Poznámky
URL adresy a portyAPP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URLPort API je predvolene 8088, nie 8080. API_EMBED=false je pre nasadenie, ktoré spúšťa API ako samostatný proces; PUBLIC_API_URL je základ zobrazovaný v úryvkoch dokumentácie.
Úložisko dátDATABASE_URL, REDIS_URLDATABASE_URL vyberá úložisko; REDIS_URL je vyhradený pre frontu úloh a nie je čítaný kódovou cestou v1.
InferenciaINFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_*Pozri sekciu o inferencii nižšie; PARTNER_* pokrýva základnú URL partnera, región, triedu suverenity a API kľúč.
FakturáciaFX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETÚčtovná kniha sa vedie v USD micros a EUR sa odvodzuje pre zobrazenie 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_KEYNastavte MAIL_SMTP_HOST pre SMTP, alebo MAIL_API_URL s MAIL_FROM pre HTTP relay, alebo ani jedno.
ZabezpečenieNODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENVNODE_ENV=production označí session cookies ako Secure. LLMEU_IP_SALT solí hashovanú IP klienta a mala by sa zmeniť pre každé nasadenie. LLMEU_KEY_ENV pridáva predponu llmeu_live_ alebo llmeu_test_ ku generovaným kľúčom.
RôzneLOG_LEVELLOG_LEVEL nastavuje minimálnu úroveň logovania.

Docker

Compose a obraz sú voliteľné: vlastná sada úložiska nevyžaduje Docker a primárnou cestou je lokálny proces bez služieb.

  • Predvolený profil spúšťa web: porty 3000 a 8088, SQLite na zväzku llmeu-data v /app/data, vstavané API a healthcheck na /healthz.
  • Ten istý obraz spúšťa worker s node apps/worker/src/run.mjs, čaká na to, kým web bude zdravý, a zdieľa zväzok llmeu-data.
  • Dva extra profily sú predvolene vypnuté: postgres (postgres:16-alpine) a redis (redis:7-alpine, rezervovaný a nečítaný cestou kódu v1).
  • Profil gpu spúšťa vllm/vllm-openai s rezerváciou zariadenia NVIDIA a pripája váhy iba na čítanie z hostiteľa; nie je predvolene povolený, pretože tvrdiť inferenciu v EÚ bez GPU by bolo nepravdivé.
  • Dockerfile je FROM node:24-alpine s tini, bez kroku zostavenia a bez inštalácie závislostí, beží ako používateľ node, zapisuje iba pod /app/data, sprístupňuje 3000 a 8088 a spúšťa apps/web/server/main.mjs.

Zálohy

node scripts/backup.mjs bez príznakov zapíše ./backups/llmeu-<stamp>.db. SQLite sa kopíruje pomocou VACUUM INTO, nikdy nie cp, pretože živá WAL databáza kopírovaná pomocou cp môže viesť k roztrhnutému alebo zastaranému stavu.

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

Každá záloha SQLite sa overí predtým, ako skript ohlási úspech: obnoví sa do dočasnej kópie, PRAGMA integrity_check musí vrátiť ok, schéma sa znovu použije a vypíšu sa počty riadkov pre modely, organizácie a používateľov.

S URL postgres:// skript použije pg_dump --format=custom a potrebuje pg_dump v PATH; výpis sa nedá otvoriť ako databáza, takže jeho počty riadkov vyžadujú dočasné obnovenie.

Pošta

Transakčná pošta — obnovenie hesla, overenie adresy, pozvánky — používa MAIL_SMTP_* alebo MAIL_API_URL s MAIL_FROM. Transport sa vyberá raz pri štarte a je uvedený na každej stránke, ktorá potrebuje poštu.

Nasadenie bez oboch je podporovaný stav: registrácia, prihlásenie, zmena hesla, tímy a pozvánky fungujú, ale pošta na obnovenie hesla a overenie sa tam nedá spracovať. Stránky to uvádzajú a node scripts/db.mjs passwd <email> je cesta obnovy.

Backendy inferencie

Riadok koncového bodu pomenúva runtime a región a registrácia backendov vyberá adaptér podľa regiónu, takže na koncový bod môže odpovedať iba stroj v regióne, ktorý pomenúva.

  • INFERENCE_MOCK=true zachováva deterministický simulovaný backend, ktorý nepotrebuje GPU ani váhy.
  • GPU_ENABLED=false vylučuje spravované backendy; s GPU_ENABLED=true sa VLLM_BASE_URL vzťahuje na jediný región pomenovaný VLLM_REGION.
  • Nasadenie s viacerými regiónmi nastavuje jednu premennú na región, pomenovanú podľa slug regiónu (napríklad VLLM_BASE_URL_DE_FRA). Koncový bod v regióne bez nakonfigurovaného backendu je odmietnutý, namiesto toho, aby bol obsluhovaný zo stroja v inom regióne.
  • Partnerské backendy pochádzajú z PARTNER_BASE_URL_<REGION> a preberajú PARTNER_SOVEREIGNTY a PARTNER_API_KEY; server povoľuje použitie partnera, keď je nastavené PARTNER_BASE_URL.

Bez GPU odpovedá simulovaný backend. Jeho región je dev-mock a jeho výstup hovorí, že ide o simulovaný backend, že nebežali žiadne skutočné váhy a že inferencia prvej strany potrebuje VLLM_BASE_URL a príznak gpu_enabled. Simulovaný úspech, ktorý by vyzeral ako skutočný, by bol jediná vec, ktorú tento produkt nesmie nikdy dodať.