chatgpt في المنزل! في الأساس أفضل محور Google Nest أو Amazon Alexa Home Home. بنيت على Raspberry Pi باستخدام API Openai.
سيشرح هذا الدليل كيفية بناء خاص بك. إنه مستقيم إلى الأمام. يمكنك أيضًا استخدام هذا كمرجع لبناء مشاريع أخرى على Raspberry Pi.
|
|
echo " export OPENAI_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
LITELLM_API_KEY
. راجع مستندات Litellm للحصول على قائمة بجميع مقدمي الخدمات المدعومة. echo " export LITELLM_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
--no-build
لسحب أحدث صورة من DockerHub: curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
هام : الصورة على اليسار هي لأغراض التوضيح. لا توصيل البطارية مباشرة بتوتبيري بي. استخدم UPS أو مصدر الطاقة مع بطارية مثل هذه. يمكن أن يؤدي توصيل البطارية مباشرة إلى Raspberry Pi إلى تلف اللوحة من تقلبات الجهد.
قبل توصيل البطارية ، تأكد من أن القطبية صحيحة لتجنب تلف Raspberry Pi أو المكونات الأخرى. افصل مصادر الطاقة قبل إجراء التغييرات.
![]() | ![]() |
هذه هي قائمة الأجزاء التي استخدمتها لبناء منزل GPT الأول. يمكنك استخدام هذا كمرجع لبناء خاص بك. لقد قمت أيضًا بتضمين أجزاء اختيارية يمكنك إضافتها لتعزيز الإعداد الخاص بك. لتوضيح ، يمكنك استخدام أي نظام يعمل Linux.
المكونات الأساسية
مكونات اختيارية
لتكوين Wi-Fi على Raspberry Pi ، ستحتاج إلى تحرير ملف wpa_supplicant.conf
والتأكد من تمكين الواجهة اللاسلكية عند التمهيد. تدعم هذه الطريقة تكوين شبكات Wi-Fi متعددة وهي مناسبة للإعدادات غير الممتازة. يمكنك أيضًا استخدام الأداة المساعدة raspi-config
أو nmcli
لتكوين Wi-Fi ؛ أو ببساطة استخدم اتصال Ethernet إذا كنت تفضل ذلك.
الخطوة 1: إنشاء نص باش
sudo nano /usr/local/bin/start_wifi.sh
أضف المحتوى التالي إلى البرنامج النصي:
#! /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
تأكد من استبدال your_wifi_ssid
و your_wifi_password
بك مع SSID وكلمة المرور لشبكة شبكة WiFi الفعلية.
الخطوة 2: اجعل البرنامج النصي قابل للتنفيذ
sudo chmod +x /usr/local/bin/start_wifi.sh
الخطوة 3: إنشاء ملف خدمة النظام
sudo nano /etc/systemd/system/start_wifi.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
الخطوة 4: إعادة تحميل النظام وتمكين الخدمة
sudo systemctl daemon-reload
sudo systemctl enable start_wifi.service
sudo systemctl start start_wifi.service
يجب أن تتصل Raspberry Pi الآن بشبكة Wi-Fi تلقائيًا عند التمهيد.
إذا كنت ترغب في الاتصال بشبكات مخفية أو شبكات متعددة ، فقم بتحرير ملف wpa_supplicant.conf
الموجود على /etc/wpa_supplicant/wpa_supplicant.conf
وأضف التكوين التالي:
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
}
أعد تشغيل خدمة wpa_supplicant
لتطبيق التغييرات:
sudo systemctl restart wpa_supplicant
راجع ملف مثال WPA_Supplicant لمزيد من المعلومات حول خيارات التكوين.
قبل تشغيل هذا المشروع على نظامك ، تأكد من مزامنة ساعة نظامك ، ويتم تحديث قوائم الحزمة الخاصة بك ، وتثبيت Nginx و Docker. سيعتني البرنامج النصي الإعداد هذا من أجلك ولكن يمكنك أيضًا القيام بذلك يدويًا.
مزامنة ساعة نظامك:
تثبيت chrony
لمزامنة الوقت:
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
تنشيط الوقت وتوافقه على الفور مع chrony
:
sudo chronyc makestep
قم بتحديث قائمة الحزمة الخاصة بك:
تضمن التحديثات المنتظمة لقائمة الحزم الخاصة بك الوصول إلى أحدث تصحيحات البرامج وتصحيحات الأمان.
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
تمكين مستودعات إضافية:
بالنسبة للأنظمة التي تستخدم EPEL وغيرها من المستودعات الخاصة ، قد تحتاج إلى تمكينها من الوصول إلى مجموعة واسعة من الحزم المتاحة.
لدبيان/أوبونتو:
sudo add-apt-repository universe
sudo apt update
ل Rhel/Centos/Alma و 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^
تثبيت أدوات التطوير:
تعد أدوات التطوير ضرورية لبناء الحزم وتجميع البرامج. تأكد من تثبيت الأدوات اللازمة.
لدبيان/أوبونتو:
sudo apt install -y build-essential
ل Rhel/Centos/Alma و Fedora:
sudo yum groupinstall -y " Development Tools " # For RHEL/CentOS/Alma
sudo dnf groupinstall -y " Development Tools " # For RHEL/CentOS/Alma 9^
تثبيت تبعيات النظام
Docker : مطلوب للحاويات.
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
ثم sudo systemctl enable --now docker
NGINX : مطلوب للوكيل العكسي لواجهة الويب.
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
قبل تشغيل البرنامج النصي الإعداد لإنشاء الحاوية ، يجب عليك أولاً التأكد من تصدير مفتاح API Openai إلى متغير البيئة.
LITELLM_API_KEY
. راجع مستندات Litellm للحصول على قائمة بجميع مقدمي الخدمات المدعومة. سيستخدم البرنامج النصي الإعداد هذا المتغير لتهيئة الحاوية. ملاحظة: تنفيذ export
مباشرة في المحطة لا يستمر بعد إعادة التشغيل.
export OPENAI_API_KEY= " your_api_key_here "
بدلاً من ذلك ، يمكنك وضع هذا في نهاية ملف ~/.bashrc
الخاص بك. (مُستَحسَن)
# 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 "
قم بتشغيل source ~/.bashrc
لتطبيق التغييرات على جلسة الطرفية الحالية.
سيستغرق برنامج Setup Script بعض الوقت (900.0s+ لبناء وإعداد التبعيات على رمس Raspberry Pi 4B W/ 1G) . سيقوم بتثبيت جميع التبعيات وإنشاء حاوية Docker. ومع ذلك ، يمكنك تخطي عملية الإنشاء عن طريق تمرير --no-build
إلى البرنامج النصي ؛ سيقوم بتثبيت التبعيات ، وإعداد جدار الحماية و Nginx ، وسحب الحاوية من Docker Hub وتشغيله.
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
بدلاً من ذلك ، بالنسبة لأغراض التطوير ، يقوم تشغيل setup.sh
بدون --no-build
العلم بتركيب دليل المشروع إلى الحاوية عن طريق إضافة -v ~/gpt-home:/app
to the docker run
Command. يتيح لك ذلك إجراء تغييرات على ملفات المشروع على Raspberry Pi ورؤية التغييرات التي تنعكس في الحاوية دون إعادة بناء الصورة. هذا مفيد لاختبار التغييرات على قاعدة الشفرة. الجري مباشرة مع:
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s
يمكنك أيضًا تشغيل الحاوية بشكل تفاعلي إذا كنت بحاجة إلى تصحيح أو اختبار تغييرات على قاعدة الشفرة مع -it
(المحطة التفاعلية) ، --entrypoint /bin/bash
، و --rm
(إزالة على خروج العملية). سيؤدي ذلك إلى إسقاطك في جلسة قذيفة داخل الحاوية. بدلاً من ذلك ، إذا كان Conatiner يعمل بالفعل:
docker exec -it gpt-home bash
سيبدأ هذا الحاوية وإسقاطك في جلسة قذيفة داخل الحاوية.
شرح أعلام تشغيل Docker
- -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.
إذا كنت تفضل تشغيل البرنامج النصي الإعداد يدويًا ، فيمكنك القيام بذلك. قم بإنشاء برنامج نصي في مجلد منزلك مع vim ~/setup.sh
أو nano ~/setup.sh
واللصق في ما يلي:
#! /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
تأكد من جعل البرنامج النصي قابل للتنفيذ لتشغيله
chmod +x setup.sh
./setup.sh
|
|
|
|
|
|
|
المساهمات هي بالتأكيد موضع ترحيب! يرجى قراءة contributing guidelines
لمزيد من المعلومات حول كيفية المساهمة.
تم ترخيص هذا المشروع بموجب ترخيص GNU GPL V3.0 - راجع ملف LICENSE
للحصول على التفاصيل.