Build SingBox Configs #37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build SingBox Configs | |
| on: | |
| schedule: | |
| - cron: '0 * * * *' | |
| workflow_dispatch: | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repo | |
| uses: actions/checkout@v4 | |
| - name: Build configs | |
| run: | | |
| SUB=$(curl -s "https://raw.githack.com/igareck/vpn-configs-for-russia/main/Vless-Reality-White-Lists-Rus-Mobile.txt" | tr -d '\r') | |
| ALL=$(echo "$SUB" | grep -E '^(vless|vmess|trojan)://') | |
| RUSSIA=$(echo "$ALL" | grep -Ei 'russia' || true) | |
| NON_RUSSIA=$(echo "$ALL" | grep -Evi 'russia' | shuf || true) | |
| make_config () { | |
| SIZE=$1 | |
| RU_PREF=$2 | |
| OUT=$3 | |
| # Берем указанное количество русских ключей | |
| RU=$(echo "$RUSSIA" | head -n "$RU_PREF") | |
| RU_COUNT=$(echo "$RU" | grep -c . || true) | |
| # Если русских меньше, чем RU_PREF, добираем из NON_RUSSIA | |
| NEED=$((SIZE - RU_COUNT)) | |
| NONRU="" | |
| if [ "$NEED" -gt 0 ]; then | |
| NONRU=$(echo "$NON_RUSSIA" | head -n "$NEED") | |
| fi | |
| # Финальный список (только русские, если хватает) | |
| FINAL=$(printf "%s\n%s\n" "$RU" "$NONRU" | grep .) | |
| echo "Building $OUT with $(echo "$FINAL" | grep -c .) nodes..." | |
| echo " - Russian nodes: $RU_COUNT" | |
| echo " - Non-Russian nodes: $(echo "$NONRU" | grep -c . || echo 0)" | |
| jq -n --arg input "$FINAL" '{ | |
| core: "singbox", | |
| input: $input, | |
| options: { | |
| addTun: true, | |
| addSocks: true, | |
| genClashSecret: false, | |
| useExtended: false | |
| } | |
| }' \ | |
| | curl -sS -X POST "https://api.web2core.workers.dev/" \ | |
| -H "Content-Type: application/json" \ | |
| --data-binary @- \ | |
| > "$OUT" | |
| } | |
| make_foreign () { | |
| SIZE=$1 | |
| OUT=$2 | |
| FOREIGN=$(echo "$NON_RUSSIA" | shuf | head -n "$SIZE") | |
| jq -n --arg input "$FOREIGN" '{ | |
| core: "singbox", | |
| input: $input, | |
| options: { | |
| addTun: true, | |
| addSocks: true, | |
| genClashSecret: false, | |
| useExtended: false | |
| } | |
| }' \ | |
| | curl -sS -X POST "https://api.web2core.workers.dev/" \ | |
| -H "Content-Type: application/json" \ | |
| --data-binary @- \ | |
| > "$OUT" | |
| } | |
| # ---------------- RU HYBRID (только русские, NON-RU только если не хватает) ---------------- | |
| make_config 5 5 config5.json # 5 русских, если не хватает - добираем | |
| make_config 7 7 config7.json # 7 русских | |
| make_config 10 10 config10.json # 10 русских | |
| # shuffled duplicates (та же логика) | |
| make_config 5 5 config5_b.json | |
| make_config 7 7 config7_b.json | |
| make_config 10 10 config10_b.json | |
| # ---------------- FOREIGN ONLY (только нерусские) ---------------- | |
| make_foreign 5 config5_foreign.json | |
| make_foreign 10 config10_foreign.json | |
| # ---------------- PATCH URLTEST ---------------- | |
| patch_interval () { | |
| FILE=$1 | |
| INTERVAL=$2 | |
| echo "Patching $FILE -> interval=$INTERVAL" | |
| jq --arg interval "$INTERVAL" ' | |
| (.outbounds[] | select(.type=="urltest") | .interval) = $interval | | |
| (.outbounds[] | select(.type=="urltest") | .tolerance) = 50 | |
| ' "$FILE" > tmp.json && mv tmp.json "$FILE" | |
| } | |
| # 5-series → 1m | |
| patch_interval config5.json "1m" | |
| patch_interval config5_b.json "1m" | |
| patch_interval config5_foreign.json "1m" | |
| # all others → 2m | |
| patch_interval config7.json "2m" | |
| patch_interval config7_b.json "2m" | |
| patch_interval config10.json "2m" | |
| patch_interval config10_b.json "2m" | |
| patch_interval config10_foreign.json "2m" | |
| - name: Commit configs | |
| run: | | |
| git config user.name "github-actions" | |
| git config user.email "actions@github.com" | |
| git add config*.json | |
| git commit -m "auto update sing-box configs" || exit 0 | |
| git push | |
| # === НОВЫЙ ШАГ ДЛЯ ЗАГРУЗКИ НА ЯНДЕКС.ДИСК === | |
| - name: Upload configs to Yandex Disk | |
| uses: kirpichk/yandex-disk-publish@v1 | |
| with: | |
| token: ${{ secrets.YANDEX_TOKEN }} | |
| source: './config*.json' # Загрузить все файлы, начинающиеся с config | |
| target: '/SingBox_Configs' # Путь к ПАПКЕ на вашем Яндекс.Диске | |
| # Опционально: удалить старые файлы в папке перед загрузкой, чтобы там были только новые | |
| cleanup: 'true' |