Eigenes ChatGPT hosten: Kein Abo, volle Kontrolle!

Eigenes ChatGPT hosten: Kein Abo, volle Kontrolle!

Übersicht

Die Idee, ein eigenes ChatGPT zu hosten, wird für viele immer spannender: volle Kontrolle über Daten, keine Abhängigkeit von externen Anbietern und die Möglichkeit, KI-Modelle individuell einzusetzen. Mit Ollama und OpenWebUI hast du zwei Werkzeuge an der Hand, die dir genau das ermöglichen, unkompliziert und mit einer modernen Oberfläche.

Damit dein Setup aber nicht nur lokal läuft, sondern du auch von unterwegs darauf zugreifen kannst, lässt sich das Ganze mit NetBird erweitern. So baust du dir dein eigenes, sicheres KI-System, das von überall erreichbar ist, ganz so, als würdest du mit einem Cloud-Dienst arbeiten, nur eben selbst gehostet.

In diesem Artikel gehen wir Schritt für Schritt durch:

So erhältst du am Ende eine vollständig selbstbestimmte ChatGPT-Alternative, die sowohl lokal als auch remote funktioniert.

Hier geht es zum zugehörigen Video: https://youtu.be/LL2PHmkyamU


Installation

Docker

Da wir OpenWebUI mit Docker betreiben möchten, installieren wir als Erstes natürlich Docker selbst, falls noch nicht geschehen. Das können wir ganz einfach mit dem offiziellen Convenience Script von Docker machen.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Docker Compose

Wir nutzen nun Docker Compose, um auf unserem Server Ollama und OpenWebUI zum Laufen zu bringen. Ollama nutzen wir hierbei, um auf die LLM-Modelle zugreifen zu können. Eine Übersicht über alle verfügbaren Modelle finden wir hier.

OpenWebUI bietet uns dann eine sehr schöne Weboberfläche, um mit dem LLM-Modell direkt im Browser interagieren zu können, wie wir es bspw. von ChatGPT kennen.

Da ich meine Compose-Projekte gerne in /opt ablege, erstelle ich hier einen neuen Ordner und speichere dort dann die Compose.

cd /opt
sudo mkdir openwebui && cd openwebui
sudo nano compose.yml
services:
  ollama:
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    restart: unless-stopped
    image: ollama/ollama:latest

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - open-webui:/app/backend/data
    ports:
      - '3000:8080'
    environment:
      - 'OLLAMA_BASE_URL=http://ollama:11434'
    restart: unless-stopped

volumes:
  ollama:
  open-webui:

Anschließend können wir die Container mit folgendem Befehl starten.

sudo docker compose up -d

Der erste Start dauert dann einen kleinen Augenblick. Danach können wir OpenWebUI im Browser unter http://<ip>:3000 erreichen und uns einen Administrator-Account erstellen.


LLM-Models

