From 9810988f285deeb6700af40ab4f861ce2d06469e Mon Sep 17 00:00:00 2001 From: lachtan Date: Fri, 11 Sep 2026 15:23:08 +0200 Subject: [PATCH] nanobot: 2026-09-11 15:23:08 --- .../ai/artifacts/librechat-podman/README.md | 85 +++++++++++++++++++ .../librechat-meilisearch.container | 16 ++++ .../librechat-mongodb.container | 16 ++++ .../librechat-podman/librechat.container | 24 ++++++ .../librechat-podman/librechat.network | 2 + projects/ai/memory.md | 1 + 6 files changed, 144 insertions(+) create mode 100644 projects/ai/artifacts/librechat-podman/README.md create mode 100644 projects/ai/artifacts/librechat-podman/librechat-meilisearch.container create mode 100644 projects/ai/artifacts/librechat-podman/librechat-mongodb.container create mode 100644 projects/ai/artifacts/librechat-podman/librechat.container create mode 100644 projects/ai/artifacts/librechat-podman/librechat.network diff --git a/projects/ai/artifacts/librechat-podman/README.md b/projects/ai/artifacts/librechat-podman/README.md new file mode 100644 index 0000000..8ee1ad1 --- /dev/null +++ b/projects/ai/artifacts/librechat-podman/README.md @@ -0,0 +1,85 @@ +# LibreChat — Podman (rootless) + systemd Quadlet + +Náhrada OpenWebUI. Minimal stack: **api + mongodb** (bez RAG/vectordb/admin-panel, +kvůli RAM). Volitelně meilisearch pro fulltext search (`SEARCH=true`). + +Zdroje: +- https://www.librechat.ai/docs/local/docker +- https://www.librechat.ai/docs/remote/docker_linux +- https://www.librechat.ai/docs/configuration/dotenv +- Quadlet: https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html + +## Instalace (rootless, user services) + +1. Předpoklady: `podman` ≥ 4.4 (ideálně 5.x), uživatelský účet na serveru. + +2. Linger, aby user services běžely bez loginu: + + loginctl enable-linger + +3. Adresář s konfigem: + + mkdir -p ~/librechat + # .env ze šablony z repa LibreChat (.env.example) + cp .env.example ~/librechat/.env + + V `~/librechat/.env` nastavit: + - `MONGO_URI=mongodb://librechat-mongodb:27017/LibreChat` + (DNS jméno kontejneru v quadlet síti; default v šabloně je 127.0.0.1) + - `MEILI_HOST=http://librechat-meilisearch:7700` + - Trvalé secrets — vygenerovat (např. `openssl rand -hex 32`): + `CREDS_KEY` (64 hex znaků), `CREDS_IV` (32 hex), `JWT_SECRET`, `JWT_REFRESH_SECRET` + (jinak se vygenerují do `/app/data/.env.temp` — funguje, ale po ztrátě volume + jsou session/šifrované záznamy nenávratně pryč) + - `SEARCH=true` jen při provozu meilisearch + `MEILI_MASTER_KEY` + +4. Quadlet unity nakopírovat do `~/.config/containers/systemd/user/`: + + cp librechat.network librechat-mongodb.container librechat.container \ + ~/.config/containers/systemd/user/ + # volitelně: cp librechat-meilisearch.container ~/.config/containers/systemd/user/ + + Cestu k `.env` v unitách případně upravit (výchozí `%h/librechat/.env` + = `~/.config/...` patřičně). + +5. Start: + + systemctl --user daemon-reload + systemctl --user enable --now librechat-mongodb.service + systemctl --user enable --now librechat.service + # volitelně: systemctl --user enable --now librechat-meilisearch.service + +6. UI na `http://:3080`. První registrace = admin účet single-tenant + deploymentu. **Po vytvoření účtu** v `.env` doplnit `ALLOW_REGISTRATION=false` + a restart (`systemctl --user restart librechat.service`). + +## Volitelné doplňky + +- `librechat.yaml` (custom endpointy — Ollama/litellm proxy na nvidia.hell, + preset modelů atd.): soubor do `~/librechat/librechat.yaml` + + v `librechat.container` odkomentovat Volume řádek. Validace YAML fail-fast. +- RAG (vectordb + rag_api): až když bude potřeba, ~1 GB RAM navíc. +- Aktualizace: `podman auto-update` (quadlet unity mají default label), + nebo ručně `podman pull registry.librechat.ai/danny-avila/librechat-dev:latest` + + `systemctl --user restart librechat.service`. + +## Provoz / debugging + +- Logy: `journalctl --user -u librechat.service` (nebo `-u librechat-mongodb`) +- Stav kontejnerů: `podman ps` +- Port konflikt: `PublishPort` v `librechat.container` (default 3080:3080) + +## Designová rozhodnutí + +- **Quadlet** místo `podman generate systemd` (deprecated) a místo + systemd-oneshot nad `podman compose` (systemd neví o kontejnerech, + špatný restart/watchdog). +- **Společná quadlet síť** (`librechat.network`) — DNS mezi api a mongo + přes ContainerName, žádné porty mimo host kromě 3080. +- **Rootless + linger** — žádný root daemon na hostu; port 3080 > 1024, + žádný konflikt s privileged porty. +- **Bind-mount `.env` do /app/.env** — stejně jako upstream compose + (aplikace čte /app/.env za běhu, env_file samotný nestačí). +- Data v pojmenovaných volumech: `librechat-data` (/app/data — session, + temp credentials), `librechat-mongodb-data` (/data/db). Záloha: + `podman volume export`. \ No newline at end of file diff --git a/projects/ai/artifacts/librechat-podman/librechat-meilisearch.container b/projects/ai/artifacts/librechat-podman/librechat-meilisearch.container new file mode 100644 index 0000000..3180901 --- /dev/null +++ b/projects/ai/artifacts/librechat-podman/librechat-meilisearch.container @@ -0,0 +1,16 @@ +[Unit] +Description=LibreChat Meilisearch (fulltext) + +[Container] +Image=docker.io/getmeili/meilisearch:v1.35.1 +ContainerName=librechat-meilisearch +Network=librechat.network +Environment=MEILI_NO_ANALYTICS=true +EnvironmentFile=%h/librechat/.env +Volume=librechat-meilisearch-data:/meili_data + +[Service] +Restart=on-failure + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/projects/ai/artifacts/librechat-podman/librechat-mongodb.container b/projects/ai/artifacts/librechat-podman/librechat-mongodb.container new file mode 100644 index 0000000..8eec184 --- /dev/null +++ b/projects/ai/artifacts/librechat-podman/librechat-mongodb.container @@ -0,0 +1,16 @@ +[Unit] +Description=LibreChat MongoDB + +[Service] +# startup ordering: restart until api comes up +Restart=on-failure + +[Container] +Image=docker.io/mongo:8.0.20 +ContainerName=librechat-mongodb +Network=librechat.network +Volume=librechat-mongodb-data:/data/db +Exec=mongod --noauth + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/projects/ai/artifacts/librechat-podman/librechat.container b/projects/ai/artifacts/librechat-podman/librechat.container new file mode 100644 index 0000000..df35154 --- /dev/null +++ b/projects/ai/artifacts/librechat-podman/librechat.container @@ -0,0 +1,24 @@ +[Unit] +Description=LibreChat +Requires=librechat-mongodb.service +After=librechat-mongodb.service + +[Container] +Image=registry.librechat.ai/danny-avila/librechat-dev:latest +ContainerName=librechat +Network=librechat.network +PublishPort=3080:3080 +Environment=HOST=0.0.0.0 +Environment=MONGO_URI=mongodb://librechat-mongodb:27017/LibreChat +EnvironmentFile=%h/librechat/.env +Volume=%h/librechat/.env:/app/.env:Z +Volume=librechat-data:/app/data +Volume=%h/librechat/uploads:/app/uploads:Z +# custom endpoints (Ollama/litellm): odkomentovat a vytvorit soubor +#Volume=%h/librechat/librechat.yaml:/app/librechat.yaml:Z + +[Service] +Restart=on-failure + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/projects/ai/artifacts/librechat-podman/librechat.network b/projects/ai/artifacts/librechat-podman/librechat.network new file mode 100644 index 0000000..22dc460 --- /dev/null +++ b/projects/ai/artifacts/librechat-podman/librechat.network @@ -0,0 +1,2 @@ +[Network] +NetworkName=librechat \ No newline at end of file diff --git a/projects/ai/memory.md b/projects/ai/memory.md index 68bd563..2bcb8bf 100644 --- a/projects/ai/memory.md +++ b/projects/ai/memory.md @@ -51,3 +51,4 @@ Klíčová designová rozhodnutí: (1) brief je psaný pro čtenáře-agenta se - 2026-09-11: OpenWebUI zakázáno (2026-09-12) — žere sílně paměť a občas zasekne celý server. Jako náhradu chci vyzkoušet LibreChat, konkrétně self-hosted Docker variantu dle oficiální dokumentace: https://www.librechat.ai/docs/local/docker +- 2026-09-11: LibreChat research done — navrh postupu spusteni pres rootless podman + systemd Quadlet, artefakt: projects/ai/artifacts/librechat-podman/ (README + librechat.network + librechat.container + librechat-mongodb.container + librechat-meilisearch.container). Minimal stack api+mongo (RAG/vectordb/admin-panel vynechany kvuli RAM — duvod odstraneni OpenWebUI). MONGO_URI/MEILI_HOST nutno prepsat na DNS jmena kontejneru (quadlet sit), trvale CREDS_KEY/CREDS_IV/JWT secrets. Quadlet zvolen nad generate systemd (deprecated) a nad podman-compose-oneshot (systemd nevidi kontejnery). Rootless + linger, port 3080. Naseptany plan: nasadit na server (ktery?), pripojit Ollama/litellm endpointy pres librechat.yaml.