Savarankiškas talpinimas
Node ir rašomasis katalogas yra visas reikalavimas. Toliau pateikti teiginiai buvo perskaityti iš šalia nurodytų failų; visko, ko nepavyko patvirtinti, čia nėra.
Įėjimo taškai
- package.json reikalauja Node >= 22.5. SQLite saugykla yra paties Node node:sqlite modulis.
- Iš viso nėra priklausomybių sąrašo: programos, paketai, scenarijai ir testai veikia su Node standartine biblioteka, o Dockerfile nieko neįdiegia.
- Yra trys procesai; kiekvienas atidaro duomenų bazę ir paleidžiant vykdo migraciją.
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
Duomenų saugykla
DATABASE_URL=sqlite:./data/llmeu.db nereikalauja serverio, o katalogas ir failas sukuriami pirmojo atidarymo metu. Ryšys veikia WAL režimu su įjungtais išoriniais raktais ir 5 s užimtumo laiko limitu.
packages/shared/src/db/schema.sql yra schema. Ji skirta tik kurti ir yra idempotentiška, todėl ją paleisti iš naujo yra saugu; stulpelis, pridėtas prie esamos lentelės, taip pat turi būti deklaruotas papildymo žingsnyje packages/shared/src/db/index.mjs.
postgres:// URL naudoja atskirą adapterio šaką. Ta šaka reikalauja pg paketo, kuris nėra deklaruota priklausomybė, o schema.sql antraštė sako, kad Postgres kelias turi būti laikomas nepatikrintu, kol neatsiras tikras tvarkyklė ir išbandyta migracija. SQLite yra kelias, kurį vykdo ši saugykla.
Operatoriaus CLI
node scripts/db.mjs skaito DATABASE_URL ir nereikalauja jokių paslaugų. Komandos:
| Komanda | Ką ji daro |
|---|---|
| node scripts/db.mjs migrate | Pritaiko schema.sql ir praneša apie sakinių skaičių. |
| node scripts/db.mjs seed | Įterpia arba atnaujina katalogą ir demonstracinę organizaciją, ir įrašo demonstracinį raktą į data/demo-key.txt su teisėmis 0600. |
| node scripts/db.mjs reset | Tik SQLite: pašalina duomenų bazės failą ir jo -wal bei -shm palydovus, tada migruoja ir užpildo pradiniais duomenimis. Postgres atveju atsisako. |
| node scripts/db.mjs status | Išspausdina variklį, lentelių skaičių ir kiekvienos netuščios lentelės eilučių skaičių. |
| node scripts/db.mjs demo-key | Išduoda naują raktą demonstracinei organizacijai ir išspausdina jį vieną kartą. |
| node scripts/db.mjs passwd <email> | Nustato naudotojo slaptažodį iš serverio ir ištrina visas to naudotojo sesijas. Tai atkūrimo kelias, kai nesukonfigūruotas joks pašto transportas. Be --password sugeneruoja jį ir išspausdina vieną kartą. |
Aplinka
Sugrupuota taip, kaip juos grupuoja .env.example.
| Grupė | Kintamieji | Pastabos |
|---|---|---|
| URL ir prievadai | APP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URL | API prievadas pagal nutylėjimą yra 8088, o ne 8080. API_EMBED=false skirtas diegimui, kuriame API veikia kaip atskiras procesas; PUBLIC_API_URL yra bazė, rodoma dokumentacijos fragmentuose. |
| Duomenų saugykla | DATABASE_URL, REDIS_URL | DATABASE_URL pasirenka saugyklą; REDIS_URL yra rezervuotas užduočių eilei ir nėra skaitomas v1 kodo kelio. |
| Inferencija | INFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_* | Žr. inferencijos skyrių žemiau; PARTNER_* apima partnerio bazinį URL, regioną, suverenumo klasę ir API raktą. |
| Atsiskaitymas | FX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET | Didžioji knyga saugoma USD mikrovienetais, o EUR rodoma pagal FX_EUR_USD. |
| Paštas | 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 | Nustatykite MAIL_SMTP_HOST, jei naudojate SMTP, arba MAIL_API_URL su MAIL_FROM HTTP relejui, arba nei vieno. |
| Saugumas | NODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENV | NODE_ENV=production pažymi sesijos slapukus kaip Secure. LLMEU_IP_SALT prideda druskos prie užmaišytos kliento IP ir turėtų būti keičiamas kiekvienam diegimui. LLMEU_KEY_ENV prideda generuojamiems raktams priešdėlį llmeu_live_ arba llmeu_test_. |
| Kita | LOG_LEVEL | LOG_LEVEL nustato mažiausią žurnalo lygį. |
Docker
Compose ir atvaizdas yra neprivalomi: pačios saugyklos rinkinys nereikalauja Docker, o pagrindinis kelias yra vietinis procesas be paslaugų.
- Numatytasis profilis paleidžia web: 3000 ir 8088 prievadus, SQLite llmeu-data tome /app/data, įterptą API ir sveikatos patikrą /healthz.
- Tas pats atvaizdas paleidžia worker su node apps/worker/src/run.mjs, laukdamas, kol web taps sveikas, ir bendrina llmeu-data tomą.
- Du papildomi profiliai pagal numatytuosius nustatymus yra išjungti: postgres (postgres:16-alpine) ir redis (redis:7-alpine, rezervuotas ir neskaitomas v1 kodo kelio).
- gpu profilis paleidžia vllm/vllm-openai su NVIDIA įrenginio rezervacija ir prijungia svorius tik skaitymui iš pagrindinio kompiuterio; jis nėra įjungtas pagal numatytuosius nustatymus, nes teigti ES išvadas be GPU būtų netiesa.
- Dockerfile yra FROM node:24-alpine su tini, be kūrimo žingsnio ir be priklausomybių įdiegimo, veikia kaip node naudotojas, rašo tik į /app/data, atidaro 3000 ir 8088 prievadus ir paleidžia apps/web/server/main.mjs.
Atsarginės kopijos
node scripts/backup.mjs be jokių parametrų įrašo ./backups/llmeu-<stamp>.db. SQLite kopijuojamas su VACUUM INTO, niekada cp, nes gyva WAL duomenų bazė, nukopijuota su cp, gali duoti suplėšytą ar pasenusią būseną.
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
Kiekviena SQLite atsarginė kopija patikrinama prieš scenarijui pranešant apie sėkmę: ji atkuriama į laikiną kopiją, PRAGMA integrity_check turi grąžinti ok, schema vėl pritaikoma, ir išspausdinami modelių, organizacijų ir naudotojų eilučių skaičiai.
Su postgres:// URL scenarijus naudoja pg_dump --format=custom ir reikalauja pg_dump PATH kelyje; išrašo negalima atidaryti kaip duomenų bazės, todėl jo eilučių skaičiams reikia bandomojo atkūrimo.
Paštas
Transakcinis paštas — slaptažodžio atstatymas, adreso patvirtinimas, kvietimai — naudoja MAIL_SMTP_* arba MAIL_API_URL su MAIL_FROM. Transportas pasirenkamas vieną kartą paleidžiant ir nurodomas kiekviename puslapyje, kuriam reikia pašto.
Diegimas be nei vieno yra palaikoma būsena: registracija, prisijungimas, slaptažodžio keitimas, komandos ir kvietimai veikia, bet slaptažodžio atstatymo ir patvirtinimo laiškai ten negali būti apdoroti. Puslapiai tai nurodo, o node scripts/db.mjs passwd <email> yra atkūrimo kelias.
Inferencijos vidiniai serveriai
Galutinio taško eilutė nurodo vykdymo aplinką ir regioną, o vidinių serverių registras parenka adapterį pagal regioną, todėl į galutinį tašką gali atsakyti tik mašina tame regione, kurį jis nurodo.
- INFERENCE_MOCK=true palieka deterministinį imitavimo vidinį serverį, kuriam nereikia nei GPU, nei svorių.
- GPU_ENABLED=false neleidžia valdomų vidinių serverių; su GPU_ENABLED=true VLLM_BASE_URL taikomas vieninteliam regionui, nurodytam VLLM_REGION.
- Diegimas su keliais regionais nustato po vieną kintamąjį kiekvienam regionui, pavadintą pagal regiono trumpinį (pvz., VLLM_BASE_URL_DE_FRA). Galutinis taškas regione, kuriame nesukonfigūruotas joks vidinis serveris, atmetamas, o ne aptarnaujamas iš mašinos kitame regione.
- Partnerių vidiniai serveriai imami iš PARTNER_BASE_URL_<REGION> ir naudoja PARTNER_SOVEREIGNTY bei PARTNER_API_KEY; serveris leidžia naudoti partnerį, kai nustatytas PARTNER_BASE_URL.
Be GPU atsako imitavimo vidinis serveris. Jo regionas yra dev-mock, o jo išvestis nurodo, kad tai imitavimo vidinis serveris, kad nebuvo paleisti jokie tikri svoriai ir kad pirmosios šalies inferencijai reikia VLLM_BASE_URL ir gpu_enabled vėliavėlės. Imitavimo sėkmė, kuri atrodytų tikra, būtų vienintelis dalykas, kurio šis produktas niekada neturi išleisti.