本文件詳細說明如何將 LINE Bot 靈感筆記專案部署到不同的平台,並確保敏感資訊的安全性。
在部署之前,請確保完成以下安全設定:
- ✅
.env檔案已加入.gitignore - ✅
config/google-credentials.json已加入.gitignore - ✅ 所有敏感資訊使用環境變數
- ✅ GitHub Secrets 已正確設定
- ✅ 依賴套件已更新到最新版本
創建生產環境的環境變數,永遠不要將這些值提交到 Git:
# LINE Bot 設定
LINE_CHANNEL_ACCESS_TOKEN=your_production_token
LINE_CHANNEL_SECRET=your_production_secret
# Google 設定
GOOGLE_SHEET_ID=your_production_sheet_id
GOOGLE_SERVICE_ACCOUNT_KEY_PATH=config/google-credentials.json
# 應用程式設定
FLASK_ENV=production
PORT=5000
SECRET_KEY=your_secure_random_secret_key
# 可選:Google Cloud Project
GOOGLE_CLOUD_PROJECT=your_production_project_id對於生產環境,建議使用以下方法之一來處理 Google 憑證:
將整個 JSON 憑證內容作為環境變數:
GOOGLE_SERVICE_ACCOUNT_JSON='{"type":"service_account","project_id":"...","private_key":"..."}'然後修改 config/settings.py 來支援此方法:
import json
import os
from google.oauth2.service_account import Credentials
def get_google_credentials():
# 優先使用環境變數中的 JSON
json_str = os.getenv('GOOGLE_SERVICE_ACCOUNT_JSON')
if json_str:
cred_dict = json.loads(json_str)
return Credentials.from_service_account_info(cred_dict)
# 備選:使用檔案路徑
key_path = os.getenv('GOOGLE_SERVICE_ACCOUNT_KEY_PATH')
if key_path and os.path.exists(key_path):
return Credentials.from_service_account_file(key_path)
raise ValueError("No Google credentials found")在部署時將憑證檔案安全地掛載到容器中,而不包含在映像中。
# 初始化 Git repository
git init
git add .
git commit -m "Initial commit: LINE Bot inspiration notes project"
# 添加 GitHub remote (替換為您的 repository URL)
git remote add origin https://github.com/blueforster/linebot-inspiration.git
git branch -M main
git push -u origin main前往 GitHub Repository > Settings > Secrets and variables > Actions,添加以下 Secrets:
LINE_CHANNEL_ACCESS_TOKEN
LINE_CHANNEL_SECRET
GOOGLE_SHEET_ID
GOOGLE_SERVICE_ACCOUNT_JSON
SECRET_KEY
GOOGLE_CLOUD_PROJECT (可選)
- 前往 Zeabur
- 連接您的 GitHub 帳號
- 選擇 repository 並導入專案
- 在 Zeabur 環境變數設定中添加所有必要的環境變數
- 部署完成後,將域名更新到 LINE Bot Webhook 設定
# macOS
brew tap heroku/brew && brew install heroku
# 其他平台請參考:https://devcenter.heroku.com/articles/heroku-cli# 登入 Heroku
heroku login
# 建立應用程式
heroku create your-linebot-app-name
# 設定環境變數
heroku config:set LINE_CHANNEL_ACCESS_TOKEN="your_token"
heroku config:set LINE_CHANNEL_SECRET="your_secret"
heroku config:set GOOGLE_SHEET_ID="your_sheet_id"
heroku config:set GOOGLE_SERVICE_ACCOUNT_JSON='{"type":"service_account",...}'
heroku config:set SECRET_KEY="your_secret_key"
heroku config:set FLASK_ENV="production"# 推送到 Heroku
git push heroku main
# 查看日誌
heroku logs --tail
# 打開應用程式
heroku openFROM python:3.11-slim
# 設定工作目錄
WORKDIR /app
# 複製 requirements 並安裝依賴
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 複製應用程式代碼
COPY . .
# 建立 config 目錄
RUN mkdir -p config
# 設定檔案權限
RUN chmod -R 755 /app
# 暴露端口
EXPOSE 5000
# 健康檢查
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/health || exit 1
# 啟動命令
CMD ["gunicorn", "wsgi:app", "--bind", "0.0.0.0:5000", "--workers", "2", "--timeout", "120"].git
.gitignore
README.md
DEPLOYMENT.md
SECURITY.md
CLAUDE.md
.env
config/google-credentials.json
tests/
.pytest_cache
__pycache__
*.pyc
.coverage
htmlcov/
.vscode
.idea
# 建構映像
docker build -t linebot-inspiration .
# 執行容器 (使用環境變數檔案)
docker run -d \
--name linebot-app \
--env-file .env.production \
-p 5000:5000 \
linebot-inspiration
# 或者直接指定環境變數
docker run -d \
--name linebot-app \
-e LINE_CHANNEL_ACCESS_TOKEN="your_token" \
-e LINE_CHANNEL_SECRET="your_secret" \
-e GOOGLE_SHEET_ID="your_sheet_id" \
-e GOOGLE_SERVICE_ACCOUNT_JSON='{"type":"service_account",...}' \
-p 5000:5000 \
linebot-inspirationruntime: python311
env_variables:
LINE_CHANNEL_ACCESS_TOKEN: "your_token"
LINE_CHANNEL_SECRET: "your_secret"
GOOGLE_SHEET_ID: "your_sheet_id"
FLASK_ENV: "production"
SECRET_KEY: "your_secret_key"
automatic_scaling:
min_instances: 1
max_instances: 10# 安裝 Google Cloud SDK
# https://cloud.google.com/sdk/docs/install
# 登入和設定專案
gcloud auth login
gcloud config set project your-project-id
# 部署
gcloud app deploy
# 查看服務
gcloud app browse部署完成後,將新的 URL 更新到 LINE Developers Console:
- 前往 LINE Developers
- 選擇您的 Channel
- 前往 Messaging API 設定
- 更新 Webhook URL:
https://your-deployed-domain.com/webhook - 測試 Webhook 連線
# 健康檢查
curl https://your-deployed-domain.com/health
# Webhook 健康檢查
curl https://your-deployed-domain.com/webhook/health- 在 Zeabur 控制台查看即時日誌和監控指標
# 查看日誌
heroku logs --tail --app your-app-name
# 查看資源使用
heroku ps --app your-app-name# 查看容器日誌
docker logs linebot-app
# 查看容器狀態
docker stats linebot-app# 檢查環境變數是否正確設定
python -c "import os; print(os.getenv('LINE_CHANNEL_ACCESS_TOKEN'))"# 驗證 JSON 格式
python -c "import json; json.loads(open('config/google-credentials.json').read())"- 確認 URL 是 HTTPS
- 檢查防火牆設定
- 驗證簽名驗證是否正確
- 增加容器記憶體限制
- 優化代碼中的記憶體使用
- 使用更少的 worker 程序
查看關鍵日誌模式:
# 搜尋錯誤
grep "ERROR" app.log
# 搜尋 Webhook 事件
grep "Webhook received" app.log
# 搜尋 Google Sheets 操作
grep "sheets_service" app.log-
使用生產級 WSGI 伺服器
gunicorn wsgi:app --workers 4 --timeout 120 --bind 0.0.0.0:5000
-
啟用 Gzip 壓縮
-
設定適當的緩存標頭
-
使用 CDN 進行靜態資源
-
實施速率限制
-
設定監控和警報
- 水平擴展: 增加更多實例
- 資料庫: 考慮使用 PostgreSQL 或 MySQL
- 快取: 實施 Redis 快取
- 佇列: 使用 Celery 處理背景任務
GitHub Actions 工作流程已設定在 .github/workflows/deploy.yml,包括:
-
測試階段
- 程式碼風格檢查 (flake8)
- 單元測試 (pytest)
- 安全掃描 (Trivy)
-
部署階段
- 自動部署到 staging 環境
- 手動批准後部署到 production
# 推送到 main 分支觸發部署
git push origin main
# 或者建立發布標籤
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0部署完成後,測試以下功能:
-
基本功能
- 傳送文字訊息
- 查看是否正確記錄到 Google Sheets
- 測試指令功能 (
/today,/stats)
-
語音功能
- 傳送語音訊息
- 確認語音轉文字功能正常
-
錯誤處理
- 傳送無效指令
- 確認錯誤訊息友善
-
效能測試
- 同時傳送多條訊息
- 監控回應時間
重要提醒: 部署到生產環境前,請務必在測試環境中驗證所有功能正常運作,並確保所有敏感資訊都已妥善保護!