抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

本教學部分畫面是 2020 ~ 2023 年的畫面,GCP UI 有些許不一致,但功能名稱基本上不會變,再斟酌一下,另外開設虛擬機的費用也會根據 GCP 的行銷策略會有些微調整。

軟體需求
MobaXTerm

1. 建立 GCP 專案

第 1/3 步: 建立專案選擇視窗 ➡︎ 新增專案

GCP 建立專案 01

第 2/3 步: 填寫新專案的名稱

GCP 建立專案 02

注意
專案名稱使用 django-server-xx 作為專案名稱,xx 請替換成自己的座號。方便後續我這邊進行維護或是解決問題。

第 3/3 步: 切換專案方式

第一種方式,於通知畫面點選【選取專案】
GCP 建立專案 03

第二種方式,專案下拉式選單 ➡︎ 找到剛剛所建立的專案
GCP 建立專案 04

2. 建立虛擬機

第 1/5 步: 進入 VM 執行個體

建立虛擬機 01

第 2/5 步: 啟用 Compute Engine API

建立虛擬機 02

第 3/5 步:

建立虛擬機 13

第 4/5 步: 設定虛擬機規格與作業系統

建立虛擬機 03
建立虛擬機 04
建立虛擬機 05
建立虛擬機 06
建立虛擬機 07
建立虛擬機 08
建立虛擬機 09

注意
建立虛擬機 10
按照上述設定後,虛擬機的預估價格為 3.83 USD/月,大約是 125 NTD/月,最後儲存建立虛擬前,請先檢查虛擬機預估發費是否過高。

等待虛擬機建立

建立虛擬機 11

第 5/5 步: 透過 WebUI 登入虛擬機並執行終端機 (點選 SSH 按鈕)

建立虛擬機 12

3. 建立 SSH Key Pair

第 1/8 步: 透過 MobaXTerm Tools 建立 SSH Keys

建立 SSH Key 01

第 2/8 步: 於 SSH Key Generator 畫面按下 Generate

建立 SSH Key 02
建立 SSH Key 03

第 3/8 步: 新增 Key comment

建立 SSH Key 04

注意
GCP 虛擬機額外透過 key comment 識別這把金鑰的使用者身分,如果虛擬主機的使用者名稱打錯將會導致 SSH 通訊過程無法登入。

第 4/8 步: 保存 Private Key

建立 SSH Key 05

第 5/8 步: 保存 Public Key

建立 SSH Key 06

第 6/8 步: 匯出 Key 為 OpenSSH 格式

建立 SSH Key 07

第 7/8 步: 回到 GCP Web UI 並進入虛擬機進行設定

建立 SSH Key 08
建立 SSH Key 09
建立 SSH Key 10
建立 SSH Key 11

第 8/8 步: 使用 MobaXTerm 進行連線

建立 SSH Key 12

完成

建立 SSH Key 13

4. 建置伺服器

4.1 更新虛擬機作業系統

1
sudo apt-get update && sudo apt-get upgrade -y

如果出現以下畫面
建置伺服器 01
假如出現上述畫面的話,按下 Tab ➡︎ 再 <ok> 選項反白時按下 Enter 即可。

4.2 安裝 Apache2

1
sudo apt-get install apache2 libapache2-mod-wsgi-py3 -y

4.3 安裝 python3.12

第 1/9 步: 安裝必要的對應程式

1
sudo apt install -y software-properties-common build-essential libffi-dev libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev libffi-dev libssl-dev

第 2/9 步: 加入 Personal Package Archive 套件庫

1
sudo add-apt-repository ppa:deadsnakes/ppa 

接著按下 Enter 確認套件庫使用訊息 ➡︎ 繼續使用該 PPA 。

第 3/9 步: 更新資訊

1
sudo apt update 

第 4/9 步: 安裝 Python 與虛擬環境

1
sudo apt install -y python3.12 python3.12-venv  

第 5/9 步: 安裝 PIP Python 套件管理

1
sudo apt install -y python3.12-distutils
1
wget https://bootstrap.pypa.io/get-pip.py 
1
sudo python3.12 get-pip.py 
1
sudo rm -rf get-pip.py 

第 6/9 步: 修改環境變數 python 所使用的程式

1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 1

第 7/9 步: 確認安裝狀況

1
2
3
4
5
6
7
python -V
## Output
## Python 3.12.4

pip -V
## Output
## pip 24.1.2 from /usr/local/lib/python3.12/dist-packages/pip (python 3.12)

第 8/9 步: 清除不必要的套件

1
sudo apt autoremove

第 9/9 步: (選) 移除 PPA 套件庫

1
sudo add-apt-repository --remove ppa:deadsnakes/ppa

5. 設定 Github Personal Access Token

