diff --git a/.env.production b/.env.production index a554d2a..338b7fd 100644 --- a/.env.production +++ b/.env.production @@ -18,10 +18,17 @@ REDIS_MAX_CONNECTIONS=50 # ====================== # Application Configuration # ====================== -# CORS - Set your domain here -CORS_ORIGINS=http://your-domain.com,https://your-domain.com +# CORS - Support both internal IP access and external domain +# Format: comma-separated list of origins +# Examples: +# - Internal IP only: CORS_ORIGINS=http://192.168.1.100 +# - Domain only: CORS_ORIGINS=http://your-domain.com,https://your-domain.com +# - Both IP and domain: CORS_ORIGINS=http://192.168.1.100,http://your-domain.com,https://your-domain.com +# - Allow all (development): CORS_ORIGINS=* +CORS_ORIGINS=* # API Base URL for frontend +# Set this to your domain or IP address VITE_API_BASE_URL=http://your-domain.com/api # ====================== diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index b93b19c..d2acd49 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -133,11 +133,29 @@ cosmo/ # 修改数据库密码(必须) DATABASE_PASSWORD=your_secure_password_here -# 修改域名(必须) +# 修改 CORS 配置(支持内网 IP 和外网域名访问) +# 方式 1: 允许所有来源(开发/测试环境) +CORS_ORIGINS=* + +# 方式 2: 仅允许特定 IP(内网访问) +CORS_ORIGINS=http://192.168.1.100 + +# 方式 3: 仅允许特定域名(外网访问) CORS_ORIGINS=http://your-domain.com,https://your-domain.com + +# 方式 4: 同时允许内网 IP 和外网域名(推荐生产环境) +CORS_ORIGINS=http://192.168.1.100,http://your-domain.com,https://your-domain.com + +# 修改前端 API 地址(必须) VITE_API_BASE_URL=http://your-domain.com/api ``` +**重要说明**: +- `CORS_ORIGINS` 使用逗号分隔多个来源,无需引号或方括号 +- 每个来源必须包含协议(http:// 或 https://) +- 不要在来源末尾添加斜杠 +- 使用 `*` 允许所有来源(仅用于开发环境) + ### 2. 初始化部署 ```bash @@ -350,6 +368,35 @@ docker stats ## 🐛 故障排查 +### CORS 配置错误 + +**错误信息**: +``` +pydantic_settings.sources.SettingsError: error parsing value for field "cors_origins" +``` + +**原因**: CORS_ORIGINS 配置格式错误 + +**解决方案**: +```bash +# ✅ 正确格式(逗号分隔,无引号) +CORS_ORIGINS=http://192.168.1.100,http://domain.com,https://domain.com + +# ✅ 允许所有来源 +CORS_ORIGINS=* + +# ❌ 错误格式(不要使用 JSON 数组格式) +CORS_ORIGINS=["http://domain.com", "https://domain.com"] + +# ❌ 错误格式(不要在域名后加斜杠) +CORS_ORIGINS=http://domain.com/,https://domain.com/ +``` + +修改 `.env.production` 后需要重启服务: +```bash +./deploy.sh --restart +``` + ### 服务启动失败 1. 查看日志: diff --git a/backend/app/config.py b/backend/app/config.py index 2c976d3..0884b67 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -2,7 +2,7 @@ Application configuration """ from pydantic_settings import BaseSettings -from pydantic import Field +from pydantic import Field, field_validator class Settings(BaseSettings): @@ -15,6 +15,15 @@ class Settings(BaseSettings): # CORS settings - allow all origins for development (IP access support) cors_origins: list[str] = ["*"] + @field_validator('cors_origins', mode='before') + @classmethod + def parse_cors_origins(cls, v): + """Parse CORS origins from comma-separated string or JSON array""" + if isinstance(v, str): + # Parse comma-separated string + return [origin.strip() for origin in v.split(',') if origin.strip()] + return v + # Cache settings cache_ttl_days: int = 3