chore: убрать VLESS-прокси, proxychains и fuck-rkn.sh

Пользователь перешёл на Amnezia VPN — встроенный VLESS-прокси (xray + proxychains4)
и отдельный server-installer fuck-rkn.sh (telemt + xray) больше не нужны. Убран
весь код в ai-setup.sh/setup.sh, конфиги с VPN-кредами, неактуальный тест и
упоминания в документации.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 21:50:50 +03:00
parent 9b906823cd
commit 9e64088e46
10 changed files with 7 additions and 2464 deletions

View File

@@ -6,7 +6,7 @@
bash setup.sh bash setup.sh
``` ```
Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры Установит лаунчеры
`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini`, `ai-cursor` `ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini`, `ai-cursor`
в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи. в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи.

View File

@@ -10,7 +10,6 @@
setup.sh # мастер-скрипт с меню setup.sh # мастер-скрипт с меню
scripts/ scripts/
├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR ├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR
├── fuck-rkn.sh # серверный установщик nginx + telemt + xray
├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального ├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального
├── ks-off.sh # временно отключить kill switch ├── ks-off.sh # временно отключить kill switch
└── ks-on.sh # восстановить kill switch └── ks-on.sh # восстановить kill switch
@@ -20,12 +19,8 @@ home-configs/
│ ├── hooks/ # хуки аккаунтов Claude Code │ ├── hooks/ # хуки аккаунтов Claude Code
│ ├── skills/ # кастомные скиллы для Claude Code (и Gemini) │ ├── skills/ # кастомные скиллы для Claude Code (и Gemini)
│ └── statusline-command.sh # статусная строка Claude Code │ └── statusline-command.sh # статусная строка Claude Code
── network/ ── network/
└── README.md # подробная документация по сетевой настройке └── README.md # подробная документация по сетевой настройке
├── vless/
│ └── servers.conf # список VLESS-серверов для прокси
└── proxychains/
└── proxychains-xray.conf # конфиг proxychains (SOCKS5 через xray)
tests/ tests/
├── test_fixes.sh # юнит-тесты структуры ai-setup.sh ├── test_fixes.sh # юнит-тесты структуры ai-setup.sh
└── test_network.sh # тесты маршрутизации └── test_network.sh # тесты маршрутизации
@@ -210,20 +205,6 @@ android init
- Android CLI находится в preview, API/команды могут меняться. - Android CLI находится в preview, API/команды могут меняться.
- На Windows в v0.7 отключена команда `android emulator`. - На Windows в v0.7 отключена команда `android emulator`.
- Если уже установлен Android Studio, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`. - Если уже установлен Android Studio, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`.
- Android CLI - нативный бинарь, который спавнит дочерние процессы (emulator, gradle, adb), поэтому он не оборачивается в `proxychains4`.
## VLESS / Xray (опционально)
При запуске `scripts/ai-setup.sh` спрашивает, нужен ли VLESS-прокси для AI API запросов.
Если выбрать **Y**:
- Читает список серверов из `home-configs/vless/servers.conf`
- Проверяет каждый сервер реальным curl'ом через SOCKS5
- Устанавливает Xray, генерирует конфиг, создаёт systemd сервис
- Все лаунчеры оборачиваются в `proxychains4`
Если выбрать **n** - VLESS отключается, xray останавливается, системный/Firefox прокси
сбрасываются в direct. IPv6 включается обратно только если UFW kill switch не активен.
## Ключи и конфиги ## Ключи и конфиги
@@ -265,7 +246,6 @@ GPT/claude-code-proxy backend; текущие лаунчеры его напря
- `bash`, `curl`, `python3` - `bash`, `curl`, `python3`
- Node.js/npm (для ai-gpt через Codex CLI и ai-gemini через agy) - Node.js/npm (для ai-gpt через Codex CLI и ai-gemini через agy)
- `ipset` (устанавливается автоматически при запуске ru-bypass.sh) - `ipset` (устанавливается автоматически при запуске ru-bypass.sh)
- (опционально) `proxychains-ng` - для VLESS-режима
- (опционально) `gsettings` - для автонастройки системного прокси GNOME - (опционально) `gsettings` - для автонастройки системного прокси GNOME
## Тесты ## Тесты

View File

@@ -80,7 +80,6 @@ android update
- **Preview-версия**: API и команды могут меняться. Обновляй через `android update`. - **Preview-версия**: API и команды могут меняться. Обновляй через `android update`.
- **Windows**: `android emulator` отключён в v0.7. - **Windows**: `android emulator` отключён в v0.7.
- **Существующий SDK**: если уже установлен Android Studio или `sdkmanager`, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`. - **Существующий SDK**: если уже установлен Android Studio или `sdkmanager`, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`.
- **Прокси**: Android CLI - нативный бинарь, который спавнит дочерние процессы (emulator, gradle, adb). Не оборачивай его в `proxychains4`, это может сломать child-процессы.
## Полезные ссылки ## Полезные ссылки

View File

@@ -1,9 +0,0 @@
# ProxyChains-NG config for xray SOCKS5 proxy
strict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5 127.0.0.1 1080

View File

