今天跟大家介紹一下如何免費使用前後端託管服務,你只需要擁有一個Github帳號就可以惹~打通全端服務無須花費任何摳摳,成為人人稱羨的網路軟體工程師,9453~

最近簡單做一個Side project,我需要一個後端系統,串接Line Messaging API建立一個機器人,它可以在群組通知使用者上去填寫一些報表,而這報表是客製化的報表,所以需要一個前端畫面。正常來說這項目是要去租一個VPS去Hosting,但如今完全可以使用簡單免費的Hosting即可。而且直接跟Github做關聯。只要一個Commit,就自動部署上去了。你說是不是太方便了~


首先先介紹一下前端託管服務(Netlify)。

我想這服務大家應該不陌生。使用非常簡單,就是把靜態網頁Push到Github上,然後到https://www.netlify.com/註冊一個帳號,並連結Github帳號並授權給他權限,可以讀取你所要的靜態網站的Repo,netlify就會自動去偵測最新的Commit,只要有更動它就會去拉取最新的部署上去。

如何使用可以參考此篇文章

基本上你只需要一個index.html就可以部署上去了。當然建議新增一個favicon.ico。讓你的網站有小圖標喔~

實作上,我還是建議大家可以使用一個前端框架,這邊我是使用Vue,因為他可以幫你解決許多不必要的前端問題,以及輕量化所有js css檔案以及Request。你只要設定build的指令以及部署所屬路徑即可。設定也相當簡單,基本上netlify預設都幫你設定好了,如下圖:

按下面的Deploy site就一件部署完畢,部署完後你只要點Site overview就可以看到你的網址摟,點一下網址就可以看到你的網站了。之後只有Push任何一次commit都會觸發部署流程,超方便的啦。

還有一件事提醒,當你是用SPA(Single Page Aplication) 作為前端架構時,通常很多人都會使用Router來做到多頁切分。記得在你的repo root放入一個netlify.toml的檔案。檔案內容如下:

[[redirects]]
  from = "/*"
  to = "/index.html"
  status = 2

如此就可以使用vue的router功能,做到多頁顯示。以上是netlify簡單分享,真心推薦大家試試。


接下來介紹後端了,這個免費託管的東東叫做Okteto

它其實是一個k8s的服務管理服務。他有Self-Host和SasS服務。SasS服務有一個free的版本。擁有3GB的RAM,10個pod每個pod擁有1 core,還有5GB的storage。雖然效能看起來有點雞肋,但對於dev測試或是side project已經是非常夠哩。以下是Quota值:

選它最主要的原因是他是真的免費,不像很多雲服務上都是送幾小時的免費,到頭來就是希望你購買…。Okteto完全沒有但有一個限制,就是24小時沒有用它會自動scale in為0。你的服務會睡著,要再戳它一下才會起來。不過沒關係,山不轉路轉,後面會說如何破解…

STEP 1:
當然第一步就是需要新增一個Okteto帳號,可以直接用Github的帳後登入,你就會獲得一個namespce,也就是你的Github帳號名稱。這時候你要到你的Repo裡面新增一個後端專案。以下以NodeJS為例。

STEP 2:
簡單在Repo中新增兩個檔案,就可起一個最簡單的express後端服務,新增index.js。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(port, () => {
    console.log(`Example app listening on port ${port}!`)
});

再新增package.json。

{
  "name": "nodejs-backend",
  "version": "1.0.0",
  "description": "Simplest backend for nodejs.",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

在本機先跑一下npm i & npm start,若是有跑起來就表示服務起來摟~

SETP 3: 將服務容器化,就是新增一個dockerfile:

FROM node:16.13.1

WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
EXPOSE 3000
CMD npm start

在本機跑一下docker指令:

docker build --file Dockerfile --tag=nodejs-backend .

如果能夠build成功那就是容器化完成摟~你可以run一下嘗試連到本機的後端看看。

docker run -p 3000:3000 nodejs-backend

SETP 4:
最後一步就是新增部署檔案,有兩個檔案,一個是給Okteto吃的,一個是k8s吃的。
第一個檔案為okteto.yaml

build:
  frontend:
    image: okteto.dev/nodejs-backend:1.0.0
deploy:
  - kubectl apply -f k8s.yml
dev:
  frontend:
    command: bash
    sync:
      - .:/usr/src/app
    forward:
      - 9229:9229

細節不多做解釋,你只需要關注image後面的名稱,是否與你repo name一致就可以,我們這邊就叫做nodejs-backend,後面的版號是每次有新版的時候記得要去更動的。
第二個檔案是:k8s.yml
這個檔案很簡單,就是部署k8s服務的基礎物件,有Deployment Service Ingress即可,給出以下範例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-backend
spec:
  selector:
    matchLabels:
      app: nodejs-backend
  template:
    metadata:
      labels:
        app: nodejs-backend
    spec:
      containers:
      - image: okteto.dev/nodejs-backend:1.0.0
        name: nodejs-backend
---
apiVersion: v1
kind: Service
metadata:
  name: svc-nodejs-backend
  annotations:
    dev.okteto.com/auto-ingress: "true"
spec:
  type: ClusterIP
  ports:
  - name: nodejs-backend
    port: 3000
  selector:
    app: nodejs-backend
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ing-nodejs-backend
  annotations:
    dev.okteto.com/generate-host: nodejs-backend
spec:
  rules:
    - http:
        paths:
          - backend:
            path: /
              service:
                name: svc-nodejs-backend
                port:
                  number: 3000

好拉~大功告成,接下來就是一口氣把這些push上你的Repo,並在Okteto中去授權可以使用這個Repo即可。只要在首頁你的namespace裡面點選Launch Dev Enviroment並選擇你剛剛新增的Repo即可。

最後點一下Launch就會去跑docker run & apply k8s~真是太方便了。 全部跑完可以在那個環境下拿到一個endpoint,就可以用這個endpoit連到你的後端服務摟。Good Job!

PS: 記得以後更版okteto.yaml和k8s.yml裡面的版號都要變更喔~

差點忘了寫,那要如何讓你deploy的東西不sleeping呢?其實相當簡單,就是使用一個第三方的cron服務,定期每小時戳一下你的服務不要讓他睡著覺好了,這邊推薦cron-job.org。細節不多做介紹,已經夠簡單摟~其實之前有嘗試用k8s的CronJob,但依然還是會睡…真的非常汗顏 >_<