Chatgpt zu Hause! Grundsätzlich ein besserer Google Nest Hub oder Amazon Alexa Home Assistant. Auf dem Raspberry Pi mit der OpenAI -API gebaut.
In diesem Leitfaden wird erklärt, wie Sie Ihre eigenen bauen. Es ist ziemlich einfach. Sie können dies auch als Referenz für den Bau anderer Projekte auf dem Raspberry Pi verwenden.
|
|
echo " export OPENAI_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
LITELLM_API_KEY
exportiert wird. In den Litellm -Dokumenten finden Sie eine Liste aller unterstützten Anbieter. echo " export LITELLM_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
--no-build
aus, um das neueste Bild von DockerHub zu ziehen: curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
Wichtig : Das Bild links dient zu Illustrationszwecken. Schließen Sie den Akku nicht direkt an den Himbeer -Pi an. Verwenden Sie eine UPS oder Netzteil mit einer Batterie wie dieser. Wenn Sie die Batterie direkt an den Himbeer -PI anschließen, können Sie durch Spannungsschwankungen Schäden an der Platine verursachen.
Stellen Sie vor dem Anschließen der Batterie sicher, dass die Polarität korrekt ist, um Schäden an Ihrem Raspberry Pi oder anderen Komponenten zu vermeiden. Trennen Sie Stromquellen, bevor Sie Änderungen vornehmen.
![]() | ![]() |
Dies ist die Liste der Teile, mit denen ich mein erstes GPT -Haus erstellt habe. Sie können dies als Referenz für den Bau Ihrer eigenen verwenden. Ich habe auch optionale Teile aufgenommen, die Sie hinzufügen können, um Ihr Setup zu verbessern. Um klar zu sein, können Sie jedes System verwenden, das Linux ausführt.
Kernkomponenten
Optionale Komponenten
Um Wi-Fi auf Ihrem Raspberry PI zu konfigurieren, müssen Sie die Datei wpa_supplicant.conf
bearbeiten und sicherstellen, dass die drahtlose Schnittstelle beim BOOT aktiviert ist. Diese Methode unterstützt das Konfigurieren mehrerer Wi-Fi-Netzwerke und eignet sich für Kopflosen-Setups. Sie können auch das raspi-config
oder das nmcli
Dienstprogramm verwenden, um Wi-Fi zu konfigurieren. Oder verwenden Sie einfach eine Ethernet -Verbindung, wenn Sie es vorziehen.
Schritt 1: Erstellen Sie das Bash -Skript
sudo nano /usr/local/bin/start_wifi.sh
Fügen Sie dem Skript den folgenden Inhalt hinzu:
#! /bin/bash
# Set the interface and SSID details
INTERFACE= " wlan0 "
SSID= " your_wifi_ssid "
PASSWORD= " your_wifi_password "
# Make sure no previous configuration interferes
sudo killall wpa_supplicant
sudo dhcpcd -x $INTERFACE
# Ensure the wireless interface is up
sudo ip link set $INTERFACE up
# Create a wpa_supplicant configuration file
WPA_CONF= " /etc/wpa_supplicant/wpa_supplicant.conf "
wpa_passphrase " $SSID " " $PASSWORD " | sudo tee $WPA_CONF > /dev/null
# Start wpa_supplicant
sudo wpa_supplicant -B -i $INTERFACE -c $WPA_CONF
# Obtain an IP address
sudo dhcpcd $INTERFACE
Stellen Sie sicher, dass Sie your_wifi_ssid
und your_wifi_password
durch SSID und Kennwort Ihres tatsächlichen WLAN -Netzwerks ersetzen.
Schritt 2: Machen Sie das Skript ausführbar
sudo chmod +x /usr/local/bin/start_wifi.sh
Schritt 3: Erstellen Sie eine Systemd -Dienstdatei
sudo nano /etc/systemd/system/start_wifi.service
Fügen Sie der Servicedatei den folgenden Inhalt hinzu:
[Unit]
Description =Start WiFi at boot
After =network.target
[Service]
ExecStart =/usr/local/bin/start_wifi.sh
RemainAfterExit =true
[Install]
WantedBy =multi-user.target
Schritt 4: SYSTEMD REODEN und den Dienst aktivieren
sudo systemctl daemon-reload
sudo systemctl enable start_wifi.service
sudo systemctl start start_wifi.service
Ihr Raspberry Pi sollte nun automatisch mit dem Wi-Fi-Netzwerk im Boot herstellen.
Wenn Sie eine Verbindung zu versteckten Netzwerken oder mehreren Netzwerken herstellen möchten, bearbeiten Sie die Datei wpa_supplicant.conf
unter /etc/wpa_supplicant/wpa_supplicant.conf
und fügen Sie die folgende Konfiguration hinzu:
network={
priority=1 # Higher priority networks are attempted first
ssid= " Your_Wi-Fi_Name "
psk= " Your_Wi-Fi_Password "
key_mgmt=WPA-PSK
scan_ssid=1 # Hidden network
priority=2
ssid= " Enterprise_Wi-Fi_Name "
key_mgmt=WPA-EAP
eap=PEAP # or TTLS, TLS, FAST, LEAP
identity= " Your_Username "
password= " Your_Password "
phase1= " peaplabel=0 " # or "peapver=0" for PEAPv0
phase2= " auth=MSCHAPV2 " # or "auth=MSCHAP" for MSCHAPv1
}
Starten Sie den wpa_supplicant
-Dienst neu, um die Änderungen anzuwenden:
sudo systemctl restart wpa_supplicant
Weitere Informationen zu den Konfigurationsoptionen finden Sie in der Beispieldatei WPA_Supplicant.
Stellen Sie vor dem Ausführen dieses Projekts auf Ihrem System sicher, dass Ihre Systemuhr synchronisiert ist, Ihre Paketlisten aktualisiert werden und Nginx und Docker installiert sind. Das Setup -Skript kümmert sich für Sie darum, aber Sie können dies auch manuell tun.
Synchronisieren Sie Ihre Systemuhr:
Installieren Sie chrony
für die Zeitsynchronisation:
sudo apt install -y chrony # For Debian/Ubuntu
sudo yum install -y chrony # For RHEL/CentOS/Alma
sudo dnf install -y chrony # # For RHEL/CentOS/Alma 9^
sudo zypper install -y chrony # For openSUSE
sudo pacman -S chrony # For Arch Linux
Aktivieren und synchronisieren Sie die Zeit sofort mit chrony
:
sudo chronyc makestep
Aktualisieren Sie Ihre Paketliste:
Regelmäßige Updates Ihrer Paketliste gewährleisten Zugriff auf die neuesten Software- und Sicherheitspatches.
sudo apt update # For Debian/Ubuntu
sudo yum makecache # For RHEL/CentOS/Alma
sudo dnf makecache # For RHEL/CentOS/Alma 9^
sudo zypper refresh # For openSUSE
sudo pacman -Sy # For Arch Linux
Aktivieren Sie zusätzliche Repositorys:
Bei Systemen, die EPEL und andere spezielle Repositories verwenden, müssen Sie möglicherweise auf eine breitere Palette verfügbarer Pakete zugreifen.
Für Debian/Ubuntu:
sudo add-apt-repository universe
sudo apt update
Für Rhel/Centos/Alma und Fedora:
sudo yum install -y epel-release # For RHEL/CentOS/Alma
sudo dnf install -y epel-release # For RHEL/CentOS/Alma 9^
sudo yum makecache --timer # For RHEL/CentOS/Alma
sudo dnf makecache --timer # For RHEL/CentOS/Alma 9^
Entwicklungswerkzeuge installieren:
Entwicklungswerkzeuge sind für den Aufbau von Paketen und die Zusammenstellung von Software unerlässlich. Stellen Sie sicher, dass Sie über die erforderlichen Tools installiert sind.
Für Debian/Ubuntu:
sudo apt install -y build-essential
Für Rhel/Centos/Alma und Fedora:
sudo yum groupinstall -y " Development Tools " # For RHEL/CentOS/Alma
sudo dnf groupinstall -y " Development Tools " # For RHEL/CentOS/Alma 9^
Systemabhängigkeiten installieren
Docker : Für die Containerisierung erforderlich.
sudo apt-get install -y docker.io # For Debian/Ubuntu
sudo yum install -y docker # For RHEL/CentOS/Alma
sudo dnf install -y docker # For RHEL/CentOS/Alma 9^
sudo zypper install -y docker # For openSUSE
sudo pacman -S docker # For Arch Linux
dann sudo systemctl enable --now docker
Nginx : Für die Reverse -Proxy für die Webschnittstelle erforderlich.
sudo apt-get install -y nginx # For Debian/Ubuntu
sudo yum install -y nginx # For RHEL/CentOS/Alma
sudo dnf install -y nginx # For RHEL/CentOS/Alma 9^
sudo zypper install -y nginx # For openSUSE
sudo pacman -S nginx # For Arch Linux
Bevor Sie das Setup -Skript ausführen, um den Container zu erstellen, sollten Sie zunächst sicherstellen, dass Ihre OpenAI -API -Schlüssel in eine Umgebungsvariable exportiert.
LITELLM_API_KEY
exportiert wird. In den Litellm -Dokumenten finden Sie eine Liste aller unterstützten Anbieter. Das Setup -Skript verwendet diese Variable, um den Container zu initialisieren. HINWEIS: Durch die direkte export
direkt im Terminal bleibt nach dem Neustart nicht bestehen.
export OPENAI_API_KEY= " your_api_key_here "
Alternativ können Sie dies am Ende Ihrer ~/.bashrc
-Datei einsetzen. (empfohlen)
# export your API Key in here to initialize it at boot
export OPENAI_API_KEY= " your_api_key_here "
# Optional: Anthropic, Mistral, Cohere, HuggingFace, etc.
export LITELLM_API_KEY= " your_api_key_here "
# Optional: Add these aliases to your .bashrc file for easier management
alias gpt-start= " docker exec -it gpt-home supervisorctl start app "
alias gpt-restart= " docker exec -it gpt-home supervisorctl restart app "
alias gpt-stop= " docker exec -it gpt-home supervisorctl stop app "
alias gpt-status= " docker exec -it gpt-home supervisorctl status app "
alias gpt-log= " docker exec -it gpt-home tail -n 100 -f /app/src/events.log "
alias wi-start= " docker exec -it gpt-home supervisorctl start web-interface "
alias wi-restart= " docker exec -it gpt-home supervisorctl restart web-interface && sudo systemctl restart nginx "
alias wi-stop= " docker exec -it gpt-home supervisorctl stop web-interface "
alias wi-status= " docker exec -it gpt-home supervisorctl status web-interface "
alias wi-build= " docker exec -it gpt-home bash -c 'cd /app/src/frontend && npm run build' "
alias wi-log= " tail -n 100 -f /var/log/nginx/access.log "
alias wi-error= " tail -n 100 -f /var/log/nginx/error.log "
alias spotifyd-start= " docker exec -it gpt-home supervisorctl start spotifyd "
alias spotifyd-restart= " docker exec -it gpt-home supervisorctl restart spotifyd "
alias spotifyd-stop= " docker exec -it gpt-home supervisorctl stop spotifyd "
alias spotifyd-status= " docker exec -it gpt-home supervisorctl status spotifyd "
alias spotifyd-log= " docker exec -it gpt-home tail -n 100 -f /var/log/spotifyd.log "
Führen Sie source ~/.bashrc
aus, um die Änderungen auf Ihre aktuelle Terminalsitzung anzuwenden.
Das Setup-Skript dauert eine ganze Weile, bis das Ausführen (900.0s+, die Abhängigkeiten auf meinem Quad-Core-Raspberry Pi 4b mit 1 g RAM) erstellt und eingerichtet wurden) . Es wird alle Abhängigkeiten installiert und den Docker -Container erstellt. Sie können den Build-Prozess jedoch überspringen, indem Sie die --no-build
Flag an das Skript übergeben. Es wird die Abhängigkeiten installiert, die Firewall und Nginx eingerichtet und den Container von Docker Hub gezogen und ausgeführt.
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
Alternativ montiert das Projektverzeichnis für Entwicklungszwecke, -v ~/gpt-home:/app
setup.sh
docker run
das --no-build
Flag ausführen. Auf diese Weise können Sie Änderungen an den Projektdateien auf Ihrem Raspberry Pi vornehmen und die im Container reflektierten Änderungen sehen, ohne das Bild wieder aufzubauen. Dies ist nützlich, um Änderungen an der Codebasis zu testen. Direkt mit:
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s
Sie können den Container auch interaktiv ausführen, wenn Sie Änderungen an der Codebasis mit den Flags -it
(Interactive Terminal), --entrypoint /bin/bash
und --rm
(entfernen) debuggen oder testen müssen. Dadurch wird Sie in eine Shell -Sitzung im Container eingeleitet. Alternativ, wenn der Conatiner bereits ausgeführt wird:
docker exec -it gpt-home bash
Dadurch wird der Container gestartet und Sie in eine Shell -Sitzung im Container fallen.
Erläuterung von Docker Run Flags
- -tmpfs /run :
Mounts a tmpfs at /run for transient runtime data.
- -tmpfs /run/lock :
Mounts a tmpfs at /run/lock for lock files.
- -privileged :
Grants extended privileges to the container
Necessary for accessing host audio devices.
- -net=host :
Uses the host network stack directly.
May be necessary for avahi-daemon services.
- v /dev/snd:/dev/snd :
Provides access to the host's sound devices.
- v /dev/shm:/dev/shm :
Provides access to shared memory.
- v /usr/share/alsa:/usr/share/alsa:ro :
Maps the ALSA shared data as read-only.
- v /var/run/dbus:/var/run/dbus :
Provides access to the D-Bus system for inter-process communication.
- -mount type=bind,source=/etc/asound.conf,target=/etc/asound.conf :
Binds the host's ALSA configuration to the container.
Wenn Sie es vorziehen, das Setup -Skript manuell auszuführen, können Sie dies tun. Erstellen Sie ein Skript in Ihrem Home -Ordner mit vim ~/setup.sh
oder nano ~/setup.sh
und fügen Sie im Folgenden ein.
#! /bin/bash
latest_release= $( curl -s https://api.github.com/repos/judahpaul16/gpt-home/releases/latest | grep ' tag_name ' | cut -d " -f4 )
# Colors
RED= ' 33[0;31m '
GREEN= ' 33[0;32m '
YELLOW= ' 33[0;33m '
BLUE= ' 33[0;34m '
MAGENTA= ' 33[0;35m '
CYAN= ' 33[0;36m '
WHITE= ' 33[0;37m '
NC= ' 33[0m ' # No Color
echo " "
echo -e " ${MAGENTA} "
echo " GPT Home $latest_release "
echo " Created by Judah Paul "
echo " More info @ https://github.com/judahpaul16/gpt-home/ "
echo -e " ${NC} "
echo -e " ${GREEN} "
echo " ____ ____ _____ _ _ "
echo " / ___| _ \ _ _| | | | | ___ _ __ ___ ___ "
echo " | | _| |_) || | | |_| |/ _ \ | '_ ` _ \ / _ \ "
echo " | |_| | __/ | | | _ | (_) | | | | | | __/ "
echo " \ ____|_| |_| |_| |_| \ ___/|_| |_| |_| \ ___| "
echo -e " ${NC} "
echo -e " ${CYAN} "
echo " ______________ "
echo " | how may I | "
echo " | assist you | "
echo " | today? | "
echo " |______________| "
echo " \ | "
echo " \ | "
echo " \ | "
echo " _______ ________ | "
echo " |ooooooo| ____ | __ __ | | "
echo " |[]+++[]| [____] |/ \ / \ | | "
echo " |+ ___ +| ]()()[ | \ __/ \ __/| | "
echo " |:| |:| ___ \ __/___ |[][][][]| | "
echo " |:|___|:| |__| |__| |++++++++| | "
echo " |[]===[]| |_|/ \ |_| | ______ | | "
echo " _ ||||||||| _ | | __ | | __ ||______|| __| "
echo " |_______| |_|[::]|_| |________| \ "
echo " \ _|_||_|_/ \ "
echo " |_||_| \ "
echo " _|_||_|_ \ "
echo " ____ |___||___| \ "
echo -e " ${NC} "
# Mask systemd-networkd-wait-online.service to prevent boot delays
sudo systemctl mask systemd-networkd-wait-online.service
# Set Permissions
sudo chown -R $( whoami ) : $( whoami ) .
sudo chmod -R 755 .
# Function to install system dependencies
function install() {
local package= $1
echo " Ensuring package ' $package ' is installed... "
# Detect the package management system
if command -v apt-get > /dev/null ; then
if ! dpkg -s " $package " > /dev/null 2>&1 ; then
sudo yes | add-apt-repository universe > /dev/null 2>&1 || true
sudo apt update || true
if [ " $package " == " docker " ] ; then
sudo apt-get install -y docker.io
else
sudo apt-get install -y " $package "
fi
fi
elif command -v yum > /dev/null ; then
if ! rpm -q " $package " > /dev/null 2>&1 ; then
sudo yum install -y epel-release > /dev/null 2>&1 || true
sudo yum makecache --timer || true
sudo yum install -y " $package "
fi
elif command -v dnf > /dev/null ; then
if ! dnf list installed " $package " > /dev/null 2>&1 ; then
sudo dnf install -y epel-release > /dev/null 2>&1 || true
sudo dnf makecache --timer || true
sudo dnf install -y " $package "
fi
elif command -v zypper > /dev/null ; then
if ! zypper se -i " $package " > /dev/null 2>&1 ; then
sudo zypper refresh || true
sudo zypper install -y " $package "
fi
elif command -v pacman > /dev/null ; then
if ! pacman -Q " $package " > /dev/null 2>&1 ; then
sudo pacman -Sy
sudo pacman -S --noconfirm " $package "
fi
else
echo " Package manager not supported. "
return 1
fi
if [ " $package " == " docker " ] ; then
if ! docker ps > /dev/null 2>&1 ; then
echo " Docker installed. Adding $( whoami ) to the 'docker' group... "
sudo usermod -aG docker $( whoami )
echo -e " ${RED} User added to ` docker ` group but the session must be reloaded to access the Docker daemon. Please log out, log back in, and rerun the script. Exiting... ${NC} "
exit 0
fi
fi
}
install chrony
install nginx
install containerd
install docker
install docker-buildx-plugin
install alsa-utils
sudo systemctl enable docker
sudo systemctl start docker
# Create ALSA config (asound.conf, adjust as needed)
sudo tee /etc/asound.conf > /dev/null << EOF
pcm.!default { type hw card Headphones device 0 }
ctl.!default { type hw card Headphones }
EOF
# Install Docker Buildx plugin
mkdir -p $HOME /.docker/cli-plugins
curl -Lo $HOME /.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm64
sudo chmod +x $HOME /.docker/cli-plugins/docker-buildx
docker buildx version
# Setup UFW Firewall
echo " Setting up UFW Firewall... "
if which firewalld > /dev/null ; then
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo yum remove firewalld -y 2> /dev/null || sudo apt-get remove firewalld -y 2> /dev/null || sudo zypper remove firewalld -y 2> /dev/null
fi
if ! which ufw > /dev/null ; then
sudo yum install ufw -y 2> /dev/null || sudo apt-get install ufw -y 2> /dev/null || sudo zypper install ufw -y 2> /dev/null
fi
sudo ufw allow ssh
sudo ufw allow 80,443/tcp
sudo ufw allow 5353/udp
echo " y " | sudo ufw enable
# Setup NGINX for reverse proxy
echo " Setting up NGINX... "
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
sudo tee /etc/nginx/sites-available/gpt-home << EOF
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $ host;
proxy_set_header X-Real-IP $ remote_addr;
proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
}
}
EOF
# Remove gpt-home site symlink if it exists
[ -L " /etc/nginx/sites-enabled/gpt-home " ] && sudo unlink /etc/nginx/sites-enabled/gpt-home
# Remove the default site if it exists
[ -L " /etc/nginx/sites-enabled/default " ] && sudo unlink /etc/nginx/sites-enabled/default
# Create a symlink to the gpt-home site and reload NGINX
sudo ln -s /etc/nginx/sites-available/gpt-home /etc/nginx/sites-enabled
sudo systemctl enable nginx
sudo nginx -t && sudo systemctl restart nginx
sudo systemctl status --no-pager nginx
if [[ " $1 " != " --no-build " ]] ; then
[ -d ~ /gpt-home ] && rm -rf ~ /gpt-home
git clone https://github.com/judahpaul16/gpt-home ~ /gpt-home
cd ~ /gpt-home
echo " Checking if the container 'gpt-home' is already running... "
if [ $( docker ps -q -f name=gpt-home ) ] ; then
echo " Stopping running container 'gpt-home'... "
docker stop gpt-home
fi
echo " Checking for existing container 'gpt-home'... "
if [ $( docker ps -aq -f status=exited -f name=gpt-home ) ] ; then
echo " Removing existing container 'gpt-home'... "
docker rm -f gpt-home
fi
echo " Pruning Docker system... "
docker system prune -f
# Check if the buildx builder exists, if not create and use it
if ! docker buildx ls | grep -q mybuilder ; then
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap
fi
# Building Docker image 'gpt-home' for ARMhf architecture
echo " Building Docker image 'gpt-home' for ARMhf... "
timeout 3600 docker buildx build --platform linux/arm64 -t gpt-home --load .
if [ $? -ne 0 ] ; then
echo " Docker build failed. Exiting... "
exit 1
fi
echo " Container 'gpt-home' is now ready to run. "
echo " Running container 'gpt-home' from image 'gpt-home'... "
docker run --restart unless-stopped -d --name gpt-home
--mount type=bind,source=/etc/asound.conf,target=/etc/asound.conf
--privileged
--net=host
--tmpfs /run
--tmpfs /run/lock
-v ~ /gpt-home:/app
-v /dev/snd:/dev/snd
-v /dev/shm:/dev/shm
-v /usr/share/alsa:/usr/share/alsa
-v /var/run/dbus:/var/run/dbus
-e OPENAI_API_KEY= $OPENAI_API_KEY
-e LITELLM_API_KEY= $LITELLM_API_KEY
gpt-home
echo " Container 'gpt-home' is now running. "
# Show status of the container
docker ps -a | grep gpt-home
sleep 10
# Show status of all programs managed by Supervisor
docker exec -i gpt-home supervisorctl status
fi
if [[ " $1 " == " --no-build " ]] ; then
docker ps -aq -f name=gpt-home | xargs -r docker rm -f
docker pull judahpaul/gpt-home
docker run --restart unless-stopped -d --name gpt-home
--mount type=bind,source=/etc/asound.conf,target=/etc/asound.conf
--privileged
--net=host
--tmpfs /run
--tmpfs /run/lock
-v /dev/snd:/dev/snd
-v /dev/shm:/dev/shm
-v /usr/share/alsa:/usr/share/alsa
-v /var/run/dbus:/var/run/dbus
-e OPENAI_API_KEY= $OPENAI_API_KEY
-e LITELLM_API_KEY= $LITELLM_API_KEY
judahpaul/gpt-home
docker ps -a | grep gpt-home
sleep 10
docker exec -i gpt-home supervisorctl status
fi
Stellen Sie sicher, dass das Skript ausführbar ist, um es auszuführen
chmod +x setup.sh
./setup.sh
|
|
|
|
|
|
|
Beiträge sind auf jeden Fall willkommen! Bitte lesen Sie die contributing guidelines
um weitere Informationen zum Beitrag zu erhalten.
Dieses Projekt ist unter der Lizenz der GNU GPL v3.0 lizenziert - Einzelheiten finden Sie in der LICENSE
.