Title: Self-hosta LLM: k%C3%B6r stacken sj%C3%A4lv %E2%80%94 LLM EU Canonical: https://llmeu.com/sv/docs/self-hosting/ Markdown mirror: https://llmeu.com/sv/docs/self-hosting.md Machine-readable: https://llmeu.com/llms.txt (index) - https://llmeu.com/llms-full.txt (full catalogue) - https://llmeu.com/llms-catalogue.json Kom ig%C3%A5ng - [Snabbstart](/sv/docs/quickstart/) - [Konsol](/sv/docs/console/) - [Migrering](/sv/docs/migration/) - [API-referens](/sv/docs/api/) Referens - [Autentisering](/sv/docs/authentication/) - [Slutpunkter](/sv/docs/endpoints/) - [Fel](/sv/docs/errors/) - [Hastighetsbegr%C3%A4nsningar](/sv/docs/rate-limits/) - [Streaming](/sv/docs/streaming/) - [Policyer](/sv/docs/policies/) - [Routning och policy](/sv/docs/routing/) - [Residens och regioner](/sv/docs/residency/) - [Bevis och verifiering](/sv/docs/evidence/) - [OpenAI-kompatibilitet](/sv/docs/openai-compat/) Drift - [Egen hosting](/sv/docs/self-hosting/) # Egen hosting Node och en skrivbar katalog %C3%A4r hela kravet. P%C3%A5st%C3%A5endena nedan l%C3%A4stes fr%C3%A5n filerna som namnges bredvid dem; allt som inte kunde bekr%C3%A4ftas finns inte h%C3%A4r. ## Ing%C3%A5ngspunkter - package.json kr%C3%A4ver Node >= 22.5. SQLite-lagringen %C3%A4r Nodes egen node:sqlite-modul. - Det finns ingen beroendelista alls: appar, paket, skript och tester k%C3%B6rs p%C3%A5 Nodes standardbibliotek, och Dockerfile installerar ingenting. - Tre processer finns; var och en %C3%B6ppnar databasen och k%C3%B6r migreringen vid start. ``` 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 ``` ## Datalager DATABASE_URL=sqlite:./data/llmeu.db beh%C3%B6ver ingen server, och katalogen och filen skapas vid f%C3%B6rsta %C3%B6ppningen. Handtaget k%C3%B6rs i WAL-l%C3%A4ge med fr%C3%A4mmande nycklar p%C3%A5 och en timeout p%C3%A5 5 s f%C3%B6r upptagen. packages/shared/src/db/schema.sql %C3%A4r schemat. Det %C3%A4r endast skapande och idempotent, s%C3%A5 det %C3%A4r s%C3%A4kert att k%C3%B6ra om det; en kolumn som l%C3%A4ggs till i en befintlig tabell m%C3%A5ste ocks%C3%A5 deklareras i det additiva steget i packages/shared/src/db/index.mjs. En postgres://-URL tar en separat adaptergren. Den grenen kr%C3%A4ver pg-paketet, vilket inte %C3%A4r ett deklarerat beroende, och rubriken i schema.sql s%C3%A4ger att Postgres-v%C3%A4gen ska behandlas som overifierad tills en riktig drivrutin och en testad migrering finns. SQLite %C3%A4r v%C3%A4gen som detta arkiv k%C3%B6r. ## Operat%C3%B6rs-CLI node scripts/db.mjs l%C3%A4ser DATABASE_URL och beh%C3%B6ver inga tj%C3%A4nster. Kommandon: ## Milj%C3%B6 Grupperade s%C3%A5 som .env.example grupperar dem. ## Docker Compose och imagen %C3%A4r valfria: arkivets egen svit kr%C3%A4ver inte Docker, och den prim%C3%A4ra v%C3%A4gen %C3%A4r en lokal process utan tj%C3%A4nster. - Standardprofilen k%C3%B6r web: portarna 3000 och 8088, SQLite p%C3%A5 llmeu-data-volymen vid /app/data, det inb%C3%A4ddade API:et, och en h%C3%A4lsokontroll p%C3%A5 /healthz. - Samma image k%C3%B6r workern med node apps/worker/src/run.mjs, v%C3%A4ntar p%C3%A5 att web ska bli frisk och delar llmeu-data-volymen. - Tv%C3%A5 extra profiler %C3%A4r avst%C3%A4ngda som standard: postgres (postgres:16-alpine) och redis (redis:7-alpine, reserverad och l%C3%A4ses inte av v1-kodv%C3%A4gen). - Gpu-profilen k%C3%B6r vllm/vllm-openai med en NVIDIA-enhetsreservation och monterar vikter skrivskyddat fr%C3%A5n v%C3%A4rden; den %C3%A4r inte aktiverad som standard, eftersom att p%C3%A5st%C3%A5 EU-inferens utan en GPU skulle vara falskt. - Dockerfile:n %C3%A4r FROM node:24-alpine med tini, inget byggsteg och ingen beroendeinstallation, k%C3%B6rs som node-anv%C3%A4ndaren, skriver endast under /app/data, exponerar 3000 och 8088, och startar apps/web/server/main.mjs. ## S%C3%A4kerhetskopior node scripts/backup.mjs utan flaggor skriver ./backups/llmeu- .db. SQLite kopieras med VACUUM INTO, aldrig cp, eftersom en levande WAL-databas som kopieras med cp kan ge ett trasigt eller inaktuellt tillst%C3%A5nd. ``` node scripts/backup.mjs # ./backups/llmeu-.db node scripts/backup.mjs --out /srv/backups/ # explicit destination node scripts/backup.mjs --verify ./backups/llmeu-.db node scripts/backup.mjs --restore ./backups/llmeu-.db --yes node scripts/backup.mjs --list ``` Varje SQLite-s%C3%A4kerhetskopia verifieras innan skriptet rapporterar framg%C3%A5ng: den %C3%A5terst%C3%A4lls till en tempor%C3%A4r kopia, PRAGMA integrity_check m%C3%A5ste returnera ok, schemat till%C3%A4mpas p%C3%A5 nytt, och radantal f%C3%B6r modeller, organisationer och anv%C3%A4ndare skrivs ut. Med en postgres://-URL anv%C3%A4nder skriptet pg_dump --format=custom och beh%C3%B6ver pg_dump i PATH; en dump kan inte %C3%B6ppnas som en databas, s%C3%A5 dess radantal kr%C3%A4ver en scratch-%C3%A5terst%C3%A4llning. ## E-post Transaktionell e-post %E2%80%94 l%C3%B6senords%C3%A5terst%C3%A4llning, adressverifiering, inbjudningar %E2%80%94 anv%C3%A4nder MAIL_SMTP_* eller MAIL_API_URL med MAIL_FROM. Transporten v%C3%A4ljs en g%C3%A5ng vid start och rapporteras p%C3%A5 varje sida som beh%C3%B6ver e-post. En distribution med ingetdera %C3%A4r ett st%C3%B6tt tillst%C3%A5nd: registrering, inloggning, l%C3%B6senordsbyte, team och inbjudningar fungerar, men %C3%A5terst%C3%A4llning av l%C3%B6senord och verifieringsmejl kan inte hanteras d%C3%A4r. Sidorna s%C3%A4ger det, och node scripts/db.mjs passwd %C3%A4r %C3%A5terst%C3%A4llningsv%C3%A4gen. ## Inferensbackends En slutpunktsrad namnger en k%C3%B6rtid och en region, och backend-registret v%C3%A4ljer adapter efter region, s%C3%A5 en slutpunkt kan bara besvaras av en maskin i den region den namnger. - INFERENCE_MOCK=true beh%C3%A5ller den deterministiska utvecklingsbackend, som inte beh%C3%B6ver n%C3%A5gon GPU och inga vikter. - GPU_ENABLED=false h%C3%A5ller hanterade backends borta; med GPU_ENABLED=true g%C3%A4ller VLLM_BASE_URL f%C3%B6r den enda region som namnges av VLLM_REGION. - En distribution med flera regioner s%C3%A4tter en variabel per region, namngiven efter regionens slug (till exempel VLLM_BASE_URL_DE_FRA). En slutpunkt i en region utan konfigurerad backend avvisas, snarare %C3%A4n att betj%C3%A4nas fr%C3%A5n en maskin i en annan region. - Partnerbackends kommer fr%C3%A5n PARTNER_BASE_URL_ och tar PARTNER_SOVEREIGNTY och PARTNER_API_KEY; servern till%C3%A5ter partneranv%C3%A4ndning n%C3%A4r PARTNER_BASE_URL %C3%A4r satt. Utan konfigurerad GPU svarar den deterministiska utvecklingsbackend och dess utdata s%C3%A4ger att inga riktiga vikter k%C3%B6rdes och att f%C3%B6rstapartsinferens beh%C3%B6ver VLLM_BASE_URL och flaggan gpu_enabled. En ers%C3%A4ttningsframg%C3%A5ng som s%C3%A5g verklig ut skulle vara det enda den h%C3%A4r produkten aldrig f%C3%A5r leverera.