第 1/7 步: 登入 Github 點選頭像打開功能選單 ➡︎ 選擇 Settings

建立 Github PAT 01

第 2/7 步: Settings 頁面捲動至中間 ➡︎ 選擇 Devloper Settings

建立 Github PAT 02

第 3/7 步: 建立 Personal Access Tokens

展開 Personal Access Tokens ➡︎ 選擇 Fine-grained Personal Access Tokens
➡︎ 點選 Generate new token
建立 Github PAT 03

第 4/7 步: 輸入密碼確認身分

建立 Github PAT 04

第 5/7 步: 設定 Token 資訊與權限

建立 Github PAT 05

第 6/7 步: 複製 Token 並妥善保管

建立 Github PAT 06

注意

  1. 產生的 Token 等同於密碼妥善保管,萬一洩漏了等同於洩漏了整個專案,包括新增、修改、刪除的權限。
  2. 這個頁面關閉之後,無法再次顯示 Token 資訊,只能重新建立新的 Token。

第 7/7 步: 透過終端機使用 PAT Clone 專案

語法為:

1
git clone https://<您的Token>@github.com/<您的Github ID>/<專案名稱>.git <存放路徑與專案資料夾名稱>

舉例: Clone 我的專案到個人資料夾並命名為 djangoBLOG

  • PAT: github_pat_11ABWDRPY0JWEpm5B5vATm_WJM3oHBku2sDQElTrdvJkCA1RmkRiMZ0QbSwcVw1OtaONK
  • 專案網址: https://github.com/keoinn/DjangoBLOG-AI.git
  • 存放的路徑: /home/waynechang1226
  • 於VM上的專案資料夾名稱: djangoBLOG

完整指令如下:

1
git clone https://github_pat_11ABWDRPY0JWEpm5B5vATm_WJM3oHBku2sDQElTrdvJkCA1RmkRiMZ0QbSwcVw1OtaONK@github.com/keoinn/DjangoBLOG-AI.git ~/djangoBLOG

而專案網址可以於 Github 的專案首頁上找到,如下圖。
建立 Github PAT 07

執行指令後

使用指令查詢當前資料夾詳細資料

1
ls -la

建立 Github PAT 08

6. 建立 Python 虛擬環境

第 1/4 步: 建立虛擬環境於個人資料夾內

1
python -m venv ~/django_env

第 2/4 步: 啟用虛擬環境

1
source ~/django_env/bin/activate

第 3/4 步: 從專案資料夾中的 requirements.txt 安裝套件

1
pip install -r ~/djangoBLOG/requirements.txt
requirements.txt
1
2
3
4
asgiref==3.8.1
Django==5.0.7
Markdown==3.6
sqlparse==0.5.0

第 4/4 步: 檢查版本

1
django-admin version

7. 撰寫 Apache2 設定檔案

進行此部分的內容時,請先完成網址申請與 DNS 設定。

第 1/6 步: 進入 Apache2 程式資料夾內

1
cd /etc/apache2/sites-available/

第 2/6 步: 建立 Apache2 conf

1
2
3
sudo touch <你的網址>.conf
## Ex:
## sudo touch wayne.deepthinkwaves.com.conf

第 3/6 步: 使用 Nano 編輯 conf

1
2
3
sudo nano <你的網址>.conf
## Ex:
## sudo nano wayne.deepthinkwaves.com.conf

您可以選擇使用上傳方式
您可以先在本機端用常用的文字編輯器編輯設定檔 (第 4 步),完成後使用 MobaXTerm 內建的 FTP 介面上傳。或者使用 scp 指令將檔案從本地端上傳至遠端主機上,語法如下:

1
scp -i <private key 路徑> <本地端檔案路徑> <GCP VM 使用者>@<主機位置>:/home/<GCP VM 使用者>

之後記得把設定檔案移動到 apache2 的資料夾內

1
sudo mv ~/<設定檔>.conf /etc/apache2/site-avaliable

第 4/6 步: 使用 Nano 編輯 conf

<你的網址>.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<VirtualHost *:80>
ServerAdmin <您的信箱>
ServerName <你申請的網址>

Alias /static /home/<VM主機使用者>/<專案資料夾>/public/assets

WSGIDaemonProcess django_blog python-path=/home/<VM主機使用者>/<專案資料夾>:/home/<VM主機使用者>/<虛擬環境資料夾>/lib/python3.12/site-packages
WSGIProcessGroup django_blog
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / /home/<VM主機使用者>/<專案資料夾>/<專案設定資料夾>/wsgi.py

<Directory "/home/<VM主機使用者>/<專案資料夾>">
AllowOverride All
Require all granted
</Directory>

