diff --git a/2.Design/DEPLOY.md b/2.Design/DEPLOY.md index 98277e6..cbc5374 100644 --- a/2.Design/DEPLOY.md +++ b/2.Design/DEPLOY.md @@ -57,6 +57,11 @@ vim ~/.config/dadaotask/env.production # 替换全部 __CHANGE_ME__ 必填项:`DATABASE_URL` / `MIGRATION_DATABASE_URL`(2.1 的口令)、`JWT_SECRET`(≥32 位随机串)、`REDIS_URL`、`WEB_DIST_DIR`、`UPLOAD_DIR`。 +两个踩过的坑: + +- **`CORS_ORIGINS` 必须写成 JSON 数组**(`'["http://...","http://..."]'`)。它是 list 字段,逗号分隔的字符串会让 pydantic-settings 当 JSON 解析并抛 `SettingsError`,alembic 这一步就挂。 +- **Redis 有口令**:fnsvr-01 的 redis 开了 `requirepass`(口令看 `docker inspect redis`),写进 URL 时要百分号编码(`#` → `%23`),否则连不上、发码/登录直接 500。 + **当前状态是内测模式**:短信通道还没接(非 dev provider 直接 501),所以 `SMS_PROVIDER=dev` + `INTERNAL_TEST_LOGIN=true`,固定验证码 `123456`。启动日志会打 WARNING。**只允许内网访问**;短信通道接好后删掉 `INTERNAL_TEST_LOGIN` 并把 `SMS_PROVIDER` 换成真实供应商。 ### 2.4 装服务单元 diff --git a/deploy/prod/deploy.sh b/deploy/prod/deploy.sh index c0b00bf..2b3f300 100755 --- a/deploy/prod/deploy.sh +++ b/deploy/prod/deploy.sh @@ -61,10 +61,11 @@ step "4. 前端构建(只在服务器上、只用 HEAD 的源码)" ( cd web && npm ci --no-audit --no-fund --registry="$NPM_REGISTRY" && npm run build ) test -f web/dist/index.html || die "前端构建产物缺失:web/dist/index.html" -step "5. 写入构建标记并重启服务" -mkdir -p "$CONF_DIR" backend/var/uploads +step "5. 写入构建标记、刷新 systemd 单元并重启服务" +mkdir -p "$CONF_DIR" "$HOME/.config/systemd/user" backend/var/uploads chmod 700 "$CONF_DIR" -printf 'BUILD_COMMIT=%s\nBUILD_TIME=%s\n' "$SHORT" "$(date -Iseconds)" >"$CONF_DIR/env.build" +cp deploy/prod/dadaotask-api.service "$HOME/.config/systemd/user/" +printf 'BUILD_COMMIT=%s\nBUILD_TIME=%s\n' "$SHORT" "$(TZ=Asia/Shanghai date -Iseconds)" >"$CONF_DIR/env.build" chmod 600 "$CONF_DIR/env.build" "$ENV_FILE" systemctl --user daemon-reload systemctl --user enable "$SERVICE" >/dev/null 2>&1 || true diff --git a/deploy/prod/env.production.example b/deploy/prod/env.production.example index ef56148..998b596 100644 --- a/deploy/prod/env.production.example +++ b/deploy/prod/env.production.example @@ -13,7 +13,10 @@ DATABASE_URL=postgresql+asyncpg://dadao_prod_app:__APP_PW__@192.168.8.160:8432/d MIGRATION_DATABASE_URL=postgresql+asyncpg://dadao_prod_owner:__OWNER_PW__@192.168.8.160:8432/dadaotask_prod # ── Redis:fnsvr-01 共享实例,独立 db 号隔离(不使用默认 0 号库)────── -REDIS_URL=redis://192.168.8.160:6379/6 +# 该实例开了 requirepass(口令见 fnsvr-01 上 `docker inspect redis`), +# URL 里的口令必须百分号编码(例如 # → %23),否则 asyncpg/redis 解析失败: +# REDIS_URL=redis://:__REDIS_PW_URLENCODED__@192.168.8.160:6379/6 +REDIS_URL=redis://:__REDIS_PW_URLENCODED__@192.168.8.160:6379/6 # ── 认证 ───────────────────────────────────────────────────────────── # 生产校验:长度 ≥ 32 且不是开发默认值 @@ -28,8 +31,9 @@ SMS_PROVIDER=dev SMS_DEV_CODE=123456 SMS_THROTTLE_SECONDS=60 -# 同源部署(后端直接托管 web/dist),CORS 只留本机调试用 -CORS_ORIGINS=http://127.0.0.1:8200,http://192.168.8.188:8200 +# 同源部署(后端直接托管 web/dist),CORS 只留本机调试用。 +# 注意:这是 list 字段,必须写成 JSON 数组(逗号分隔会被 pydantic-settings 当成 JSON 解析而报错) +CORS_ORIGINS='["http://192.168.8.188:8200","http://127.0.0.1:8200"]' # ── 前端产物与上传目录(绝对路径)───────────────────────────────────── WEB_DIST_DIR=/home/openclaw/app/dadaotask/web/dist