Wir können direkt über OpenWebUI unsere gewünschten LLMs in das lokale Ollama laden. Dafür geben wir bei den Modellen oben einfach den Namen ein, anschließend lädt Ollama dann das Modell herunter. Eine Übersicht über alle Modelle finden wir [hier](https://Der erste Start dauert dann einen kleinen Augenblick. Danach können wir OpenWebUI im Browser unter http://:3000 erreichen).


Andere Ollama Instanz

In meinem Fall lasse ich Ollama und OpenWebUI auf einem virtuellen Server laufen. Dieser hat natürlich keine GPU verbaut und ist dementsprechend sehr langsam bei der Verarbeitung der Anfragen. Um hier schnelle Antworten zu erhalten, greife ich auf einen Rechner mit GPU zurück, auf dem ebenfalls Ollama läuft. Diese Instanz ist über das Netzwerk erreichbar und kann in OpenWebUI hinterlegt werden.

Anschließend kann ich dann ein Modell von dem Rechner auswählen und meine Fragen dahin stellen. Die erste Verbindung dauert einen kurzen Moment, aber danach antwortet mir Ollama deutlich schneller.


Zugriff von überall

Um sicher von überall auf unsere eigene Chat-KI zugreifen zu können, ohne diese gleich für die ganze Welt verfügbar machen zu müssen, können wir das Tool Netbird verwenden. Netbird bietet uns die Möglichkeit, superleicht von überall mit wenigen Klicks eine Verbindung zu unserem Server mit der KI herzustellen. Alles, was wir dafür tun müssen, ist es, den Server sowie unsere Clients, wie bspw. Laptop, in unser Netbird-Netzwerk hinzuzufügen.

Dafür können wir entweder unseren eigenen Netbird-Server verwenden oder auf die von Netbird gehostete Variante zurückgreifen, beides ist für die Menge an Geräten kostenlos.

Server hinzufügen

Als Erstes können wir den Server zu unserem Netbird-Netz hinzufügen. Dafür navigieren wir auf dem Dashboard zum Reiter Setup Keys und erstellen einen neuen Key. Wir können hier direkt eine neue Gruppe für den Server erstellen, um mit dieser später unsere Regeln zu bauen.

Als Nächstes klicken wir auf Create Setup Key.

Unser Key wurde erfolgreich erstellt. Nun können wir Install NetBird auswählen und erhalten direkt den richtigen Befehl für die Installation auf unserem Server.

Die beiden Befehle führen wir jetzt einfach auf unserem Server aus.

Anschließend sehen wir unseren Server in der Peerübersicht.


Client hinzufügen

Als Nächstes müssen wir natürlich noch unser Gerät hinzufügen, mit dem wir bspw. von unterwegs auf OpenWebUI zugreifen wollen. Dafür können wir im Netbird Dashboard unter Peers einfach auf Add Peer gehen und das entsprechende Betriebssystem auswählen.

In meinem Fall habe ich zu Demonstrationszwecken meinen Laptop ebenfalls hinzugefügt. Dies kann ich jetzt ebenfalls in eine neue Gruppe packen, um anschließend mit den beiden Gruppen eine entsprechende Regel für den Zugriff zu bauen.


Zugriff erlauben

Wir haben nun alle Geräte hinzugefügt und können als Nächstes ganz einfach für die erstellten Gruppen eine entsprechende Regel bauen, damit unsere Clients auf OpenWebUI zugreifen dürfen. Dafür gehen wir zu dem Reiter Access Control und dort auf Policies.

Hier erstellen wir jetzt eine neue Policy und wählen unsere beiden Geräte aus. Theoretisch können wir es genau auf den Port einschränken, ich erlaube aber in diesem Testszenario einfach mal den kompletten Zugriff.

Jetzt müssen wir der Regel noch einen Namen und ggf. eine Beschreibung geben, anschließend können wir sie speichern und sie ist aktiv.


WebUI von unterwegs

In Netbird erhält jeder Peer eine eigene 100er IP-Adresse. Dies ist quasi unser Netbird-Netzwerk. Sobald die entsprechende Regel, wie wir sie oben erstellt haben, besteht, können wir mit unserem Laptop, sobald wir Netbird darauf gestartet haben, über die Netbird-IP von WebUI auf die Oberfläche zugreifen, egal wo wir uns befinden.


Weitere Ressourcen & SSL-Zertifikat + Domain

Natürlich wollen wir uns die IP-Adresse von unserem WebUI-Server nicht merken müssen, und allgemein wäre es schöner, wenn wir die WebUI einfach über eine Domain aufrufen könnten. In vergangenen Beiträgen habe ich erklärt, wie wir lokal in unserem Homelab verschiedene gehostete Anwendungen mit einer Domäne inklusive gültigem Zertifikat lokal erreichbar machen können. So habe ich auch für diese Demo ein Setup mit einem AdGuard DNS Server und Caddy als Reverse Proxy vorbereitet. Der DNS-Server hat eine interne Umschreibung für die Domäne gpt.juseclab.de konfiguriert, die auf einen Server mit Caddy verweist. Caddy ist so konfiguriert, dass er die Anfrage dann intern, aber mit gültigem Zertifikat und Co., an unseren WebUI-Server weiterleitet.


Netbird Networks

Dieses Setup ist so natürlich nur intern erreichbar. Um WebUI nun aber auch von unterwegs mittels Netbird über unsere interne Domäne zu erreichen, können wir das Netbird-Feature Networks benutzen. Das ermöglicht uns, weitere Geräte aus unserem Homelab von unserem Client aus erreichbar zu machen. Außerdem können wir Netbird dann so konfigurieren, dass wir beim Verbinden mit Netbird direkt den richtigen DNS-Server zu Hause verwenden, damit die Anfrage richtig weitergeleitet wird.

Network erstellen

Als Erstes erstellen wir ein neues Netzwerk in Netbird und greifen dabei auf unseren WebUI-Server zurück. Dafür navigieren wir auf dem Dashboard zum Reiter Networks und erstellen ein neues.

Ressourcen hinzufügen

Wenn wir jetzt das Netzwerk auswählen, können wir dort Ressourcen hinzufügen. Mit Ressourcen sind in dem Fall alle Server und Co. gemeint, die wir ebenfalls über den WebUI-Server als "Jumphost" erreichen wollen. Wir erstellen hier also eine Ressource für unseren internen DNS-Server

und für unseren Reverse-Proxy Caddy. Beide packen wir dann in eine Gruppe, damit wir theoretisch auch direkt für alle Ressourcen Regeln bauen könnten.

Routing Peers

Für das Netzwerk müssen wir jetzt noch einen Routing Peer hinterlegen. Damit ordnen wir das Netzwerk quasi einfach dem WebUI-Server zu, damit Netbird weiß, dass wir über diesen Peer gehen müssen.

Access Control Regeln

Jetzt fehlen noch die entsprechenden Regeln, damit unsere Client-Gruppe auch auf die neu erstellten Ressourcen zugreifen darf. Fangen wir also mit dem DNS-Server an. Hier reicht es, wenn die Client-Gruppe per 53 UDP zu der DNS-Server-Ressource kommen.

Als Nächstes erstellen wir die Regel, die erlaubt, dass unsere Clients auf den Caddy Reverse Proxy via 443 zugreifen können, um WebUI via https öffnen zu können.


Netbird DNS Server

Als Letztes können wir in Netbird konfigurieren, dass die Gruppe Clients beim Verbinden mit Netbird direkt den Homelab-DNS-Server zugewiesen bekommt, damit wir sofort die internen Domains auflösen können.

Dafür navigieren wir im Netbird Dashboard zu DNS → Nameservers. Hier fügen wir jetzt einen neuen DNS-Server hinzu und wählen Custom. Den konfigurieren wir so, dass er nur für unsere interne Domain genommen wird.

Jetzt geben wir die interne IP von unserem DNS-Server im Homelab an und wählen die Client-Gruppe bei der Zuweisung.

Im Reiter Domains tragen wir jetzt unsere intern genutzte Domain ein. Das hat zur Auswirkung, dass der DNS-Server nur genommen wird, wenn wir die Domain auflösen wollen.

Als Letztes vergeben wir noch einen Namen.

Für alle anderen Anfragen fügen wir jetzt noch einen Public DNS-Server hinzu (ihr könnt auch alle Anfragen über den internen DNS-Server leiten).

Jetzt haben wir 2 DNS-Einstellungen, die allen Geräten in der Client-Gruppe beim Verbinden mitgegeben werden.


Ergebnis

Wenn wir uns nun mit unserem Laptop von unterwegs mit Netbird verbinden, können wir unsere WebUI direkt über die entsprechende Domäne erreichen. Natürlich können wir jederzeit weitere Ressourcen zu unserem Netzwerk hinzufügen, um so von unterwegs weitere Services zu Hause erreichen zu können.