Files
daily-news-app/執行步驟.md
donald db0f0bbfe7 Initial commit: Daily News App
企業內部新聞彙整與分析系統
- 自動新聞抓取 (Digitimes, 經濟日報, 工商時報)
- AI 智慧摘要 (OpenAI/Claude/Ollama)
- 群組管理與訂閱通知
- 已清理 Python 快取檔案

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 23:53:24 +08:00

11 KiB
Raw Blame History

每日報導 APP - 執行步驟指南

本文檔提供系統的詳細執行步驟,包含本地開發和生產部署兩種方式。


📋 前置需求

系統需求

  • 作業系統Linux / macOS / Windows
  • Python3.11 或以上版本
  • Docker20.10 或以上版本(使用 Docker 部署時)
  • Docker Compose2.0 或以上版本(使用 Docker 部署時)
  • MySQL8.0 或以上版本(生產環境,或使用 Docker 時自動安裝)

必要帳號與 API Key

  • LLM API Key(三選一):
    • Google Gemini API Key
    • OpenAI API Key
    • 或使用 Ollama本地部署無需 API Key
  • Digitimes 帳號(如需抓取 Digitimes 新聞)
  • SMTP 設定(如需發送 Email 通知)

🚀 方式一:本地開發環境

步驟 1環境準備

1.1 複製專案(如尚未複製)

# 如果專案在 Git 倉庫
git clone <repository-url>
cd daily-news-app

# 或直接進入專案目錄
cd /Users/peelerwu/Documents/AICoding/daily-news-app

1.2 建立 Python 虛擬環境

# 建立虛擬環境
python3 -m venv venv

# 啟動虛擬環境
# macOS/Linux:
source venv/bin/activate
# Windows:
# venv\Scripts\activate

1.3 安裝 Python 依賴套件

pip install -r requirements.txt

步驟 2環境變數設定

2.1 建立 .env 檔案

# 複製範例檔案(如果存在)
cp .env.example .env

# 或手動建立
touch .env

2.2 編輯 .env 檔案

使用文字編輯器開啟 .env,填入以下設定:

# ============================================
# 應用程式設定
# ============================================
APP_ENV=development
DEBUG=true
SECRET_KEY=your-secret-key-here-min-32-chars-change-in-production
JWT_SECRET_KEY=your-jwt-secret-key-here-min-32-chars-change-in-production

# ============================================
# 資料庫設定(開發環境可使用 SQLite
# ============================================
# 選項 1使用 SQLite簡單適合開發
DB_HOST=sqlite
DB_NAME=daily_news_app

# 選項 2使用 MySQL需先啟動 MySQL
# DB_HOST=localhost
# DB_PORT=3306
# DB_NAME=daily_news_app
# DB_USER=root
# DB_PASSWORD=your-mysql-password

# ============================================
# LLM 設定(選擇一個)
# ============================================
# 選項 1使用 Gemini推薦費用較低
LLM_PROVIDER=gemini
GEMINI_API_KEY=your-gemini-api-key-here
GEMINI_MODEL=gemini-1.5-pro

# 選項 2使用 OpenAI
# LLM_PROVIDER=openai
# OPENAI_API_KEY=your-openai-api-key-here
# OPENAI_MODEL=gpt-4o

# 選項 3使用 Ollama本地部署
# LLM_PROVIDER=ollama
# OLLAMA_ENDPOINT=http://localhost:11434
# OLLAMA_MODEL=llama3

# ============================================
# SMTP 設定Email 通知,選填)
# ============================================
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=your-smtp-username
SMTP_PASSWORD=your-smtp-password
SMTP_FROM_EMAIL=noreply@example.com
SMTP_FROM_NAME=每日報導系統

# ============================================
# LDAP/AD 設定(選填,如需企業認證)
# ============================================
LDAP_SERVER=ldap.example.com
LDAP_PORT=389
LDAP_BASE_DN=DC=example,DC=com
LDAP_BIND_DN=
LDAP_BIND_PASSWORD=

# ============================================
# Digitimes 帳號(選填,如需抓取 Digitimes
# ============================================
DIGITIMES_USERNAME=your-digitimes-username
DIGITIMES_PASSWORD=your-digitimes-password

