fix(deploy): CORS 用 JSON 数组、Redis 口令说明,部署时自动刷新 systemd 单元
CI / backend (push) Canceled after 0s

This commit is contained in:
2026-10-30 22:01:00 +08:00
parent 2a118ad407
commit 2ff1f6e9cd
3 changed files with 16 additions and 6 deletions
+5
View File
@@ -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`。 必填项:`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` 换成真实供应商。 **当前状态是内测模式**:短信通道还没接(非 dev provider 直接 501),所以 `SMS_PROVIDER=dev` + `INTERNAL_TEST_LOGIN=true`,固定验证码 `123456`。启动日志会打 WARNING。**只允许内网访问**;短信通道接好后删掉 `INTERNAL_TEST_LOGIN` 并把 `SMS_PROVIDER` 换成真实供应商。
### 2.4 装服务单元 ### 2.4 装服务单元
+4 -3
View File
@@ -61,10 +61,11 @@ step "4. 前端构建(只在服务器上、只用 HEAD 的源码)"
( cd web && npm ci --no-audit --no-fund --registry="$NPM_REGISTRY" && npm run build ) ( 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" test -f web/dist/index.html || die "前端构建产物缺失:web/dist/index.html"
step "5. 写入构建标记并重启服务" step "5. 写入构建标记、刷新 systemd 单元并重启服务"
mkdir -p "$CONF_DIR" backend/var/uploads mkdir -p "$CONF_DIR" "$HOME/.config/systemd/user" backend/var/uploads
chmod 700 "$CONF_DIR" 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" chmod 600 "$CONF_DIR/env.build" "$ENV_FILE"
systemctl --user daemon-reload systemctl --user daemon-reload
systemctl --user enable "$SERVICE" >/dev/null 2>&1 || true systemctl --user enable "$SERVICE" >/dev/null 2>&1 || true
+7 -3
View File
@@ -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 MIGRATION_DATABASE_URL=postgresql+asyncpg://dadao_prod_owner:__OWNER_PW__@192.168.8.160:8432/dadaotask_prod
# ── Redis:fnsvr-01 共享实例,独立 db 号隔离(不使用默认 0 号库)────── # ── 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 且不是开发默认值 # 生产校验:长度 ≥ 32 且不是开发默认值
@@ -28,8 +31,9 @@ SMS_PROVIDER=dev
SMS_DEV_CODE=123456 SMS_DEV_CODE=123456
SMS_THROTTLE_SECONDS=60 SMS_THROTTLE_SECONDS=60
# 同源部署(后端直接托管 web/dist),CORS 只留本机调试用 # 同源部署(后端直接托管 web/dist),CORS 只留本机调试用。
CORS_ORIGINS=http://127.0.0.1:8200,http://192.168.8.188:8200 # 注意:这是 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 WEB_DIST_DIR=/home/openclaw/app/dadaotask/web/dist