### 從gitlab git clone程式碼 由於是private repo,因此需要[access token](https://docs.gitlab.com/topics/git/clone/),這裡使用personal access token 點開左上方的個人圖像-> Edit profile-> Access tokens,創建一個token 使用以下的方式 clone ``` git clone https://<username>:<token>@gitlab.example.com/tanuki/awesome_project.git ``` ### 切換git branch 以下指令會clone所有branch,並將你現在的branch設定成你指定的 ``` git clone -b <branchname> <remote-repo-url> ``` 切換到該branch * -c 可以創造branch並直接切換 ``` git switch <branchname> ``` 查看本地branch ``` git branch ``` 刪除本地 branch ``` git branch -d 分支名稱 ``` -d 是 "delete",會在刪除前檢查該分支是否已合併到目前分支或其他分支。 若你確定要強制刪除(即使未合併): ``` git branch -D 分支名稱 ``` ### 使用branch 抓取遠端最新分支列表 ``` git fetch ``` 查看所有遠端分支 ``` git branch -r ``` 建立一個本地分支追蹤遠端分支 ``` git checkout -b 本地分支名稱 origin/遠端分支名稱 ``` 刪除遠端 branch ``` git push origin --delete 分支名稱 ``` 這會通知 Git server(如 GitHub、GitLab)刪除該遠端分支。 如果刪除後仍看到遠端分支殘留在本地 cache,可執行: ``` git fetch -p ``` ### 在容器壞境內開發 在容器環境內開發,本地就不用再安裝環境,需要的做法如下: 1. 安裝nodemon,當檔案有變動會自動重啟nodejs 2. 將檔案直接映射到容器內(透過 volumes) 3. 可以設定nodemon.json,當某種檔案有變動就會自動重啟 api-gateway的Dockerfile內容 ```dockerfile= FROM node:22-slim WORKDIR /app COPY ./api-gateway/package*.json /app RUN npm install # 在容器環境內開發,本地不用安裝環境 (開發用) # ========== RUN npm install -g nodemon # ========== RUN mkdir -p /member/protos COPY ./api-gateway /app COPY ./member/protos /member/protos EXPOSE 9000 # 在容器環境內開發,本地不用安裝環境 (開發用) # 用 nodemon 啟動你的 app(根據你的進入點名稱),加上 --legacy-watch 是因為部分系統對檔案變更監控有問題 # ========== CMD ["nodemon", "--legacy-watch", "index.js"] # ========== #CMD ["npm", "run", "start"] ``` dokcer-compose file 1. 透過volumes將本地資料夾映射到容器內 2. 由於我們是先將檔案複製到/app中並npm install,如果再../api-gateway:/app會把/app的內容覆蓋掉,因此我們要加上/app/node_modules避免被覆蓋掉 ```yaml= services: member: image: ntcupj/member:dev ports: - "7700:7700" environment: DB_TYPE: LITE api-gateway: build: context: ../ dockerfile: ./api-gateway/Dockerfile ports: - "9000:9000" depends_on: - member environment: JWT_SECRET: th1siSjwTseCReT4Test1n9 MEMBER_HOST: member # 開發用,將目錄掛載到容器中 # ========== volumes: #volumes - ../api-gateway:/app # 掛載本地程式碼(主程式) - /app/node_modules #避免node_modules被覆蓋 # ========== ``` nodemon.json的設定 * watch 指的是要監控的目錄 * ext 當那些檔案被修改時要執行指令 * ignore 略過那些檔案 * exec 執行的指令 ```json= { "watch": ["."], "ext": "js,json", "ignore": ["node_modules"], "exec": "node index.js" } ``` ### docker build 指令 (目前用不到) 目錄結構如下 ``` #指令: tree . ├───api-gateway │ ├───src │ │ ├───grpc │ │ ├───middleware │ │ └───routes │ └───tests └───member ├───database ├───generated ├───member ├───protos └───tests ├───integration └───unit ``` Dockerfile 內容(位置: src/api-gateway/Dockerfile) ```dockerfile= FROM node:22-slim WORKDIR /app COPY ./api-gateway/package*.json /app RUN npm install --omit=dev RUN mkdir -p /member/protos COPY ./api-gateway /app COPY ./member/protos /member/protos EXPOSE 9000 CMD ["npm", "run", "start"] ``` 我們使用以下指令: * --no-cache 不使用cache,如果build有出問題可以用個把之前錯誤的cache清掉比較保險 * -f 要build的Docker file * -t image的名字 * . 建構目錄(build context),要讀到src/member/protos因此不能在src/api-gateway跑 ``` #在 src/ 執行 docker build --no-cache -f .\api-gateway\Dockerfile -t api-gateway . ``` ## 活動資料收集模組 ![image](https://hackmd.io/_uploads/SyCe2KeDxg.png) `activity` 資料夾主要負責會員(Member)相關的資料庫操作與 gRPC 服務,功能如下: - **models.py** 定義了會員資料表的 ORM 模型 `Member`,包含欄位:uid(UUID主鍵)、account(帳號)、password(密碼)、name(姓名)、email(電子郵件)。 - **service.py** 實作會員的業務邏輯,包括: - 密碼加密與驗證(`hash_password`, `verify_password`) - 註冊(`sign_up`):新增會員資料,若帳號或 email 重複則丟出錯誤 - 登入(`login`):驗證帳號與密碼 - 依 UUID 查詢會員(`get_user`) - **servicers.py** 實作 gRPC 服務端,將 service.py 的功能包裝成 gRPC API,包括: - `SignUp`:註冊會員 - `Login`:會員登入 - `GetMemberByID`:依 UUID 取得會員資料 - 例外處理(如帳號重複、認證失敗、找不到會員等) - **logger.py** 提供自訂的 logger 工具,可根據環境(DEV/TEST/PROD)輸出不同格式的 log(純文字或 JSON)。 - **__init__.py** 讓此資料夾可作為 Python 套件匯入。 總結:這個資料夾負責會員資料的資料庫操作、密碼安全、gRPC API 服務,以及 log 管理。