Itseisännöinti

Node ja kirjoitettava hakemisto ovat koko vaatimus. Alla olevat väitteet on luettu niiden vieressä nimetyistä tiedostoista; mitään, mitä ei voitu vahvistaa, ei ole tässä.

Sisääntulopisteet

  • package.json vaatii Noden >= 22.5. SQLite-säilö on Noden oma node:sqlite-moduuli.
  • Riippuvuusluetteloa ei ole lainkaan: sovellukset, paketit, skriptit ja testit toimivat Noden vakiokirjastolla, eikä Dockerfile asenna mitään.
  • Prosesseja on kolme; kukin avaa tietokannan ja suorittaa migraation käynnistyksen yhteydessä.
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

Tietovarasto

DATABASE_URL=sqlite:./data/llmeu.db ei tarvitse palvelinta, ja hakemisto ja tiedosto luodaan ensimmäisellä avauskerralla. Käsittelijä toimii WAL-tilassa, vieraat avaimet ovat päällä ja 5 sekunnin varattu aikakatkaisu.

packages/shared/src/db/schema.sql on skeema. Se on vain luontia ja idempotentti, joten sen uudelleen suorittaminen on turvallista; olemassa olevaan tauluun lisätty sarake on myös ilmoitettava additiivisessa vaiheessa tiedostossa packages/shared/src/db/index.mjs.

postgres://-URL-osoite ottaa käyttöön erillisen sovittimen haaran. Tämä haara vaatii pg-paketin, joka ei ole ilmoitettu riippuvuus, ja schema.sql-tiedoston otsikko sanoo, että Postgres-polku on käsiteltävä vahvistamattomana, kunnes oikea ajuri ja testattu migraatio ovat olemassa. SQLite on polku, jota tämä repositorio käyttää.

Operaattorin CLI

node scripts/db.mjs lukee DATABASE_URL-ympäristömuuttujan eikä tarvitse palveluita. Komennot:

Komento Mitä se tekee
node scripts/db.mjs migrateKäyttää schema.sql-tiedostoa ja raportoi lauseiden määrän.
node scripts/db.mjs seedLisää tai päivittää luettelon ja demo-organisaation ja kirjoittaa demo-avaimen tiedostoon data/demo-key.txt tilassa 0600.
node scripts/db.mjs resetVain SQLitelle: poistaa tietokantatiedoston ja sen -wal- ja -shm-kumppanit, sitten migroi ja kylvää. Postgresilla se kieltäytyy.
node scripts/db.mjs statusTulostaa moottorin, taulujen määrän ja jokaisen ei-tyhjän taulun rivimäärän.
node scripts/db.mjs demo-keyMyöntää uuden avaimen demo-organisaatiolle ja tulostaa sen kerran.
node scripts/db.mjs passwd <email>Asettaa käyttäjän salasanan palvelimelta ja poistaa kyseisen käyttäjän kaikki istunnot. Tämä on palautuspolku, kun sähköpostinsiirtoa ei ole määritetty. Ilman --password-valitsinta se luo sellaisen ja tulostaa sen kerran.

Ympäristö

Ryhmitelty kuten .env.example ryhmittelee ne.

Ryhmä Muuttujat Huomautukset
URL-osoitteet ja portitAPP_URL, API_URL, WEB_PORT, API_PORT, API_EMBED, PUBLIC_API_URLAPI-portin oletusarvo on 8088, ei 8080. API_EMBED=false on käyttöönotolle, jossa API ajetaan omana prosessinaan; PUBLIC_API_URL on dokumentaatiokatkelmissa näytetty perusosoite.
TietovarastoDATABASE_URL, REDIS_URLDATABASE_URL valitsee säilön; REDIS_URL on varattu työjonolle, eikä v1-koodipolku lue sitä.
PäättelyINFERENCE_MOCK, GPU_ENABLED, VLLM_BASE_URL, VLLM_REGION, VLLM_MODEL_VERSION, VLLM_BASE_URL_<REGION>, DEFAULT_REGION, PARTNER_*Katso jäljempänä oleva päättelyosio; PARTNER_* kattaa kumppanin perus-URL-osoitteen, alueen, suvereniteettiluokan ja API-avaimen.
LaskutusFX_EUR_USD, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETKirjanpito pidetään USD-mikroina ja EUR johdetaan näyttöä varten kurssilla FX_EUR_USD.
SähköpostiMAIL_FROM, MAIL_SMTP_HOST, MAIL_SMTP_PORT, MAIL_SMTP_SECURE, MAIL_SMTP_USER, MAIL_SMTP_PASS, MAIL_TIMEOUT_MS, MAIL_API_URL, MAIL_API_KEYAseta MAIL_SMTP_HOST SMTP:tä varten, tai MAIL_API_URL yhdessä MAIL_FROMin kanssa HTTP-relaalle, tai ei kumpaakaan.
TurvallisuusNODE_ENV, LLMEU_IP_SALT, LLMEU_DEMO_PASSWORD, LLMEU_KEY_ENVNODE_ENV=production merkitsee istuntoevästeet Secure-merkinnällä. LLMEU_IP_SALT suolaa tiivistetyn asiakas-IP:n, ja se tulee vaihtaa käyttöönottoa kohden. LLMEU_KEY_ENV liittää luotujen avainten eteen llmeu_live_ tai llmeu_test_.
MuutLOG_LEVELLOG_LEVEL asettaa lokituksen vähimmäistason.

