Skip to content

Commit a99a950

Browse files
committed
fix(deploy): add existing deployment update mode
Allow already deployed installs to configure Docker socket one-click update without rerunning the full port/database/secret wizard.
1 parent 3065482 commit a99a950

2 files changed

Lines changed: 131 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@
9797

9898
如果当前目录已有 `.env`,脚本会读取其中的端口、监听地址、数据库、Redis、管理密钥和 API 密钥作为默认值,后续重跑脚本时可直接回车复用原配置。
9999

100+
已有部署后只想补开启一键更新时,重新运行 `bash deploy.sh`,在「已有部署」步骤选择 **仅配置一键更新** 即可。该模式不会重新询问端口、监听范围、数据库、密钥等配置,也不会重写 `.env`
101+
100102
**场景 1:尚未克隆仓库(一行远程拉起)**
101103

102104
```bash

deploy.sh

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,35 @@ load_existing_env_defaults() {
134134
fi
135135
}
136136

137+
step_existing_deployment_action() {
138+
DEPLOY_ACTION="full"
139+
if [[ ! -f "$EXISTING_ENV_FILE" ]]; then
140+
return 0
141+
fi
142+
143+
echo ""
144+
printf "${BOLD}${CYAN}━━━ 已有部署 ━━━${NC}\n"
145+
echo ""
146+
echo " 1) 完整部署向导 — 重新确认端口、数据库、密钥等配置"
147+
echo " 2) 仅配置一键更新 — 只切换 Docker socket 挂载并重启服务"
148+
echo ""
149+
ask "请选择 (1 或 2)" "2" EXISTING_DEPLOY_CHOICE
150+
151+
case "$EXISTING_DEPLOY_CHOICE" in
152+
1|full|deploy)
153+
DEPLOY_ACTION="full"
154+
success "进入完整部署向导"
155+
;;
156+
2|update|socket|docker|watchtower)
157+
DEPLOY_ACTION="update_options"
158+
success "进入一键更新配置模式"
159+
;;
160+
*)
161+
error "无效选择: $EXISTING_DEPLOY_CHOICE"
162+
;;
163+
esac
164+
}
165+
137166
is_codex2api_repo() {
138167
[[ -f "docker-compose.yml" ]] && [[ -f "deploy.sh" ]] \
139168
&& grep -q '^name: codex2api' docker-compose.yml 2>/dev/null
@@ -382,7 +411,11 @@ step_build_mode() {
382411
# ---------- 第六步:更新能力 ----------
383412
step_update_options() {
384413
echo ""
385-
printf "${BOLD}${CYAN}━━━ 6/7 更新能力 ━━━${NC}\n"
414+
if [[ "${DEPLOY_ACTION:-full}" == "update_options" ]]; then
415+
printf "${BOLD}${CYAN}━━━ 更新能力 ━━━${NC}\n"
416+
else
417+
printf "${BOLD}${CYAN}━━━ 6/7 更新能力 ━━━${NC}\n"
418+
fi
386419
echo ""
387420

388421
if [[ "$BUILD_MODE" == "local" ]]; then
@@ -416,6 +449,96 @@ step_update_options() {
416449
esac
417450
}
418451

452+
infer_existing_deploy_config() {
453+
PORT="$(env_default CODEX_PORT "$(env_default PORT "8080")")"
454+
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || (( PORT < 1 || PORT > 65535 )); then
455+
error "已有 .env 中的端口无效: $PORT"
456+
fi
457+
458+
local bind_default db_default
459+
bind_default="$(env_default BIND_HOST "0.0.0.0")"
460+
case "$bind_default" in
461+
127.*|localhost)
462+
BIND_HOST="127.0.0.1"
463+
BIND_MODE="loopback"
464+
;;
465+
*)
466+
BIND_HOST="0.0.0.0"
467+
BIND_MODE="all"
468+
;;
469+
esac
470+
471+
db_default="$(env_default DATABASE_DRIVER "sqlite")"
472+
db_default="$(printf "%s" "$db_default" | tr '[:upper:]' '[:lower:]')"
473+
case "$db_default" in
474+
postgres|postgresql|pg)
475+
DB_MODE="postgres"
476+
;;
477+
*)
478+
DB_MODE="sqlite"
479+
;;
480+
esac
481+
482+
ADMIN_SECRET="$(env_default ADMIN_SECRET "")"
483+
API_KEYS="$(env_default CODEX_API_KEYS "")"
484+
BUILD_MODE="image"
485+
486+
if existing_local_build_compose_active; then
487+
BUILD_MODE="local"
488+
fi
489+
}
490+
491+
existing_local_build_compose_active() {
492+
local compose_file
493+
if [[ "${DB_MODE:-}" == "sqlite" ]]; then
494+
compose_file="docker-compose.sqlite.local.yml"
495+
else
496+
compose_file="docker-compose.local.yml"
497+
fi
498+
499+
[[ -f "$compose_file" ]] || return 1
500+
[[ -n "$($COMPOSE_CMD -f "$compose_file" ps -q codex2api 2>/dev/null || true)" ]]
501+
}
502+
503+
confirm_update_options_only() {
504+
echo ""
505+
printf "${BOLD}${CYAN}━━━ 配置确认 ━━━${NC}\n"
506+
echo ""
507+
echo " 模式: 仅配置一键更新"
508+
echo " 端口: $PORT"
509+
if [[ "$BIND_MODE" == "loopback" ]]; then
510+
echo " 监听范围: 127.0.0.1 (仅本机访问)"
511+
else
512+
echo " 监听范围: 0.0.0.0 (全部网络)"
513+
fi
514+
echo " 数据库: $DB_MODE"
515+
echo " 构建方式: $( [[ "$BUILD_MODE" == "image" ]] && echo "拉取镜像" || echo "本地构建" )"
516+
if [[ "$BUILD_MODE" == "local" ]]; then
517+
echo " 一键更新: 本地构建无需挂载"
518+
else
519+
echo " 一键更新: $( [[ "${ENABLE_DOCKER_SOCKET:-false}" == "true" ]] && echo "启用 Docker socket 挂载" || echo "未启用" )"
520+
fi
521+
echo ""
522+
ask "确认应用并重启服务? (y/n)" "y" CONFIRM
523+
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
524+
warn "已取消"
525+
exit 0
526+
fi
527+
}
528+
529+
run_update_options_only() {
530+
infer_existing_deploy_config
531+
step_update_options
532+
if [[ "$BUILD_MODE" == "local" ]]; then
533+
success "当前为本地构建部署,一键更新无需 Docker socket 挂载,未重启服务"
534+
return 0
535+
fi
536+
confirm_update_options_only
537+
resolve_compose_file
538+
apply_docker_socket_option
539+
deploy
540+
}
541+
419542
# ---------- 第七步:确认 ----------
420543
step_confirm() {
421544
echo ""
@@ -690,6 +813,11 @@ main() {
690813
preflight
691814
update_repo_code
692815
load_existing_env_defaults
816+
step_existing_deployment_action
817+
if [[ "$DEPLOY_ACTION" == "update_options" ]]; then
818+
run_update_options_only
819+
exit 0
820+
fi
693821
step_port
694822
step_bind
695823
step_database

0 commit comments

Comments
 (0)