---
# System prepended metadata

title: 執行計畫的思考脈絡
tags: [Thinking]

---

---
GA: G-W3D79QQKQ3
tags: Thinking
---
# 執行計畫的思考脈絡

## 前言

:::info
本文連結僅為示意，沒有反應是正常的
:::

- 旨在分享軟體工程師在工作上的思考脈絡，我會盡力將情境描述正確。
- 期望能提供一個思考脈絡，啟發工作夥伴。
- 小團隊初期需要驗證想法的可能性時，有些會採用 MVP 的方式進行軟體設計開發，在成本考量之下，可能會建立一台虛擬主機（Virtual Machine, VM）將所有服務都塞進去。
- 以開發方式來說，至少會分為兩個環境：開發環境與正式環境。有些團隊會再加上 `pre 正式環境` stage 環境。
- 本文情境是基於三個環境：
    - 開發環境: dev
    - pre 正式環境: stage
    - 正式環境: prod

### 情境

- 當業務需求及團隊成長到一個程度，一台 VM 無法負擔團隊所需，需要將 stage 及 prod 的資料庫與服務都獨立於該 VM，原 VM 緊作為 dev 使用。
- 團隊在初期使用 GCP 建立 GCE 作為 VM，裡頭有 dev, stage, prod 的資料庫及服務。
- 現在期望把 stage 與 prod 分別獨立成新的 VM，故 GCP 中，會從一台 GCE 變成三台 GCE。

## 思考脈絡

「將 dev server 上、非 dev 等級的任何服務，移出主機」之計畫，共有五個步驟：

1. 規劃
    - 制定出本五個步驟
    - 撰寫 [Plans](#Plans) 、 [TO-DOs (sorted)](#TO-DOs-sorted) 區塊
    - 撰寫以下內容
        - 要額外調整的 CI 相關事宜： [Trello Card 名稱](Trello Card 網址)
        - 事後要移除的程式碼： [#remove unnecessory code - this HackMD](#remove-unnecessory-code)
2. 分階段驗證
    - 共有階段
        - For staging: `stage`
        - For staging: `db-stage`
        - For production: `prod`
        - For production: `db-prod`
    - 每個階段共有三大步驟
        - GCP: 設定 GCP 工作
        - prepare: 前置作業工作
        - online: 上線工作
    - 我們會希望將 `online: 上線工作` 步驟儘可能地簡化，並努力降低執行時間，甚至希望能夠做到 zero downtime
3. 整合驗證
    - 重複執行 `2. 分階段驗證` ，並持續調整 `1. 規劃` 、`2. 分階段驗證` 步驟內容
    - 決定將不同階段拆解為獨立 HackMD 文件，並在標題增加預計執行時間長度
4. 整理出執行順序
    - 調整 [TO-DOs (sorted)](#TO-DOs-sorted) 區塊內容
    - 保持每個階段文件的內容一致性
5. 依照 [TO-DOs (sorted)](#TO-DOs-sorted) 區塊執行

### 文件結構

- Wrok flow for staging and production
    - 思考脈絡
    - TO-DOs (sorted)
    - Plans
        - plan: create GCEs
        - plan: CI flow
    - For staging: stage
        - GCP: (5 mins) create GCE
        - GCP: (2 mins) static IP
        - GCP: (ignore) Firewall
        - prepare: (10 mins) init GCE
        - prepare: (3 mins) GCE can access GitLab
        - prepare: (5 mins) install Nginx
        - prepare: (5 mins) install Node.js and NPM
        - prepare: (30 mins) install stage.fio.one
        - online: (5+ mins) update DNS, server-config
        - online: (10 mins) install SSL Certificates and with cronjob
    - For staging: db-stage
    - For production: prod
    - remove unnecessory code in repositiry

