8.5 KiB
8.5 KiB
部署指南 - 暫時規範管理系統 V4
本文件提供詳細的部署指導,涵蓋 Docker 環境部署方式。
🎉 生產環境優化完成
✅ 已完成50人併發生產環境優化:
- Gunicorn WSGI部署(多進程併發)
- Redis快取系統(提升效能)
- Nginx反向代理(負載均衡)
- CDN支援(靜態資源加速)
- 資源限制(防止系統過載)
- 監控工具(效能監控)
📋 目錄
1. 系統需求
前置需求檢查清單
- Docker 20.10+ 已安裝且運行中
- Docker Compose 2.0+ 已安裝
- 外部 MySQL 資料庫可訪問 (mysql.theaken.com:33306)
- LDAP/Active Directory 伺服器可連線
- SMTP 郵件伺服器已配置
- 足夠的磁碟空間 (建議至少 10GB)
端口需求
確保以下端口未被占用:
12010: Flask 應用程式(Gunicorn)12011: OnlyOffice 文檔服務12013: Nginx HTTP(反向代理)12014: Nginx HTTPS(反向代理)6379: Redis 快取(內部)
2. 快速部署
一鍵部署(推薦)
# 1. 克隆專案
git clone <repository-url>
cd TEMP_spec_system_V4
# 2. 配置環境變數
cp .env.production .env
# 編輯 .env 文件,填入實際的配置值
# 3. 啟動所有服務(生產環境優化版本)
docker-compose up -d
# 4. 檢查服務狀態
docker-compose ps
預期輸出應包含以下服務:
NAME STATUS PORTS
tempspec-redis Up (healthy)
tempspec-onlyoffice Up (healthy) 0.0.0.0:12011->80/tcp
tempspec-app Up (healthy) 0.0.0.0:12010->5000/tcp
tempspec-nginx Up 0.0.0.0:12013->80/tcp, 0.0.0.0:12014->443/tcp
# 5. 查看服務日誌
docker-compose logs -f
# 6. 驗證服務可訪問性
curl -I http://localhost:12013/login # Nginx 反向代理(推薦)
curl -I http://localhost:12010/login # 直接訪問 Flask
curl -I http://localhost:12011 # OnlyOffice 服務
3. 生產環境配置
3.1 服務架構(生產優化)
用戶請求 → Nginx (12013/12014) → Gunicorn (多進程) → Flask App
↓
Redis快取
↓
外部MySQL資料庫
服務組件:
- Nginx: 反向代理 + 靜態檔案 + 負載均衡(端口 12013/12014)
- Flask 應用: Gunicorn WSGI伺服器(多進程,端口 12010)
- Redis: 快取系統(內部端口 6379)
- OnlyOffice: 文檔編輯服務(端口 12011)
- MySQL: 外部資料庫服務(mysql.theaken.com)
3.2 效能規格(50人併發支援)
- 併發處理: 2-8個Gunicorn worker進程
- 記憶體使用: App容器1GB + Redis 256MB
- 快取命中: Redis快取減少70%+資料庫查詢
- 響應時間: < 200ms(快取命中時)
- 可用性: 99.9%+(健康檢查 + 自動重啟)
3.3 環境變數配置
編輯 .env 檔案(基於 .env.production 範例):
# 生產環境基本設定
FLASK_ENV=production
SECRET_KEY=your_super_secret_production_key_here
# 服務端口
APP_PORT=12010 # Gunicorn WSGI伺服器
ONLYOFFICE_PORT=12011 # OnlyOffice 服務
NGINX_PORT=12013 # Nginx HTTP
NGINX_SSL_PORT=12014 # Nginx HTTPS
# Redis 快取
REDIS_URL=redis://redis:6379/0
# CDN 支援 (可選)
CDN_DOMAIN=cdn.yourcompany.com
# 資料庫連線
DATABASE_URL=mysql+pymysql://user:pass@mysql.theaken.com:33306/dbname
# LDAP 設定
LDAP_SERVER=panjit.com.tw
LDAP_PORT=389
LDAP_USE_SSL=false
LDAP_SEARCH_BASE=OU=PANJIT,DC=panjit,DC=com,DC=tw
LDAP_BIND_USER_DN=CN=LdapBind,CN=Users,DC=PANJIT,DC=COM,DC=TW
LDAP_BIND_USER_PASSWORD=your_ldap_password
LDAP_USER_LOGIN_ATTR=userPrincipalName
# SMTP 設定
SMTP_SERVER=mail.panjit.com.tw
SMTP_PORT=25
SMTP_USE_TLS=false
SMTP_SENDER_EMAIL=temp-spec-system@panjit.com.tw
# ONLYOFFICE 設定
ONLYOFFICE_JWT_SECRET=your_onlyoffice_jwt_secret
4. 監控與管理
4.1 系統監控
# 即時監控(每5秒刷新)
python monitor.py --watch 5
# 單次檢查
python monitor.py
# JSON格式輸出
python monitor.py --json
4.2 Docker 管理命令
# 查看所有服務狀態
docker-compose ps
# 查看實時日誌
docker-compose logs -f
# 查看特定服務日誌
docker-compose logs -f app
docker-compose logs -f redis
docker-compose logs -f nginx
# 重啟服務
docker-compose restart
docker-compose restart app
# 停止所有服務
docker-compose down
# 查看資源使用
docker stats
4.3 Redis 快取管理
# 連接Redis並測試
docker-compose exec redis redis-cli ping
# 查看快取統計
docker-compose exec redis redis-cli info stats
# 清空所有快取
docker-compose exec redis redis-cli FLUSHALL
# 查看快取鍵值數量
docker-compose exec redis redis-cli DBSIZE
5. 服務訪問
5.1 服務入口
服務啟動後,可透過以下 URL 訪問:
主要服務:
- 主應用程式 (Nginx): http://localhost:12013/login 🌟 推薦
- 主應用程式 (直接): http://localhost:12010/login
- OnlyOffice 服務: http://localhost:12011
推薦使用方式(生產環境):
- 使用 Nginx 反向代理:
http://localhost:12013 - 直接訪問 Flask:
http://localhost:12010
5.2 登入資訊
- 認證方式: LDAP/Active Directory
- 登入帳號: 使用公司 LDAP 帳號密碼
- 登入格式: 支援
username@panjit.com.tw或username
5.3 預設管理員帳號
如需創建本地管理員帳號(非LDAP):
# 進入應用容器
docker-compose exec app python update_admin.py
# 或手動創建
docker-compose exec app python -c "
from models import db, User
from werkzeug.security import generate_password_hash
from app import app
with app.app_context():
admin = User(
username='admin',
email='admin@company.com',
password_hash=generate_password_hash('admin123'),
is_admin=True
)
db.session.add(admin)
db.session.commit()
print('管理員帳號已創建: admin/admin123')
"
6. 疑難排解
6.1 生產環境常見問題
Redis 連接失敗
# 檢查Redis容器狀態
docker-compose logs redis
# 測試Redis連接
docker-compose exec redis redis-cli ping
# 重啟Redis
docker-compose restart redis
應用程式無回應
# 檢查Gunicorn日誌
docker-compose logs app
# 檢查容器資源
docker stats tempspec-app
# 重啟應用
docker-compose restart app
效能問題
# 檢查快取命中率
python monitor.py
# 檢查Gunicorn worker狀態
docker-compose exec app ps aux | grep gunicorn
# 調整worker數量(編輯gunicorn.conf.py)
6.2 基本故障排除
容器無法啟動
# 檢查容器狀態
docker-compose ps
# 查看詳細日誌
docker-compose logs app
docker-compose logs onlyoffice
docker-compose logs redis
資料庫連線失敗
# 測試資料庫連接
docker-compose exec app python -c "
import pymysql
try:
conn = pymysql.connect(host='mysql.theaken.com', port=33306, user='A060', password='WLeSCi0yhtc7', database='db_A060')
print('Database connection successful')
conn.close()
except Exception as e:
print(f'Database connection failed: {e}')
"
端口衝突
修改 .env 文件中的端口設定:
APP_PORT=12015 # 改為其他可用端口
ONLYOFFICE_PORT=12016 # 改為其他可用端口
NGINX_PORT=12017 # 改為其他可用端口
6.3 維護命令
# 完全重建服務(清除快取)
docker-compose down
docker-compose build --no-cache
docker-compose up -d
# 更新單一服務
docker-compose up -d --force-recreate app
# 清理未使用的 Docker 資源
docker system prune -a
6.4 效能調優
Redis 優化
# 調整 Redis 記憶體限制(編輯 docker-compose.yml)
# 預設: 256MB,可根據需要調整
# 監控 Redis 使用
docker-compose exec redis redis-cli info memory
Gunicorn 調優
# 編輯 gunicorn.conf.py 調整:
# - workers: worker 進程數量
# - timeout: 請求超時時間
# - max_requests: worker 重啟頻率
🎉 生產環境部署完成!系統已準備好支援50人的併發使用。
快速啟動: docker-compose up -d
系統監控: python monitor.py --watch 5
服務訪問: http://localhost:12013/login