歡迎來到第二十二天!今天我們進入「產品正式上線」第一步:搭建穩定且可彈性擴充的生產環境與 CI/CD 自動化部署管線。
為了縮小容器 Image 體積並提升部署速度,我們採用 Docker 多階段建置:
# ===== 階段 1:Gradle 編譯打包 =====
FROM gradle:8.5-jdk17 AS builder
WORKDIR /app
COPY --chown=gradle:gradle . .
# 打包出包含所有相依套件的 Shadow JAR
RUN gradle shadowJar --no-daemon
# ===== 階段 2:Alpine 輕量化運行環境 =====
FROM eclipse-temurin:17-jre-alpine AS runner
WORKDIR /app
# 設定環境變數與容器 Port
ENV PORT=8080
EXPOSE 8080
# 僅複製編譯好的 JAR 檔 (體積從 800MB 縮小至 60MB!)
COPY --from=builder /app/build/libs/*-all.jar /app/game-backend.jar
# 建立非 Root 安全使用者
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/game-backend.jar"]
LINE LIFF 與綠界 Webhook 強制要求 HTTPS (TLS 1.2+) 傳輸協定:
# /etc/nginx/conf.d/game_platform.conf
upstream ktor_backend {
server 127.0.0.1:8080;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name api.yourstore.com;
ssl_certificate /etc/letsencrypt/live/api.yourstore.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.yourstore.com/privkey.pem;
location / {
proxy_pass http://ktor_backend;
proxy_http_version 1.1;
# 支持 WebSocket 長連接升級
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Tech Tip:傳統 Dockerfile 會把 Gradle SDK、原始碼與編譯快取全留在最終 Image 中(常超過 1GB)。透過 Multi-stage Build,第一個階段完成 JAR 打包後,第二個階段僅需基於輕量 JRE Alpine 複製
.jar檔,不但將 Image 壓至 60MB 左右,還能隔離原始碼,顯著提升安全性與 Cloud Run 冷啟動(Cold Start)速度!