# ============================================
# 其他設定
# ============================================
CORS_ORIGINS=["http://localhost:3000","http://localhost:8000"]

2.3 產生強隨機密鑰(生產環境必做)

# 使用 Python 產生
python3 -c "import secrets; print('SECRET_KEY=' + secrets.token_urlsafe(32)); print('JWT_SECRET_KEY=' + secrets.token_urlsafe(32))"

將產生的密鑰填入 .env 檔案。

步驟 3資料庫初始化

3.1 使用 SQLite開發環境推薦

# 執行初始化腳本
python scripts/init_db_sqlite.py

這會自動建立 SQLite 資料庫檔案 daily_news_app.db 並建立所有資料表。

3.2 使用 MySQL如需

# 1. 確保 MySQL 服務已啟動
# macOS (Homebrew):
brew services start mysql
# Linux:
sudo systemctl start mysql
# Windows: 從服務管理員啟動 MySQL

# 2. 建立資料庫
mysql -u root -p
CREATE DATABASE daily_news_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;

# 3. 執行初始化 SQL
mysql -u root -p daily_news_app < scripts/init.sql

步驟 4啟動應用程式

4.1 使用啟動腳本(推薦)

python run.py

4.2 或使用 uvicorn 直接啟動

uvicorn app.main:app --reload --host 127.0.0.1 --port 8000

4.3 驗證啟動成功

開啟瀏覽器訪問:

步驟 5初始化資料可選

如果需要建立預設用戶或測試資料:

# 進入 Python 互動環境
python

# 執行初始化(範例)
from app.db.session import SessionLocal
from app.models.user import User, Role
from app.core.security import get_password_hash

db = SessionLocal()
# 建立管理員用戶
admin_role = db.query(Role).filter(Role.code == "admin").first()
if admin_role:
    admin_user = User(
        username="admin",
        password_hash=get_password_hash("admin123"),
        display_name="系統管理員",
        email="admin@example.com",
        auth_type="local",
        role_id=admin_role.id,
        is_active=True
    )
    db.add(admin_user)
    db.commit()
db.close()

🐳 方式二Docker 部署(生產環境推薦)

步驟 1環境準備

1.1 確認 Docker 已安裝

docker --version
docker-compose --version

1.2 建立 .env 檔案

在專案根目錄建立 .env 檔案,內容參考「方式一」的步驟 2.2,但需調整以下設定:

# 生產環境設定
APP_ENV=production
DEBUG=false

# 資料庫設定Docker Compose 會自動建立 MySQL
DB_HOST=mysql
DB_PORT=3306
DB_NAME=daily_news_app
DB_USER=root
DB_PASSWORD=your-strong-mysql-password-here

# 必須使用強隨機密鑰
SECRET_KEY=your-strong-secret-key-min-32-chars
JWT_SECRET_KEY=your-strong-jwt-secret-key-min-32-chars

# 其他設定與方式一相同

步驟 2啟動服務

2.1 使用 Docker Compose 啟動

# 啟動所有服務(應用程式 + MySQL
docker-compose up -d

# 查看日誌
docker-compose logs -f app

# 查看所有服務狀態
docker-compose ps

2.2 使用 Ollama可選本地 LLM

# 啟動包含 Ollama 的服務
docker-compose --profile ollama up -d

# 下載模型
docker exec -it daily-news-ollama ollama pull llama3

步驟 3資料庫初始化

3.1 等待 MySQL 就緒

# 檢查 MySQL 健康狀態
docker-compose ps mysql

3.2 執行初始化 SQL

# 方法 1使用 docker exec
docker exec -i daily-news-mysql mysql -uroot -p${DB_PASSWORD} daily_news_app < scripts/init.sql

# 方法 2進入容器執行
docker exec -it daily-news-mysql bash
mysql -uroot -p
# 輸入密碼後
USE daily_news_app;
SOURCE /docker-entrypoint-initdb.d/init.sql;
EXIT;

注意:如果 docker-compose.yml 中已設定 init.sql 掛載MySQL 容器啟動時會自動執行。