@@ -1,6 +0,0 @@
# VLESS servers — один URL на строку
# Имя после # используется для отображения в меню выбора
vless://495ac855-d718-4581-8344-f1e62105a904@92.118.8.29:443?encryption=mlkem768x25519plus.native.0rtt.gNGR8kO_UDWjoeer_TenoRbA09ajfrSfahqkS4q0dTeCFutCHGJjIdhSl8Fv8HyYUyWB_2GqMrSIzLS9l1BiidClOnliyUmZylQwQoUFl6CsLsZxdrrDz3w2isuIhtXPfZw8lANOErk7p7mm4QN0H2ZKCOQQaxkL3XA8EcxqNuGhK4XLqlFBDommPJUQfPuP7LV3V7s8YTcwq1EUr-Nyv0CZRdcF9WCNCWq26TVYXFwHSkeknBBFKYEJiytB8DpIvlmTvREQfEVnTziwOdYKikQXeOYdbcuKSWGb2okDZjFzYckULaWhavOwRWnOquZqdXiatrNPmCWnG2mfcSxA0UdLu8ALiOtuPjBGDUqqaXhZLLuH1zhdsUE4PMqqkNnMvsRwmvAYgWwSKWioz3wTQ1sKVfW1jTh8LyouZaVkuqRTunwWBcVCRDYEFUh4TBB_-WOpu7eh4ROmj9w0mhWBrtRO-uin8ZwqhkeScQhwoFUEvlwCsAl8AevGmAm1qpdOzfXNUgBTtVoXG9OTMUk9ZORiTzO0tutVTlKjaiBb1vOqgiFqiPuG1csvaPt63LQ1e9ywvEek7NkLVnrJopmCnTiu9UhE7GwZbxI8FBFYrBmPpIUszLiWLQZqvySbqBrIFTC5lIw9WymdW5wKONs5DZmYtFZOHUVEFtVFJvcZqwnEJARKI_M-rvkS7FWPPCkKHpEVe_IJsgOgoUzI9yQI5kNlS5XAzUG7ZMGWtzYjOZNZ1FYP5NbBTTy9I8kpLRQv3yp7PYBGdBQapaYX82Qjc4orJdghG5UOTQwsokojPVaAzSWG4qk5hoNugvogx9KHdsitKXCDlhdksQS5Obc8uMg1TxO2c0AnR2nNNVqgb_prVUlaNHcP4wARfCqrMwdgYQSSoLZluah9a2eZxGcC6CMxPBsThCEwNzIJUZiuPIvEQVFyJpiCHeUErGZFLpmaE0MK2cEzD9N7pRVgEExvwIMnO3jIGmCz80FFuAmEjDG5iyMkzQpsEnBHwAaihjkSwgCsZzTL26OtIDUUYMZ1N8ciRRqTvSGzn_K6EUp7JaWygZGw3QCBRocO7SEWpuGvakJc0QV32vpty3c8UeIcJZlgGKgtcNcsVYvLpEkkYviNCbpq6jnECRYUuXGp_oQv1mwqx2WMqGic7LVZNtYCJ3fHAsGi4yh5nfU0dNSCC0cgeyakNXvL3eyqHIB_e8RrEiMywUg7_MGP2oE9ZOqayLRapVTGQ-YATgcnZ_Eg5bKHNcRVqBpo0heElCtMPoEdQYE_HZSOm1cf9nFIYqRJ6_RPJNKGDOBwy1wJWJel54y-CeY3S2vAWRibOFiwVGW01tHNSCEQBaiLEzQ2Xml6IkSAHNm9eifPrdxuBChibzco4dUFpumbxrRkJYAuqmQfWgi36ziojeEDLlUd55ZDeCOVn4MoHMcD4yzAkpdUelyBafeUoQEs6hCDf2p7CvCquWKoEzcwvuccR0GcN5un2sqQAMVKw3Gs3fsRwkgcdsK69oE4KfUKVjrBGkIk9ChYCJMYGZJ-pGkWFp1qLua2QnNmPVJlpPjurRJVoiAiOVE&security=reality&sni=www.amd.com&fp=chrome&pbk=AMoGtXyztJYD6GRP6m8K82Mi-5vthrNrppJkEmconTU&sid=9cd28fd258f8b99c&type=xhttp&path=%2F&mode=auto#RF-VPS1
vless://91749001-1f60-4afb-b7b5-25d1480de980@194.87.213.143:443?encryption=mlkem768x25519plus.native.0rtt.D4eIFKFhlMVUsInLgmx5lWuTpBJ8B3lEWnA4gCKdZgw1rjlvHsWd38rC35BAQeKSeBmbZ_sIk6w1gzCCAcYKlJN8rMZyr4TEecnADumEI0e05fRcYCXH70BdHnJxkhklzUIwAKyZHmwlk7euozhYinwq-piRuEBvl0NS-tITgOaje8jLuMyrBTnBKBtzwDR43aMsDqZhzRi-qIaiy0GXjEgHmypFIFB3EOdmCukbvgyJuBAbttTHqdCedQCeJTNfs3tzmzqFKuJXVGRvAvipWGqC_4hzlTWaVXBiuysAmGMC0oqERTyUS9qKqytOr_oyu-jPzjCdIUTPAjdpw4kzXEiuetAuZNuwdbRAHAB_DadVIAsqyVapNIVP0UlN-PJE95pAS6Yfpru2uIBWcJZhV7LE2FKBtAcC31lHeVKy12pG_NlZopYltcmdacVeXBRd1wURrrDFNNTCKaG5wAFm3HFYrzY6qZfNanebgQeYIQm3rbbGGCLBYLyHxcmKeuWVIMTJlISicHdnNyok7KJ2gWKTWtREkfQMXrZKF8BeiSp-9FQX_UCwx0LMd0axB8hqCVtpGspbH8ugKamFr4olFyKrUdQuLhEM1_xzNgZT3dWhvCxDw1VOp3qMd6G4X4YhnABioLOPl2JEyjOLMdAFRlRrdXnNpJdTA0esrJFw5Mte2gNYDAgWEFoq5uupAZlYwniB69BCeEouQiU0GYdWkxwAqwy8xtCEs9Wi4RGPBmdZnhOb5LMUBACwvFm_haF5zgwDrTmUZWdKhXMDXOMOdrcQaDvMf3uk64Q6obe47hkn1LFQS5mKOYYAjblg1RV0y1ovWtFSVBuuCsckyNUPSjETKthQQ6OUgZmpN-pMlBgzGzi3rowqdjNzrMh894ufrptX2GBqEANIM3h5HkR2ObIlJdOv6rQRnmu09EVKp7BHAVLKJcJff9HJYWIqUueArllu5IivueGPG5gPMDIp5SoHVvk_eCMUY2lLtxEE1PCjbgt8ahKTQLcFCXmJf7h945F4jOsDLCxiBSSxaMZdK5AiGGcQm-mcQ4aXBLgiHLCfD3SU7UzIF9key8u35bBm2OVjyTWei-AOssdVV2qFMppuF7Myv4GaEMpQ1JGaLpxT9zSSdVqbO6aJNBkkFxJhcnWqm8CMWVkaGubHkSeDInS65_KFe6I8IrZVm9lBThN1mvdqWkCvZ_ooRiChX7hNKTAXH9cgW-OaOTY1eissDkmW2FEGcPU5iRcDY5kgubZYgTSaHKFAIqg-6NIQX1l3d6lx41EkwyKUCWU-zfjBGsdgszjHXykOrcNQ75o_M3k_-_IBdkOpaESrhSsj2bdNUVcx7fx1S2d6STiLIrW--WeoeBhb6BcytgkbnlRlmvfNDZbOTJYzXQLJtCRZv3xJyfcEB0UqvKFIaCtN4ubHTpyRZ5PHtYHDh9lmIASIItMqeXQlazktz-cajiOFX8RCIkcDFkZ-0KpmYiBToVpi-zSjdLCPPVMf14V5kqAP6EA1IiTJPwFuroWluOJ5j8mx4c0i8fbd1n_mTH_7Ff8Ognu-LFLBU9r9yWcVhBkm_JQ&security=reality&sni=vkvideo.ru&fp=chrome&pbk=BWwAjxuB6QbC2ta23L8_U4QjjkUs17NDi79Mm2RjQHQ&sid=17c863e8490260b6&type=xhttp&path=%2F&mode=packet-up#RF-Bridge-PQ
vless://f3f3d573-5440-425c-a13c-203b34a9279f@202.148.54.122:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.samsung.com&fp=chrome&pbk=aTBwueWs3WYoxA0M051KZn3hr2EogEULd3GOdvl7x0Y&sid=5a0048d376dc1c00#AmneziaVPN
vless://40ee74ff-9865-498a-b464-12fa6a3772fe@45.43.91.139:853?encryption=mlkem768x25519plus.native.0rtt.TZBtUoTBrKNMXKtza2TElwtqc9W_zgAJEDcxH1fBEwQgbZCAXHgK9edzewlVFSBK3zK2p4IZ6hsESffCSOesy4Mll_CKPiY0kFGCV-yNl6w45eav7RUhDOuiPBrHR3hC-bgH4xoClLajDfG7nHu2ecppcsEedkt7MLSacYI3EsJ-rKa-vbN3vgI5w8ZtunFF-PYVRJuYrbw711RwbcO_AWfPt1J25ZhVcxQ5CWufWXG1XLtaZLdk-2cmKsiVIgcr6tOIYIuh8XULoCVh5rsjwlcH4slu4cYGGgxwNIg7C_wYs8zLyvKWgBUL0UwctTyNbxChWktTuWaGRnS27PJbdbJ6T9gTzMsWh3dbVnlGZbIjbJMe3NAvVOJUhGOQ7NpEP9x9wgVzO-dUJQkOwKAoDfAtvbRIAaRg_5w20ZRy0sutSwUCoKtUfxCxB4CwcSmFgqWRrsvHNTy2U7We6GibAwy90iiC3sGCVSM69XcN1xirfVVGRbAMrfk0DehWNAvQFHFNkThvi0qh-1Q3p4YK6EWhgswTqmMbM2iOTQA_KaxUQKwfPnIfCBMIuTBdFDYOMyyvZayFq4Ul62vEMvUOCQCHL7WtdzhVR5cdquggX3C4Zzutlug_n4q2jLt2ldYvAwEMErPOlSq2DKmIcWFE5YWSjUhYxvg76rOEK_WSSGNrtrO5n6eRFtiIyaxXPxEhjsFdoLMekDSdhZWyhwa3-9Vqf_xDgrs2CMlOkpQbIvqe92QkVdWzhWeulBu4XGsnOVCivvvLrUBfGDs9FrCYGLEtOLtMlHcny1tXjdjEVkejrvOcOTCvxKoidTzJVsVi2Oxn9VGfO6TOURvP4KwsDDVZbgUgAYqfBbkrnpNhaaZFuoYw-7GuZawl8LyOy8SU9NQesDt4YUZ3MrWcHwALrKqCD3OSf0wzq0N-BDY6frAQf8W3KSO8ivKfxMQhN5xPfSuTlRivWuq1lpEjFiqi-vZF-ZkVA9qRWmyXRfaUYcKqqQFoO5Ks0FuainJmxPocseUIxVF3qCINQLsaxVgWITAcWOOZV4m021Yy2LxnwcubRUkDHPGvIocQE8JF7fpAWVqjAxwT7oCHiHRf6WtzEHhCWZx7y9tR-AV4_XgZNEwRj7DM-kdztDl78Wg9E7Ze9lnK3UCXPxQf9THOd_wqQ0aF5bkwf_qqj0klX9WphfBvPzVuI0lmVeWPDKyqVDqCw4An8oFB7bxt_lPDzIOInvB5U8hXUuMjsQS6iEcSSHcfqed8adcKvzTCK6JcjLCTyImVS3hsxMOC9qFMtDpmsxcNdFphlZc9ODjGgZtVLYLIYka-JKQWPgC2R-s8H6EU0ymjIhsmdMe93KyHAcC3anpUKTu9oSk5sthVFhB0l2RCpSKlWOhFG8RkAspKWYlu-DGC3ROvnbJojjpGkpDFEWoVnzWQ8VK5hcxSeFQ17auDWMKBkDuhR1ciVURnCBBVO1FEGvGGVyAbYoUri8moPeZ8jNBvztFZiahBeWQBsxQcA9C78Yus34S2aOwCfHVQ9hN2slx5tPY5abR_EwhyS4NhAZ7how7k0Fds42glbOE&security=reality&sni=www.amd.com&fp=chrome&pbk=3PdVmi-ZFgQpvTD8Tj4ubL1kicezogKf7-qkMLfjxxw&sid=846683ae0dde8bd1&type=xhttp&path=%2F&mode=auto#EURO-Reality-PQ

