Bläddra i källkod

optimisize: code

Dew-OF-Aurora 2 veckor sedan
förälder
incheckning
4785dce2ef

+ 1 - 0
CLAUDE.md

@@ -146,5 +146,6 @@ Generated in `runtime/`:
 - Fallback behavior is stateful: `last_good_domain` persistence is critical for resilience.
 - `runtime-state` branch is intended to isolate frequently changing runtime outputs from `main` source history.
 - Debian installer (`scripts/install_debian.sh`) writes `/etc/vmess-domain-rotator.env`, configures oneshot service+timer, and sets push-required behavior when push is enabled.
+- Repository `systemd/*` static templates are intentionally not maintained; install script dynamically generates unit files under `/etc/systemd/system/`.
 - Default install path is in-place (current git clone), default service user is `SUDO_USER`, and default auth mode is credential helper store.
 - Uninstaller removes systemd units and, by default, removes service auth/env files unless `--keep-auth-files` is set.

+ 53 - 14
README.md

@@ -163,26 +163,65 @@ sudo journalctl -u vmess-domain-rotator.service -n 120 --no-pager
 sudo bash scripts/install_debian.sh [options]
 ```
 
-| 参数 | 说明 | 默认值 |
-|---|---|---|
-| `--user <name>` | 指定 service 用户 | 当前 `sudo` 用户 |
-| `--group <name>` | 指定 service 用户组 | 当前 `sudo` 用户主组 |
-| `--interval <value>` | 定时周期(如 `1h`/`5min`) | `1h` |
-| `--git-push <0|1>` | 是否自动 push | `1` |
-| `--git-push-remote <name>` | 远程名 | `origin` |
-| `--git-http-username <u>` | HTTPS 认证用户名 | `git` |
-| `--git-http-token <t>` | HTTPS token(明文参数) | 空 |
-| `--git-http-token-file <f>` | 从文件读取 token | 空 |
-| `--git-use-credential-store <0|1>` | 是否使用 `credential.helper store` | `1` |
-| `--git-credentials-file <f>` | 指定 credential store 文件路径 | 空(Git 默认) |
-| `--no-install-deps` | 跳过 apt 安装依赖 | 关闭 |
-| `-h, --help` | 查看帮助 | - |
+| 参数                           | 说明                           | 默认值                               |
+| ------------------------------ | ------------------------------ | ------------------------------------ |
+| `--user <name>`              | 指定 service 用户              | 当前 `sudo` 用户                   |
+| `--group <name>`             | 指定 service 用户组            | 当前 `sudo` 用户主组               |
+| `--interval <value>`         | 定时周期(如 `1h`/`5min`) | `1h`                               |
+| `--git-push <0                 | 1>`                            | 是否自动 push                        |
+| `--git-push-remote <name>`   | 远程名                         | `origin`                           |
+| `--git-http-username <u>`    | HTTPS 认证用户名               | `git`                              |
+| `--git-http-token <t>`       | HTTPS token(明文参数)        | 空                                   |
+| `--git-http-token-file <f>`  | 从文件读取 token               | 空                                   |
+| `--git-use-credential-store <0 | 1>`                            | 是否使用 `credential.helper store` |
+| `--git-credentials-file <f>` | 指定 credential store 文件路径 | 空(Git 默认)                       |
+| `--no-install-deps`          | 跳过 apt 安装依赖              | 关闭                                 |
+| `-h, --help`                 | 查看帮助                       | -                                    |
 
 说明:
 
 - `--git-push 1` 时,push 失败会返回非 0,systemd 任务标记失败(便于监控)。
 - 安装会写入环境文件:`/etc/vmess-domain-rotator.env`。
 
+### 5.1 systemd unit 生成说明(示例)
+
+`install_debian.sh` 会按安装参数动态写入 `/etc/systemd/system/vmess-domain-rotator.service` 和 `/etc/systemd/system/vmess-domain-rotator.timer`。仓库不再维护 `systemd/*` 静态模板文件。
+
+service 示例(安装后实际内容会替换成你的参数):
+
+```ini
+[Unit]
+Description=VMess Domain Rotator updater
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+User=<RUN_USER>
+Group=<RUN_GROUP>
+WorkingDirectory=<APP_DIR>
+EnvironmentFile=-/etc/vmess-domain-rotator.env
+UMask=0077
+ExecStart=/bin/bash <APP_DIR>/scripts/run_update_and_commit.sh <APP_DIR>/config.json
+```
+
+timer 示例(`OnUnitActiveSec` 由 `--interval` 决定):
+
+```ini
+[Unit]
+Description=Run VMess Domain Rotator every <INTERVAL>
+
+[Timer]
+OnBootSec=2min
+OnUnitActiveSec=<INTERVAL>
+AccuracySec=30s
+Unit=vmess-domain-rotator.service
+Persistent=true
+
+[Install]
+WantedBy=timers.target
+```
+
 ---
 
 ## 6. 自动提交/推送逻辑说明

+ 11 - 11
runtime/current_domain.json

@@ -1,30 +1,30 @@
 {
-  "domain": "01-cctv.com",
-  "updated_at": "2026-04-16T18:40:45Z",
+  "domain": "cloudflare.182682.xyz",
+  "updated_at": "2026-04-17T18:04:28Z",
   "status": "ok",
   "source_count": 20,
   "checked_count": 0,
   "top_candidates": [
     {
-      "domain": "01-cctv.com",
+      "domain": "cloudflare.182682.xyz",
       "scores": [
-        133.0
+        137.0
       ],
-      "created_raw": "2026-04-17 00:00:00"
+      "created_raw": "2026-04-18 00:00:00"
     },
     {
-      "domain": "f.lma.de5.net",
+      "domain": "a.lma.de5.net",
       "scores": [
-        133.0
+        135.0
       ],
-      "created_raw": "2026-04-17 00:00:00"
+      "created_raw": "2026-04-18 00:00:00"
     },
     {
-      "domain": "01-qq.com",
+      "domain": "bbs.alipansou.com",
       "scores": [
-        132.0
+        135.0
       ],
-      "created_raw": "2026-04-17 00:00:00"
+      "created_raw": "2026-04-18 00:00:00"
     }
   ]
 }

+ 1 - 1
runtime/current_domain.txt

@@ -1 +1 @@
-01-cctv.com
+cloudflare.182682.xyz

+ 2 - 2
runtime/state.json

@@ -1,6 +1,6 @@
 {
-  "updated_at": "2026-04-16T18:40:45Z",
-  "last_good_domain": "01-cctv.com",
+  "updated_at": "2026-04-17T18:04:28Z",
+  "last_good_domain": "cloudflare.182682.xyz",
   "status": "ok",
   "source_count": 20,
   "checked_count": 0,

+ 2 - 2
runtime/substore_vars.json

@@ -1,5 +1,5 @@
 {
-  "AUTO_DOMAIN": "01-cctv.com",
-  "UPDATED_AT": "2026-04-16T18:40:45Z",
+  "AUTO_DOMAIN": "cloudflare.182682.xyz",
+  "UPDATED_AT": "2026-04-17T18:04:28Z",
   "STATUS": "ok"
 }

+ 0 - 2
scripts/domain_updater.py

@@ -190,7 +190,6 @@ def parse_scored_records(payload, scoring_cfg):
                 "created_at": created,
                 "created_raw": r.get(created_time_field),
                 "scores": scores,
-                "raw": r,
             }
         )
     return out
@@ -332,7 +331,6 @@ def run_notify(cmd, domain, status):
 def choose_domain(filtered_domains, check_results, top_n, ranked_scored):
     if ranked_scored:
         domains_by_score = [x["domain"] for x in ranked_scored]
-        domain_set = set(domains_by_score)
 
         if check_results:
             check_map = {x["domain"]: x for x in check_results}

+ 0 - 10
systemd/vmess-domain-rotator.service

@@ -1,10 +0,0 @@
-[Unit]
-Description=VMess Domain Rotator updater
-After=network-online.target
-Wants=network-online.target
-
-[Service]
-Type=oneshot
-User=vmessrotator
-WorkingDirectory=/opt/vmess-domain-rotator
-ExecStart=/bin/bash /opt/vmess-domain-rotator/scripts/run_update_and_commit.sh /opt/vmess-domain-rotator/config.json

+ 0 - 12
systemd/vmess-domain-rotator.timer

@@ -1,12 +0,0 @@
-[Unit]
-Description=Run VMess Domain Rotator every 1 hour
-
-[Timer]
-OnBootSec=2min
-OnUnitActiveSec=1h
-AccuracySec=30s
-Unit=vmess-domain-rotator.service
-Persistent=true
-
-[Install]
-WantedBy=timers.target