Chatgpt di rumah! Pada dasarnya Google Nest Hub yang lebih baik atau Asisten Rumah Amazon Alexa. Dibangun di atas Raspberry Pi menggunakan API Openai.
Panduan ini akan menjelaskan cara membangun sendiri. Cukup lurus ke depan. Anda juga dapat menggunakan ini sebagai referensi untuk membangun proyek lain di Raspberry Pi.
|
|
echo " export OPENAI_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
LITELLM_API_KEY
. Lihat dokumen Litellm untuk daftar semua penyedia yang didukung. echo " export LITELLM_API_KEY='your_api_key_here' " >> ~ /.bashrc && source ~ /.bashrc
--no-build
untuk menarik gambar terbaru dari Dockerhub: curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
Penting : Gambar di sebelah kiri adalah untuk tujuan ilustrasi. Jangan menghubungkan baterai langsung ke Raspberry Pi. Gunakan catu UPS atau daya dengan baterai seperti ini. Menghubungkan baterai langsung ke Raspberry Pi dapat menyebabkan kerusakan pada papan dari fluktuasi tegangan.
Sebelum menghubungkan baterai, pastikan bahwa polaritas benar untuk menghindari kerusakan pada pi raspberry Anda atau komponen lainnya. Lepaskan sumber daya sebelum membuat perubahan.
![]() | ![]() |
Ini adalah daftar bagian yang saya gunakan untuk membangun rumah GPT pertama saya. Anda dapat menggunakan ini sebagai referensi untuk membangun sendiri. Saya juga menyertakan bagian opsional yang dapat Anda tambahkan untuk meningkatkan pengaturan Anda. Untuk lebih jelasnya Anda dapat menggunakan sistem apa pun yang menjalankan Linux.
Komponen inti
Komponen opsional
Untuk mengonfigurasi Wi-Fi di Raspberry Pi Anda, Anda harus mengedit file wpa_supplicant.conf
dan memastikan antarmuka nirkabel diaktifkan saat boot. Metode ini mendukung mengkonfigurasi beberapa jaringan Wi-Fi dan cocok untuk pengaturan tanpa kepala. Anda juga dapat menggunakan raspi-config
atau utilitas nmcli
untuk mengonfigurasi Wi-Fi; Atau cukup gunakan koneksi Ethernet jika Anda mau.
Langkah 1: Buat skrip bash
sudo nano /usr/local/bin/start_wifi.sh
Tambahkan konten berikut ke skrip:
#! /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
Pastikan untuk mengganti your_wifi_ssid
dan your_wifi_password
dengan SSID dan kata sandi jaringan wifi Anda yang sebenarnya.
Langkah 2: Buat skrip dapat dieksekusi
sudo chmod +x /usr/local/bin/start_wifi.sh
Langkah 3: Buat file layanan SystemD
sudo nano /etc/systemd/system/start_wifi.service
Tambahkan konten berikut ke file layanan:
[Unit]
Description =Start WiFi at boot
After =network.target
[Service]
ExecStart =/usr/local/bin/start_wifi.sh
RemainAfterExit =true
[Install]
WantedBy =multi-user.target
Langkah 4: Muat Ulang SystemD dan Aktifkan Layanan
sudo systemctl daemon-reload
sudo systemctl enable start_wifi.service
sudo systemctl start start_wifi.service
Raspberry Pi Anda sekarang harus terhubung ke jaringan Wi-Fi secara otomatis saat boot.
Jika Anda ingin terhubung ke jaringan tersembunyi atau beberapa jaringan, edit file wpa_supplicant.conf
yang terletak di /etc/wpa_supplicant/wpa_supplicant.conf
dan tambahkan konfigurasi berikut:
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
}
Mulai ulang layanan wpa_supplicant
untuk menerapkan perubahan:
sudo systemctl restart wpa_supplicant
Lihat file contoh WPA_Supplicant untuk informasi lebih lanjut tentang opsi konfigurasi.
Sebelum menjalankan proyek ini di sistem Anda, pastikan jam sistem Anda disinkronkan, daftar paket Anda diperbarui, dan Nginx dan Docker diinstal. Skrip pengaturan akan mengurus ini untuk Anda tetapi Anda juga dapat melakukan ini secara manual.
Sinkronisasi jam sistem Anda:
Instal chrony
untuk sinkronisasi waktu:
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
Aktifkan dan menyinkronkan waktu segera dengan chrony
:
sudo chronyc makestep
Perbarui daftar paket Anda:
Pembaruan rutin ke daftar paket Anda memastikan akses ke perangkat lunak terbaru dan patch keamanan.
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
Aktifkan repositori tambahan:
Untuk sistem yang memanfaatkan EPEL dan repositori khusus lainnya, Anda mungkin perlu memungkinkan mereka untuk mengakses berbagai paket yang tersedia.
Untuk Debian/Ubuntu:
sudo add-apt-repository universe
sudo apt update
Untuk rhel/centos/alma dan 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^
Instal alat pengembangan:
Alat pengembangan sangat penting untuk membangun paket dan menyusun perangkat lunak. Pastikan Anda memiliki alat yang diperlukan diinstal.
Untuk Debian/Ubuntu:
sudo apt install -y build-essential
Untuk rhel/centos/alma dan fedora:
sudo yum groupinstall -y " Development Tools " # For RHEL/CentOS/Alma
sudo dnf groupinstall -y " Development Tools " # For RHEL/CentOS/Alma 9^
Instal dependensi sistem
Docker : Diperlukan untuk kontainerisasi.
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
Kemudian sudo systemctl enable --now docker
Nginx : Diperlukan untuk proxy terbalik untuk antarmuka 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
Sebelum Anda menjalankan skrip pengaturan untuk membangun wadah, Anda harus terlebih dahulu memastikan untuk mengekspor kunci API OpenAI Anda ke variabel lingkungan.
LITELLM_API_KEY
. Lihat dokumen Litellm untuk daftar semua penyedia yang didukung. Skrip Pengaturan akan menggunakan variabel ini untuk menginisialisasi wadah. Catatan: Melaksanakan export
langsung di terminal tidak bertahan setelah reboot.
export OPENAI_API_KEY= " your_api_key_here "
Atau, Anda dapat meletakkan ini di akhir file ~/.bashrc
Anda. (direkomendasikan)
# 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 "
Jalankan source ~/.bashrc
untuk menerapkan perubahan pada sesi terminal Anda saat ini.
Skrip pengaturan akan membutuhkan waktu cukup lama untuk dijalankan (900.0s+ untuk membangun dan mengatur dependensi pada quad-core Raspberry Pi 4b w/ 1G RAM) . Ini akan menginstal semua dependensi dan membangun wadah Docker. Namun, Anda dapat melewatkan proses pembangunan dengan meneruskan bendera --no-build
ke skrip; Ini akan menginstal dependensi, mengatur firewall dan nginx, dan menarik wadah dari hub Docker dan menjalankannya.
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s -- --no-build
Atau, untuk tujuan pengembangan, menjalankan setup.sh
tanpa bendera --no-build
memasang direktori proyek ke wadah dengan menambahkan -v ~/gpt-home:/app
ke perintah docker run
. Ini memungkinkan Anda untuk membuat perubahan pada file proyek pada Raspberry Pi Anda dan melihat perubahan yang tercermin dalam wadah tanpa membangun kembali gambar. Ini berguna untuk menguji perubahan pada basis kode. Jalankan langsung dengan:
curl -s https://raw.githubusercontent.com/judahpaul16/gpt-home/main/contrib/setup.sh |
bash -s
Anda juga dapat menjalankan wadah secara interaktif jika Anda perlu men -debug atau menguji perubahan pada basis kode dengan -it
(terminal interaktif), --entrypoint /bin/bash
, dan --rm
(hapus pada proses keluar proses). Ini akan membuat Anda menjadi sesi shell di dalam wadah. Atau, jika conatiner sudah berjalan:
docker exec -it gpt-home bash
Ini akan memulai wadah dan mengantar Anda ke sesi shell di dalam wadah.
Penjelasan Bendera Run 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.
Jika Anda lebih suka menjalankan skrip pengaturan secara manual, Anda dapat melakukannya. Buat skrip di folder home Anda dengan vim ~/setup.sh
atau nano ~/setup.sh
dan tempel di berikut ini:
#! /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
Pastikan untuk membuat skrip dapat dieksekusi untuk menjalankannya
chmod +x setup.sh
./setup.sh
|
|
|
|
|
|
|
Kontribusi pasti diterima! Harap baca contributing guidelines
untuk informasi lebih lanjut tentang cara berkontribusi.
Proyek ini dilisensikan di bawah lisensi GNU GPL v3.0 - lihat file LICENSE
untuk detailnya.