View File

@@ -1,51 +0,0 @@
{
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
}
},
{
"port": 2080,
"listen": "127.0.0.1",
"protocol": "http"
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "92.118.8.29",
"port": 443,
"users": [
{
"id": "495ac855-d718-4581-8344-f1e62105a904",
"encryption": "mlkem768x25519plus.native.0rtt.gNGR8kO_UDWjoeer_TenoRbA09ajfrSfahqkS4q0dTeCFutCHGJjIdhSl8Fv8HyYUyWB_2GqMrSIzLS9l1BiidClOnliyUmZylQwQoUFl6CsLsZxdrrDz3w2isuIhtXPfZw8lANOErk7p7mm4QN0H2ZKCOQQaxkL3XA8EcxqNuGhK4XLqlFBDommPJUQfPuP7LV3V7s8YTcwq1EUr-Nyv0CZRdcF9WCNCWq26TVYXFwHSkeknBBFKYEJiytB8DpIvlmTvREQfEVnTziwOdYKikQXeOYdbcuKSWGb2okDZjFzYckULaWhavOwRWnOquZqdXiatrNPmCWnG2mfcSxA0UdLu8ALiOtuPjBGDUqqaXhZLLuH1zhdsUE4PMqqkNnMvsRwmvAYgWwSKWioz3wTQ1sKVfW1jTh8LyouZaVkuqRTunwWBcVCRDYEFUh4TBB_-WOpu7eh4ROmj9w0mhWBrtRO-uin8ZwqhkeScQhwoFUEvlwCsAl8AevGmAm1qpdOzfXNUgBTtVoXG9OTMUk9ZORiTzO0tutVTlKjaiBb1vOqgiFqiPuG1csvaPt63LQ1e9ywvEek7NkLVnrJopmCnTiu9UhE7GwZbxI8FBFYrBmPpIUszLiWLQZqvySbqBrIFTC5lIw9WymdW5wKONs5DZmYtFZOHUVEFtVFJvcZqwnEJARKI_M-rvkS7FWPPCkKHpEVe_IJsgOgoUzI9yQI5kNlS5XAzUG7ZMGWtzYjOZNZ1FYP5NbBTTy9I8kpLRQv3yp7PYBGdBQapaYX82Qjc4orJdghG5UOTQwsokojPVaAzSWG4qk5hoNugvogx9KHdsitKXCDlhdksQS5Obc8uMg1TxO2c0AnR2nNNVqgb_prVUlaNHcP4wARfCqrMwdgYQSSoLZluah9a2eZxGcC6CMxPBsThCEwNzIJUZiuPIvEQVFyJpiCHeUErGZFLpmaE0MK2cEzD9N7pRVgEExvwIMnO3jIGmCz80FFuAmEjDG5iyMkzQpsEnBHwAaihjkSwgCsZzTL26OtIDUUYMZ1N8ciRRqTvSGzn_K6EUp7JaWygZGw3QCBRocO7SEWpuGvakJc0QV32vpty3c8UeIcJZlgGKgtcNcsVYvLpEkkYviNCbpq6jnECRYUuXGp_oQv1mwqx2WMqGic7LVZNtYCJ3fHAsGi4yh5nfU0dNSCC0cgeyakNXvL3eyqHIB_e8RrEiMywUg7_MGP2oE9ZOqayLRapVTGQ-YATgcnZ_Eg5bKHNcRVqBpo0heElCtMPoEdQYE_HZSOm1cf9nFIYqRJ6_RPJNKGDOBwy1wJWJel54y-CeY3S2vAWRibOFiwVGW01tHNSCEQBaiLEzQ2Xml6IkSAHNm9eifPrdxuBChibzco4dUFpumbxrRkJYAuqmQfWgi36ziojeEDLlUd55ZDeCOVn4MoHMcD4yzAkpdUelyBafeUoQEs6hCDf2p7CvCquWKoEzcwvuccR0GcN5un2sqQAMVKw3Gs3fsRwkgcdsK69oE4KfUKVjrBGkIk9ChYCJMYGZJ-pGkWFp1qLua2QnNmPVJlpPjurRJVoiAiOVE",
"flow": ""
}
]
}
]
},
"streamSettings": {
"network": "xhttp",
"security": "reality",
"realitySettings": {
"serverName": "www.amd.com",
"fingerprint": "chrome",
"publicKey": "AMoGtXyztJYD6GRP6m8K82Mi-5vthrNrppJkEmconTU",
"shortId": "9cd28fd258f8b99c"
},
"xhttpSettings": {
"path": "/",
"mode": "auto"
}
}
}
]
}

