Title: Samodzielny hosting LLM: uruchom stack %E2%80%94 LLM EU Canonical: https://llmeu.com/pl/docs/self-hosting/ Markdown mirror: https://llmeu.com/pl/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 Pierwsze kroki - [Szybki start](/pl/docs/quickstart/) - [Konsola](/pl/docs/console/) - [Migracja](/pl/docs/migration/) - [Dokumentacja API](/pl/docs/api/) Referencja - [Uwierzytelnianie](/pl/docs/authentication/) - [Punkty ko%C5%84cowe](/pl/docs/endpoints/) - [B%C5%82%C4%99dy](/pl/docs/errors/) - [Limity szybko%C5%9Bci](/pl/docs/rate-limits/) - [Strumieniowanie](/pl/docs/streaming/) - [Polityki](/pl/docs/policies/) - [Routing i polityka](/pl/docs/routing/) - [Rezydencja i regiony](/pl/docs/residency/) - [Dowody i weryfikacja](/pl/docs/evidence/) - [Zgodno%C5%9B%C4%87 z OpenAI](/pl/docs/openai-compat/) Eksploatacja - [Samodzielne hostowanie](/pl/docs/self-hosting/) # Samodzielne hostowanie Node i katalog z prawem zapisu to jedyne wymagania. Poni%C5%BCsze stwierdzenia odczytano z plik%C3%B3w wskazanych obok nich; wszystko, czego nie uda%C5%82o si%C4%99 potwierdzi%C4%87, nie znajduje si%C4%99 tutaj. ## Punkty wej%C5%9Bcia - package.json wymaga Node >= 22.5. Magazyn SQLite to w%C5%82asny modu%C5%82 Node node:sqlite. - Nie ma %C5%BCadnej listy zale%C5%BCno%C5%9Bci: aplikacje, pakiety, skrypty i testy dzia%C5%82aj%C4%85 na bibliotece standardowej Node, a Dockerfile nic nie instaluje. - Istniej%C4%85 trzy procesy; ka%C5%BCdy otwiera baz%C4%99 danych i uruchamia migracj%C4%99 przy starcie. ``` 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 ``` ## Magazyn danych DATABASE_URL=sqlite:./data/llmeu.db nie wymaga serwera, a katalog i plik s%C4%85 tworzone przy pierwszym otwarciu. Uchwyt dzia%C5%82a w trybie WAL z w%C5%82%C4%85czonymi kluczami obcymi i 5-sekundowym limitem czasu zaj%C4%99to%C5%9Bci. packages/shared/src/db/schema.sql to schemat. Jest tylko do tworzenia i idempotentny, wi%C4%99c ponowne uruchomienie jest bezpieczne; kolumn%C4%99 dodan%C4%85 do istniej%C4%85cej tabeli nale%C5%BCy tak%C5%BCe zadeklarowa%C4%87 w kroku dodawania w packages/shared/src/db/index.mjs. Adres URL postgres:// wybiera osobn%C4%85 ga%C5%82%C4%85%C5%BA adaptera. Ta ga%C5%82%C4%85%C5%BA wymaga pakietu pg, kt%C3%B3ry nie jest zadeklarowan%C4%85 zale%C5%BCno%C5%9Bci%C4%85, a nag%C5%82%C3%B3wek schema.sql m%C3%B3wi, aby traktowa%C4%87 %C5%9Bcie%C5%BCk%C4%99 Postgres jako niezweryfikowan%C4%85, dop%C3%B3ki nie istnieje prawdziwy sterownik i przetestowana migracja. SQLite to %C5%9Bcie%C5%BCka, kt%C3%B3r%C4%85 uruchamia to repozytorium. ## CLI operatora node scripts/db.mjs odczytuje DATABASE_URL i nie wymaga us%C5%82ug. Polecenia: ## %C5%9Arodowisko Pogrupowane tak, jak grupuje je .env.example. ## Docker Compose i obraz s%C4%85 opcjonalne: w%C5%82asny zestaw test%C3%B3w repozytorium nie wymaga Dockera, a podstawowa %C5%9Bcie%C5%BCka to lokalny proces bez us%C5%82ug. - Domy%C5%9Blny profil uruchamia web: porty 3000 i 8088, SQLite na wolumenie llmeu-data w /app/data, wbudowane API oraz healthcheck na /healthz. - Ten sam obraz uruchamia workera za pomoc%C4%85 node apps/worker/src/run.mjs, czekaj%C4%85c, a%C5%BC web stanie si%C4%99 zdrowy, i wsp%C3%B3%C5%82dziel%C4%85c wolumen llmeu-data. - Dwa dodatkowe profile s%C4%85 domy%C5%9Blnie wy%C5%82%C4%85czone: postgres (postgres:16-alpine) i redis (redis:7-alpine, zarezerwowany i nieodczytywany przez %C5%9Bcie%C5%BCk%C4%99 kodu v1). - Profil gpu uruchamia vllm/vllm-openai z rezerwacj%C4%85 urz%C4%85dzenia NVIDIA i montuje wagi tylko do odczytu z hosta; nie jest domy%C5%9Blnie w%C5%82%C4%85czony, poniewa%C5%BC twierdzenie o wnioskowaniu w UE bez GPU by%C5%82oby fa%C5%82szywe. - Dockerfile to FROM node:24-alpine z tini, bez kroku budowania i bez instalowania zale%C5%BCno%C5%9Bci, dzia%C5%82a jako u%C5%BCytkownik node, zapisuje tylko w /app/data, wystawia 3000 i 8088 oraz uruchamia apps/web/server/main.mjs. ## Kopie zapasowe node scripts/backup.mjs bez flag zapisuje ./backups/llmeu- .db. SQLite jest kopiowany za pomoc%C4%85 VACUUM INTO, nigdy cp, poniewa%C5%BC aktywna baza WAL skopiowana przez cp mo%C5%BCe da%C4%87 stan rozerwany lub nieaktualny. ``` 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 ``` Ka%C5%BCda kopia zapasowa SQLite jest weryfikowana, zanim skrypt zg%C5%82osi powodzenie: jest przywracana do tymczasowej kopii, PRAGMA integrity_check musi zwr%C3%B3ci%C4%87 ok, schemat jest ponownie stosowany, a liczby wierszy dla modeli, organizacji i u%C5%BCytkownik%C3%B3w s%C4%85 wypisywane. W przypadku adresu URL postgres:// skrypt u%C5%BCywa pg_dump --format=custom i wymaga pg_dump w PATH; zrzutu nie mo%C5%BCna otworzy%C4%87 jako bazy danych, wi%C4%99c liczby jego wierszy wymagaj%C4%85 tymczasowego przywr%C3%B3cenia. ## Poczta Poczta transakcyjna %E2%80%94 reset has%C5%82a, weryfikacja adresu, zaproszenia %E2%80%94 u%C5%BCywa MAIL_SMTP_* lub MAIL_API_URL z MAIL_FROM. Transport jest wybierany raz przy starcie i raportowany na ka%C5%BCdej stronie, kt%C3%B3ra wymaga poczty. Wdro%C5%BCenie bez %C5%BCadnego z nich jest obs%C5%82ugiwanym stanem: rejestracja, logowanie, zmiana has%C5%82a, zespo%C5%82y i zaproszenia dzia%C5%82aj%C4%85, ale poczta do resetu has%C5%82a i weryfikacji nie mo%C5%BCe by%C4%87 tam przetwarzana. Strony to m%C3%B3wi%C4%85, a node scripts/db.mjs passwd jest drog%C4%85 odzyskiwania. ## Backendy wnioskowania Wiersz punktu ko%C5%84cowego wskazuje %C5%9Brodowisko uruchomieniowe i region, a rejestr backend%C3%B3w wybiera adapter wed%C5%82ug regionu, wi%C4%99c punkt ko%C5%84cowy mo%C5%BCe by%C4%87 obs%C5%82u%C5%BCony tylko przez maszyn%C4%99 w regionie, kt%C3%B3ry wskazuje. - INFERENCE_MOCK=true utrzymuje deterministyczny backend deweloperski, kt%C3%B3ry nie wymaga GPU ani wag. - GPU_ENABLED=false wyklucza zarz%C4%85dzane backendy; przy GPU_ENABLED=true VLLM_BASE_URL dotyczy jednego regionu wskazanego przez VLLM_REGION. - Wdro%C5%BCenie z kilkoma regionami ustawia jedn%C4%85 zmienn%C4%85 na region, nazwan%C4%85 wed%C5%82ug slugu regionu (na przyk%C5%82ad VLLM_BASE_URL_DE_FRA). Punkt ko%C5%84cowy w regionie bez skonfigurowanego backendu jest odrzucany, a nie obs%C5%82ugiwany przez maszyn%C4%99 w innym regionie. - Backendy partnerskie pochodz%C4%85 z PARTNER_BASE_URL_ i przyjmuj%C4%85 PARTNER_SOVEREIGNTY oraz PARTNER_API_KEY; serwer zezwala na u%C5%BCycie partnera, gdy ustawiono PARTNER_BASE_URL. Gdy nie skonfigurowano GPU, odpowiada deterministyczny backend deweloperski, a jego wynik m%C3%B3wi, %C5%BCe nie uruchomiono prawdziwych wag i %C5%BCe wnioskowanie w%C5%82asne wymaga VLLM_BASE_URL i flagi gpu_enabled. Zast%C4%99pczy sukces, kt%C3%B3ry wygl%C4%85da%C5%82by na prawdziwy, by%C5%82by jedyn%C4%85 rzecz%C4%85, kt%C3%B3rej ten produkt nigdy nie mo%C5%BCe wyda%C4%87.