xu3cl40122 / go-court-service

0 stars 0 forks source link

dev log #5

Open xu3cl40122 opened 3 years ago

xu3cl40122 commented 3 years ago

打算部署 comment-service 發現 build 出來的 docker image 竟然 1G 以上 ,需要縮減 image size

xu3cl40122 commented 3 years ago

猜測是受限記憶體大小之類的,目前沒辦法在 ec2 上面 build ,只好採用 local build => docker hub => ec2 pull 的流程。 要更新 docker -compose 內的 image version 難免會影響 compose 內其他 container,預計把 nginx 搬出來,以免被波及

xu3cl40122 commented 3 years ago

雖然說 container 間可以透過 network 互相溝通,但是跨 compose file 還需要先建立 public network 之類的有點麻煩, 後來想說反正都會把 port export 到 host ,不如就用 host:xxxx port 連接比較簡單明瞭

在 windows, mac 上可以用 host.docker.internal 存取到 host 的 ip 在 linux 上有人說需要在 compose file 設定

 extra_hosts:
      - "host.docker.internal:host-gateway"

我自己測試是沒辦法,但是用 172.17.0.1 就可以莫名連的到

參考資料 https://stackoverflow.com/questions/48546124/what-is-linux-equivalent-of-host-docker-internal https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

xu3cl40122 commented 3 years ago

nestjs 跑起來時好像沒有預設的環境變數,像是 NODE_ENV=PRODUCTION 之類的 必須自己加,目前是加在 package.json 的 script "start:dev": "export NODE_ENV=development && nest start --watch " 如果是跑在 winodws 環境 export 可能要改成 SET

參考資料 https://github.com/nestjs/nest/issues/2174

xu3cl40122 commented 3 years ago

comment-service build 出來的 image 在 local 可以跑,丟到 ec2 上面卻說找不到 dist/main 之類的 懷疑是 Dockerfile 問題,先 copy gc-service 的 Dockerfile 來用(因為 gc-service 是會動的) 但包了好幾次還是不行(中間清快取 清環境 無限循環 ...)

後來懷疑是 window , linux 環境問題,用 wiindows 筆電 pull 下來發現也不能跑而且 image 裡面根本沒有 dist/ 所以其實 build 出來的 image 根本不能用,是因為開發環境有把當前資料夾 volume 進去才有 dist 可以執行

 volumes:
     - .:/usr/src/app
     - /usr/src/app/node_modules

所以參考網路上教學改一下 Dockerfile https://dev.to/abbasogaji/how-to-dockerize-your-nestjs-app-for-production-2lmf

並在 production 不啟用 volume 就可以了

xu3cl40122 commented 3 years ago

可以成功部署後該把流程寫成 script 流程大概是 local build image => push to docker hub => ec2 pull new image => docker-compose restart 原本以為可以直接這樣

docker build -t xu3cl40122/comment-service -f .\Dockerfile.prod .
docker push xu3cl40122/comment-service
ssh  -i  ec2 
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d --remove-orphans
docker image prune -f

但是 ssh 到 ec2 指令就會中斷,目前解法是把要在 ec2 上執行的指令寫成 .sh 丟到 ec2 上,ssh 的時候直接指定該 script

# 在 local 的指令... 
ssh  ec2-user@ec2 sudo bash {path_of_script}
xu3cl40122 commented 3 years ago

nginx 設定上傳檔案大小 到 /etc/nginx/nginx.conf 設定 client_max_body_size 20M;

ref https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/

xu3cl40122 commented 3 years ago

開始寫 api spec,發現 nestjs 可以動態產生 spec ,其實也是要寫啦,就是在 controller 跟 dto 那邊加上一些 tag 這樣, 比較特別的部分應該是產生分頁的 response

ref: https://github.com/nestjsx/crud/issues/114

xu3cl40122 commented 3 years ago

開始寫測試,一開始卡在不知道如何 mock 依賴的東西,後來才看到要用 getRepositoryToken 來 mock Repository。 接著卡在不知道怎麼 catch throw 出來的 exception。 後來試出來怎麼測試丟出來的 exception 是不是預期的

 await expect(() => gamesController.initGame(req, game_id))
        .rejects.toEqual(new HttpException('only admin or host user can init game', HttpStatus.FORBIDDEN))

ref: https://stackoverflow.com/questions/54204720/how-to-unit-test-exception-thrown-in-typescript-classs-constructor-in-jestjs

xu3cl40122 commented 3 years ago

今天測試如何透過 typorm cli 來進行 db migration,因為在正式環境不適合開啟 ORM 的同步機制,有機率造成資料損毀。 本來想寫成 docker container 啟動時 cmd 執行 shell script 會自動 migration 的,但是卡關,目前還是需要手動 migration

更新解法

typeorm.config 有一項 "migrationsRun": true, 可以設定,會在啟動 server 時執行指定資料夾內的 migration, 至於產生 migration 的部分把指令寫在 docker compose command 的 shell script 裡,

#之前好像是因為後面的參數用縮寫導致 cli 會再問一些問題使 script 沒有順順跑完,所以建議不要縮寫
npx typeorm migration:generate --name mg --outputJs
npm run start:prod
xu3cl40122 commented 3 years ago

遇到神奇 bug deploy shelll script 突然不能跑了, 一開始先重開 asw ec2 => 沒用 後來發現是 shell script 裡面有空白字元