View File

@@ -53,260 +53,6 @@ else
warn "jq не найден. statusline-command.sh и некоторые функции могут не работать." warn "jq не найден. statusline-command.sh и некоторые функции могут не работать."
fi fi
# ── VLESS URL parser ───────────────────────────────────────────
# Принимает vless:// URL, устанавливает переменные VL_*
parse_vless_url() {
local url="$1"
eval "$(python3 -c "
import urllib.parse, sys
url = sys.argv[1]
rest = url[8:] # strip 'vless://'
at_pos = rest.index('@')
uuid = rest[:at_pos]
rest = rest[at_pos+1:]
colon_pos = rest.index(':')
q_pos = rest.index('?')
host = rest[:colon_pos]
port = rest[colon_pos+1:q_pos]
rest = rest[q_pos+1:]
hash_pos = rest.index('#') if '#' in rest else len(rest)
qs = rest[:hash_pos]
name = rest[hash_pos+1:] if '#' in rest else ''
params = urllib.parse.parse_qs(qs)
def get(p, default=''):
vals = params.get(p, [default])
return vals[0] if vals else default
flow = get('flow')
vtype = get('type')
if not vtype:
vtype = 'xhttp' if not flow else 'tcp'
spx_default = '' if vtype == 'tcp' else '/'
print(f'VL_UUID={uuid}')
print(f'VL_ADDRESS={host}')
print(f'VL_PORT={port}')
print(f'VL_ENCRYPTION={get(\"encryption\")}')
print(f'VL_FLOW={flow}')
print(f'VL_SECURITY={get(\"security\")}')
print(f'VL_SNI={get(\"sni\")}')
print(f'VL_FP={get(\"fp\", \"chrome\")}')
print(f'VL_PBK={get(\"pbk\")}')
print(f'VL_SID={get(\"sid\")}')
print(f'VL_TYPE={vtype}')
print(f'VL_PATH={urllib.parse.unquote(get(\"path\", \"/\"))}')
print(f'VL_MODE={get(\"mode\", \"auto\")}')
print(f'VL_SPX={get(\"spx\", spx_default)}')
print(f'VL_NAME={name}')
" "$url")"
}
# ── VLESS connectivity test ────────────────────────────────────
# Запускает xray с тестовым конфигом и проверяет curl'ом
# Возвращает: "ok" или "fail"
test_vless_server() {
local url="$1" test_port="$2"
parse_vless_url "$url"
# Генерируем временный конфиг
_TMP_CONF="/tmp/xray_test_${test_port}.json"
_VL_XHTTP=""
if [ "$VL_TYPE" = "xhttp" ]; then
_VL_XHTTP=$(printf ',\n "xhttpSettings": {\n "path": "%s",\n "mode": "%s"\n }' "$VL_PATH" "$VL_MODE")
fi
cat > "$_TMP_CONF" << XRAYEOF
{
"log": { "loglevel": "none" },
"inbounds": [
{
"port": $test_port,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": { "udp": true }
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "$VL_ADDRESS",
"port": $VL_PORT,
"users": [
{
"id": "$VL_UUID",
"encryption": "$VL_ENCRYPTION",
"flow": "$VL_FLOW"
}
]
}
]
},
"streamSettings": {
"network": "$VL_TYPE",
"security": "$VL_SECURITY",
"realitySettings": {
"serverName": "$VL_SNI",
"fingerprint": "$VL_FP",
"publicKey": "$VL_PBK",
"shortId": "$VL_SID",
"spiderX": "$VL_SPX"
}$_VL_XHTTP
}
}
]
}
XRAYEOF
# Запускаем xray
/usr/local/bin/xray run -c "$_TMP_CONF" >/dev/null 2>&1 &
local xpid=$!
sleep 2
# Тест через SOCKS5
local result="fail"
if curl --socks5 "127.0.0.1:${test_port}" --max-time 5 -s https://ifconfig.co/ >/dev/null 2>&1; then
result="ok"
fi
kill $xpid 2>/dev/null; wait $xpid 2>/dev/null
rm -f "$_TMP_CONF"
echo "$result"
}
# ── 0. Выбор режима работы VLESS (on / off / skip) ─────────────
# AI_SETUP_VLESS:
# 1 / on — включить VLESS (установка xray + proxychains + обёртки лаунчеров)
# 0 / off — отключить VLESS (откат: stop xray, сброс прокси, IPv6 on)
# skip — НЕ трогать сеть (умолчание). Лаунчеры синхронизируются
# с текущим состоянием (xray активен?).
# Устанавливается из меню setup.sh. По умолчанию skip, чтобы прямой запуск
# ai-setup.sh и пункты 1/7/8 не меняли сетевые настройки.
DO_VLESS_INSTALL=0
case "${AI_SETUP_VLESS:-skip}" in
1|on)
USE_VLESS=1
DO_VLESS_INSTALL=1
# Читаем список серверов
_VL_URLS=()
_VL_LABELS=()
_SERVERS_FILE="$SCRIPT_DIR/home-configs/vless/servers.conf"
if [ ! -f "$_SERVERS_FILE" ]; then
err "Файл servers.conf не найден: $_SERVERS_FILE"
fi
while IFS= read -r line || [[ -n "$line" ]]; do
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "$line" ]] && continue
_vl_rest="${line#vless://}"
_vl_rest="${_vl_rest#*@}"
_vl_ip="${_vl_rest%%:*}"
_vl_name="${line##*#}"
[[ "$_vl_name" == "$line" ]] && _vl_name=""
_VL_URLS+=("$line")
_VL_LABELS+=("$_vl_ip ($_vl_name)")
done < "$_SERVERS_FILE"
if [ "${#_VL_URLS[@]}" -eq 0 ]; then
err "Нет VLESS серверов в $_SERVERS_FILE"
fi
# Реальная проверка VLESS (запускаем xray для каждого сервера)
echo ""
info "Проверяю VLESS-доступность серверов..."
_VL_STATUS=()
for i in "${!_VL_URLS[@]}"; do
_label="${_VL_LABELS[$i]}"
_test_port=$((10980 + i))
printf " %-45s" "$((i+1))) $_label"
_status=$(test_vless_server "${_VL_URLS[$i]}" "$_test_port")
if [ "$_status" = "ok" ]; then
echo -e "${GREEN}✓ работает${NC}"
_VL_STATUS+=("ok")
else
echo -e "${RED}✗ не работает${NC}"
_VL_STATUS+=("fail")
fi
done
echo ""
read -r -p "Выбери сервер [1-${#_VL_URLS[@]}]: " _vl_choice
_vl_choice="${_vl_choice:-1}"
if ! [[ "$_vl_choice" =~ ^[0-9]+$ ]] || [ "$_vl_choice" -lt 1 ] || [ "$_vl_choice" -gt "${#_VL_URLS[@]}" ]; then
err "Неверный выбор: $_vl_choice"
fi
_VL_SELECTED="${_VL_URLS[$((_vl_choice-1))]}"
parse_vless_url "$_VL_SELECTED"
info "Выбран: $VL_ADDRESS ($VL_NAME)"
;;
0|off)
USE_VLESS=0
DO_VLESS_INSTALL=0
info "Отключение VLESS (откат настроек)"
# ── Откат всех настроек vless ──────────────────────────────
info "Откатываю настройки прокси..."
# Останавливаем и отключаем xray
sudo systemctl stop xray 2>/dev/null || true
sudo systemctl disable xray 2>/dev/null || true
success "xray остановлен и отключён"
# Системный прокси → none
if command -v gsettings &>/dev/null; then
gsettings set org.gnome.system.proxy mode 'none' 2>/dev/null || true
success "Системный прокси отключён"
fi
# Firefox → direct (type=0)
FIREFOX_PROFILE=""
if [ -d "$HOME/snap/firefox/common/.mozilla/firefox" ]; then
FIREFOX_PROFILE=$(find "$HOME/snap/firefox/common/.mozilla/firefox" -name "*.default*" -type d | head -1)
elif [ -d "$HOME/.mozilla/firefox" ]; then
FIREFOX_PROFILE=$(find "$HOME/.mozilla/firefox" -name "*.default*" -type d | head -1)
fi
if [ -n "$FIREFOX_PROFILE" ]; then
cat > "$FIREFOX_PROFILE/user.js" << 'FJSEOF'
user_pref("network.proxy.type", 0);
FJSEOF
success "Firefox переключён на прямой доступ"
fi
# Включаем IPv6 обратно (только если kill switch не активен)
if ufw status | grep -qE "активен|active"; then
info "UFW kill switch активен — оставляю IPv6 отключённым"
else
sudo rm -f /etc/sysctl.d/99-disable-ipv6.conf
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0 2>/dev/null || true
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0 2>/dev/null || true
sudo systemctl restart systemd-resolved 2>/dev/null || true
success "IPv6 восстановлен"
fi
;;
*)
# skip — сеть не трогаем; синхронизируем лаунчеры с текущим состоянием xray
if systemctl is-active --quiet xray 2>/dev/null; then
USE_VLESS=1
info "Сеть не трогаю. VLESS активен — лаунчеры будут с proxychains4."
else
USE_VLESS=0
info "Сеть не трогаю. VLESS не активен — прямые лаунчеры."
fi
info "Управление VLESS: пункт 9 (включить / отключить)."
;;
esac
# ── 1. npm prefix в домашнюю папку ────────────────────────── # ── 1. npm prefix в домашнюю папку ──────────────────────────
info "Настраиваю npm prefix..." info "Настраиваю npm prefix..."
mkdir -p "$NPM_GLOBAL" mkdir -p "$NPM_GLOBAL"
@@ -334,175 +80,6 @@ else
warn "Node.js не найден. Некоторые функции могут не работать." warn "Node.js не найден. Некоторые функции могут не работать."
fi fi
# ── 2.5. proxychains-ng + xray (только при включении VLESS) ──
if [ "$DO_VLESS_INSTALL" -eq 1 ]; then
info "Проверяю proxychains-ng..."
if ! command -v proxychains4 &>/dev/null; then
info "Устанавливаю proxychains-ng (нужен sudo)..."
if command -v apt-get &>/dev/null; then
sudo apt-get install -y proxychains-ng
elif command -v dnf &>/dev/null; then
sudo dnf install -y proxychains-ng
else
warn "Не удалось установить proxychains-ng автоматически. Установите вручную."
fi
fi
if command -v proxychains4 &>/dev/null; then
success "proxychains4 найден"
else
warn "proxychains4 не найден. Продолжаю без проксирования."
fi
info "Устанавливаю xray..."
# Останавливаем старый процесс (мог остаться от предыдущей установки)
sudo systemctl stop xray 2>/dev/null || true
XRAY_VERSION="26.3.27"
XRAY_ARCH="64"
XRAY_URL="https://github.com/XTLS/Xray-core/releases/download/v${XRAY_VERSION}/Xray-linux-${XRAY_ARCH}.zip"
TMPDIR=$(mktemp -d)
curl -fsSL "$XRAY_URL" -o "$TMPDIR/xray.zip"
unzip -q "$TMPDIR/xray.zip" -d "$TMPDIR"
sudo install -m 755 "$TMPDIR/xray" /usr/local/bin/xray
rm -rf "$TMPDIR"
sudo mkdir -p /etc/xray
# xhttpSettings — только для xhttp-транспорта
_VL_XHTTP=""
if [ "$VL_TYPE" = "xhttp" ]; then
_VL_XHTTP=$(printf ',\n "xhttpSettings": {\n "path": "%s",\n "mode": "%s"\n }' "$VL_PATH" "$VL_MODE")
fi
sudo tee /etc/xray/config.json > /dev/null << XRAYEOF
{
"log": { "loglevel": "warning" },
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": { "udp": true }
},
{
"port": 2080,
"listen": "127.0.0.1",
"protocol": "http"
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "$VL_ADDRESS",
"port": $VL_PORT,
"users": [
{
"id": "$VL_UUID",
"encryption": "$VL_ENCRYPTION",
"flow": "$VL_FLOW"
}
]
}
]
},
"streamSettings": {
"network": "$VL_TYPE",
"security": "$VL_SECURITY",
"realitySettings": {
"serverName": "$VL_SNI",
"fingerprint": "$VL_FP",
"publicKey": "$VL_PBK",
"shortId": "$VL_SID",
"spiderX": "$VL_SPX"
}$_VL_XHTTP
}
}
]
}
XRAYEOF
sudo chmod 644 /etc/xray/config.json
sudo tee /etc/systemd/system/xray.service > /dev/null << 'SVCEOF'
[Unit]
Description=Xray Service
After=network.target
[Service]
ExecStart=/usr/local/bin/xray run -c /etc/xray/config.json
Restart=on-failure
[Install]
WantedBy=multi-user.target
SVCEOF
# Удаляем чужие drop-in оверрайды (могут переопределять ExecStart на старый конфиг)
sudo rm -rf /etc/systemd/system/xray.service.d/
# Удаляем старый дефолтный конфиг xray из других путей
sudo rm -rf /usr/local/etc/xray/
sudo systemctl daemon-reload
sudo systemctl enable --now xray
success "xray установлен и запущен"
# ── Отключение IPv6 (VLESS не тянет IPv6, браузеры зависают) ──
info "Отключаю IPv6 на уровне системы..."
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo tee /etc/sysctl.d/99-disable-ipv6.conf > /dev/null << 'SYSCTEOF'
# Отключение IPv6 — требуется для стабильной работы VLESS/xray
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
SYSCTEOF
sudo systemctl restart systemd-resolved
success "IPv6 отключён, DNS-кэш очищен"
cp "$SCRIPT_DIR/home-configs/proxychains/proxychains-xray.conf" "$HOME/.proxychains-xray.conf"
success "Proxychains конфиг обновлён"
# ── Настройка Firefox на SOCKS5 + remote DNS ────────────────
info "Настраиваю Firefox на SOCKS5 прокси..."
FIREFOX_PROFILE=""
if [ -d "$HOME/snap/firefox/common/.mozilla/firefox" ]; then
FIREFOX_PROFILE=$(find "$HOME/snap/firefox/common/.mozilla/firefox" -name "*.default*" -type d | head -1)
elif [ -d "$HOME/.mozilla/firefox" ]; then
FIREFOX_PROFILE=$(find "$HOME/.mozilla/firefox" -name "*.default*" -type d | head -1)
fi
if [ -n "$FIREFOX_PROFILE" ]; then
cat > "$FIREFOX_PROFILE/user.js" << 'FJSEOF'
user_pref("network.proxy.type", 1);
user_pref("network.proxy.socks", "127.0.0.1");
user_pref("network.proxy.socks_port", 1080);
user_pref("network.proxy.socks_remote_dns", true);
user_pref("network.proxy.http", "");
user_pref("network.proxy.http_port", 0);
user_pref("network.proxy.ssl", "");
user_pref("network.proxy.ssl_port", 0);
FJSEOF
success "Firefox настроен на SOCKS5 (профиль: $FIREFOX_PROFILE)"
else
warn "Firefox не найден, пропускаю настройку прокси"
fi
# ── Настройка системного прокси (для Chrome/Chromium) ───────
info "Настраиваю системный прокси..."
if command -v gsettings &>/dev/null; then
gsettings set org.gnome.system.proxy mode 'manual' 2>/dev/null || true
gsettings set org.gnome.system.proxy.http host '127.0.0.1' 2>/dev/null || true
gsettings set org.gnome.system.proxy.http port 2080 2>/dev/null || true
gsettings set org.gnome.system.proxy.socks host '127.0.0.1' 2>/dev/null || true
gsettings set org.gnome.system.proxy.socks port 1080 2>/dev/null || true
success "Системный прокси настроен (HTTP 2080 + SOCKS 1080)"
else
warn "gsettings не найден, пропускаю настройку системного прокси"
fi
fi
# ── 3. Claude Code ─────────────────────────────────────────── # ── 3. Claude Code ───────────────────────────────────────────
info "Проверяю Claude Code..." info "Проверяю Claude Code..."
if ! command -v claude &>/dev/null; then if ! command -v claude &>/dev/null; then
@@ -2320,21 +1897,6 @@ claude --dangerously-skip-permissions --system-prompt-file "$_PROMPT_FILE" "$@"
OPENCODEEOF OPENCODEEOF
chmod +x "$BIN_DIR/ai-opencode" chmod +x "$BIN_DIR/ai-opencode"
# ── 8.5. Proxychains инъекция (только в режиме vless) ────────
if [ "$USE_VLESS" -eq 1 ]; then
info "Включаю proxychains4 в ai-лаунчеры..."
sed -i 's/^exec "\$codex_bin"/exec proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" "\$codex_bin"/' "$BIN_DIR/ai-gpt"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-deepseek"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-kimi"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-glm"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-openrouter"
sed -i 's|^\([[:space:]]*\)"\$agy_bin" --dangerously-skip-permissions "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$agy_bin" --dangerously-skip-permissions "\$@"|' "$BIN_DIR/ai-gemini"
sed -i 's|^\([[:space:]]*\)"\$cursor_bin" --force "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$cursor_bin" --force "\$@"|' "$BIN_DIR/ai-cursor"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-claude"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode"
success "proxychains4 интегрирован"
fi
# Подготавливаем изолированные config dir'ы для Claude Code-лаунчеров, # Подготавливаем изолированные config dir'ы для Claude Code-лаунчеров,
# чтобы hooks (/switch-account, /add-account) и settings.json были на месте # чтобы hooks (/switch-account, /add-account) и settings.json были на месте
# ещё до первого запуска пользователем. # ещё до первого запуска пользователем.

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,6 @@ if command -v whiptail >/dev/null 2>&1; then
"6" "Проверить сеть (маршрутизация, geo)" \ "6" "Проверить сеть (маршрутизация, geo)" \
"7" "Обновить (git pull + перегенерация скриптов)" \ "7" "Обновить (git pull + перегенерация скриптов)" \
"8" "Android CLI (установить Google Android CLI)" \ "8" "Android CLI (установить Google Android CLI)" \
"9" "VLESS: настроить встроенный прокси (включить / отключить)" \
3>&1 1>&2 2>&3) || exit 0 3>&1 1>&2 2>&3) || exit 0
echo "" echo ""
else else
@@ -64,10 +63,7 @@ else
echo -e " ${BLD}8) Android CLI${CLR}" echo -e " ${BLD}8) Android CLI${CLR}"
echo -e " ${GRY}Установить Google Android CLI для Android-разработки.${CLR}" echo -e " ${GRY}Установить Google Android CLI для Android-разработки.${CLR}"
echo "" echo ""
echo -e " ${BLD}9) VLESS${CLR}" echo -n "Выбери [1-8] или Enter для выхода: "
echo -e " ${GRY}Включить или отключить встроенный VLESS-прокси для AI API запросов.${CLR}"
echo ""
echo -n "Выбери [1-9] или Enter для выхода: "
read -r choice read -r choice
echo "" echo ""
fi fi
@@ -76,7 +72,7 @@ fi
case "$choice" in case "$choice" in
1) 1)
AI_SETUP_VLESS=skip bash scripts/ai-setup.sh bash scripts/ai-setup.sh
;; ;;
2) 2)
echo -e "${GRY}Нужно указать параметры твоей локальной сети:${CLR}" echo -e "${GRY}Нужно указать параметры твоей локальной сети:${CLR}"
@@ -228,20 +224,10 @@ case "$choice" in
git -C "$REPO_DIR" pull --ff-only git -C "$REPO_DIR" pull --ff-only
echo "" echo ""
echo -e "${BLD}Перегенерация скриптов...${CLR}" echo -e "${BLD}Перегенерация скриптов...${CLR}"
AI_SETUP_VLESS=skip bash "$REPO_DIR/scripts/ai-setup.sh" bash "$REPO_DIR/scripts/ai-setup.sh"
;; ;;
8) 8)
AI_SETUP_VLESS=skip bash scripts/ai-setup.sh bash scripts/ai-setup.sh
;;
9)
echo -n "Включить VLESS-прокси? [Y/n] "
read -r _vless_choice
_vless_choice="${_vless_choice:-Y}"
if [[ "$_vless_choice" =~ ^[Yy]$ ]]; then
AI_SETUP_VLESS=1 bash scripts/ai-setup.sh
else
AI_SETUP_VLESS=0 bash scripts/ai-setup.sh
fi
;; ;;
"") "")
exit 0 exit 0

View File

@@ -188,14 +188,6 @@ test_android_symlink_to_bin_dir() {
fi fi
} }
test_no_proxychains_for_android() {
if grep -q 'proxychains4.*android' "$SCRIPT"; then
fail "android-cli: should not be wrapped in proxychains4 (breaks child processes)"
else
ok "android-cli: not wrapped in proxychains4"
fi
}
test_android_skill_exists() { test_android_skill_exists() {
skill_file="$(cd "$(dirname "$0")/.." && pwd)/home-configs/claude/skills/android-cli/SKILL.md" skill_file="$(cd "$(dirname "$0")/.." && pwd)/home-configs/claude/skills/android-cli/SKILL.md"
if [ -f "$skill_file" ]; then if [ -f "$skill_file" ]; then
@@ -265,7 +257,6 @@ test_fix7_trap_tmp
test_android_cli_install_url test_android_cli_install_url
test_android_init_called test_android_init_called
test_android_symlink_to_bin_dir test_android_symlink_to_bin_dir
test_no_proxychains_for_android
test_android_skill_exists test_android_skill_exists
test_opencode_claude_launcher test_opencode_claude_launcher
test_opencode_routatic_proxy test_opencode_routatic_proxy