From 682b79852d3e1c2762674f36e5a9d23cb1e746a1 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 6 Aug 2026 16:49:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor(vps-xray):=20=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E6=94=B9=E7=94=A8=20configure=5Frestart=5Fti?= =?UTF-8?q?mer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit harden_system 与 start_service 里的旧 DAILY_RESTART 分支删除, save_env 改写三个新字段。 --- vps-xray/deploy.sh | 80 ++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 53 deletions(-) diff --git a/vps-xray/deploy.sh b/vps-xray/deploy.sh index d493b87..9b966f2 100644 --- a/vps-xray/deploy.sh +++ b/vps-xray/deploy.sh @@ -227,12 +227,26 @@ remove_restart_units() { return 0 } -resolve_restart_config || exit 1 +# 依据 RESTART_EVERY_DAYS / RESTART_TIME / RESTART_TZ 建立或移除定时重启, +# 并完成 daemon-reload 与 enable/disable。完整部署与 --restart 共用。 +configure_restart_timer() { + if [ "$RESTART_EVERY_DAYS" -eq 0 ]; then + if remove_restart_units; then + warn "已移除定时重启(XRAY_RESTART_EVERY_DAYS=0)" + fi + systemctl daemon-reload + log "定时重启: 关闭(崩溃恢复已由 Restart=always 秒级覆盖)" + return + fi -# 过渡兼容:harden_system / start_service / save_env 仍引用 DAILY_RESTART, -# 要到「接线进完整部署流程」那个任务才会清理。在那之前必须保证 -# master 上的脚本可以完整跑完——set -u 下缺这个变量会中途崩溃。 -DAILY_RESTART=$([ "$RESTART_EVERY_DAYS" -ne 0 ] && echo 1 || echo 0) + render_restart_units "$RESTART_EVERY_DAYS" "$RESTART_TIME" "$RESTART_TZ" + systemctl daemon-reload + systemctl enable --now xray-restart.timer >/dev/null 2>&1 + log "定时重启: 每 ${RESTART_EVERY_DAYS} 天 ${RESTART_TIME} (${RESTART_TZ})" + warn "重启会切断所有活动连接;崩溃恢复本已由 Restart=always 覆盖,按需启用" +} + +resolve_restart_config || exit 1 XRAY_PORT="${XRAY_PORT:-443}" @@ -844,47 +858,7 @@ Restart=always RestartSec=3 EOF - # ===== 每日重启 timer:默认关闭 ===== - # 崩溃恢复已由上面的 Restart=always + RestartSec=3 覆盖(秒级响应), - # 而每日硬重启会切断全部活动连接(跨夜下载、备份、CI 都会中断), - # 属于为假想问题付出真实代价。仅在确实观察到长期运行后性能退化时才开启。 - if [ "$DAILY_RESTART" -ne 1 ]; then - if [ -f /etc/systemd/system/xray-restart.timer ]; then - systemctl disable --now xray-restart.timer 2>/dev/null || true - rm -f /etc/systemd/system/xray-restart.timer \ - /etc/systemd/system/xray-restart.service - warn "已移除旧部署遗留的每日重启 timer" - warn "如需保留,请在 .env 中设置 XRAY_DAILY_RESTART=true 后重新部署" - fi - log "每日自动重启: 关闭(崩溃由 Restart=always 秒级恢复)" - return - fi - - # 定时重启 timer(每日凌晨 4 点) - cat > /etc/systemd/system/xray-restart.service << 'EOF' -[Unit] -Description=Daily restart of Xray -After=network.target - -[Service] -Type=oneshot -ExecStart=/bin/systemctl restart xray -EOF - - cat > /etc/systemd/system/xray-restart.timer << 'EOF' -[Unit] -Description=Daily restart Xray at 04:00 CST - -[Timer] -OnCalendar=*-*-* 04:00:00 -TimeZone=Asia/Shanghai -Persistent=true - -[Install] -WantedBy=timers.target -EOF - warn "每日自动重启: 已启用(04:00 Asia/Shanghai)" - warn "该操作会切断所有活动连接,如无必要建议设 XRAY_DAILY_RESTART=false" + configure_restart_timer } # ===== 7. 启动服务 ===== @@ -892,9 +866,6 @@ start_service() { systemctl daemon-reload systemctl restart xray systemctl enable xray - if [ "$DAILY_RESTART" -eq 1 ]; then - systemctl enable --now xray-restart.timer - fi sleep 2 if systemctl is-active --quiet xray; then @@ -919,10 +890,13 @@ XRAY_UUID=${XRAY_UUID} # NAT / 端口转发的机器请填写服务商给你的实际入站 IP SERVER_IP=${SERVER_IP:-} -# 每日 04:00 自动重启 Xray。默认 false。 -# 崩溃恢复已由 systemd 的 Restart=always 覆盖(秒级),而每日硬重启会 -# 切断全部活动连接。仅在确实观察到长期运行后性能退化时才改为 true。 -XRAY_DAILY_RESTART=$([ "$DAILY_RESTART" -eq 1 ] && echo true || echo false) +# 定时重启。0 = 关闭(默认);N = 每 N 天在 XRAY_RESTART_TIME 重启一次。 +# 崩溃恢复已由 systemd 的 Restart=always 覆盖(秒级),而硬重启会切断 +# 全部活动连接。仅在确实观察到长期运行后性能退化时才启用。 +# 改这两项无需完整重新部署: bash deploy.sh --restart 7 04:00 +XRAY_RESTART_EVERY_DAYS=${RESTART_EVERY_DAYS} +XRAY_RESTART_TIME=${RESTART_TIME} +XRAY_RESTART_TIMEZONE=${RESTART_TZ} EOF if [ "$MODE" = "reality" ]; then