步驟 4驗證部署

# 檢查應用程式健康狀態
curl http://localhost:8000/health

# 查看應用程式日誌
docker-compose logs -f app

步驟 5存取系統


🔧 常用操作

查看日誌

# 本地開發
tail -f logs/app.log

# Docker
docker-compose logs -f app

停止服務

# 本地開發
# 按 Ctrl+C 停止

# Docker
docker-compose down

# 停止並刪除資料(謹慎使用)
docker-compose down -v

重啟服務

# Docker
docker-compose restart app

# 或重新建立
docker-compose up -d --force-recreate app

進入容器

# 進入應用程式容器
docker exec -it daily-news-app bash

# 進入 MySQL 容器
docker exec -it daily-news-mysql bash

資料庫備份

# MySQL 備份
docker exec daily-news-mysql mysqldump -uroot -p${DB_PASSWORD} daily_news_app > backup_$(date +%Y%m%d).sql

# SQLite 備份
cp daily_news_app.db backup_$(date +%Y%m%d).db

資料庫還原

# MySQL 還原
docker exec -i daily-news-mysql mysql -uroot -p${DB_PASSWORD} daily_news_app < backup_20240101.sql

🧪 測試系統

1. 測試 API 端點

# 健康檢查
curl http://localhost:8000/health

# 登入(需先建立用戶)
curl -X POST http://localhost:8000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

2. 測試新聞抓取

# 進入容器或虛擬環境
python

# 執行測試
from app.services.crawler_service import CrawlerService
crawler = CrawlerService()
# 測試抓取(需先設定新聞來源)

3. 測試 LLM 摘要

# 進入容器或虛擬環境
python

# 執行測試
from app.services.llm_service import LLMService
llm = LLMService()
# 測試摘要生成

⚠️ 常見問題

問題 1資料庫連線失敗

症狀:啟動時出現資料庫連線錯誤

解決方法

  1. 檢查 .env 中的資料庫設定是否正確
  2. 確認 MySQL 服務已啟動(本地開發)
  3. 確認 Docker 容器中的 MySQL 已就緒Docker 部署)
  4. 檢查防火牆設定

問題 2LLM API 呼叫失敗

症狀:生成摘要時出現 API 錯誤

解決方法

  1. 檢查 API Key 是否正確設定
  2. 檢查 API Key 是否有足夠額度
  3. 檢查網路連線
  4. 查看日誌了解詳細錯誤

問題 3Email 發送失敗

症狀:通知無法發送

解決方法

  1. 檢查 SMTP 設定是否正確
  2. 檢查 SMTP 伺服器是否需要 TLS/SSL
  3. 檢查防火牆是否阻擋 SMTP 埠號
  4. 查看 notification_logs 表了解錯誤詳情

問題 4新聞抓取失敗

症狀:定時抓取沒有執行或失敗

解決方法

  1. 檢查排程服務是否正常啟動
  2. 檢查新聞來源設定是否正確
  3. 檢查 Digitimes 帳號是否有效(如需)
  4. 查看 crawl_jobs 表了解錯誤詳情

問題 5權限錯誤

症狀:無法執行某些操作

解決方法

  1. 檢查用戶角色是否正確
  2. 檢查 JWT Token 是否有效
  3. 檢查 API 端點的權限設定

📝 後續設定

1. 建立初始用戶

使用 API 或直接操作資料庫建立管理員用戶。

2. 設定新聞來源

在系統設定中配置新聞來源Digitimes、經濟日報、工商時報

3. 建立群組

建立產業別或議題群組,並設定關鍵字。

4. 設定排程

確認排程服務正常運作,每日定時抓取和生成報告。

5. 測試完整流程

  1. 手動觸發新聞抓取
  2. 檢查新聞是否正確匹配到群組
  3. 生成測試報告
  4. 測試 Email 通知

🔗 相關資源

  • API 文件http://localhost:8000/docs
  • 專案 READMEREADME.md
  • 系統解析系統解析.md
  • 系統設計文檔daily-news-SDD.md

📞 支援

如有問題,請聯繫 IT 部門或查看專案文檔。