iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
佛心分享-SideProject30

網頁遊戲_名字對決系列 第 23

Day23 - 安裝Docker,本地執行成功,一些筆記

  • 分享至 

  • xImage
  •  

接下來是將專案部屬到EC2上,這次選擇用Docker部屬,先確認能用的資源和要做的事:

AWS有一個專門儲存docker images的服務,叫做Amazon Elastic Container Registry,但是私有儲存空間免費的部分只有500MB,有可能不夠用,因此先不使用,而是將Docker直接放在EC2中。

由於EC2的免費空間只有5GB,放了專案和docker images後剩下不多,因此需要將資料庫儲存的資料放在Amazon RDS中來減少儲存壓力,有20GB的免費空間,相當夠用了。

首先新增dockerfile並執行:

# 使用官方 Rust 映像作為基礎
FROM rust:1.81.0 as builder

# 設置工作目錄
WORKDIR /usr/src/app

# 複製 Cargo.toml 和 Cargo.lock(如果存在)
COPY Cargo.toml Cargo.lock* ./

# 複製源代碼
COPY src ./src

# 複製 .env 文件
COPY .env ./

# 構建應用
RUN cargo build --release

# 使用 Debian bookworm slim 作為運行時基礎鏡像(提供 libssl3)
FROM debian:bookworm-slim

# 安裝 libssl3 和 ca-certificates
RUN apt-get update && apt-get install -y libssl3 ca-certificates && rm -rf /var/lib/apt/lists/*

# 複製構建好的二進制文件
COPY --from=builder /usr/src/app/target/release/battle_server /usr/local/bin/battle_server

# 複製 .env 文件
COPY --from=builder /usr/src/app/.env /.env

# 暴露端口
EXPOSE 8082

# 運行應用
CMD ["battle_server"]

在後端資料夾中執行docker build,之後如果有更新後端的話再執行一次即可,會生成一個新的images,舊的則是繼續存在,在生成新的images時,只會更新有改動的地方,因此只有第一次會跑比較久。

docker build -t battle_server .

執行docker run,然後執行docker ps -a可以看到目前正在運作中的docker:

docker run -d -p 8082:8082 --env-file .env battle_server
docker ps -a

但是這裡我執行docker ps -a沒看到任何docker正在運作,表示出bug了。
執行docker run -it查看錯誤訊息,上面用的docker run -d是後台模式,要看錯誤訊息就得去log查看,而-it的
-i 表示交互模式(interactive)
-t 表示分配一個偽終端(pseudo-TTY)
結合起來,-it允許你與容器的shell進行交互,就像在直接使用終端一樣,因此能直接看到錯誤訊息。
這裡提示找不到libssl.so.3,這是OpenSSL 庫的一部分,它提供了加密功能。許多 Rust 程序,特別是那些涉及網絡或加密的程序,都依賴於這個庫。
在dockerfile中安裝libssl3,在最上方的dockerfile是最終能正確執行的,因此已經添加了,就是「# 安裝 libssl3 和 ca-certificates」那一行,ca-certificates是之後遇到的另一個錯誤,一樣安裝完就解決了。

PS D:\program\fight_web_game\battle_server> docker run -it --rm -p 8082:8082 --env-file .env battle_server
battle_server: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

接下來遇到的問題是連不到資料庫,網頁上從資料庫取值的部分都失效了,於是使用RUST_BACKTRACE=1來執行,這是一個環境變量,用於在Rust程序崩潰時生成詳細的堆棧跟踪。
當設置為 1 時,它會顯示完整的調用堆棧,包括函數名稱、文件名和行號:

PS D:\program\fight_web_game\battle_server> docker run -it --rm -p 8082:8082 --env-file .env -e RUST_BACKTRACE=1 battle_server
thread 'main' panicked at src/main.rs:176:53:
called Result::unwrap() on an Err value: PoolTimedOut
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::result::unwrap_failed
   3: <tokio::task::local::RunUntil<T> as core::future::future::Future>::poll
   4: <core::pin::Pin<P> as core::future::future::Future>::poll
   5: tokio::runtime::scheduler::current_thread::CoreGuard::block_on
   6: tokio::runtime::context::runtime::enter_runtime
   7: tokio::runtime::runtime::Runtime::block_on
   8: battle_server::main
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.
PS D:\program\fight_web_game\battle_server>

可以看到問題是數據庫連接超時(PoolTimedOut),檢查DATABASE_URL,修改成docker本地開發的路徑,5432是PostgreSQL默認的port:

DATABASE_URL=postgres://username:password@localhost/database_name #之前本地測試時的
DATABASE_URL=postgres://username:password@host.docker.internal:5432/database_name #修改後的

接著遇到的問題是無法連線到ChatGPT的api,提示錯誤:

Error sending command: Error: HTTP error! status: 500, message: "Error sending request to ChatGPT: error sending request for url 

這是因為沒有安裝ca-certificates,一樣在dockerfile中安裝完就可以正常跑了。
clude.ai解釋ca-certificates:

ca-certificates 是一個包含了一系列可信任的證書頒發機構(Certificate Authorities,簡稱CA)根證書的軟件包。這些根證書用於在進行 SSL/TLS 連接時驗證服務器的身份。讓我們深入了解一下:

1. 什麼是 CA(證書頒發機構)?
   - CA 是負責發行和管理數字證書的實體。
   - 它們充當可信任的第三方,確保證書持有者的身份是真實的。

2. ca-certificates 的作用:
   - 提供一個預裝的受信任 CA 列表。
   - 使系統能夠驗證 SSL/TLS 連接的安全性。
   - 允許應用程序和服務確認它們連接到的是合法的服務器。

3. 為什麼需要 ca-certificates?
   - 沒有這些證書,系統將無法驗證大多數 HTTPS 連接的安全性。
   - 它們是建立安全網絡連接的基礎。

4. 在 Docker 中的應用:
   - 許多基礎 Docker 鏡像(如 debian:slim)預設不包含 ca-certificates。
   - 安裝 ca-certificates 可以確保容器內的應用程序能夠建立安全的外部連接。

5. 更新和維護:
   - ca-certificates 包會定期更新,以包含新的根證書和移除不再受信任的證書。
   - 保持這個包的更新對於維護系統安全性很重要。

6. 實際應用場景:
   - 當你的應用需要連接到 HTTPS 網站或 API(如 OpenAI API)時。
   - 進行安全的數據庫連接。
   - 使用加密的電子郵件服務。

7. 在你的項目中的重要性:
   - 安裝 ca-certificates 解決了你之前遇到的 SSL 證書驗證問題。
   - 它允許你的應用安全地連接到 OpenAI 的 API。

8. 安全性考慮:
   - 雖然 ca-certificates 提高了安全性,但它不能防止所有類型的攻擊。
   - 正確配置 TLS 和保持系統更新仍然很重要。

總的來說,ca-certificates 是現代網絡安全基礎設施的一個關鍵組件。它使得加密通信和身份驗證成為可能,這對於保護敏感數據和確保通信安全至關重要。在 Docker 容器中安裝它是一個良好的實踐,特別是當你的應用需要進行安全的外部網絡連接時。

上一篇
Day22 - 在本地裝nginx part3
下一篇
Day24 - 在ec2上執行docker part1
系列文
網頁遊戲_名字對決30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言