---
title: "德國網站上線 - 佈署到正式環境，遇到比較特別的技術問題"
description: "記錄德國電商網站上線前兩週遇到的四個特殊技術問題：WSL 核心過舊、Strapi 映像檔過大、Docker DNS 異常，以及 SQL Server TLS 版本不相容。"
canonical_url: "https://blog.markkulab.net/post/germany-website-go-live-encountered-special-technical-problems"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2024-07-06 01:01:35 +0800"
category: "DevOps"
tags: ["devops", "docker", "dns", "sql server", "tls", "windows server", "deployment", "troubleshooting"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

# 德國網站上線 - 佈署到正式環境，遇到比較特別的技術問題

## 時空背景
問題發生在德國網站的系統上線前兩週，開始準備一些Live環境所發生的一系列問題，做個記錄。

### Windows Subsystem for Linux 核心過舊
在上線前兩週，開始建置德國網站生產環境的CICD時，然後發生Docker 一直建置不過，經過調查及測試，上網也查不到原因，因為外面公司比較少用window 當容器伺服器的主機，所以比較少會遇到，比較環境過後發現台灣的開發環境都架設在一台Win 11 上的Docker，而 Windows Server 2019 的內核是 Win 10， Linux 內核過會舊導致 Docker build 失敗，並在多次重裝和不同機器上的嘗試後仍未解決，但在台灣開發環境正常，一佈署到生產環境中卻反復出現 Docker Build 失敗，推測這可能與 Windows 的作業系統版本有關，Windows Server 2019 核心是對照 Win 10，Windows Server 2022 核心是對照 Win 11，最後在找了台 Windows 11 建構，建構完推到正式環境。  

因為美國機房缺少 Windows 11 內核的伺服器版本，最後從美國的生產線借了一台伺服器虛擬 Win 11 的虛擬主機做CICD，推送映像檔到美國的機房。

### Strapi 版本更新頻繁，建構過程一直出錯，且映像檔過大
我們的 CMS 採用的是 Strapi，但由於 Strapi 版本迭代的速度太快，相依的套件使用 yarn 時遇到插件無法正確識別的問題，因解決此問題，後來轉而使用npm 來安裝套件。  

先前提到從美國的生產線借了一台伺服器虛擬主機 Win 11 做CICD，但從美國的辦公室要將映像檔佈署到 IDC 的生產環境，雖然一樣在加州，還是有點距離，為了提高網絡傳輸速度，改使用輕量版的node (node:18.17.0-alpine3.18) 映像將檔案大小從 3.8 GB 壓縮至 1.5 GB。  

![image](https://blog.markkulab.net/content/markku/posts/germany-website-go-live-encountered-special-technical-problems/images/after-image-resize.png)

### Docker 容器中 DNS 查詢異常
在所有環境部署完成後，Docker 容器的 DNS 查詢出現異常，錯誤訊息如下：

```
Error fetch multi lang data, fallback to local file, environment: production, error: {"cause":{"errno":-3001,"code":"EAI_AGAIN","syscall":"getaddrinfo","hostname":"e645f404c07e0ac86.ibuypower.com"}}
```

我們都知道DNS 主要是用於解析 IP 和域名的服務，Dcoker 的特性，為了把作業系統，網路環境隔離，因此並不會直接繼承宿主主機的DNS ，透過以下設定解決容器無法解析 DNS 伺服器的問題：
```
  "dns": [
    "8.8.8.8",
    "1.1.1.1"
  ],
```

![Docker DNS setting](https://blog.markkulab.net/content/markku/posts/germany-website-go-live-encountered-special-technical-problems/images/docker-dns-setting.png)

### SQL Server 版本過舊，在staging 是正常的，上live 就遇到問題 
```
Error: Client network socket disconnected before secure TLS connection was established 
```
在佈署當天，應徵程式佈署完後，程式一直出現 TLS 相關的的錯誤，比較了測試環境是 SQL Server 2017 ，德國網站正式環境的的資料庫是 SQL Server 2016 ，而SQL Server 2016 是使用過時的 TLS 1.0，導致新應用程式無法通過 TLS 驗證，為解決此問題，將 SQL Server 升級至 SQL Server 2017，導致部署時間延長三小時。

### 頁面渲染卡住
當我們將網站上線後，發現有些頁面偶爾會卡住，我們都知道 Next.js 採用伺服器渲染技術，如果有Index API Now任一 API 回應過慢或未能返回，頁面渲染就會被卡住，經過一番埋Log 及分析後，發現是因為多語系 API 的請求頻率過高導致了 SharePoint 拒絕請求，為了解決這個問題，我們最終決定將 Office 365 的多語系寫入 Redis 快取，這樣不僅解決了請求頻率問題，也顯著提升了頁面的加載速度和穩定性。

## 總結
技術事後在回顧都會覺得很容易，但當下要查出關鍵原因，準時上線，都不是這麼容易事，光這麼多 DevOps 問題，要如期上線，我自己就加班兩週以上，最終，歷經了各種困難，終於德國間在7/1 上線，在這些挑戰中學到，使用 Windows Server 環境時，應保持系統及其組件更新至最新版，以避免類似的技術問題。

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/germany-website-go-live-encountered-special-technical-problems)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
