Pašmitināšana
Node un rakstāma direktorija ir vienīgā prasība. Tālāk minētie apgalvojumi nolasīti no blakus nosauktajām datnēm; nekas, ko nevarēja apstiprināt, šeit nav iekļauts.
Ieejas punkti
- package.json prasa Node >= 22.5. SQLite krātuve ir Node paša node:sqlite modulis.
- Nav nekāda atkarību saraksta: lietotnes, pakotnes, skripti un testi darbojas uz Node standarta bibliotēkas, un Dockerfile neko neinstalē.
- Pastāv trīs procesi; katrs atver datubāzi un palaišanas laikā izpilda migrāciju.
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
Datu krātuve
DATABASE_URL=sqlite:./data/llmeu.db neprasa serveri, un direktorija un datne tiek izveidotas pirmajā atvēršanas reizē. Turētājs darbojas WAL režīmā ar ieslēgtām ārējām atslēgām un 5 s aizņemtības taimautu.
packages/shared/src/db/schema.sql ir shēma. Tā ir tikai izveides un idempotenta, tāpēc tās atkārtota palaišana ir droša; kolonna, kas pievienota esošai tabulai, arī ir jādeklarē papildināšanas solī failā packages/shared/src/db/index.mjs.
postgres:// URL izmanto atsevišķu adaptera atzaru. Šim atzaram nepieciešama pg pakotne, kas nav deklarēta atkarība, un schema.sql galvene nosaka, ka Postgres ceļš ir jāuzskata par nepārbaudītu, līdz pastāv reāls draiveris un pārbaudīta migrācija. SQLite ir ceļš, ko izmanto šis repozitorijs.
Operatora CLI
node scripts/db.mjs nolasa DATABASE_URL un neprasa pakalpojumus. Komandas:
| Komanda | Ko tā dara |
|---|---|
| node scripts/db.mjs migrate | Piemēro schema.sql un ziņo par priekšrakstu skaitu. |
| node scripts/db.mjs seed | Ievieto vai atjauno katalogu un demonstrācijas organizāciju, un ieraksta demonstrācijas atslēgu failā data/demo-key.txt ar režīmu 0600. |
| node scripts/db.mjs reset | Tikai SQLite: noņem datubāzes datni un tās -wal un -shm pavadoņus, pēc tam veic migrāciju un sākotnējo piepildīšanu. Uz Postgres tas atsakās. |
| node scripts/db.mjs status | Izdrukā dzinēju, tabulu skaitu un katras ne tukšas tabulas rindu skaitu. |
| node scripts/db.mjs demo-key | Izsniedz jaunu atslēgu demonstrācijas organizācijai un izdrukā to vienreiz. |
| node scripts/db.mjs passwd <email> | Iestata lietotāja paroli no servera un dzēš visas šī lietotāja sesijas. Šis ir atjaunošanas ceļš, ja nav konfigurēts pasta transports. Bez --password tas ģenerē paroli un izdrukā to vienreiz. |
Vide
Sagrupēti tā, kā tos sagrupē .env.example.
| Grupa | Mainīgie | Piezīmes |
|---|---|---|
| URL un porti | APP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URL | API ports pēc noklusējuma ir 8088, nevis 8080. API_EMBED=false ir izvietojumam, kas API palaiž kā atsevišķu procesu; PUBLIC_API_URL ir bāze, kas parādīta dokumentācijas fragmentos. |
| Datu krātuve | DATABASE_URL, REDIS_URL | DATABASE_URL izvēlas krātuvi; REDIS_URL ir rezervēts darbu rindai, un to nelasa v1 koda ceļš. |
| Secināšana | INFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_* | Skatiet secināšanas sadaļu zemāk; PARTNER_* aptver partnera bāzes URL, reģionu, suverenitātes klasi un API atslēgu. |
| Norēķini | FX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET | Virsgrāmata tiek glabāta USD mikro vienībās, un EUR tiek atvasināts attēlošanai pēc FX_EUR_USD. |
| Pasts | 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 | Iestatiet MAIL_SMTP_HOST SMTP vajadzībām, vai MAIL_API_URL kopā ar MAIL_FROM HTTP starpniekam, vai neko no tā. |
| Drošība | NODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENV | NODE_ENV=production atzīmē sesijas sīkfailus kā Secure. LLMEU_IP_SALT pievieno sāli jaucētajai klienta IP adresei, un tas ir jāmaina katrā izvietojumā. LLMEU_KEY_ENV pievieno ģenerētajām atslēgām prefiksu llmeu_live_ vai llmeu_test_. |
| Dažādi | LOG_LEVEL | LOG_LEVEL nosaka minimālo žurnāla līmeni. |
Docker
Compose un attēls ir neobligāti: repozitorija paša komplekts neprasa Docker, un galvenais ceļš ir vietējs process bez pakalpojumiem.
- Noklusējuma profils palaiž web: portus 3000 un 8088, SQLite uz llmeu-data sējuma /app/data, iegulto API un veselības pārbaudi /healthz.
- Tas pats attēls palaiž darbinieku ar node apps/worker/src/run.mjs, gaidot, līdz web kļūst vesels, un koplietojot llmeu-data sējumu.
- Divi papildu profili pēc noklusējuma ir izslēgti: postgres (postgres:16-alpine) un redis (redis:7-alpine, rezervēts un netiek lasīts v1 koda ceļā).
- gpu profils palaiž vllm/vllm-openai ar NVIDIA ierīces rezervāciju un montē svarus tikai lasāmi no resursdatora; tas nav iespējots pēc noklusējuma, jo apgalvot ES inferenci bez GPU būtu nepatiesi.
- Dockerfile ir FROM node:24-alpine ar tini, bez būvēšanas soļa un bez atkarību instalēšanas, darbojas kā node lietotājs, raksta tikai zem /app/data, atver 3000 un 8088, un palaiž apps/web/server/main.mjs.
Rezerves kopijas
node scripts/backup.mjs bez karodziņiem ieraksta ./backups/llmeu-<stamp>.db. SQLite tiek kopēta ar VACUUM INTO, nekad ar cp, jo dzīva WAL datubāze, kas kopēta ar cp, var radīt saplēstu vai novecojušu stāvokli.
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
Katra SQLite rezerves kopija tiek pārbaudīta, pirms skripts ziņo par panākumiem: tā tiek atjaunota pagaidu kopijā, PRAGMA integrity_check ir jāatgriež ok, shēma tiek atkārtoti piemērota, un tiek izdrukāti modeļu, organizāciju un lietotāju rindu skaiti.
Ar postgres:// URL skripts izmanto pg_dump --format=custom un nepieciešams pg_dump uz PATH; izgūto datni nevar atvērt kā datubāzi, tāpēc tās rindu skaitiem nepieciešama pagaidu atjaunošana.
Pasts
Darījumu pasta sūtījumi — paroles atiestatīšana, adreses verifikācija, ielūgumi — izmanto MAIL_SMTP_* vai MAIL_API_URL kopā ar MAIL_FROM. Transportu izvēlas vienreiz palaišanas laikā, un tas tiek norādīts katrā lapā, kurai vajadzīgs pasts.
Izvietojums bez neviena no tiem ir atbalstīts stāvoklis: reģistrēšanās, pierakstīšanās, paroles maiņa, komandas un ielūgumi darbojas, bet paroles atiestatīšanas un verifikācijas pastu tur nevar apstrādāt. Lapas to norāda, un node scripts/db.mjs passwd <email> ir atjaunošanas ceļš.
Secināšanas aizmugures
Galapunkta rinda nosauc izpildlaiku un reģionu, un aizmugures reģistrs izvēlas adapteri pēc reģiona, tāpēc uz galapunktu var atbildēt tikai mašīna reģionā, ko tas nosauc.
- INFERENCE_MOCK=true patur deterministisko mock aizmuguri, kurai nav vajadzīgs ne GPU, ne svari.
- GPU_ENABLED=false nepieļauj pārvaldītās aizmugures; ar GPU_ENABLED=true VLLM_BASE_URL attiecas uz vienīgo reģionu, ko nosauc VLLM_REGION.
- Izvietojums ar vairākiem reģioniem iestata vienu mainīgo uz reģionu, nosauktu pēc reģiona sluga (piemēram, VLLM_BASE_URL_DE_FRA). Galapunkts reģionā, kurā nav konfigurēta aizmugure, tiek atteikts, nevis apkalpots no mašīnas citā reģionā.
- Partneru aizmugures nāk no PARTNER_BASE_URL_<REGION> un izmanto PARTNER_SOVEREIGNTY un PARTNER_API_KEY; serveris atļauj partnera lietošanu, kad PARTNER_BASE_URL ir iestatīts.
Bez GPU atbild mock aizmugure. Tās reģions ir dev-mock, un tās izvade norāda, ka tā ir mock aizmugure, ka netika izpildīti īsti svari un ka pirmās puses secināšanai ir vajadzīgs VLLM_BASE_URL un gpu_enabled karodziņš. Mock panākums, kas izskatītos īsts, būtu vienīgā lieta, ko šim produktam nekad nevajadzētu laist klajā.