From d37267bceb9ec5e7e92078c3aab8b7d357c77cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BA=AF=E7=99=BD=E8=89=B2=E5=86=B0=E6=B7=87=E6=B7=8B?= Date: Tue, 11 Aug 2026 11:54:40 +0800 Subject: [PATCH 1/4] =?UTF-8?q?~=E4=BF=AE=E5=A4=8D=20Docker=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=87=8D=E5=BB=BA=E5=AE=B9=E5=99=A8=E5=90=8E=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E5=BC=80=E6=9C=BA=E8=87=AA=E5=90=AF=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9A=E5=B0=86=20s6=20=E8=87=AA?= =?UTF-8?q?=E5=90=AF=E6=A0=87=E8=AE=B0=E6=8C=81=E4=B9=85=E5=8C=96=E5=88=B0?= =?UTF-8?q?=20configs=20=E5=8D=B7=EF=BC=8C=E5=B9=B6=E5=9C=A8=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=97=B6=E9=80=9A=E8=BF=87=20S6=5FSTAGE2=5FHOOK=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 +++ docker/s6-overlay/scripts/sync-autostart | 22 ++++++++++++++++++++++ scripts/libs/check_autostart.sh | 22 +++++++++++++++++++++- scripts/menus/4_setboot.sh | 4 ++-- scripts/menus/userguide.sh | 1 + scripts/start.sh | 3 ++- 6 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 docker/s6-overlay/scripts/sync-autostart diff --git a/Dockerfile b/Dockerfile index 8471cf41..fba7ffb2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,7 +74,10 @@ COPY --from=builder /tmp/s6_noarch.tar.xz /tmp/s6_noarch.tar.xz RUN tar -xJf /tmp/s6_noarch.tar.xz -C / && rm -rf /tmp/s6_noarch.tar.xz RUN tar -xJf /tmp/s6_arch.tar.xz -C / && rm -rf /tmp/s6_arch.tar.xz COPY docker/s6-rc.d /etc/s6-overlay/s6-rc.d +COPY docker/s6-overlay/scripts/sync-autostart /etc/s6-overlay/scripts/sync-autostart +RUN chmod +x /etc/s6-overlay/scripts/sync-autostart ENV S6_CMD_WAIT_FOR_SERVICES=1 +ENV S6_STAGE2_HOOK=/etc/s6-overlay/scripts/sync-autostart ENTRYPOINT ["/init"] diff --git a/docker/s6-overlay/scripts/sync-autostart b/docker/s6-overlay/scripts/sync-autostart new file mode 100644 index 00000000..8fe895bd --- /dev/null +++ b/docker/s6-overlay/scripts/sync-autostart @@ -0,0 +1,22 @@ +#!/bin/sh +# 在 s6-rc 编译 user bundle 之前,把 configs 卷中的自启状态同步到 contents.d +# 由 S6_STAGE2_HOOK 调用;删除重建容器后仍可按 volume 恢复开机自启 + +CRASHDIR=/etc/ShellCrash +CFG_MARK="$CRASHDIR/configs/.autostart" +S6_MARK=/etc/s6-overlay/s6-rc.d/user/contents.d/afstart + +mkdir -p "$CRASHDIR/configs" /etc/s6-overlay/s6-rc.d/user/contents.d + +# 兼容旧容器:仅有 s6 标记时迁移到 configs +if [ -f "$S6_MARK" ] && [ ! -f "$CFG_MARK" ]; then + touch "$CFG_MARK" +fi + +if [ -f "$CFG_MARK" ] && [ ! -f "$CRASHDIR/.dis_startup" ]; then + touch "$S6_MARK" +else + rm -f "$S6_MARK" +fi + +exit 0 diff --git a/scripts/libs/check_autostart.sh b/scripts/libs/check_autostart.sh index f07c80ca..3a958e73 100644 --- a/scripts/libs/check_autostart.sh +++ b/scripts/libs/check_autostart.sh @@ -1,3 +1,22 @@ +# s6 / Docker:自启状态以 configs 卷内标记为准,并同步到 s6 contents.d + +enable_s6_autostart_marks() { + mkdir -p "$CRASHDIR/configs" /etc/s6-overlay/s6-rc.d/user/contents.d + touch "$CRASHDIR/configs/.autostart" /etc/s6-overlay/s6-rc.d/user/contents.d/afstart +} + +disable_s6_autostart_marks() { + rm -f "$CRASHDIR/configs/.autostart" /etc/s6-overlay/s6-rc.d/user/contents.d/afstart +} + +# 将旧版仅写在可写层的 s6 标记迁移到 configs +migrate_s6_autostart_mark() { + if [ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && [ ! -f "$CRASHDIR/configs/.autostart" ]; then + mkdir -p "$CRASHDIR/configs" + touch "$CRASHDIR/configs/.autostart" + fi +} + check_autostart(){ if [ "$start_old" = ON ];then [ ! -f "$CRASHDIR"/.dis_startup ] && return 0 @@ -7,7 +26,8 @@ check_autostart(){ elif ckcmd systemctl; then [ "$(systemctl is-enabled shellcrash.service 2>&1)" = enabled ] && return 0 elif grep -q 's6' /proc/1/comm; then - [ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && return 0 + migrate_s6_autostart_mark + [ -f "$CRASHDIR/configs/.autostart" ] && [ ! -f "$CRASHDIR"/.dis_startup ] && return 0 elif rc-status -r >/dev/null 2>&1; then rc-update show default | grep -q "shellcrash" && return 0 else diff --git a/scripts/menus/4_setboot.sh b/scripts/menus/4_setboot.sh index ec8a5721..7a153f5a 100644 --- a/scripts/menus/4_setboot.sh +++ b/scripts/menus/4_setboot.sh @@ -12,7 +12,7 @@ allow_autostart() { fi ckcmd systemctl && systemctl enable shellcrash.service >/dev/null 2>&1 - grep -q 's6' /proc/1/comm && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart + grep -q 's6' /proc/1/comm && enable_s6_autostart_marks rc-status -r >/dev/null 2>&1 && rc-update add shellcrash default >/dev/null 2>&1 rm -rf "$CRASHDIR"/.dis_startup } @@ -20,7 +20,7 @@ allow_autostart() { disable_autostart() { [ -d /etc/rc.d ] && cd /etc/rc.d && rm -rf *shellcrash >/dev/null 2>&1 && cd - >/dev/null ckcmd systemctl && systemctl disable shellcrash.service >/dev/null 2>&1 - grep -q 's6' /proc/1/comm && rm -rf /etc/s6-overlay/s6-rc.d/user/contents.d/afstart + grep -q 's6' /proc/1/comm && disable_s6_autostart_marks rc-status -r >/dev/null 2>&1 && rc-update del shellcrash default >/dev/null 2>&1 touch "$CRASHDIR"/.dis_startup } diff --git a/scripts/menus/userguide.sh b/scripts/menus/userguide.sh index bb11d4ba..995ef1dd 100644 --- a/scripts/menus/userguide.sh +++ b/scripts/menus/userguide.sh @@ -69,6 +69,7 @@ forwhat() { fi ckcmd systemctl && [ "$(cat /proc/1/comm)" = "systemd" ] && systemctl enable shellcrash.service >/dev/null 2>&1 + grep -q 's6' /proc/1/comm && enable_s6_autostart_marks rm -rf "$CRASHDIR"/.dis_startup autostart=enable # 检测IP转发 diff --git a/scripts/start.sh b/scripts/start.sh index 97e9247f..8fa387aa 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -11,6 +11,7 @@ . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/set_cron.sh . "$CRASHDIR"/libs/check_cmd.sh +. "$CRASHDIR"/libs/check_autostart.sh . "$CRASHDIR"/libs/compare.sh . "$CRASHDIR"/libs/logger.sh . "$CRASHDIR"/libs/web_save.sh @@ -54,7 +55,7 @@ start) systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh elif grep -q 's6' /proc/1/comm; then bfstart && /command/s6-svc -u /run/service/shellcrash && { - [ ! -f "$CRASHDIR"/.dis_startup ] && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart + [ ! -f "$CRASHDIR"/.dis_startup ] && enable_s6_autostart_marks afstart & } elif rc-status -r >/dev/null 2>&1; then From 376197c654ab4598873f10164f42727663a12e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BA=AF=E7=99=BD=E8=89=B2=E5=86=B0=E6=B7=87=E6=B7=8B?= Date: Tue, 11 Aug 2026 14:08:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?~=E4=BF=AE=E5=A4=8D=20Docker=20=E4=BB=85?= =?UTF-8?q?=E6=8C=82=E8=BD=BD=20configs=20=E6=97=B6=E9=87=8D=E5=BB=BA?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E4=B8=A2=E5=A4=B1=E5=86=85=E6=A0=B8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?=20yamls/jsons=20=E5=8D=B7=E6=8C=82=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/README.md | 4 +++- docker/compose.yml | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docker/README.md b/docker/README.md index c3daaa64..dcc1bb14 100644 --- a/docker/README.md +++ b/docker/README.md @@ -89,6 +89,8 @@ mkdir -p /root/ShellCrash docker run -d \ ……………… -v shellcrash_configs:/etc/ShellCrash/configs \ + -v shellcrash_yamls:/etc/ShellCrash/yamls \ + -v shellcrash_jsons:/etc/ShellCrash/jsons \ ……………… ``` @@ -134,7 +136,7 @@ docker rm -f shellcrash ### Docker删除卷 ```shell -docker volume rm shellcrash_configs +docker volume rm shellcrash_configs shellcrash_yamls shellcrash_jsons ``` ### Compose删除容器&卷 diff --git a/docker/compose.yml b/docker/compose.yml index d246815b..636dd9df 100644 --- a/docker/compose.yml +++ b/docker/compose.yml @@ -18,10 +18,14 @@ services: # - net.ipv6.conf.all.forwarding=1 volumes: - shellcrash_configs:/etc/ShellCrash/configs:rw + - shellcrash_yamls:/etc/ShellCrash/yamls:rw + - shellcrash_jsons:/etc/ShellCrash/jsons:rw restart: unless-stopped volumes: shellcrash_configs: + shellcrash_yamls: + shellcrash_jsons: networks: macvlan_lan: From b255ac47f42a7b1191d1ef20ddc9c0246276c68e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B0=8F=E5=B0=8F=E7=8C=AB=E4=BB=94?= Date: Thu, 27 Aug 2026 11:40:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=AB=98=E5=80=8D?= =?UTF-8?q?=E7=8E=87=E4=BB=A3=E7=A0=81=E7=9A=84=E5=8C=B9=E9=85=8D=E5=92=8C?= =?UTF-8?q?=E9=B2=81=E6=A3=92=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化高倍率代码的匹配和鲁棒性 --- rules/clash_providers/ShellCrash_RS_Full_BanAds.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/clash_providers/ShellCrash_RS_Full_BanAds.yaml b/rules/clash_providers/ShellCrash_RS_Full_BanAds.yaml index ca1d555c..33a5f056 100644 --- a/rules/clash_providers/ShellCrash_RS_Full_BanAds.yaml +++ b/rules/clash_providers/ShellCrash_RS_Full_BanAds.yaml @@ -11,7 +11,7 @@ proxy-groups: - {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, ✨ 自动选择(去高倍率), 🛠️ 手动切换, ⚖️ 负载均衡, 🚑 故障转移, 🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]} - {name: 🛠️ 手动切换, type: select, include-all: true, proxies: [🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]} - {name: ♻️ 自动选择, type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"} - - {name: ✨ 自动选择(去高倍率), type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)`(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|\\d{2,}))"} + - {name: ✨ 自动选择(去高倍率), type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)`(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))"} - {name: ⚖️ 负载均衡, type: load-balance, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"} - {name: 🚑 故障转移, type: fallback, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"} # @@ -51,7 +51,7 @@ proxy-groups: - {name: 🇰🇷 韩国节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇰🇷|韩|韓|首尔|kr|kor)"} - {name: 🇸🇬 狮城节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇸🇬|新加坡|狮城|sg|singapore)"} - - {name: 👑 高级节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|\\d{2,}))"} + - {name: 👑 高级节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))"} - {name: 📉 省流节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(0\\.[1-6]|低倍率|省流|大流量|公益|免费|闲时|Low)"} #规则提供者(更新mrs格式) From df9ae2a8d8f869fcdd0ba1d3fb4715812ee63baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B0=8F=E5=B0=8F=E7=8C=AB=E4=BB=94?= Date: Thu, 27 Aug 2026 11:41:16 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=AB=98=E5=80=8D?= =?UTF-8?q?=E7=8E=87=E4=BB=A3=E7=A0=81=E7=9A=84=E5=8C=B9=E9=85=8D=E5=92=8C?= =?UTF-8?q?=E9=B2=81=E6=A3=92=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化高倍率代码的匹配和鲁棒性 --- rules/singbox_providers/ShellCrash_RS_Full_BanAds.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/singbox_providers/ShellCrash_RS_Full_BanAds.json b/rules/singbox_providers/ShellCrash_RS_Full_BanAds.json index 40a1b483..9414bc42 100644 --- a/rules/singbox_providers/ShellCrash_RS_Full_BanAds.json +++ b/rules/singbox_providers/ShellCrash_RS_Full_BanAds.json @@ -4,7 +4,7 @@ { "tag": "🚀 节点选择", "type": "selector", "outbounds": ["♻️ 自动选择", "✨ 自动选择(去高倍率)", "🛠️ 手动切换", "🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "🛠️ 手动切换", "type": "selector", "use_all_providers": true, "outbounds": ["🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "♻️ 自动选择", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)" }, - { "tag": "✨ 自动选择(去高倍率)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|[0-9][0-9]+))" }, + { "tag": "✨ 自动选择(去高倍率)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))" }, { "tag": "🤖 AI 平台", "type": "selector", "outbounds": ["🚀 节点选择", "🤖 AI节点(过滤港澳)", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "🤖 AI节点(过滤港澳)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|🇭🇰|港|🇲🇴|澳门|hk|hongkong|hong kong)" }, @@ -42,7 +42,7 @@ { "tag": "🇰🇷 韩国节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇰🇷|韩|韓|首尔|kr|kor)" }, { "tag": "🇸🇬 狮城节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇸🇬|新加坡|狮城|sg|singapore)" }, - { "tag": "👑 高级节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|[0-9][0-9]+))" }, + { "tag": "👑 高级节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))" }, { "tag": "📉 省流节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(0[.][1-5]|低倍率|省流|大流量|公益|免费|闲时|Low)" } ], "route": {