Chatgpt à la maison! Fondamentalement, une meilleure hub Google Nest ou Amazon Alexa Home Assistant. Construit sur le Raspberry Pi à l'aide de l'API OpenAI.
Ce guide expliquera comment construire le vôtre. C'est assez simple. Vous pouvez également l'utiliser comme référence pour construire d'autres projets sur le Raspberry Pi.
|
|
echo " export OPENAI_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
LITELLM_API_KEY
. Voir les documents Litellm pour une liste de tous les fournisseurs pris en charge. echo " export LITELLM_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
--no-build
pour extraire la dernière image de DockerHub: curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
IMPORTANT : L'image de gauche est à des fins d'illustration. Ne connectez pas la batterie directement au Raspberry Pi. Utilisez un UPS ou une alimentation avec une batterie comme celle-ci. La connexion de la batterie directement au Raspberry Pi peut endommager la carte des fluctuations de tension.
Avant de connecter la batterie, assurez-vous que la polarité est correcte pour éviter d'endommager votre Raspberry Pi ou d'autres composants. Débranchez les sources d'alimentation avant d'apporter des modifications.
![]() | ![]() |
Ceci est la liste des pièces que j'ai utilisées pour construire ma première maison GPT. Vous pouvez l'utiliser comme référence pour construire le vôtre. J'ai également inclus des pièces en option que vous pouvez ajouter pour améliorer votre configuration. Pour être clair, vous pouvez utiliser n'importe quel système qui exécute Linux.
Composants de base
Composants facultatifs
Pour configurer le Wi-Fi sur votre Raspberry Pi, vous devrez modifier le fichier wpa_supplicant.conf
et vous assurer que l'interface sans fil est activée au démarrage. Cette méthode prend en charge la configuration de plusieurs réseaux Wi-Fi et convient aux configurations sans tête. Vous pouvez également utiliser le raspi-config
ou l'utilitaire nmcli
pour configurer le Wi-Fi; ou utilisez simplement une connexion Ethernet si vous préférez.
Étape 1: Créez le script bash
sudo nano /usr/local/bin/start_wifi.sh
Ajoutez le contenu suivant au script:
#! /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
Assurez-vous de remplacer your_wifi_ssid
et your_wifi_password
par le SSID et le mot de passe de votre réseau WiFi réel.
Étape 2: rendre le script exécutable
sudo chmod +x /usr/local/bin/start_wifi.sh
Étape 3: Créez un fichier de service SystemD
sudo nano /etc/systemd/system/start_wifi.service
Ajoutez le contenu suivant au fichier de service:
[Unit]
Description =Start WiFi at boot
After =network.target
[Service]
ExecStart =/usr/local/bin/start_wifi.sh
RemainAfterExit =true
[Install]
WantedBy =multi-user.target
Étape 4: Recharger Systemd et activer le service
sudo systemctl daemon-reload
sudo systemctl enable start_wifi.service
sudo systemctl start start_wifi.service
Votre Raspberry Pi devrait désormais se connecter automatiquement au réseau Wi-Fi sur le démarrage.
Si vous souhaitez vous connecter à des réseaux cachés ou à plusieurs réseaux, modifiez le fichier wpa_supplicant.conf
situé sur /etc/wpa_supplicant/wpa_supplicant.conf
et ajoutez la configuration suivante:
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
}
Redémarrez le service wpa_supplicant
pour appliquer les modifications:
sudo systemctl restart wpa_supplicant
Voir le fichier d'exemple WPA_Supplicant pour plus d'informations sur les options de configuration.
Avant d'exécuter ce projet sur votre système, assurez-vous que votre horloge système est synchronisée, vos listes de packages sont mises à jour et Nginx et Docker sont installés. Le script de configuration s'occupera de cela pour vous, mais vous pouvez également le faire manuellement.
Synchronisez votre horloge système:
Installez chrony
pour la synchronisation du temps:
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
Activer et synchroniser le temps immédiatement avec chrony
:
sudo chronyc makestep
Mettez à jour votre liste de packages:
Les mises à jour régulières de votre liste de packages garantissent l'accès aux derniers logiciels et correctifs de sécurité.
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
Activer les référentiels supplémentaires:
Pour les systèmes qui utilisent EPEL et d'autres référentiels spéciaux, vous devrez peut-être leur permettre d'accéder à une gamme plus large de packages disponibles.
Pour Debian / Ubuntu:
sudo add-apt-repository universe
sudo apt update
Pour Rhel / Centos / Alma et 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^
Installer des outils de développement:
Les outils de développement sont essentiels pour construire des packages et compilation des logiciels. Assurez-vous que les outils nécessaires sont installés.
Pour Debian / Ubuntu:
sudo apt install -y build-essential
Pour Rhel / Centos / Alma et Fedora:
sudo yum groupinstall -y " Development Tools " # For RHEL/CentOS/Alma
sudo dnf groupinstall -y " Development Tools " # For RHEL/CentOS/Alma 9^
Installer les dépendances du système
Docker : requis pour la conteneurisation.
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
puis sudo systemctl enable --now docker
Nginx : requis pour le proxy inversé pour l'interface Web.
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
Avant d'exécuter le script de configuration pour créer le conteneur, vous devez d'abord vous assurer d'exporter votre clé API OpenAI vers une variable d'environnement.
LITELLM_API_KEY
. Voir les documents Litellm pour une liste de tous les fournisseurs pris en charge. Le script de configuration utilisera cette variable pour initialiser le conteneur. Remarque: l'exécution export
directement dans le terminal ne persiste pas après le redémarrage.
export OPENAI_API_KEY= " your_api_key_here "
Alternativement, vous pouvez le mettre à la fin de votre fichier ~/.bashrc
. (recommandé)
# 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 "
Exécutez source ~/.bashrc
pour appliquer les modifications à votre session de terminal actuelle.
Le script de configuration mettra un certain temps à exécuter (900.0S + pour construire et configurer des dépendances sur mon Raspberry Pi 4B quadricœur avec RAM) . Il installera toutes les dépendances et construira le conteneur Docker. Cependant, vous pouvez ignorer le processus de construction en passant le drapeau --no-build
au script; Il installera les dépendances, configurera le pare-feu et Nginx, et tirera le conteneur de Docker Hub et l'exécutera.
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
Alternativement, à des fins de développement, l'exécution setup.sh
sans l'indicateur --no-build
monte le répertoire du projet au conteneur en ajoutant -v ~/gpt-home:/app
à la commande docker run
. Cela vous permet d'apporter des modifications aux fichiers du projet sur votre Raspberry Pi et de voir les modifications reflétées dans le conteneur sans reconstruire l'image. Ceci est utile pour tester les modifications de la base de code. Exécutez directement avec:
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s
Vous pouvez également exécuter le conteneur de manière interactive si vous avez besoin de déboguer ou de tester les modifications de la base de code avec les indicateurs -it
(terminal interactif), --entrypoint /bin/bash
, et --rm
(supprimer à la sortie du processus). Cela vous déposera dans une session Shell à l'intérieur du conteneur. Alternativement, si le Conatiner est déjà en cours d'exécution:
docker exec -it gpt-home bash
Cela commencera le conteneur et vous déposera dans une session de shell à l'intérieur du conteneur.
Explication des drapeaux Docker Run
- -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.
Si vous préférez exécuter le script de configuration manuellement, vous pouvez le faire. Créez un script dans votre dossier à domicile avec vim ~/setup.sh
ou nano ~/setup.sh
et collez-le dans ce qui suit:
#! /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
Assurez-vous de rendre le script exécutable pour l'exécuter
chmod +x setup.sh
./setup.sh
|
|
|
|
|
|
|
Les contributions sont certainement les bienvenues! Veuillez lire les contributing guidelines
pour plus d'informations sur la façon de contribuer.
Ce projet est autorisé sous la licence GNU GPL V3.0 - voir le fichier LICENSE
pour plus de détails.