Docker

Compose ja levykuva ovat valinnaisia: repositorion oma testisarja ei vaadi Dockeria, ja ensisijainen polku on paikallinen prosessi ilman palveluita.

  • Oletusprofiili suorittaa webin: portit 3000 ja 8088, SQLite llmeu-data-taltiossa /app/data, sulautettu API ja terveystarkistus /healthz-päätepisteessä.
  • Sama levykuva suorittaa työntekijän komennolla node apps/worker/src/run.mjs, odottaen webin tulevan terveeksi ja jakaen llmeu-data-taltion.
  • Kaksi ylimääräistä profiilia on pois päältä oletusarvoisesti: postgres (postgres:16-alpine) ja redis (redis:7-alpine, varattu eikä v1-koodipolku lue sitä).
  • gpu-profiili suorittaa vllm/vllm-openai NVIDIA-laitteen varauksella ja liittää painot vain luku -tilassa isännästä; sitä ei ole otettu käyttöön oletusarvoisesti, koska EU-päättelyn väittäminen ilman GPU:ta olisi väärin.
  • Dockerfile on FROM node:24-alpine with tini, ei rakennusvaihetta eikä riippuvuuksien asennusta, suoritetaan node-käyttäjänä, kirjoittaa vain /app/data-alle, paljastaa portit 3000 ja 8088 ja käynnistää apps/web/server/main.mjs.

Varmuuskopiot

node scripts/backup.mjs ilman valitsimia kirjoittaa ./backups/llmeu-<stamp>.db. SQLite kopioidaan komennolla VACUUM INTO, ei koskaan cp:llä, koska elävä WAL-tietokanta, joka kopioidaan cp:llä, voi tuottaa repeytyneen tai vanhentuneen tilan.

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

Jokainen SQLite-varmuuskopio vahvistetaan ennen kuin skripti ilmoittaa onnistumisesta: se palautetaan väliaikaiseen kopioon, PRAGMA integrity_check on palautettava ok, skeema otetaan uudelleen käyttöön ja mallien, organisaatioiden ja käyttäjien rivimäärät tulostetaan.

Kun käytetään postgres://-URL-osoitetta, skripti käyttää pg_dump --format=custom ja tarvitsee pg_dump:n PATH-ympäristömuuttujassa; dumppia ei voi avata tietokantana, joten sen rivimäärät vaativat väliaikaisen palautuksen.

Sähköposti

Transaktiosähköposti – salasanan palautus, osoitteen vahvistus, kutsut – käyttää MAIL_SMTP_* -asetuksia tai MAIL_API_URL:ää yhdessä MAIL_FROMin kanssa. Siirtotapa valitaan kerran käynnistyksen yhteydessä ja ilmoitetaan jokaisella sivulla, joka tarvitsee sähköpostia.

Käyttöönotto, jossa ei ole kumpaakaan, on tuettu tila: rekisteröityminen, kirjautuminen, salasanan vaihto, tiimit ja kutsut toimivat, mutta salasanan palautus- ja vahvistussähköpostia ei voida käsitellä siinä. Sivut kertovat tämän, ja node scripts/db.mjs passwd <email> on palautumisreitti.

Päättelytaustajärjestelmät

Päätepisterivi nimeää suoritusympäristön ja alueen, ja taustajärjestelmärekisteri valitsee sovittimen alueen perusteella, joten päätepisteeseen voi vastata vain kone sillä alueella, jonka se nimeää.

  • INFERENCE_MOCK=true pitää käytössä deterministisen mock-taustajärjestelmän, joka ei tarvitse GPU:ta eikä painoja.
  • GPU_ENABLED=false jättää hallitut taustajärjestelmät pois; kun GPU_ENABLED=true, VLLM_BASE_URL koskee ainoaa aluetta, jonka VLLM_REGION nimeää.
  • Käyttöönotto, jossa on useita alueita, asettaa yhden muuttujan aluetta kohden, nimettynä alueen slug-nimen mukaan (esimerkiksi VLLM_BASE_URL_DE_FRA). Päätepiste alueella, jolla ei ole määritettyä taustajärjestelmää, hylätään sen sijaan, että se tarjoiltaisiin toisen alueen koneelta.
  • Kumppanitaustajärjestelmät tulevat osoitteesta PARTNER_BASE_URL_<REGION> ja ottavat käyttöön PARTNER_SOVEREIGNTY ja PARTNER_API_KEY; palvelin sallii kumppanin käytön, kun PARTNER_BASE_URL on asetettu.

Ilman GPU:ta vastaa mock-taustajärjestelmä. Sen alue on dev-mock, ja sen tuloste kertoo, että se on mock-taustajärjestelmä, että todellisia painoja ei ajettu ja että ensimmäisen osapuolen päättely vaatii VLLM_BASE_URL:n ja gpu_enabled-lipun. Mock-onnistuminen, joka näyttäisi todelliselta, olisi ainoa asia, jota tämän tuotteen ei koskaan pidä toimittaa.