refactor(vps-xray): 完整部署改用 configure_restart_timer

harden_system 与 start_service 里的旧 DAILY_RESTART 分支删除,
save_env 改写三个新字段。
This commit is contained in:
2026-08-06 16:49:57 +08:00
parent 22d1aa6a93
commit 682b79852d
+27 -53
View File
@@ -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