🚀 從零打造自己的 AWS 股票看盤網站:EC2 + Ubuntu + Docker + Nginx + Node.js + K 線
最近想自己做一個可以放在網路上使用的股票 Dashboard,所以乾脆從零開始架一台 AWS EC2,自己建立 Linux Server,再把 Docker、Nginx、Node.js 和股票 API 串起來。
最後做出來的東西包含:
-
🇹🇼 台股即時股價
-
🇺🇸 美股即時股價
-
📈 股票 K 線
-
🔍 股票查詢
-
➕ 網頁新增股票
-
🗑️ 網頁刪除股票
-
📝 記事本
-
🧮 計算機
-
🔄 自動更新
-
🌐 使用瀏覽器直接開啟
-
🐳 Docker Container 化
-
🔀 Nginx Reverse Proxy
而且整套不是架在自己的電腦,而是放在 AWS EC2 上。
一、先了解最後的架構
最後整個系統大概長這樣:
使用者其實不需要知道 Node.js 的 3000 Port。
瀏覽器只需要:
Nginx 收到請求之後,再把 /api/... 的請求轉給 Node.js。
二、建立 AWS EC2
首先在 AWS 建立 EC2。
我選擇:
建立完成後會取得:
例如:
這個就是之後從 Windows 瀏覽器連進去的地址。
三、Windows 登入 Ubuntu
Windows 可以直接使用 SSH。
例如:
成功後會看到類似:
這代表已經進入 AWS EC2。
四、第一次遇到的 Linux 權限問題
一開始執行:
結果出現:
原因很簡單。
Ubuntu 一般使用者不能直接修改系統套件。
所以改成:
以及:
這是一個很常見的 Linux 初學者問題。
五、安裝 Docker
接下來安裝 Docker。
安裝完成後確認:
以及:
如果兩個都有版本號,就可以開始建立網站。
六、建立網站目錄
我把整個專案放在:
結構如下:
這樣前端和後端可以分開管理。
七、建立 Node.js API
Node.js 負責:
例如:
八、Dockerfile
Node.js 使用 Docker 包起來。
這樣 Node.js 就不需要直接安裝在 Ubuntu 主機上。
九、package.json
使用 Express:
十、第一次遇到 Docker 問題
一開始執行:
結果:
這個錯誤其實非常直接。
Docker Compose 找不到:
後來確認專案結構:
問題就解決了。
這也提醒了一件事情:
Docker 出錯時,不要只看最後一行,先確認檔案結構。
十一、股票 API
後端使用 Yahoo Finance Chart API 取得資料。
例如:
台股則可以使用:
台灣加權指數:
美國主要指數:
十二、即時股價 API
自己建立:
例如:
API 回傳:
這樣前端就不用直接碰 Yahoo。
架構變成:
十三、最重要的 K 線 API
一開始網站可以看到股價,但是:
K 線完全沒有。
後來發現前端呼叫:
但是 Node.js 根本沒有這個 API。
所以瀏覽器得到:
這就是非常典型的:
前端已經寫好了,但後端沒有對應 API。
後來在 Node.js 加入:
讓它支援:
例如:
成功之後會得到:
前端再把這些資料畫成 K 線。
十四、又遇到一個很有趣的 Docker 問題
有一次:
結果:
但是:
卻顯示:
注意這兩個不是同一件事情。
代表:
Container 裡面有 3000 Port
不代表:
已經開放。
十五、直接從 Container 裡測試
於是改成:
結果:
這就證明:
Node.js 本身是正常的。
而且:
也確認 Node.js 正在監聽:
十六、為什麼最後不用開 AWS 3000 Port?
因為我們使用 Nginx。
外部:
Nginx:
再轉:
所以 AWS Security Group 只需要讓網站使用:
Node.js 的:
不需要直接暴露給 Internet。
這樣反而比較安全。
十七、Nginx 的角色
Nginx 在這個專案裡做兩件事。
第一:
第二:
例如:
會被轉給:
而:
則直接提供:
十八、最後做出 Dashboard
前端最後整合:
十九、增加網頁直接管理股票
後來又增加:
以及:
例如直接輸入:
就可以新增。
股票清單則存在:
因此不需要每次修改 Server。
二十、記事本
又加入一個簡單的記事本:
可以記錄:
資料存在瀏覽器的:
二十一、計算機
Dashboard 裡面也加入:
支援:
所以看股票的時候可以直接計算:
或:
二十二、目前完成的系統
到目前為止,這個小專案已經變成:
這已經不是單純的 HTML 網頁,而是一個真正的:
前端 + API Server + Reverse Proxy + Docker + Cloud Server
的小型 Web Application。
二十三、後來又準備加入即時新聞
下一步準備加入:
架構會變成:
新聞 API Key 不直接放在 HTML,而是放在 Docker 的:
例如:
這樣比較不容易把 API Key 直接暴露在前端。
二十四、這次最大的收穫
這次最大的收穫其實不是做出一個股票網站。
而是第一次完整走過:
每一層都有可能出問題。
例如:
Linux 權限
解決:
Docker 找不到 Dockerfile
解決:
Node API 不存在
解決:
Container Port 問題
解決:
直接從 Container 裡確認 Node.js。
最後確認 API
看到:
那一刻就代表:
我的 Node.js API 真的跑起來了。
二十五、下一步可以做到什麼?
目前這個架構還可以繼續往下發展。
例如:
到這裡,就可以開始把它從「自己玩的股票 Dashboard」,慢慢變成一個真正的個人投資資訊平台。
結語
這次最大的感覺是:
自己架 Server 沒有想像中難。
真正困難的是第一次遇到錯誤時,不知道問題到底在:
但只要一層一層拆開測試,其實就能慢慢找到問題。
例如:
看 Container。
看 Node.js。
測 API。
直接進 Container 測試。
這幾個指令,對之後維護 Docker Server 會非常常用。
最後從一台空白的 AWS Ubuntu:
一路做到可以直接用瀏覽器看台美股與 K 線。
這就是自己從零架一個 Web Application 最有趣的地方。 🚀