GCP與Node.js環境建置與部屬 & 建置MongoDB
===
##### 採用"VSCode"作為文字編輯及專案管理工具
## GCP虛擬機建立
1. 建立google 帳號
2. 進入google cloud platform
3. 建立新專案,為此次專案部署伺服器(也可以多個專案共同使用同一台虛擬機)
4. 開啟"Compute Engine"
5. 選取"VM執行個體",以建立虛擬機
6. 建立
7. 設定虛擬機資訊(包含名稱、架設區域、開機磁碟(作業系統)、記憶體大小、CPU個數),依據申請的虛擬機設備有不同的計價方式
8. 設定完成後,若有固定ip的需求,可以到"VPC網路","外部IP位址"將此虛擬機的類型設定為"靜態"
9. 此時,這台虛擬機在網路上就有固定的ip可以連上他
*==ip表示這台電腦在網路上的絕對位置,不會有人跟他重複==*
## 本機建置Node.js環境
1. 下載Node.js (https://nodejs.org/en/)
2. 安裝
3. 選擇並建置本次專案資料夾
4. 於專案資料夾中執行terminal指令"$npm init -y",(初始化node.js的套件管理工具,並對後續要求皆選擇yes)
5. 專案資料夾中會創建package.json
6. 安裝"express套件"框架
7. "$npm i express -S",(安裝express套件,並將之寫入package.json中)(-S : -save)
8. 於"package.json"中可以看到"dependencies"中有"express"與其版號,其主要的用意是大家都是相同的套件,在上傳專案的同時可以將套件排除,當專案有需要用到此套件時,再依據此套件與版號,於網路上下載即可
9. 於專案資料夾中建立"index.js"檔案,內容如下
```javascript=
// 比較像是java中把express import進來的意思
const express = require('express');
const app = express();
// 在本機端開啟一個連接阜(port),可以供外部連結本機
app.listen(3000, () => {
console.log('listening on' + 3000);
});
```
10. "$node index.js",以nodejs執行index.js這個檔案
11. 於自己的網址輸入本機網址"127.0.0.1:3000",確認是否有連上
12. 本機後端部署完成
## 將本機ssh金鑰與GCP環境連結
1. 於terminal中輸入"$ssh-keygen -C *你的使用者名稱*"
2. 執行完成後,於本機中會有"Users/*電腦使用者名稱*/.ssh/id_rsa"(windows須自己創建)(macOS會自動新建)
3. 回到GCP中
4. 選擇"Compute Engine"中的"中繼資料"
5. 選擇"SSH金鑰"
6. 編輯並新增項目
7. 將本機中"id_rsa.pub"以文字編輯器開啟,其中的資料完整複製至此並儲存
8. 回到本機專案資料夾中
9. 於terminal輸入指令"$ssh *你的使用者名稱*@*你的虛擬機ip* -p 22 -i \"*你的金鑰於本機的儲存位置*\""
```
可能會長得如下
ssh {{你的使用者名稱}}@{{你的ip}} -p 22 -i \"/Users/{{你的使用者名稱}}/.ssh/id_rsa\"
===============================================
-p 22 : 表示ssh通訊協定所使用的連接阜(port)
-i 金鑰位置 : 要連上虛擬機,需確認登入的人員是誰
```
(補充)
若是覺得每次都需要打這些指令太麻煩,也能夠於"package.json"中"scripts"的位置,打上自己的腳本,快速呼叫指令("$npm run *你的腳本名稱*")
```json=
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
// 連上server
"ssh": "ssh {{你的使用者名稱}}@{{你的ip}} -p 22 -i \"/Users/kj/.ssh/id_rsa\"",
// 開啟要執行的檔案
"start": "node index.js"
},
```
10. 於vscode中點擊F1快捷鍵,選擇"SFTP : config" 選擇本次專案資料夾,於專案資料夾中會建立".vscode/sftp.json"
```json=
{
"name": "My Server",
// 你的虛擬機ip
"host": "{{你的ip}}",
"protocol": "sftp",
"port": 22,
// 你的使用者名稱
"username": "{{你的使用者名稱}}",
// 私鑰的路徑
"privateKeyPath": "~/.ssh/id_rsa",
// 遠端的資料夾路徑
"remotePath": "/home/{{你的使用者名稱}}/server",
// 排除不上傳的檔案
"ignore":[
"**/node_modules",
"**/.vscode"
]
}
```
11. 將本機檔案上傳至虛擬機(sync local -> remote)(藉由sftp傳輸協定)
11. 於terminal輸入指令"$npm run ssh",連上server
## 伺服器端建置Node.js環境
:::info
若是已經於本機端建置好專案,並已將專案推送至安裝好環境的伺服器
可以直接於專案資料夾中執行指令"$npm i"
將專案所需套件下載至專案資料夾中
:::
1. 接續上一個part連接上server
2. 於server的terminal上執行指令
3. "$curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -"
4. "$sudo apt-get install -y nodejs"
5. 將本機端檔案推送至伺服器(Sync local to remote)
6. 同樣於伺服器端的terminal輸入指令"$sudo apt-get install lsof"
:::info
// 查看目前對外監聽TCP的服務
sudo lsof -i | grep TCP
// 查看指定port目前之監聽狀況
sudo lsof -i -P -n | grep :3000
:::
==設定伺服器對外的連接口==
7. 因為此次專案是用port 3000,所以必須在server端的port 3000開啟一個可以供外部連線的接口,想要使用此專案服務的使用者才能夠連上
8. 回到GCP,"VPC網路"中"防火牆規則"
9. "建立防火牆規則",填入"名稱"、"目標代碼"、"來源ip範圍(0.0.0.0/0)"、"指定的通訊協定和通訊埠(打勾tcp填入3000)"
10. 再來回到"VM執行個體"後編輯,網路標記的部分加入剛剛設定好的"目標代碼"接著儲存。(此步驟將虛擬機的外部連接規則加入我們剛剛設定好的防火牆規則,讓他的port 3000可以供外部連線)
12. 接著回到伺服器中的專案資料夾
13. 伺服器中的terminal執行"node index.js"
14. 接著就可以於自己的網址欄中輸入虛擬的的ip,再連上port 3000,只要不是無法連上,即表示部署成功
## 伺服器端永遠執行程式
(待補)
## 拆分專案架構
主要拆分為routes、controllers、models、config
* routes:管理所有路由路徑(根路由/路由/路由/路由...),依據url會導向不同的位置,執行不同的api。
* controllers:管理所有連接到此網址所要做的事,針對不同路由下,每個request會有什麼樣的response
* models:用於管理資料的型態以及身上的方法(其中屬性都為基本型態{String、Number、Boolean...})
* config:管理此專案基本配置的資訊
```javascript=
/* 專案的index.js */
// 表示此專案的根路由是從"/api"開始
app.use('/api', router);
```
```javascript=
/* routes/index.js */
// 此路由會階層式進入"/api/test"
router.use('/test', testRoute);
```
```javascript=
/* routes/testRoute.js */
// 經由上兩個步驟會藉由testRoute進入到"/api/test/a"
// 執行 testController身上的"a"方法
// 使用者必須採用 get 的方法向目標網址發出request
router.get('/a', testController.a);
```
```javascript=
/* controllers/testController.js */
// 根據送來的request以及身上的參數,判斷是否有符合規範
// 若有,給予相對應的response,使用者也能夠得到正確的回應
// 若無,使用者無法得到想要的回應,但同樣要給予response,否則連線無法結束,直到time-out斷線
const a = (req, res, next) =>{
if(req.body.id != "kj"){
res.json({status: 1, msg: 'error id'});
}else{
res.json({status: 1, msg: 'hello ' + req.body.id});
}
};
```
## MongoDB
1. 申請"mongoDB.Atlas"帳號
2. 選擇一個架設虛擬機的公司(aws、gcp、azure)以及虛擬機所在位置
3. 選擇免費方案後創建資料庫
4. 左方菜單選擇"Database Access",創建管理者,並給予管理權限(admin/admin)(read/write),可讀寫所有資料庫
5. 左方菜單選擇"Network Access",設定ip白名單,表示只有符合此名單的ip可以連上此資料庫(在此對所有ip開放{設定"0.0.0.0/0"})
6. 設定完成回到左方菜單"Cluster",進入後選擇"CONNECT","Connect Your Application",Driver:"Node.js"、Version:"3.0 or later",並將下方"Connection String only"中的文字中複製起來
7. 回到專案中的設定檔"config/index.js"中,將之加入
```javascript=
const config = {
port: 3000,
mongodb: 'mongodb+srv://admin:{{你的密碼}}@cluster0-XXXX.gcp.mongodb.net/test?retryWrites=true&w=majority'
}
```
==此次專案採用第三方套件"mongoose"來連結資料庫==
8. 至專案資料夾中的terminal中輸入指令"$npm i -S mongoose",加入此次專案資料夾中,並將使用到的此套件紀錄於package.json中
## Vue環境建置(本機端)
1. terminal輸入指令"$npm i -g @vue/cli"
2. 進入專案資料夾中,輸入指令"$vue create *想要的資料夾名稱*"
3. 會在專案資料夾中創建出"想要的資料夾"
4. 進入"想要的資料夾"中(同樣有package.json有預先寫好的scripts以及dependencies)
5. 輸入指令"$npm run serve",會於本機端port:8080開啟網頁
6. 輸入指令"$npm run build",會於"dist"資料夾中創建出"index.js",表示此為網頁的入口
## Vue環境建置(伺服器端 ubuntu)
1. 連上伺服器
2. 先更新apt抓取套件的工具,"$sudo apt update"
3. 抓取"nginx",terminal輸入指令"$sudo apt-get install nginx"
4. 到伺服器根目錄下(/etc/)
###### tags: `js` `server` `gcp` `mongodb`