<Directory "/home/<VM主機使用者>/<專案資料夾>/<專案設定資料夾>">
<Files wsgi.py>
Require all granted
</Files>
</Directory>

<Directory "/home/<VM主機使用者>/<專案資料夾>/public/assets">
AllowOverride All
Require all granted
</Directory>

<Directory "/home/<VM主機使用者>/<專案資料夾>/static">
AllowOverride All
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error-djangoBLOG.log
CustomLog ${APACHE_LOG_DIR}/access-djangoBLOG.log combined
</VirtualHost>

如果您是使用 nano 進行編輯,使用 Crtl + O 存檔。

注意
上面設定檔中,請將 <...> 按照自己的狀況替換字串。

  1. ServerAdmin <您的信箱> 替還換成您自己的信箱,即 ServerAdmin example@gmail.com
  2. ServerName <你申請的網址> 使用您申請的網址,不包含 protocol,即 ServerName example.learningweb.net
  3. <VM主機使用者> 則替換個人目錄資料夾名稱,通常為虛擬主機上的使用者名稱。
  4. <專案資料夾> 專案存放的資料夾名稱,大小寫相異
  5. <專案設定資料夾> 根據自己專案存放 settings.py 的資料夾名稱。

上述內容替換後,設定檔案不存在中文<> 符號。

第 5/6 步: 複製設定檔並啟用設定

1
2
3
4
sudo a2dissite 000-default.conf
sudo a2ensite <你的網址>.conf
## Ex:
## sudo a2ensite wayne.deepthinkwaves.com.conf

第 6/6 步: 重新啟動 Apache 伺服器

1
sudo systemctl reload apache2

8. 還原資料庫

第 1/4 步: 將資料庫 db.sqlite3 上傳至 Google Drive

第 2/4 步: 共用檔案 ➡︎ 複製共用連結

資料庫上傳共用

第 3/4 步: 取得檔案 ID

1
2
3
4
5
6
7
8
# 檔案連結
https://drive.google.com/file/d/19GU_3r-x6Ch9ohrrUeDHW7O8vxUK4mV8/view?usp=sharing

# 檔案ID字串位置
https://drive.google.com/file/d/<檔案的ID>/view?usp=sharing

# 以下字串是我的檔案 ID
19GU_3r-x6Ch9ohrrUeDHW7O8vxUK4mV8

第 4/4 步: 使用 WGET 下載至專案資料夾內

1
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=<檔案的ID>' -O ~/<專案資料夾>/db.sqlite3

9. 調整專案資料夾權限

第 1/5 步: 讓個人資料夾給予任何人搜尋權限

1
2
3
sudo chmod +x /home/<VM主機使用者>
## Ex:
## sudo chmod +x /home/waynechang1226

第 2/5 步: 讓 db.sqlite3 擁有寫入權限

1
2
3
sudo chmod 664 ~/<專案資料夾>/db.sqlite3
## Ex:
## sudo chmod 664 ~/DjangoBLOG/db.sqlite3

第 3/5 步: 讓 apache2 可以存取 db.sqlite3

1
2
3
sudo chown :www-data ~/<專案資料夾>/db.sqlite3
## Ex:
## sudo chown :www-data ~/DjangoBLOG/db.sqlite3

第 4/5 步: 讓 apache2 可以存取專案資料夾

1
2
3
sudo chown :www-data <專案資料夾>
## Ex:
## sudo chown :www-data djangoBLOG

第 5/5 步: 讓 apache2 可以存取專案設定資料夾

1
2
3
sudo chown :www-data <專案資料夾>/<專案設定資料夾> #專案資料夾/專案設定資料夾
## Ex:
## sudo chown :www-data djangoBLOG/DjangoBLOG #專案資料夾/專案設定資料夾

10. 靜態檔案生成與集中

1
2
source ~/django_env/bin/activate
python ~/<專案資料夾>/manage.py collectstatic

上述指令會將整個專案的靜態檔案,打包至指定資料夾,過程中會再次進行確認。
提示介面請輸入 yes 進行收集,而非輸入 y

11. 專案部屬時需要調整程式碼

  1. <專案資料夾>/<專案設定資料夾>/wsgi.py

    wsgi.py
    1
    2
    3
    4
    5
    6
    7
    import os

    from django.core.wsgi import get_wsgi_application

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoBLOG.settings")

    application = get_wsgi_application()
  2. <專案資料夾>/<專案設定資料夾>/settings.py

    settings.py
    1
    2
    3
    4
    5
    6
    7
    # ... (略) ...
    # allowed host 需修改為 "*" 主機才會允許任何IP的連線
    ALLOWED_HOSTS = ["*"]

    # ... (略) ...
    # 加入於檔案的結尾
    SECURE_CROSS_ORIGIN_OPENER_POLICY = None

留言