###### tags: `RaspberryPi`,`Nginx`,`SQLite`,`Docker` # 使用 RaspberryPi 架設WebServer、DB及Docker 本篇文章的背景環境如下: 1. 樹梅派 Raspberry Pi 3 Model B V1.2。 2. 一張 16GB SD卡 接著我要一步一步測試架設一個WebServer、DB及Docker的環境。 ## 設定樹梅派 ### 燒錄作業系統 ==以下1~3步的操作是使用Windows系統,並把SD卡插入筆電後的操作== 1. 到[樹梅派官網](https://www.raspberrypi.com/software/)下載`Raspberry Pi Imager`。 ![](https://hackmd.io/_uploads/rkw2sCke6.png) 2. 開啟後,可以先到高級設置(右下齒輪)中設定像是`SSH服務`及`WIFI設置`等等。 ![](https://hackmd.io/_uploads/HJO8veeeT.png) 3. 選擇`操作系統`及`儲存卡`(SD卡)後按`燒製`,關於要怎麼選擇OS,可以看[這裡](https://www.raspberrypi.com/software/operating-systems/)依據你的需求及樹梅派的版本去選擇,這邊燒入的版本為`Raspberry Pi OS Lite(64-bit)`。 ![](https://hackmd.io/_uploads/S10vn-xgp.png) 4. 接著等待寫入及驗證步驟都成功後即可。若一直在驗證階段失敗,有可能是記憶卡品質不佳,建議換一個記憶卡試試看。 5. 之後將SD卡插入樹梅派中通電開機,如果是下載桌面版的可以在外接螢幕中看到系統畫面,若是Lite則會看到純文字的命令畫面,另外有開SSH服務的話,可以先用`ifconfig`確認內部ip後再用SSH的方式連線。(本篇樹梅派的ip為`192.168.140.33`) ### 設定時區與時間 如果==時間差太多的話很多套件會因為時區錯誤而導致不能下載或更新==,所以一定要先調整時間與時區。 1. 打開樹梅派設定。 ```bash sudo raspi-config ``` 2. 選擇 `Internationalization Option`。 ![](https://hackmd.io/_uploads/HkjlVmgl6.png) 3. 選擇 `Timezone`。 ![](https://hackmd.io/_uploads/S1FzNQglp.png) 4. 選擇 `Asia`。 ![](https://hackmd.io/_uploads/SkgV47glp.png) 5. 選擇 `Taipei`。 ![](https://hackmd.io/_uploads/B1mr4QxeT.png) 6. 選擇 `Finish`以關閉設定。 ![](https://hackmd.io/_uploads/H1iL4Xlgp.png) 應該會回覆類似如下,但時間部份可能會錯得離譜: ![](https://hackmd.io/_uploads/SyrqN7gl6.png) 7. 設定時間,有`指令設定`或是用`ntp套件設定`的方式。 - 指令設定: ```bash sudo date -s "26 Sep 2023 16:55:10" ``` - ntp套件設定: ```bash sudo apt install ntp #安裝ntp套件 sudo nano /etc/ntp.conf #查看設定檔 #ntp 指令的參數有 : sudo service ntp status | start | stop | restart sudo service ntp restart sudo apt install ntpdate #NTPDate 可以用來強制時間同步。 ``` ## 使用 Nginx 架設 Webserver 本篇使用Nginx作為網頁伺服器,接著就來看看要如何安裝及設定吧! ### 安裝 Nginx - Using Apt repository 1. 逐一輸入下方指令以完成Nginx的安裝。 ```bash sudo apt update sudo apt install nginx ``` 2. 安裝完成後就可以直接開啟網站輸入它的ip看看是否正常,應該會出現如下圖的歡迎頁面。 ![](https://hackmd.io/_uploads/rkU3Jzlep.png) ### 運行 .Net Core Web Api 運行一般的網頁正常後,接著我們試著讓`Nginx`運行`.Net Core Web Api`。 1. 先到[官網載點](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)下載`Asp.Net Runtime`,要下載`Binaries`中符合樹梅派作業系統的位元,範例是64位元,所以下載`Arm64`。 ![](https://hackmd.io/_uploads/HkVgxzgla.png) 2. 在`opt`資料夾中開一個`dotnet`資料夾,並把剛剛下載好的檔案解壓縮到該資料夾,接著在`/user/local/bin`建立一個dotnet的捷徑,就可以使用`dotnet`指令囉。 ```bash sudo mkdir -p /opt/dotnet sudo tar zxf /home/user/aspnetcore-runtime-6.0.22-linux-arm64.tar.gz -C /opt/dotnet sudo ln -s /opt/dotnet/dotnet /usr/local/bin dotnet --list-runtimes ``` >請記得將第二行指令的`/home/user/aspnetcore-runtime-6.0.22-linux-arm64.tar.gz`換為你下載runtime壓縮檔的路徑。 3. 在`/home/user`建立一個資料夾`testWebApi`,用來放程式發布檔。 ```bash mkdir /home/user/testWebApi ``` 4. 發布`.net core web api`並透過`MobaXterm`把檔案傳上去。 5. 將檔案移動到`/var/www/testWebApi`。 ```bash sudo mv /home/user/testWebApi /var/www/testWebApi ``` >注意在此處因為權限問題,所以我只能先將檔案從本機上傳到`/home/user`,之後在將檔案移動到`/var/www/testWebApi`,如果沒有權限問題就直接上傳到`var/www/testWebApi`就好了。 6. 先用 dotnet 語法將程式運行起來,這使用一個 `ApplicationServer`。 ```bash cd /var/www/testWebApi/ dotnet YOUR_PROJECT_NAME.dll ``` 回覆如下圖 ![](https://hackmd.io/_uploads/SJqzVflxp.png) > 若沒有運作成功,檢查一下 .net runtime 版本正不正確,或是看看有沒有錯誤訊息,我在實作的時候就有先發生runtime版本裝錯,之後又有發生漏新增一個資料夾的錯誤。 5. 運作成功後也可以用 `curl` 語法測試看看有沒有運作成功,本篇使用之前做過的案子測試,這裡放一下測試的結果。 ![](https://hackmd.io/_uploads/r16N4fgla.png) 6. 測試完畢後按 `ctrl` + `C` 以結束運行。 ### Nginx 反向代理 前一步我們已經將程式運行在Application Server 中,接著要讓Nginx做反向代理,讓我們可以透過其他網址或埠號訪問網頁。 1. 編輯Nginx設定檔。 ```bash sudo vi /etc/nginx/sites-enabled/default ``` 2. 貼上下面的設定。 ```json server { listen 80; server_name example.com *.example.com; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } ``` 3. 重啟Nginx以套用設定。 ```bash sudo systemctl restart nginx ``` 4. 再次運行 dotnet 程式。 ```bash dotnet YOUR_PROJECT_NAME.dll ``` 5. 運作成功後就可以開始測試囉!因為設定檔中我們是設定 80 port,所以現在應該可以直接用本地端ip不用加埠號就可以進行訪問,這邊放一下測試結果。 ![](https://hackmd.io/_uploads/ryciROAk6.png) ## 使用 SQLite 架設 DB 因為ARM的處理器不支援`MSSQL`,所以這邊會使用`SQLite`作為資料庫服務。 1. 安裝SQLite。 ```bash sudo apt-get update sudo apt-get install sqlite3 ``` 2. 建立SQLite資料庫檔案。 ```bash sqlite3 testDB.db ``` 回覆如下圖,成功建立檔案後,會出現 `sqlite>` 提示字元,可以繼續執行sqlite語法。 ![](https://hackmd.io/_uploads/rJ83_zWgT.png) 3. 在`sqlite>`提示字元中使用`.databases`指令來印出資料庫列表以驗證資料庫建立成功。 ```bash .databases ``` 回覆如下圖。 ![](https://hackmd.io/_uploads/B1BC_GWla.png) 4. 建立資料表`users`。 ```sql CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT); ``` 5. 插入一筆資料。 ```sql INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com'); ``` 6. 查詢`users`表。 ```sql SELECT * FROM users; ``` 回覆如下圖: ![](https://hackmd.io/_uploads/Skhv0NZep.png) 7. 使用`.quit`語法以結束`sqlite>`提示字元。 ![](https://hackmd.io/_uploads/Sk5QFGWga.png) ## 安裝 Docker ==注意!如果是64-bit的作業系統要參照[這篇](https://docs.docker.com/engine/install/debian/#uninstall-docker-engine)如果是32-bit則是參照[這篇](https://docs.docker.com/engine/install/raspberry-pi-os/),下述是以64-bit為範例喔!== 1. Run the following command to uninstall all conflicting packages. ```bash for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done ``` 2. Set up Docker's Apt repository. ```bash # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Add the repository to Apt sources: echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update ``` 3. Install the Docker packages. ```bash sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` 4. Verify that the installation is successful by running the `hello-world`image: ```bash sudo docker run hello-world ``` 如果回覆如下圖,代表安裝成功啦! ![](https://hackmd.io/_uploads/HyVJk7xea.png) ## 參考連結 * [我的另一篇文章:使用Linux架設WebServer及DB](https://hackmd.io/@andy971029/B1XpyEOy6) * [樹梅派官網](https://www.raspberrypi.com/software/) * [Install ASP.NET Core on Linux ARM 32-bit](https://www.prowaretech.com/articles/current/information-technology/linux/setup-and-configure/asp-net-core-on-arm#!) * [linux ln 命令使用参数详解 (ln -s 软链接)](https://my.oschina.net/u/4385912/blog/3910266) * [SQLite - CREATE Database](https://www.tutorialspoint.com/sqlite/sqlite_create_database.htm) * [Docker-Install Docker Engine on Raspberry Pi OS](https://docs.docker.com/engine/install/raspberry-pi-os/) * ChatGPT