Det här sätter du upp
Open WebUI är en chattapp i webbläsaren, ungefär som ChatGPT, som du kör själv. Chattar, uppladdade dokument och användarkonton stannar på din server. Svaren kommer från en AI-modell någon annanstans: här från OpenRouter, en API-nyckel som når hundratals modeller från många leverantörer, några av dem gratis. Ingen modell körs på själva servern, så en liten server räcker.
Open WebUI utvecklas av Open WebUI, Inc., ett företag i San Francisco i USA, grundat av Timothy Jaeryang Baek. Licensen, "Open WebUI License", är BSD-licensen med tre klausuler plus en extra klausul: du får inte ta bort eller ändra namnet och logotypen Open WebUI, om inte installationen har högst 50 användare under 30 dagar, eller du har tillstånd eller en företagslicens från företaget. Äldre kod omfattas fortfarande av de tidigare MIT- och BSD-licenserna. OpenRouter drivs av OpenRouter, Inc. i New York i USA. Allt du skriver i en chatt går till OpenRouter och vidare till leverantören av den modell du väljer. OpenRouter uppger att de inte sparar dina meddelanden om du inte själv slår på det, men de sparar metadata som antal tokens, och varje leverantör har sina egna regler för loggning och träning.
Här körs Open WebUI i rootless Podman under en egen användare som heter openwebui, bakom Caddy från Podman-guiden.
Varje steg nedan har körts på en ny Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:
- Administratörskontot skapades via en SSH-tunnel innan webbplatsen var publik. Efteråt var registreringen stängd, och ett registreringsförsök utifrån nekades.
- En andra användare såg bara den enda modell som administratören hade gjort publik, och chattade med OpenRouters gratismodeller utan kostnad.
- En fråga om ett uppladdat dokument besvarades utifrån dokumentet, med dokumentsökningen på servern.
- Med inställningarna nedan anslöt Open WebUI bara till openrouter.ai. Med standardinställningarna hämtade den också filer från Hugging Face vid varje start och frågade GitHub efter nya versioner.
- Inloggningar visade besökarnas riktiga IPv4- och IPv6-adresser, svaren strömmades över en WebSocket genom Caddy, och allt startade igen av sig självt efter en omstart av servern, med användarna fortfarande inloggade.
Open WebUI använde omkring 690 MB minne. Avbilden tar 4,7 GB disk.
Innan du börjar
Du behöver:
- en server uppsatt som i Podman-guiden, med Caddy igång, och helst ufw från säkerhetsguiden;
- en A-post och en AAAA-post för
chat.example.comsom pekar på din server; - ett konto hos OpenRouter och en API-nyckel (steg 7).
Exemplen använder chat.example.com för Open WebUI och 203.0.113.10 för serverns IPv4-adress. Byt ut dem genomgående.
1. Skapa användaren
Som root:
useradd -m -s /bin/bash openwebui
loginctl enable-linger openwebui
machinectl shell openwebui@
Allt fram till steg 6 körs som openwebui.
2. Skapa den hemliga nyckeln
Open WebUI signerar inloggningarna med en hemlig nyckel. Om du inte ger den någon skapar avbilden en ny nyckel inne i containern, och Quadlet skapar containern på nytt vid varje omstart, så alla skulle loggas ut varje gång. Spara en slumpmässig nyckel som en Podman-hemlighet:
openssl rand -base64 32 | tr -d '\n' | podman secret create webui-secret-key -
3. Definiera containern
mkdir -p ~/.config/containers/systemd
Skapa ~/.config/containers/systemd/open-webui.container:
[Unit]
Description=Open WebUI
[Container]
ContainerName=open-webui
Image=ghcr.io/open-webui/open-webui:main
Volume=open-webui:/app/backend/data
# Only Caddy, on this server, can reach Open WebUI: the port is not open to the internet.
PublishPort=127.0.0.1:8103:8080
Secret=webui-secret-key,type=env,target=WEBUI_SECRET_KEY
Environment=WEBUI_URL=https://chat.example.com
Environment=CORS_ALLOW_ORIGIN=https://chat.example.com
# Caddy's connections arrive from the server's own IPv4 address
Environment=FORWARDED_ALLOW_IPS=203.0.113.10
# No local models: the chats go to OpenRouter
Environment=ENABLE_OLLAMA_API=False
Environment=OPENAI_API_BASE_URL=https://openrouter.ai/api/v1
# No downloads from Hugging Face, no update check against GitHub
Environment=OFFLINE_MODE=True
# No buttons that send chats, models and prompts to openwebui.com
Environment=ENABLE_COMMUNITY_SHARING=False
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=300
[Install]
WantedBy=default.target
Avbilden main är den utan inbyggd Ollama, som skulle köra modeller på servern. Allt som Open WebUI sparar ligger i volymen open-webui: en SQLite-databas med användare, chattar och inställningar, uppladdade filer och sökindexet för deras innehåll.
Vad inställningarna gör:
WEBUI_URLochCORS_ALLOW_ORIGINanger den publika adressen, som används i länkar och för att bara ta emot anrop från din egen webbplats.FORWARDED_ALLOW_IPSlitar på att Caddy skickar vidare besökarens riktiga adress. Inne i containern ser Caddys anslutningar ut att komma från serverns IPv4-adress.OPENAI_API_BASE_URLgör OpenRouter till den enda modellanslutningen. Utan den startar Open WebUI med en anslutning till OpenAI.OFFLINE_MODEstoppar två anrop som standardinställningarna gör. Vid varje start frågar Open WebUI Hugging Face (Hugging Face, Inc., USA) efter en nyare version av den lilla modell den använder för att söka i dokument, och i vårt test hämtade den omkring 800 MB därifrån. Dessutom frågar den GitHubs API efter senaste versionen, för att tala om för administratören att det finns uppdateringar. Modellen för dokumentsökning finns redan i avbilden, så dokument fungerar ändå. Inställningen hindrar också tillägg från att installera Python-paket.ENABLE_COMMUNITY_SHARING=Falsetar bort knapparna Share to Open WebUI Community, som skickar en chatt, en modell eller en prompt till openwebui.com när man klickar på dem.
Avbilden slår redan av inställningarna för anonym användningsstatistik (SCARF_NO_ANALYTICS, DO_NOT_TRACK, ANONYMIZED_TELEMETRY).
De flesta av inställningarna läses bara vid allra första starten och sparas sedan i databasen, dit senare ändringar i den här filen inte når. Skriv hela filen innan du startar Open WebUI första gången, och ändra inställningar på administratörssidorna efteråt.
4. Starta den
systemctl --user daemon-reload
systemctl --user start open-webui
systemctl --user enable --now podman-auto-update.timer
Första starten hämtar avbilden på 4,7 GB, vilket tog ungefär två och en halv minut, så start kan dröja innan den är klar. Vänta sedan tills Open WebUI svarar:
curl -s http://127.0.0.1:8103/health
Den svarar {"status":true} efter omkring 45 sekunder.
5. Skapa ditt administratörskonto via en SSH-tunnel
Det första kontot som skapas i Open WebUI blir administratör. Skapa det nu, medan Open WebUI bara kan nås från servern: i vårt test besökte en skanner webbplatsen inom en minut efter att den blev publik.
Öppna en tunnel till servern från din egen dator:
ssh -L 8103:127.0.0.1:8103 root@203.0.113.10
Medan den är öppen går du till http://localhost:8103 i webbläsaren. Välj Get started, fyll i Name, Email och Password, och välj Create Admin Account.
Så snart administratören finns stänger Open WebUI registreringen av sig själv. Kontrollera det genom att öppna din profilbild längst ned till vänster, Admin Panel, Settings och sedan Authentication: New Sign Ups är avslaget och Default User Role är pending. Stäng tunneln med exit.
6. Sätt Caddy framför
Gå tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:
chat.example.com {
reverse_proxy 127.0.0.1:8103
}
Starta om Caddy med systemctl --user restart caddy. Caddy skickar vidare den WebSocket-anslutning som Open WebUI strömmar sina svar över, utan extra inställningar.
Kontrollera från din egen dator att ingen annan kan registrera sig:
curl -s -X POST https://chat.example.com/api/v1/auths/signup \
-H 'Content-Type: application/json' \
-d '{"name": "test", "email": "test@example.com", "password": "Test-12345678"}'
Svaret är {"detail":"You do not have permission to access this resource. Please contact your administrator for assistance."}.
7. Anslut OpenRouter
Skapa en API-nyckel i ditt konto på openrouter.ai och ge den en kreditgräns. Nyckeln i vårt test hade gränsen 0 och använde bara gratismodeller, utan kostnad.
Gå till https://chat.example.com och öppna Admin Panel, Settings, Connections. Anslutningen https://openrouter.ai/api/v1 finns redan där. Välj kugghjulet bredvid den:
- Klistra in nyckeln i API Key.
- Öppna Advanced, skriv
openrouter/freeunder Model IDs och välj + bredvid. Annars listas alla OpenRouters modeller, fler än 450 i vårt test, också betalmodellerna.openrouter/freeskickar varje fråga till en av OpenRouters gratismodeller. - Välj Save.
Open WebUI sparar nyckeln i sin databas, i klartext: i tabellen config i webui.db i volymen open-webui. Den som har säkerhetskopian från steg 11, eller root på servern, kan läsa den, så håll kreditgränsen låg.
Gratismodellerna är långsammare och har begränsningar, och i vårt test tillät de 50 anrop per dag. Varje leverantör har sina egna regler för vad den sparar och om den tränar på dina meddelanden. I integritetsinställningarna för ditt OpenRouter-konto kan du spärra leverantörer som kan träna på meddelanden, med separata inställningar för gratis- och betalmodeller.
8. Välj vilka modeller användarna får använda
Modeller i Open WebUI är privata för administratören tills du delar dem, så en ny användare ser inga modeller alls. Öppna Admin Panel, Settings, Models, välj pennan bredvid openrouter/free, sedan Access, ändra Private till Public, stäng dialogrutan och välj Save & Update.
Public låter alla användare använda modellen. Vill du bara ge vissa personer en modell låter du den vara Private och lägger till dem, eller en grupp från Admin Panel, Users, Groups, med Add Access.
9. Chatta
Välj New Chat, kontrollera att openrouter/free är vald högst upp och ställ en fråga. Svaret strömmar in efter några sekunder.
Vill du fråga om ett dokument drar du det till meddelanderutan. Open WebUI delar upp och indexerar det på servern, och skickar bara de delar som passar din fråga till modellen. I vårt test hittade den ett kodord i en kort textfil.
Varje meddelande du skickar blir mer än ett anrop till OpenRouter: i vårt test använde ett meddelande fyra av de 50 gratisanropen, eftersom Open WebUI också ber modellen om ett namn på chatten, taggar och förslag på följdfrågor. Vill du spara anrop, eller pengar med betalmodeller, slår du av Title Generation, Follow Up Generation och Tags Generation under Admin Panel, Settings, Interface.
10. Lägg till användare
Under Admin Panel, Users väljer du Add User, väljer Role user och fyller i Name, Email och Password. Ge personen lösenordet och be hen byta det under Settings, Account.
Du kan också slå på New Sign Ups under Authentication en stund. Nya konton är då pending: de kan inte chatta förrän du ändrar deras roll till user i Admin Panel, Users. Slå av registreringen igen efteråt.
Om du senare använder betalmodeller:
- Kreditgränsen på OpenRouter-nyckeln sätter ett tak för vad alla användare tillsammans kan göra av med. Höj den i små steg.
- Lägg till varje betalmodell under Model IDs i steg 7, och dela den bara med de användare eller grupper som får använda den, som i steg 8.
11. Säkerhetskopiera
Som openwebui:
mkdir -p ~/backup
systemctl --user stop open-webui
podman volume export open-webui --output ~/backup/open-webui.tar
systemctl --user start open-webui
podman secret inspect --showsecret --format '{{.SecretData}}' webui-secret-key > ~/backup/webui-secret-key
chmod 600 ~/backup/*
Volymen innehåller databasen med användare, chattar, inställningar och OpenRouter-nyckeln, de uppladdade filerna och deras index. Den var 266 MB i vårt test, varav 120 MB var sökmodellen. Kopiera ~/backup till en annan maskin och förvara den säkert.
För att återställa skapar du hemligheten från den sparade filen med podman secret create webui-secret-key ~/backup/webui-secret-key, och kör sedan podman volume create open-webui och podman volume import open-webui ~/backup/open-webui.tar före första starten. Vi återställde en säkerhetskopia till en ny volym och loggade in med samma konto.
12. Håll den uppdaterad
Timern från steg 4 letar efter en ny avbild varje dag och startar om Open WebUI när det finns en. Taggen main följer Open WebUI:s versioner. podman auto-update --dry-run visar om en uppdatering väntar. En ny version kan ändra databasen när den startar, så ha en färsk säkerhetskopia från steg 11.
Felsökning
En inställning i containerfilen har ingen effekt. De flesta inställningar läses bara vid första starten, och sedan gäller det som står i databasen. Ändra dem på administratörssidorna. I vårt test lämnade ENABLE_COMMUNITY_SHARING=False, tillagd efter första starten, delningen till communityn påslagen.
En användare ser inga modeller. Modellerna är fortfarande privata. Dela dem som i steg 8.
Alla OpenRouters modeller listas, också betalmodellerna. Model IDs i anslutningen från steg 7 är tom: lägg till openrouter/free, välj + och sedan Save.
Alla har serverns egen IP-adress i Open WebUI:s logg. Det är väntat för besök via SSH-tunneln. För besök via Caddy kontrollerar du att FORWARDED_ALLOW_IPS är serverns IPv4-adress.