nanobot: 2026-09-11 15:55:26
This commit is contained in:
85
projects/devops/artifacts/librechat-podman/README.md
Normal file
85
projects/devops/artifacts/librechat-podman/README.md
Normal file
@@ -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 <user>
|
||||
|
||||
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://<host>: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`.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
[Network]
|
||||
NetworkName=librechat
|
||||
74
projects/devops/artifacts/podman-systemd-summary.md
Normal file
74
projects/devops/artifacts/podman-systemd-summary.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# Podman + systemd — souhrn diskuse (11.9.2026)
|
||||
|
||||
Poznámka: toto je přehled informací a hledisek, **ne hotová rozhodnutí** —
|
||||
rozhodnutí o přístupu dělá uživatel po nastudování.
|
||||
|
||||
## Historie: `podman generate systemd` (starý model)
|
||||
|
||||
- Spustíš `podman run --detach`, pak `podman generate systemd --name X`
|
||||
vygeneruje `.service` unit s napevno zadrátovaným `podman start X` / `podman stop X`.
|
||||
- Problémy:
|
||||
- Unit je snapshot příkazové řádky — změna parametrů = ručně přepsat
|
||||
unit nebo regenerovat; drift mezi realitou a unitem.
|
||||
- systemd neví, co se děje — unit sleduje jen "podman start vrátil 0".
|
||||
Kontejner spadne vnitřně → systemd spí, watchdog nefunguje.
|
||||
- Deprecated od Podman 4.4, od 5.0 jen bugfixy. LibreChat podman blog
|
||||
(8/2023) ho ještě používá — historický.
|
||||
|
||||
## Současný model: Quadlet (od 4.4, komfortně 5.x)
|
||||
|
||||
Quadlet je systemd generator:
|
||||
- čte deklarativní unity z `~/.config/containers/systemd/user/` (rootless)
|
||||
nebo `/etc/containers/systemd/` (rootful)
|
||||
- přípony: `.container`, `.volume`, `.network`, `.pod`, `.kube`
|
||||
- při `systemctl daemon-reload` generuje skutečné `.service` unity
|
||||
do `/run/systemd/generator/`
|
||||
|
||||
Praktické rozdíly:
|
||||
- Deklarativní, idempotentní — unit je zdroj pravdy; změna `Image=`/`Volume=`
|
||||
→ `daemon-reload` + `restart` a podman kontejner rekne podle unitu.
|
||||
- Životní cyklus v systemd — generovaný service spouští `podman run`
|
||||
na popředí, ne detached; kontejner umře → systemd to vidí → `Restart=on-failure`
|
||||
funguje opravdu, `journalctl -u`, `systemctl status`, závislosti
|
||||
(`Requires=`/`After=`).
|
||||
- Volumes a sítě jsou taky unity (`.network`, `.volume`) — v unitu se
|
||||
odkazuješ `Network=librechat.network`, žádné ruční `podman network create`.
|
||||
- Auto-update: quadlet defaultně labeluje `io.containers.autoupdate=registry`;
|
||||
`podman auto-update` (typicky timer) porovná digest, pulzne a restartne.
|
||||
|
||||
## Třetí cesta: `podman compose` v systemd oneshotu
|
||||
|
||||
- `Type=oneshot` + `ExecStart=podman compose up -d` funguje, ale systemd
|
||||
vidí jen wrapper proces — restart-per-container, závislosti a logy
|
||||
per-service zmizí, celý stack = jedna monolitní jednotka.
|
||||
|
||||
## Hlediska pro LibreChat (ne rozhodnutí)
|
||||
|
||||
- Rootless vyžaduje `loginctl enable-linger` (běh bez loginu); port > 1024
|
||||
bez proxy OK (3080).
|
||||
- DNS jména mezi kontejnery = `ContainerName=` z quadlet unitů, ne názvy
|
||||
compose služeb → `MONGO_URI` by mířila na `librechat-mongodb`.
|
||||
- Verze podmana v distro repu: Debian/Ubuntu mají staré (4.3.x), quadlet
|
||||
user unity od 4.4 — zkontrolovat `podman --version` před nasazením.
|
||||
|
||||
## Zdroje k prostudování
|
||||
|
||||
- https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html — kompletní reference quadlet direktiv
|
||||
- https://docs.podman.io/en/latest/markdown/podman-quadlet.1.html — přehled generatoru, search paths
|
||||
- https://www.redhat.com/en/blog/quadlet-podman — motivace, srovnání s generate systemd
|
||||
- https://podman.io/docs/podman-installation — verze v distro repozitářích
|
||||
- https://docs.podman.io/en/latest/markdown/podman-auto-update.1.html — auto-update přes registry labely
|
||||
- https://www.librechat.ai/blog/2023-08-18_podman — historický (generate systemd), užitečný co kontejnery potřebují
|
||||
|
||||
## LibreChat zdroje
|
||||
|
||||
- https://www.librechat.ai/docs/local/docker — základní compose instalace
|
||||
- https://www.librechat.ai/docs/remote/docker_linux — remote Linux detaily, secrets (CREDS_KEY/CREDS_IV/JWT)
|
||||
- https://www.librechat.ai/docs/configuration/dotenv — reference .env proměnných
|
||||
- https://www.librechat.ai/docs/configuration/librechat_yaml — custom endpointy (Ollama/litellm přes baseURL)
|
||||
|
||||
Připravený návrh unity (před nastudováním, ke zvážení):
|
||||
`artifacts/librechat-podman/` v tomto projektu — README + librechat.network
|
||||
+ librechat.container + librechat-mongodb.container + librechat-meilisearch.container.
|
||||
Minimal stack api+mongo (RAG/vectordb/admin-panel vynechány kvůli RAM —
|
||||
důvod zrušení OpenWebUI); meilisearch volitelný pro fulltext.
|
||||
Reference in New Issue
Block a user