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 migrate | Aplikuje schema.sql a hlási počet príkazov. |
| node scripts/db.mjs seed | Vloží 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 reset | Iba 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 status | Vypíše engine, počet tabuliek a počet riadkov každej neprázdnej tabuľky. |
| node scripts/db.mjs demo-key | Vydá 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 porty | APP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URL | Port 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át | DATABASE_URL, REDIS_URL | DATABASE_URL vyberá úložisko; REDIS_URL je vyhradený pre frontu úloh a nie je čítaný kódovou cestou v1. |
| Inferencia | INFERENCE_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ácia | FX_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š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 | Nastavte MAIL_SMTP_HOST pre SMTP, alebo MAIL_API_URL s MAIL_FROM pre HTTP relay, alebo ani jedno. |
| Zabezpečenie | NODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENV | NODE_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ôzne | LOG_LEVEL | LOG_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ť.