Expand local_machine docs and automation for connectivity, games, and ops.
Add proxy/VPN/telegram launchd and emergency runbooks; reorganize apps docs; document JA3 CrossOver runbook and Wine troubleshooting; add GOG/HoMM game scripts, disk cleanup guides, and gitea push-via-proxy helper. Ignore temp/. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
122
docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md
Normal file
122
docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# Emergency: сеть после смены хотспота (macOS)
|
||||
|
||||
Симптом: **отключили Mac от Wi‑Fi / переподключились к другому хотспоту — «интернета нет», помогает только перезагрузка.**
|
||||
|
||||
Документ описывает **проверенную на машине причину** в вашей конфигурации, **ручное восстановление без перезагрузки** и **скрипт** из репозитория.
|
||||
|
||||
---
|
||||
|
||||
## Причина (точная по конфигурации)
|
||||
|
||||
На macOS в **Системных настройках → Сеть → Wi‑Fi → Подробнее → Прокси** часто включён **автоматический прокси (PAC)** с URL вида **`http://localhost:1089/proxy.pac`** (см. [PROXY_GUIDE.md](./PROXY_GUIDE.md) → раздел про системный PAC).
|
||||
|
||||
Проверка на рабочей машине (2026): **PAC для сервиса Wi‑Fi включён (Enabled: Yes)**, при этом **на порту 1089 нет процесса**, который отдаёт `proxy.pac` — соединение к `127.0.0.1:1089` отклоняется.
|
||||
|
||||
В таком состоянии:
|
||||
|
||||
1. Система и часть приложений **сначала** должны получить PAC с localhost; при недоступном URL поведение **нестабильно** (часть трафика «в никуда», таймауты).
|
||||
2. При **смене хотспота** меняются шлюз, DNS, часто появляется **captive portal**; страница входа может **не открыться**, пока PAC мешает или DNS закеширован со старой сети.
|
||||
3. **Перезагрузка** «лечит», потому что заново поднимаются **configd**, **mDNSResponder**, порядок инициализации Wi‑Fi и иногда снова стартует локальный PAC‑сервер (Clash / Surge / свой сервис на 1089).
|
||||
|
||||
Дополнительные усилители сбоя (проверять при `status`):
|
||||
|
||||
- **Системный SOCKS** на `127.0.0.1:1080` (Shadowsocks и т.д.) — если включён, а клиент не слушает порт, трафик через системный прокси тоже падает.
|
||||
- **VPN / туннели** с политикой «весь трафик» — после смены сети маршруты могут остаться битые до отключения VPN.
|
||||
|
||||
**SOCKS Telegram (1081) и SSH‑туннели сами по себе не отключают Wi‑Fi** — они приложенческие. Проблема класса «всё мёртво до ребута» у вас с высокой вероятностью — **системный PAC/SOCKS на localhost без живого сервиса + кэш DNS / состояние Wi‑Fi**.
|
||||
|
||||
---
|
||||
|
||||
## Быстро: один скрипт (рекомендуется)
|
||||
|
||||
Из корня репозитория `local_machine`:
|
||||
|
||||
```bash
|
||||
chmod +x ./docs/connectivity/scripts/macos-hotspot-network-recover.sh
|
||||
./docs/connectivity/scripts/macos-hotspot-network-recover.sh status
|
||||
./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
`recover` делает: **выключает PAC** (те же сервисы, что и `macos-system-pac.sh`), **выключает системный SOCKS на Wi‑Fi**, по возможности **сбрасывает DNS** и **кратко перезапускает Wi‑Fi** и DHCP.
|
||||
|
||||
Если скрипт пишет, что нет `sudo` без пароля — выполните вручную команды из раздела «Вручную» ниже.
|
||||
|
||||
После появления интернета, если вам снова нужен PAC:
|
||||
|
||||
```bash
|
||||
./docs/connectivity/scripts/macos-pac-on.sh
|
||||
```
|
||||
|
||||
Только **после** того как процесс на **1089** реально запущен и отдаёт `proxy.pac`.
|
||||
|
||||
---
|
||||
|
||||
## Вручную (без скрипта)
|
||||
|
||||
### 1. Отключить автоматический PAC
|
||||
|
||||
**GUI:** Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять **«Автоматическая настройка прокси (PAC)»**.
|
||||
|
||||
**CLI** (из репо):
|
||||
|
||||
```bash
|
||||
./docs/connectivity/scripts/macos-pac-off.sh
|
||||
./docs/connectivity/scripts/macos-system-pac.sh status
|
||||
```
|
||||
|
||||
### 2. Отключить системный SOCKS (если включали для Shadowsocks)
|
||||
|
||||
```bash
|
||||
networksetup -setsocksfirewallproxystate "Wi-Fi" off
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi"
|
||||
```
|
||||
|
||||
### 3. Сброс DNS
|
||||
|
||||
```bash
|
||||
sudo dscacheutil -flushcache
|
||||
sudo killall -HUP mDNSResponder
|
||||
```
|
||||
|
||||
### 4. Обновить DHCP и «пнуть» Wi‑Fi
|
||||
|
||||
Узнать интерфейс Wi‑Fi (часто `en0`):
|
||||
|
||||
```bash
|
||||
networksetup -listallhardwareports | sed -n '/Hardware Port: Wi-Fi/,/Ethernet Address/p'
|
||||
```
|
||||
|
||||
Дальше (подставьте свой `Device`, например `en0`):
|
||||
|
||||
```bash
|
||||
sudo ipconfig set en0 DHCP
|
||||
networksetup -setairportpower en0 off
|
||||
sleep 2
|
||||
networksetup -setairportpower en0 on
|
||||
```
|
||||
|
||||
### 5. Captive portal
|
||||
|
||||
Откройте в браузере **`http://captive.apple.com`** или **`http://neverssl.com`** — должна открыться страница входа в сеть отели/кафе.
|
||||
|
||||
---
|
||||
|
||||
## Профилактика (архитектурно)
|
||||
|
||||
1. **Не держать PAC включённым**, если сервис на **1089** не запущен: сначала поднять Clash/Surge/свой HTTP‑сервер с PAC, **затем** `macos-pac-on.sh`.
|
||||
2. Перед подключением к **чужому хотспоту** с обязательной страницей входа — **временно PAC off** (`macos-pac-off.sh`), залогиниться в сеть, затем при необходимости снова **on**.
|
||||
3. Разнести роли: **глобальный PAC** — только когда стабильно есть локальный конфиг‑сервер; для «чистого» интернета в дороге — **PAC выключен**, прокси только в приложениях (Telegram SOCKS **1081**, Cursor **10809** и т.д.) — см. [TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md), [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md).
|
||||
|
||||
---
|
||||
|
||||
## Связанные документы
|
||||
|
||||
| Документ | Зачем |
|
||||
|----------|--------|
|
||||
| [PROXY_GUIDE.md](./PROXY_GUIDE.md) | Системный PAC, порты, скрипты `macos-pac-*.sh` |
|
||||
| [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md) | SSH, SOCKS 1081, прод |
|
||||
| [README.md](./README.md) | Оглавление `connectivity/` |
|
||||
|
||||
---
|
||||
|
||||
*Если после `recover` сеть всё ещё мёртвая — проверьте аппаратный тумблер Wi‑Fi, другое SSID, и логи: Консоль → `Wi-Fi` / `configd`.*
|
||||
172
docs/connectivity/PROXY_EMERGENCY.md
Normal file
172
docs/connectivity/PROXY_EMERGENCY.md
Normal file
@@ -0,0 +1,172 @@
|
||||
# Экстренное восстановление: прокси ru.hunab.app и SSH
|
||||
|
||||
Одна страница на случай, когда «всё слетело». Полная схема, безопасность и нюансы `~/.ssh/config`: [PROXY_GUIDE.md](./PROXY_GUIDE.md).
|
||||
|
||||
**Сеть / хотспот (интернет есть только после перезагрузки):** чаще всего системный **PAC на localhost:1089** без живого сервера или системный SOCKS на **1080**. Пошагово: **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)**.
|
||||
|
||||
---
|
||||
|
||||
## Константы (запомнить / вставить в заметки)
|
||||
|
||||
| Что | Значение |
|
||||
|-----|----------|
|
||||
| RU-прокси (SSH) | **149.154.64.19**, пользователь **ahau**, порт **22** |
|
||||
| Домен прокси | **ru.hunab.app** |
|
||||
| Прод (DO) | **209.38.32.21**, SSH **2222**, пользователь **hunab** (или **root**) |
|
||||
| Прод (веб) | **hunab.app** |
|
||||
|
||||
**Ключи (типично):**
|
||||
|
||||
- RU (ahau): `~/.ssh/id_ed25519`
|
||||
- RU root: `~/.ssh/hsites_new_deploy_key` → хост **`hsites-new`**
|
||||
- Прод: `~/.ssh/hunab_deploy_key`
|
||||
|
||||
---
|
||||
|
||||
## Порядок проверки (2 минуты)
|
||||
|
||||
1. **Интернет и DNS:** открыть в браузере `https://ru.hunab.app/proxy-health` и `https://ru.hunab.app/api/health`.
|
||||
2. **RU SSH:** `ssh -o ConnectTimeout=10 hsites-ahau "echo RU_OK"`
|
||||
Без алиаса: `ssh -o ConnectTimeout=10 -i ~/.ssh/id_ed25519 ahau@149.154.64.19 "echo RU_OK"`
|
||||
3. **Прод через RU:** `ssh -o ConnectTimeout=15 hunab-prod "echo PROD_OK"`
|
||||
4. **Прод напрямую** (если RU мёртв): `ssh -o ConnectTimeout=15 hunab-prod-direct "echo PROD_DIRECT_OK"`
|
||||
|
||||
Если шаг 2 падает — цепочка через прокси недоступна; используйте **прямой** доступ к DO (шаг 4) и SOCKS «через DO» (ниже).
|
||||
|
||||
---
|
||||
|
||||
## Минимальные блоки `~/.ssh/config` (восстановить вручную)
|
||||
|
||||
**Важно:** `hunab-prod` и `hunab-prod-root` — **разные** блоки `Host` (разный `User`). Не объединять в одну строку `Host`.
|
||||
|
||||
```sshconfig
|
||||
Host hsites-ahau
|
||||
HostName 149.154.64.19
|
||||
User ahau
|
||||
IdentityFile ~/.ssh/id_ed25519
|
||||
StrictHostKeyChecking accept-new
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 8
|
||||
|
||||
Host hunab-prod hunab-prod-via-ahau
|
||||
HostName 209.38.32.21
|
||||
User hunab
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
ProxyJump hsites-ahau
|
||||
StrictHostKeyChecking accept-new
|
||||
IdentitiesOnly yes
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 8
|
||||
|
||||
Host hunab-prod-direct
|
||||
HostName 209.38.32.21
|
||||
User hunab
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
StrictHostKeyChecking accept-new
|
||||
IdentitiesOnly yes
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 8
|
||||
```
|
||||
|
||||
При необходимости root на проде — отдельный блок `Host hunab-prod-root` / `hunab-prod-root-direct` с `User root` (см. [PROXY_GUIDE.md](./PROXY_GUIDE.md)).
|
||||
|
||||
**Зависший master-сокет:**
|
||||
`ssh -O exit hunab-prod 2>/dev/null; ssh -O exit hunab-prod-direct 2>/dev/null; rm -f ~/.ssh/cm-hunab-*`
|
||||
|
||||
---
|
||||
|
||||
## SOCKS для Telegram (порт **1081**)
|
||||
|
||||
**Только RU (если достаточно выхода с 149.154.64.19):**
|
||||
|
||||
```bash
|
||||
ssh -D 1081 -N ahau@149.154.64.19
|
||||
```
|
||||
|
||||
**RU → прод → интернет** (когда с RU до Telegram не проходит):
|
||||
|
||||
```bash
|
||||
ssh -D 1081 -N -J hsites-ahau -i ~/.ssh/hunab_deploy_key -p 2222 hunab@209.38.32.21
|
||||
```
|
||||
|
||||
**Без RU, только DO:**
|
||||
|
||||
```bash
|
||||
ssh -D 1081 -N -i ~/.ssh/hunab_deploy_key -p 2222 hunab@209.38.32.21
|
||||
```
|
||||
|
||||
Проверка (второй терминал):
|
||||
|
||||
```bash
|
||||
curl -x socks5h://127.0.0.1:1081 -sI https://api.telegram.org | head -3
|
||||
```
|
||||
|
||||
В Telegram: **SOCKS5**, **127.0.0.1**, **1081**.
|
||||
Скрипты и launchd: [launchd/README.md](./launchd/README.md), [scripts/telegram-socks-tunnel.sh](./scripts/telegram-socks-tunnel.sh).
|
||||
|
||||
---
|
||||
|
||||
## scp на прод через RU (если нужен файл «прямо сейчас»)
|
||||
|
||||
```bash
|
||||
PROXY_CMD="ssh -i $HOME/.ssh/id_ed25519 -o StrictHostKeyChecking=accept-new -W %h:%p hsites-ahau"
|
||||
scp -i ~/.ssh/hunab_deploy_key -o ProxyCommand="$PROXY_CMD" -o ServerAliveInterval=15 \
|
||||
/path/to/file hunab@209.38.32.21:/home/hunab/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cursor / PING timeout из РФ
|
||||
|
||||
SOCKS для IDE: [docs/cursor/README.md](../cursor/README.md), порт **10809**. Скрипт **`docs/cursor/scripts/cursor-socks-tunnel.sh`** при **`CURSOR_SOCKS_VIA_DO=1`** — только **Mac→RU→DO** (`telegram-socks-via-do`); **`CURSOR_SOCKS_VIA_DO=0`** — выход с RU. Не путать с **1081** (Telegram).
|
||||
|
||||
---
|
||||
|
||||
## Скрипт выбора маршрута к проду
|
||||
|
||||
Из репозитория: [scripts/ssh-hunab-prod.sh](./scripts/ssh-hunab-prod.sh)
|
||||
- `HUNAB_PROD_FORCE_VIA=1` — сразу через RU
|
||||
- `HUNAB_PROD_FORCE_DIRECT=1` — только прямой DO
|
||||
|
||||
---
|
||||
|
||||
*Краткая версия от PROXY_GUIDE; при расхождении правьте сначала основной гайд.*
|
||||
|
||||
---
|
||||
|
||||
## Как сейчас на этой машине (проверено: **2026-04-07**)
|
||||
|
||||
**Среда:** macOS, пользователь **`eternal`**, имя хоста **`Eternals.local`**.
|
||||
|
||||
### `~/.ssh/config`
|
||||
|
||||
- В начале файла: **`Include ~/.colima/ssh_config`** (Colima).
|
||||
- **RU → прод (основной путь):** `hunab-prod` и `hunab-prod-via-ahau` → `209.38.32.21:2222`, пользователь **`hunab`**, ключ **`~/.ssh/hunab_deploy_key`**, **`ProxyJump hsites-ahau`**, плюс **ControlMaster** / **`ControlPath ~/.ssh/cm-hunab-prod-%C`**, **ControlPersist 30m**, keepalive, **UseKeychain**.
|
||||
- **Прод без RU:** `hunab-prod-direct`, root-вариант **`hunab-prod-root-direct`** — те же порт/ключ, без `ProxyJump`, свой **`ControlPath`** (`cm-hunab-direct-*` / `cm-hunab-direct-root-*`).
|
||||
- **Root через RU:** `hunab-prod-root`, `hunab-prod-root-via-ahau` — как `hunab-prod`, но **`User root`** и **`cm-hunab-prod-root-%C`**.
|
||||
- **RU SSH (ahau):** **`hsites-ahau`** → **`149.154.64.19`**, **`~/.ssh/id_ed25519`**, keepalive, **UseKeychain** / **AddKeysToAgent**.
|
||||
- **RU SSH (root):** **`hsites-new`** → тот же IP, **`~/.ssh/hsites_new_deploy_key`**.
|
||||
- **Альтернатива через root на RU:** **`prod-ru`**, **`hunab-prod-via-ru`** — **`ProxyJump hsites-new`** (не `hsites-ahau`). В конфиге блок **`Host prod-ru` продублирован дважды** — лишнее можно схлопнуть при правке.
|
||||
- **Туннель через локальный SOCKS 1090:** **`prod-tunnel`** — `ProxyCommand nc -X 5 -x 127.0.0.1:1090 %h %p`.
|
||||
- **SOCKS для Telegram:** только **`telegram-socks-via-do`** (Mac→RU→DO). **`telegram-socks-direct-do`** — опционально для ручного SSH к DO без RU, не для автозамены SOCKS.
|
||||
- Дополнительно в файле: старые хосты **`hsites` / `hsites.hunab`**, **`ahau@ru.hunab`**, боты **`hunab-bot` / `hunab.bots`**, алиас **`tunnel`** на `149.154.64.19`.
|
||||
|
||||
**Ключи на диске (есть):** `~/.ssh/id_ed25519`, `~/.ssh/hunab_deploy_key`, `~/.ssh/hsites_new_deploy_key`.
|
||||
|
||||
### Автозапуск SOCKS **1081** (Telegram)
|
||||
|
||||
- **LaunchAgent:** `~/Library/LaunchAgents/com.hunab.telegram-socks-via-do.plist` — **RunAtLoad**, **KeepAlive**, лог **`/tmp/telegram-socks-tunnel-via-do.log`**.
|
||||
- **Скрипт:** `~/Library/Application Support/hunab/telegram-socks-launch.sh` — всегда **`ssh -D 1081 -N telegram-socks-via-do`** (Mac→RU→DO).
|
||||
- Состояние на момент проверки: задание в **launchctl** в статусе **running**; при обрыве цепочки SSH в логе сыплются ошибки до следующего успешного подключения (смотреть хвост лога).
|
||||
|
||||
### Ручной запуск из репозитория
|
||||
|
||||
- Скрипт: **`docs/connectivity/scripts/telegram-socks-tunnel.sh`** — порт **1081**; без `TELEGRAM_SOCKS_VIA_DO` — только RU; с **`TELEGRAM_SOCKS_VIA_DO=1`** — только Mac→RU→DO (`telegram-socks-via-do`), как LaunchAgent.
|
||||
|
||||
### Прочее на машине
|
||||
|
||||
- В **launchctl** также видны **Shadowsocks** (`com.shadowsocks.local`, `com.qiuyuzhou.shadowsocksX-NG.local`) — к hunab-прокси не относятся, но могут влиять на маршрутизацию, если включены.
|
||||
|
||||
*Порт **1081** и SSH в момент автоматической проверки из среды агента могли быть пустыми или с ошибками сети; ориентируйтесь на `lsof -i :1081` и лог выше.*
|
||||
@@ -6,13 +6,49 @@
|
||||
|
||||
## Оглавление
|
||||
|
||||
1. [Доступ и файлы](#-доступ-и-файлы)
|
||||
2. [Команды управления](#-команды-управления)
|
||||
3. [Безопасность](#-безопасность)
|
||||
4. [Запросы-сканеры (serverless и др.)](#-запросы-сканеры-serverless-и-др)
|
||||
5. [Редирект на прокси](#-автоматический-редирект)
|
||||
6. [Скорость и тесты](#-проверка-скорости)
|
||||
7. [Telegram и SOCKS при старте](#-telegram-и-socks-при-старте)
|
||||
1. [Схема соединений](#схема-соединений)
|
||||
2. [Доступ и файлы](#-доступ-и-файлы)
|
||||
3. [Клиентский SSH config и KexAlgorithms](#клиентский-ssh-config-и-kexalgorithms)
|
||||
4. [Команды управления](#-команды-управления)
|
||||
5. [Безопасность](#-безопасность)
|
||||
6. [Запросы-сканеры (serverless и др.)](#-запросы-сканеры-serverless-и-др)
|
||||
7. [Редирект на прокси](#-автоматический-редирект)
|
||||
8. [Скорость и тесты](#-проверка-скорости)
|
||||
9. [Telegram и SOCKS при старте](#-telegram-и-socks-при-старте)
|
||||
10. [SSH к продакшену (hunab-prod)](#ssh-к-продакшену-hunab-prod)
|
||||
11. [macOS: системный PAC](#-macos-системный-pac)
|
||||
|
||||
---
|
||||
|
||||
## Схема соединений
|
||||
|
||||
Текущая логика с **вашего Mac** (или другой клиентской машины с тем же `~/.ssh/config`):
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph client [Клиент]
|
||||
M["SSH, scp, Docker CLI,\nTelegram с SOCKS"]
|
||||
end
|
||||
RU["RU-прокси 149.154.64.19\nru.hunab.app, SSH 22, user ahau\n(Host hsites-ahau)"]
|
||||
DO["Прод 209.38.32.21 DigitalOcean\nSSH 2222, hunab / root\nDocker, Nginx, приложения"]
|
||||
NET["Интернет (выход с DO)"]
|
||||
|
||||
M -->|"Основной: ssh hunab-prod,\nSOCKS telegram-socks-via-do"| RU
|
||||
RU -->|ProxyJump / туннель| DO
|
||||
M -->|"Прямой SSH: hunab-prod-direct\n(SOCKS через DO — только via-do)"| DO
|
||||
DO --> NET
|
||||
```
|
||||
|
||||
**Кратко:**
|
||||
|
||||
| Направление | Как задаётся |
|
||||
|-------------|----------------|
|
||||
| Mac → RU | `ssh hsites-ahau`, первый прыжок в **ProxyJump** |
|
||||
| RU → прод DO | Второй hop SSH на **209.38.32.21:2222** |
|
||||
| Mac → прод без RU | `hunab-prod-direct`; **`telegram-socks-direct-do`** — тот же hop, для ручного SSH/scp, не для авто-SOCKS |
|
||||
| Telegram / Cursor SOCKS → интернет с IP DO | Только **Mac→RU→DO** (`telegram-socks-via-do`); прямой Mac→DO в скриптах не используется |
|
||||
|
||||
Прод и RU — **разные** машины; ключи разные: к RU обычно **`id_ed25519`** (ahau), к проду на DO — **`hunab_deploy_key`**.
|
||||
|
||||
---
|
||||
|
||||
@@ -36,6 +72,79 @@
|
||||
- Health: https://ru.hunab.app/proxy-health
|
||||
- API: https://ru.hunab.app/api/health
|
||||
|
||||
### Клиентский SSH config и KexAlgorithms
|
||||
|
||||
Файл на той машине, **с которой** вы подключаетесь (обычно Mac):
|
||||
|
||||
- путь **`~/.ssh/config`**;
|
||||
- на Mac это тот же путь в домашнем каталоге, например **`/Users/<ваш-логин>/.ssh/config`**.
|
||||
|
||||
Сюда добавляются `Host`, `ProxyJump`, ключи и при необходимости опции вроде **`KexAlgorithms`**.
|
||||
|
||||
#### Нельзя смешивать `hunab-prod` и `hunab-prod-root` в одном блоке `Host`
|
||||
|
||||
В одной строке **`Host hunab-prod hunab-prod-root`** может быть только **один** `User`. Если указать `User hunab`, то при вызове `ssh hunab-prod-root` клиент всё равно пойдёт как **hunab** — это **ошибка**.
|
||||
|
||||
**Правильно:** два отдельных блока — один с **`User hunab`**, второй с **`User root`** (и при необходимости разные `ControlPath` / алиасы).
|
||||
|
||||
**Можно** в одном блоке перечислить алиасы с **одним и тем же** пользователем и маршрутом, например: **`Host hunab-prod hunab-prod-via-ahau`** — оба имени ведут на прод как **hunab** через **`ProxyJump hsites-ahau`**.
|
||||
|
||||
#### Имеет ли смысл `KexAlgorithms`?
|
||||
|
||||
На актуальных **macOS** и **OpenSSH** на Ubuntu 24 набор алгоритмов обмена ключей по умолчанию уже **нормальный** (в т.ч. curve25519). Явно задавать **`KexAlgorithms`** стоит **не «на всякий случай»**, а когда есть **конкретная** проблема: сообщение вроде *Unable to negotiate … no matching key exchange method*, старый сервер или нестандартный посредник в сети.
|
||||
|
||||
**Минусы** жёсткого списка: если на сервере **sshd** не поддерживает ни один из перечисленных KEX, подключение **сломается**. Поэтому список должен **пересекаться** с тем, что включено на сервере (`ssh -Q kex` на клиенте, настройки `sshd_config` на сервере).
|
||||
|
||||
Если всё же добавляете — вставляйте строку **в каждый нужный блок отдельно** (`hunab-prod`, `hunab-prod-root`, при цепочке через RU при желании и **`Host hsites-ahau`**), **не объединяя** hunab и root в один блок из‑за разного `User`.
|
||||
|
||||
Пример **опционально** (без `ProxyJump` здесь не показан — в реальном конфиге сохраняйте свои `ProxyJump`, `Port`, `ControlPath` и т.д.):
|
||||
|
||||
```
|
||||
Host hunab-prod
|
||||
HostName 209.38.32.21
|
||||
User hunab
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
StrictHostKeyChecking accept-new
|
||||
IdentitiesOnly yes
|
||||
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
|
||||
|
||||
Host hunab-prod-root
|
||||
HostName 209.38.32.21
|
||||
User root
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
StrictHostKeyChecking accept-new
|
||||
IdentitiesOnly yes
|
||||
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
|
||||
```
|
||||
|
||||
У **текущего** репозиторийного сценария **`hunab-prod` по умолчанию через `hsites-ahau`** — в блок **`Host hunab-prod`** нужно добавлять и **`ProxyJump hsites-ahau`** (как в [TELEGRAM_GUIDE](./TELEGRAM_GUIDE.md) и полных шаблонах ниже), а не только поля из примера выше.
|
||||
|
||||
### SSH к продакшену (hunab-prod)
|
||||
|
||||
Прод: **209.38.32.21**, SSH **порт 2222**, пользователь **hunab** (или **root**), ключ **`hunab_deploy_key`**.
|
||||
|
||||
| Host в `~/.ssh/config` | Назначение |
|
||||
|------------------------|------------|
|
||||
| **hunab-prod** (и алиас **hunab-prod-via-ahau**) | **По умолчанию:** **Mac → hsites-ahau → прод**. Обычная команда `ssh -T hunab-prod 'docker …'` сразу идёт через RU — **не нужен** `export HUNAB_PROD_FORCE_VIA` (эта переменная только для скрипта `ssh-hunab-prod.sh`). |
|
||||
| **hunab-prod-direct** | Прямое TCP к **209.38.32.21:2222** — когда RU недоступен, а DO доступен. |
|
||||
| **hunab-prod-root** / **hunab-prod-root-via-ahau** | Root через **hsites-ahau**; **hunab-prod-root-direct** — прямой root. |
|
||||
| **hunab-prod-via-ru**, **prod-ru** | ProxyJump через **hsites-new** (root); ключ **`hsites_new_deploy_key`**. |
|
||||
|
||||
**Два бэкенда в логах (пример):**
|
||||
|
||||
```bash
|
||||
ssh -T hunab-prod 'docker logs -f --tail=80 hunab-prod-backend-green 2>&1 | sed -u "s/^/[GREEN] /" & docker logs -f --tail=80 hunab-prod-backend 2>&1 | sed -u "s/^/[BLUE ] /" & wait'
|
||||
```
|
||||
|
||||
**Скрипт** `ssh-hunab-prod.sh` — при необходимости сначала пробует **hunab-prod-direct** (8 с), иначе **hunab-prod**:
|
||||
`HUNAB_PROD_FORCE_VIA=1` — сразу через RU; `HUNAB_PROD_FORCE_DIRECT=1` — только прямой.
|
||||
|
||||
Проверка: `ssh hunab-prod "echo OK"` (через RU), `ssh hunab-prod-direct "echo OK"` (прямой).
|
||||
|
||||
**Стабильность:** **ServerAliveInterval 30**, **ServerAliveCountMax 8**, **ControlMaster** / **ControlPersist 30m** на прод-хостах и **hsites-ahau**. Сброс: `ssh -O exit hunab-prod`, `ssh -O exit hunab-prod-direct`, при необходимости `rm -f ~/.ssh/cm-hunab-*`.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Команды управления
|
||||
@@ -105,9 +214,36 @@ ssh -i ~/.ssh/hunab_deploy_key -o ProxyCommand="$PROXY_CMD" hunab@209.38.32.21 "
|
||||
|
||||
## Cursor IDE (PING timeout из РФ)
|
||||
|
||||
Если Cursor выдаёт **PING timed out** при работе из России, трафик можно пустить через тот же сервер по SOCKS (SSH -D). Подробно:
|
||||
Если Cursor выдаёт **PING timed out** при работе из России, трафик можно пустить через SOCKS (SSH `-D`) на **127.0.0.1:10809**. Скрипт **`docs/cursor/scripts/cursor-socks-tunnel.sh`** при **`CURSOR_SOCKS_VIA_DO=1`** поднимает **только Mac→RU→DO** (`telegram-socks-via-do`); без доступа к RU — ошибка (без прямого Mac→DO). **`CURSOR_SOCKS_VIA_DO=0`** — выход только с RU (`hsites-ahau`).
|
||||
|
||||
📖 **[docs/cursor/README.md](../docs/cursor/README.md)** — обход PING timeout через SOCKS-туннель (без отключения HTTP/2).
|
||||
📖 **[docs/cursor/README.md](../cursor/README.md)** — пошагово, проверки и Windows (`cursor-socks-tunnel.ps1`).
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ macOS: системный PAC
|
||||
|
||||
В **Системных настройках → Сеть** на Mac может быть включён **автоматический прокси** с файлом конфигурации **PAC** (часто `http://localhost:1089/proxy.pac`). Пока PAC включён, браузер и часть приложений ходят в интернет по правилам из PAC; для **локальной админки роутера** (`192.168.x.x`), **чистого Wi‑Fi без прокси** или диагностики удобно **временно выключить** PAC и потом снова включить.
|
||||
|
||||
**Важно:** если PAC **включён**, а по выбранному URL **ничего не слушает** (например, порт **1089** пуст), macOS и приложения ведут себя непредсказуемо; при **смене хотспота** часто кажется, что «сеть мёртвая до перезагрузки». Это не баг Wi‑Fi как такового, а **нерабочий PAC + кэш DNS**. Скрипт восстановления и пошаговый emergency: **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)** (`macos-hotspot-network-recover.sh`).
|
||||
|
||||
**Быстрые скрипты** (из корня репозитория):
|
||||
|
||||
```bash
|
||||
./docs/connectivity/scripts/macos-pac-on.sh # включить PAC (URL + состояние On)
|
||||
./docs/connectivity/scripts/macos-pac-off.sh # выключить PAC (URL не стирается, только Off)
|
||||
./docs/connectivity/scripts/macos-system-pac.sh status # что сейчас в networksetup и scutil
|
||||
```
|
||||
|
||||
Полный вариант одной командой: `./docs/connectivity/scripts/macos-system-pac.sh on|off|status`.
|
||||
|
||||
**Переопределения через окружение:**
|
||||
|
||||
- **`MACOS_PAC_URL`** — по умолчанию `http://localhost:1089/proxy.pac`.
|
||||
- **`MACOS_PAC_SERVICES`** — список имён сетевых сервисов **через символ `|`** (как в `networksetup -listallnetworkservices`). По умолчанию: `Wi-Fi|Thunderbolt Bridge 2`.
|
||||
|
||||
Пример только для Wi‑Fi: `MACOS_PAC_SERVICES=Wi-Fi ./docs/connectivity/scripts/macos-pac-off.sh`
|
||||
|
||||
Убедитесь, что процесс, который отдаёт PAC по выбранному URL (порт **1089**), запущен, иначе после `on` приложения могут не открывать сайты.
|
||||
|
||||
---
|
||||
|
||||
@@ -144,6 +280,68 @@ launchctl load ~/Library/LaunchAgents/com.hunab.telegram-socks.plist
|
||||
|
||||
В Telegram (или другом клиенте) укажите прокси: **SOCKS5**, **127.0.0.1**, порт **1081**.
|
||||
|
||||
### Выход через DigitalOcean (прокси → DO → интернет)
|
||||
|
||||
Если с **149.154.64.19** до инфраструктуры Telegram TLS не проходит (типично DPI), поднимите SOCKS так, чтобы **трафик выходил в интернет с прод-сервера DO** (209.38.32.21), а до RU-прокси шёл только SSH. Цепочка: **Mac → hsites-ahau (149.154.64.19) → hunab@209.38.32.21:2222**.
|
||||
|
||||
**Вручную:**
|
||||
|
||||
```bash
|
||||
ssh -D 1081 -N -J hsites-ahau -i ~/.ssh/hunab_deploy_key -p 2222 hunab@209.38.32.21
|
||||
```
|
||||
|
||||
**Скрипт из репо** (те же параметры по умолчанию):
|
||||
|
||||
```bash
|
||||
export TELEGRAM_SOCKS_VIA_DO=1
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh start
|
||||
```
|
||||
|
||||
Переменные при необходимости: `TELEGRAM_SOCKS_JUMP_HOST`, `TELEGRAM_SOCKS_FINAL_HOST`, `TELEGRAM_SOCKS_FINAL_PORT` (по умолчанию 2222), `TELEGRAM_SOCKS_FINAL_IDENTITY`.
|
||||
|
||||
**`~/.ssh/config`** — удобно для LaunchAgent без длинной строки `ssh`:
|
||||
|
||||
```
|
||||
Host telegram-socks-via-do
|
||||
HostName 209.38.32.21
|
||||
User hunab
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
ProxyJump hsites-ahau
|
||||
StrictHostKeyChecking accept-new
|
||||
ServerAliveInterval 60
|
||||
ServerAliveCountMax 4
|
||||
ConnectTimeout 60
|
||||
TCPKeepAlive yes
|
||||
IPQoS throughput
|
||||
UseKeychain yes
|
||||
AddKeysToAgent yes
|
||||
```
|
||||
|
||||
**Прямой SSH к DO** (без RU в цепочке) — для админки вроде `hunab-prod-direct`, **не** для автоматического SOCKS «в обход RU»:
|
||||
|
||||
```
|
||||
Host telegram-socks-direct-do
|
||||
HostName 209.38.32.21
|
||||
User hunab
|
||||
Port 2222
|
||||
IdentityFile ~/.ssh/hunab_deploy_key
|
||||
StrictHostKeyChecking accept-new
|
||||
ServerAliveInterval 60
|
||||
ServerAliveCountMax 4
|
||||
ConnectTimeout 60
|
||||
TCPKeepAlive yes
|
||||
IPQoS throughput
|
||||
UseKeychain yes
|
||||
AddKeysToAgent yes
|
||||
```
|
||||
|
||||
Скрипты **`TELEGRAM_SOCKS_VIA_DO=1`**, **`cursor-socks-tunnel.sh`** при выходе через DO и LaunchAgent **не** переключаются на этот host — только **Mac→RU→DO** через `telegram-socks-via-do`.
|
||||
|
||||
Проверка SOCKS: `ssh -D 1081 -N telegram-socks-via-do` (в другом терминале: `curl -x socks5h://127.0.0.1:1081 -sI https://api.telegram.org | head -3`).
|
||||
|
||||
**Автозапуск (macOS):** `./docs/connectivity/launchd/install-via-do.sh` копирует `telegram-socks-launch.sh`, который всегда запускает **`telegram-socks-via-do`** (Mac→RU→DO). Лог: `/tmp/telegram-socks-tunnel-via-do.log`. Старый RU-only агент: `./docs/connectivity/launchd/uninstall.sh`. Вернуть только RU: `./docs/connectivity/launchd/uninstall-via-do.sh` и `./docs/connectivity/launchd/install.sh`.
|
||||
|
||||
---
|
||||
|
||||
## SSL
|
||||
|
||||
@@ -9,9 +9,12 @@
|
||||
| Файл / папка | Назначение |
|
||||
|--------------|------------|
|
||||
| **[PROXY_GUIDE.md](./PROXY_GUIDE.md)** | Основное руководство: SSH, Nginx, безопасность, scp через туннель, Cursor, скорость |
|
||||
| **[TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md)** | Гайд по Telegram: быстрые команды и порядок настройки с нуля на новой машине |
|
||||
| **[TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md)** | Telegram SOCKS: быстрые команды → регламент → развёртывание с нуля по сценариям |
|
||||
| **[PROXY_CHANGELOG.md](./PROXY_CHANGELOG.md)** | История изменений (безопасность, скрипты, документация) |
|
||||
| **[BUILD_AAB_FROM_RUSSIA_GUIDE.md](./BUILD_AAB_FROM_RUSSIA_GUIDE.md)** | Сборка AAB/APK из России: Maven proxy на проде + SSH-туннель |
|
||||
| **[WINDOWS_CURSOR_TUNNEL.md](./WINDOWS_CURSOR_TUNNEL.md)** | Cursor из РФ на **Windows**: туннель через прокси, скрипт .ps1, автозапуск |
|
||||
| **[WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md)** | Установка SSH-ключа на Windows (один файл `setup-ssh-key-for-proxy.ps1`, только для туннеля) |
|
||||
| **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)** | Сеть после смены хотспота: причина (PAC localhost), ручной сброс без ребута, `macos-hotspot-network-recover.sh` |
|
||||
| **[scripts/](./scripts/)** | Скрипты для туннелей и локальной работы |
|
||||
| **[launchd/](./launchd/)** | LaunchAgent для macOS: автозапуск SOCKS-туннеля при входе |
|
||||
|
||||
@@ -20,8 +23,8 @@
|
||||
## Быстрые ссылки по задачам
|
||||
|
||||
- **Доступ по SSH к прокси** — [PROXY_GUIDE.md → Доступ и файлы](./PROXY_GUIDE.md#-доступ-и-файлы)
|
||||
- **Telegram через SOCKS** — [TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md) (быстрые команды + гайд для новой машины), [launchd/README.md](./launchd/README.md)
|
||||
- **Cursor (PING timeout из РФ)** — [PROXY_GUIDE.md → Cursor IDE](./PROXY_GUIDE.md#cursor-ide-ping-timeout-из-рф), в репо: `docs/cursor/README.md`, скрипт `docs/cursor/scripts/cursor-socks-tunnel.sh`
|
||||
- **Telegram через SOCKS** — [TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md) (команды, регламент, сценарии), [launchd/README.md](./launchd/README.md)
|
||||
- **Cursor (PING timeout из РФ)** — [PROXY_GUIDE.md → Cursor IDE](./PROXY_GUIDE.md#cursor-ide-ping-timeout-из-рф), в репо: `docs/cursor/README.md`, скрипт `docs/cursor/scripts/cursor-socks-tunnel.sh` (macOS/Linux), **[Windows: WINDOWS_CURSOR_TUNNEL.md](./WINDOWS_CURSOR_TUNNEL.md)** и `docs/cursor/scripts/cursor-socks-tunnel.ps1`
|
||||
- **Загрузка файлов на прод через прокси** — [PROXY_GUIDE.md → Загрузка файлов на прод (scp)](./PROXY_GUIDE.md#-загрузка-файлов-на-прод-через-туннель-scp)
|
||||
- **Безопасность прокси (nginx, fail2ban)** — [PROXY_GUIDE.md → Безопасность](./PROXY_GUIDE.md#-безопасность), SECURITY.md (если есть в папке)
|
||||
- **Сборка AAB из РФ** — [BUILD_AAB_FROM_RUSSIA_GUIDE.md](./BUILD_AAB_FROM_RUSSIA_GUIDE.md)
|
||||
@@ -32,7 +35,9 @@
|
||||
|
||||
| Скрипт | Описание |
|
||||
|--------|----------|
|
||||
| **telegram-socks-tunnel.sh** | Поднять/остановить/проверить SOCKS5 на 127.0.0.1:1081 для Telegram (и др.). Хост: ahau@149.154.64.19. Переменные: `TELEGRAM_SOCKS_PORT`, `TELEGRAM_TUNNEL_HOST`. |
|
||||
| **telegram-socks-tunnel.sh** | SOCKS5 на 1081 для Telegram. `TELEGRAM_SOCKS_VIA_DO=1` — только Mac→RU→DO (`telegram-socks-via-do`); без RU — ошибка. См. PROXY_GUIDE. |
|
||||
| **macos-hotspot-network-recover.sh** | После смены хотспота: `status` / `recover` (PAC off, SOCKS off на Wi‑Fi, DNS, DHCP, перезапуск радио). См. HOTSPOT_NETWORK_EMERGENCY.md. |
|
||||
| **ssh-hunab-prod.sh** | Опционально: сначала `hunab-prod-direct`, иначе `hunab-prod` (в конфиге по умолчанию уже через RU). См. PROXY_GUIDE. |
|
||||
|
||||
---
|
||||
|
||||
@@ -40,9 +45,10 @@
|
||||
|
||||
Автозапуск SOCKS-туннеля для Telegram при входе в macOS:
|
||||
|
||||
- **com.hunab.telegram-socks.plist** — LaunchAgent (RunAtLoad, KeepAlive, порт 1081).
|
||||
- **install.sh** — один раз скопировать plist и загрузить; дальше туннель поднимается при каждом входе.
|
||||
- **uninstall.sh** — снять автозапуск.
|
||||
- **com.hunab.telegram-socks.plist** — LaunchAgent (RunAtLoad, KeepAlive, порт 1081, выход на RU-прокси).
|
||||
- **com.hunab.telegram-socks-via-do.plist** — только Mac→RU→DO (`telegram-socks-launch.sh` + `telegram-socks-via-do`).
|
||||
- **install.sh** / **uninstall.sh** — RU-only агент.
|
||||
- **install-via-do.sh** / **uninstall-via-do.sh** — агент с выходом через DigitalOcean.
|
||||
- **[launchd/README.md](./launchd/README.md)** — установка, удаление, требования (ключ в keychain), возможные конфликты портов.
|
||||
|
||||
---
|
||||
@@ -52,4 +58,4 @@
|
||||
| Порт | Назначение |
|
||||
|------|------------|
|
||||
| **1081** | Telegram (и др. приложения) — SOCKS через `scripts/telegram-socks-tunnel.sh` или LaunchAgent |
|
||||
| **10809** | Cursor IDE — SOCKS через `docs/cursor/scripts/cursor-socks-tunnel.sh` |
|
||||
| **10809** | Cursor IDE — SOCKS через `docs/cursor/scripts/cursor-socks-tunnel.sh` / `cursor-socks-tunnel.ps1`; по умолчанию только **Mac→RU→DO** (`CURSOR_SOCKS_VIA_DO=1`, `telegram-socks-via-do`) |
|
||||
|
||||
@@ -1,146 +1,213 @@
|
||||
# Telegram через SOCKS-туннель (ru.hunab.app)
|
||||
# Telegram через SOCKS (RU-прокси → DigitalOcean)
|
||||
|
||||
Трафик Telegram идёт через прокси 149.154.64.19 по SOCKS5 на **127.0.0.1:1081**. Гайд для быстрых команд и для настройки с нуля на новой машине.
|
||||
На Mac поднимается **SOCKS5** на **127.0.0.1:1081**. Для выхода в интернет с **IP DO** используется **только** цепочка **Mac → 149.154.64.19 → DO (209.38.32.21)** (`telegram-socks-via-do`). Без доступа к RU автоматический SOCKS «напрямую в DO» **не** поднимается. Подробности: [PROXY_GUIDE.md](./PROXY_GUIDE.md).
|
||||
|
||||
Все пути ниже — от корня репозитория **local_machine**.
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Быстрые команды
|
||||
## Быстрые команды
|
||||
|
||||
### Туннель вручную (основной: только Mac→RU→DO)
|
||||
|
||||
```bash
|
||||
# Поднять туннель вручную
|
||||
export TELEGRAM_SOCKS_VIA_DO=1
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh start
|
||||
|
||||
# Проверить, слушается ли порт
|
||||
lsof -i :1081
|
||||
|
||||
# Статус туннеля
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh status
|
||||
|
||||
# Остановить туннель
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh stop
|
||||
|
||||
# Включить автозапуск при входе (один раз)
|
||||
./docs/connectivity/launchd/install.sh
|
||||
|
||||
# Отключить автозапуск
|
||||
./docs/connectivity/launchd/uninstall.sh
|
||||
|
||||
# Проверить доступ к Telegram API через прокси
|
||||
curl -x socks5h://127.0.0.1:1081 -sI https://api.telegram.org | head -3
|
||||
```
|
||||
|
||||
**В Telegram:** Настройки → Данные и память → Прокси → добавить **SOCKS5**, **127.0.0.1**, порт **1081**.
|
||||
|
||||
---
|
||||
|
||||
## Полный гайд: новая машина (порядок действий)
|
||||
|
||||
### 1. Требования
|
||||
|
||||
- macOS (для LaunchAgent; на Linux можно использовать systemd или скрипт в автозагрузке).
|
||||
- Доступ по SSH к **149.154.64.19** под пользователем **ahau** (ключ в `~/.ssh/` или алиас в `~/.ssh/config`, например `hsites-ahau`).
|
||||
- Репозиторий **local_machine** склонирован (нужны скрипты из `docs/connectivity/`).
|
||||
|
||||
### 2. Проверка SSH
|
||||
|
||||
Убедись, что вход без пароля работает:
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes -o ConnectTimeout=10 ahau@149.154.64.19 "echo OK"
|
||||
```
|
||||
|
||||
Если просит пароль или ключ не подхватывается — настрой `~/.ssh/config` или укажи ключ явно: `ssh -i ~/.ssh/id_ed25519 ahau@149.154.64.19`.
|
||||
|
||||
### 3. Поднять туннель вручную (первый раз)
|
||||
|
||||
Из корня репо:
|
||||
|
||||
```bash
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh start
|
||||
```
|
||||
|
||||
Ожидаемый вывод: `SOCKS tunnel started: 127.0.0.1:1081 -> ahau@149.154.64.19`.
|
||||
|
||||
Проверка порта:
|
||||
|
||||
```bash
|
||||
lsof -i :1081
|
||||
```
|
||||
|
||||
Должен быть процесс `ssh` в состоянии LISTEN.
|
||||
|
||||
### 4. Настройка прокси в Telegram
|
||||
|
||||
1. Открой **Telegram** (Desktop или мобильное приложение).
|
||||
2. **Настройки** (Settings) → **Данные и память** (Data and Storage) → **Прокси** (Proxy).
|
||||
3. **Добавить прокси** (Add Proxy):
|
||||
- Тип: **SOCKS5**
|
||||
- Сервер: **127.0.0.1**
|
||||
- Порт: **1081**
|
||||
- Логин/пароль — не нужны.
|
||||
4. Сохрани и **включи** прокси.
|
||||
|
||||
После этого Telegram должен подключаться через туннель. Если не подключается — см. раздел [Проверка и диагностика](#проверка-и-диагностика) ниже.
|
||||
|
||||
### 5. Автозапуск туннеля при входе в систему (macOS)
|
||||
|
||||
Чтобы не запускать туннель вручную после каждой перезагрузки:
|
||||
|
||||
```bash
|
||||
./docs/connectivity/launchd/install.sh
|
||||
```
|
||||
|
||||
Скрипт копирует plist в `~/Library/LaunchAgents/` и загружает его. Дальше при каждом входе в систему туннель будет подниматься сам (и перезапускаться при обрыве).
|
||||
|
||||
**Важно:** при старте системы SSH должен иметь доступ к ключу. Добавь ключ в связку с keychain (один раз):
|
||||
|
||||
```bash
|
||||
ssh-add --apple-use-keychain
|
||||
# или, если ключ не дефолтный:
|
||||
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
Проверка после перезагрузки:
|
||||
|
||||
```bash
|
||||
lsof -i :1081
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh status
|
||||
```
|
||||
|
||||
### 6. Проверка и диагностика
|
||||
|
||||
**Туннель слушает порт?**
|
||||
### Проверка порта и API Telegram
|
||||
|
||||
```bash
|
||||
lsof -i :1081 -sTCP:LISTEN
|
||||
curl -x socks5h://127.0.0.1:1081 -sI --connect-timeout 10 https://api.telegram.org | head -5
|
||||
```
|
||||
|
||||
**Доступ к API Telegram через SOCKS?**
|
||||
### Автозапуск после перезагрузки (via-DO + авто-fallback)
|
||||
|
||||
Скрипт **`~/Library/Application Support/hunab/telegram-socks-launch.sh`** ставится из репо командой ниже.
|
||||
|
||||
```bash
|
||||
curl -x socks5h://127.0.0.1:1081 -sI https://api.telegram.org | head -5
|
||||
./docs/connectivity/launchd/install-via-do.sh
|
||||
./docs/connectivity/launchd/uninstall-via-do.sh
|
||||
launchctl list | grep telegram-socks
|
||||
launchctl kickstart -k "gui/$(id -u)/com.hunab.telegram-socks-via-do"
|
||||
```
|
||||
|
||||
Успех: в ответе есть HTTP-заголовки (например 302 или 200). Таймаут или отказ — туннель не работает или порт занят.
|
||||
Лог агента: `tail -50 /tmp/telegram-socks-tunnel-via-do.log`
|
||||
|
||||
**Лог LaunchAgent (если туннель при старте не поднимается):**
|
||||
### Ключи в связку (один раз после смены ключей / сбоя SSH)
|
||||
|
||||
```bash
|
||||
tail -50 /tmp/telegram-socks-tunnel.log
|
||||
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
|
||||
ssh-add --apple-use-keychain ~/.ssh/hunab_deploy_key
|
||||
```
|
||||
|
||||
Типичные причины: ключ не в keychain, ошибка «Permission denied», сеть ещё недоступна при RunAtLoad.
|
||||
### Прокси в Telegram (обязательно)
|
||||
|
||||
### 7. Конфликты портов
|
||||
| Поле | Значение |
|
||||
|------|----------|
|
||||
| Тип | **SOCKS5** |
|
||||
| Сервер | **127.0.0.1** |
|
||||
| Порт | **1081** |
|
||||
| Логин / пароль | *пусто* |
|
||||
|
||||
| Порт | Назначение |
|
||||
|-------|------------|
|
||||
| 1081 | Telegram SOCKS (этот гайд) |
|
||||
| 10809 | Cursor IDE SOCKS (другой туннель) |
|
||||
**Настройки → Данные и память → Прокси** — добавить, сохранить, **включить**.
|
||||
|
||||
Если на 1081 уже висит другой прокси (например Shadowsocks), смени порт в plist и в настройках Telegram или отключи автозапуск: `./docs/connectivity/launchd/uninstall.sh`.
|
||||
---
|
||||
|
||||
### 8. Ссылки
|
||||
## Регламент
|
||||
|
||||
- [PROXY_GUIDE.md](./PROXY_GUIDE.md) — общее руководство по прокси ru.hunab.app (SSH, Nginx, Cursor, scp).
|
||||
- [launchd/README.md](./launchd/README.md) — детали LaunchAgent (удаление, ThrottleInterval, логи).
|
||||
Документ задаёт **обязательные** правила и **порядок действий**. Отклонения — только осознанно (обрывы, DPI, конфликт портов).
|
||||
|
||||
### 1. Назначение
|
||||
|
||||
- Выход в интернет через **DO**; предпочтительно через **`hsites-ahau`**, при его недоступности — **прямой** SSH к DO (автоматически).
|
||||
- Исключить работу Telegram **мимо** туннеля и конкуренцию на порту **1081**.
|
||||
|
||||
### 2. Обязательные нормы (всегда)
|
||||
|
||||
| № | Требование |
|
||||
|---|------------|
|
||||
| N1 | **Основной** сценарий: **`TELEGRAM_SOCKS_VIA_DO=1`** и/или LaunchAgent **`com.hunab.telegram-socks-via-do`**, не «только RU без DO», если с RU TLS до Telegram нестабилен. |
|
||||
| N2 | В Telegram — **SOCKS5**, **127.0.0.1**, **1081**, без логина/пароля (см. таблицу в «Быстрые команды»). |
|
||||
| N3 | На **1081** только наш `ssh -D`. Другие прокси (Shadowsocks, v2ray и т.п.) на этот порт **не ставить**. |
|
||||
| N4 | В `~/.ssh/config` есть **`Host telegram-socks-via-do`** (с jump **`hsites-ahau`**) и **`hsites-ahau`** — [PROXY_GUIDE.md](./PROXY_GUIDE.md). |
|
||||
| N5 | Ключи **id_ed25519** и **hunab_deploy_key** доступны SSH после входа: **связка ключей** (`ssh-add --apple-use-keychain`). |
|
||||
| N6 | Для работы после перезагрузки: plist **`~/Library/LaunchAgents/com.hunab.telegram-socks-via-do.plist`** загружен. Ручной `start` без агента перезагрузку **не переживает**. |
|
||||
| N7 | Не держать **два** LaunchAgent на **1081**: `com.hunab.telegram-socks` (только RU) и `com.hunab.telegram-socks-via-do` — **ровно один** вариант. |
|
||||
|
||||
### 3. Первоначальная настройка (один раз)
|
||||
|
||||
Порядок фиксирован (детальнее и варианты — раздел «Развёртывание с нуля»).
|
||||
|
||||
1. Проверка SSH (см. быстрые проверки в сценарии 1).
|
||||
2. `~/.ssh/config`: **`Host telegram-socks-via-do`** по [PROXY_GUIDE.md](./PROXY_GUIDE.md).
|
||||
3. `ssh-add --apple-use-keychain` для обоих ключей.
|
||||
4. Снять старый агент only-RU при необходимости: `./docs/connectivity/launchd/uninstall.sh`.
|
||||
5. `./docs/connectivity/launchd/install-via-do.sh`.
|
||||
6. Настроить прокси в Telegram (таблица выше).
|
||||
7. Контрольные проверки (п. 6).
|
||||
|
||||
### 4. Повседневная эксплуатация
|
||||
|
||||
| Ситуация | Действие |
|
||||
|----------|----------|
|
||||
| Обычный день | Ничего не запускать: туннель поднимает LaunchAgent после входа. |
|
||||
| Ручной перезапуск туннеля | `stop` → `export TELEGRAM_SOCKS_VIA_DO=1` → `start` (см. быстрые команды). |
|
||||
| После смены plist / обновления репо | `install-via-do.sh` или `kickstart` (см. быстрые команды). |
|
||||
|
||||
### 5. Норматив: клиент Telegram
|
||||
|
||||
Соответствует таблице в разделе **«Быстрые команды»**. Иначе нарушение N2.
|
||||
|
||||
### 6. Контрольные проверки
|
||||
|
||||
```bash
|
||||
test -f "$HOME/Library/LaunchAgents/com.hunab.telegram-socks-via-do.plist" && echo "plist OK" || echo "FAIL: нет plist"
|
||||
launchctl list | grep telegram-socks
|
||||
lsof -i :1081 -sTCP:LISTEN
|
||||
curl -x socks5h://127.0.0.1:1081 -sI --connect-timeout 10 https://api.telegram.org | head -5
|
||||
```
|
||||
|
||||
Лог: `/tmp/telegram-socks-tunnel-via-do.log`.
|
||||
|
||||
### 7. Запреты и конфликты
|
||||
|
||||
- Не занимать **1081** сторонним ПО (N3).
|
||||
- Не два LaunchAgent на 1081 (N7).
|
||||
- Не отключать прокси в Telegram и ожидать тот же доступ «через туннель» (N2).
|
||||
|
||||
| Порт | Назначение |
|
||||
|------|------------|
|
||||
| **1081** | Telegram SOCKS |
|
||||
| **10809** | Cursor IDE SOCKS |
|
||||
|
||||
### 8. Действия при сбое
|
||||
|
||||
1. П. 6 (контрольные проверки).
|
||||
2. `tail -80 /tmp/telegram-socks-tunnel-via-do.log`.
|
||||
3. **`Too many open files`**: обновить plist из репозитория, снова `install-via-do.sh`.
|
||||
4. **`channel … open failed`**: часто сеть или следствие п.3; перезапуск туннеля после правок.
|
||||
5. После правок `~/.ssh/config`: `stop` → `TELEGRAM_SOCKS_VIA_DO=1` → `start` или `kickstart`.
|
||||
6. Прокси в Telegram по-прежнему включён (п. 5).
|
||||
7. **`Connection timed out during banner exchange`** к RU: без доступа к **149.154.64.19** цепочка Mac→RU→DO **невозможна** — восстановите доступ к RU или временно используйте только-RU агент (`install.sh`) / другую сеть; автоматического SOCKS «напрямую в DO» нет.
|
||||
|
||||
### 9. Снятие автозапуска и откат
|
||||
|
||||
- Via-DO: `./docs/connectivity/launchd/uninstall-via-do.sh`.
|
||||
- Переход на только-RU: `./docs/connectivity/launchd/install.sh` — см. **сценарий 2** ниже.
|
||||
|
||||
---
|
||||
|
||||
## Развёртывание с нуля (по сценариям)
|
||||
|
||||
Общие требования: **macOS**; репозиторий **local_machine**; SSH без пароля к **209.38.32.21:2222** (hunab, `hunab_deploy_key`) и к **149.154.64.19** (ahau) — для SOCKS через DO нужен **оба** hop (Mac→RU→DO).
|
||||
|
||||
### Сценарий 1: основной — macOS, автозапуск (только Mac→RU→DO)
|
||||
|
||||
Рекомендуемый вариант (регламент N1, N6).
|
||||
|
||||
1. Проверка SSH (для via-DO нужны **оба**):
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes -o ConnectTimeout=10 ahau@149.154.64.19 "echo OK"
|
||||
ssh -o BatchMode=yes -o ConnectTimeout=15 -i ~/.ssh/hunab_deploy_key -p 2222 hunab@209.38.32.21 "echo OK"
|
||||
```
|
||||
|
||||
2. Добавить в `~/.ssh/config` блок **`Host telegram-socks-via-do`** — [PROXY_GUIDE.md](./PROXY_GUIDE.md).
|
||||
|
||||
3. `ssh-add --apple-use-keychain` для `id_ed25519` и `hunab_deploy_key`.
|
||||
|
||||
4. Если ранее стоял агент только-RU: `./docs/connectivity/launchd/uninstall.sh`.
|
||||
|
||||
5. `./docs/connectivity/launchd/install-via-do.sh`.
|
||||
|
||||
6. В Telegram — прокси по таблице в **«Быстрые команды»**.
|
||||
|
||||
7. Проверки из п. 6 регламента.
|
||||
|
||||
### Сценарий 2: только RU-прокси (без DO)
|
||||
|
||||
Если прямой выход с **149.154.64.19** до Telegram устойчив или для диагностики. **Не** ставить одновременно с via-DO на 1081 (N7).
|
||||
|
||||
**Ручной туннель:**
|
||||
|
||||
```bash
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh start
|
||||
```
|
||||
|
||||
**Автозапуск:** `./docs/connectivity/launchd/install.sh`
|
||||
**Снятие:** `./docs/connectivity/launchd/uninstall.sh`
|
||||
|
||||
Перед переходом на сценарий 1 — `uninstall.sh`, затем сценарий 1 с шага 5.
|
||||
|
||||
### Сценарий 3: без LaunchAgent, только ручной туннель (via-DO)
|
||||
|
||||
Для отладки; после перезагрузки нужно снова поднимать вручную.
|
||||
|
||||
```bash
|
||||
export TELEGRAM_SOCKS_VIA_DO=1
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh start
|
||||
```
|
||||
|
||||
Убедиться, что `~/.ssh/config` и ключи настроены как в сценарии 1 (шаги 1–3). Прокси в Telegram — как в таблице.
|
||||
|
||||
### Сценарий 4: смена с via-DO на only-RU или обратно
|
||||
|
||||
- **На only-RU:** `./docs/connectivity/launchd/uninstall-via-do.sh`, затем `./docs/connectivity/launchd/install.sh`.
|
||||
- **Обратно на via-DO:** `./docs/connectivity/launchd/uninstall.sh`, затем `./docs/connectivity/launchd/install-via-do.sh`.
|
||||
|
||||
Каждый раз проверять: один plist на 1081, `launchctl list | grep telegram-socks`.
|
||||
|
||||
### Сценарий 5: Linux (без LaunchAgent)
|
||||
|
||||
Репозиторий и скрипт `docs/connectivity/scripts/telegram-socks-tunnel.sh`; автозапуск — **systemd**, **cron @reboot**, или ручной `start` как в сценарии 3. Plist macOS на Linux не используется.
|
||||
|
||||
---
|
||||
|
||||
## Ссылки
|
||||
|
||||
- [PROXY_GUIDE.md](./PROXY_GUIDE.md) — прокси ru.hunab.app, `Host telegram-socks-via-do`, scp.
|
||||
- [launchd/README.md](./launchd/README.md) — LaunchAgent, логи, порты.
|
||||
|
||||
269
docs/connectivity/WINDOWS_CURSOR_TUNNEL.md
Normal file
269
docs/connectivity/WINDOWS_CURSOR_TUNNEL.md
Normal file
@@ -0,0 +1,269 @@
|
||||
# Cursor из РФ на Windows — туннель через прокси ru.hunab.app
|
||||
|
||||
Пошаговая инструкция для тех, кто впервые настраивает Cursor за пределами «обычного» интернета. Все действия выполняются на компьютере Windows.
|
||||
|
||||
---
|
||||
|
||||
## Зачем это нужно
|
||||
|
||||
В России Cursor иногда выдаёт ошибку **PING timed out**: связь с серверами Cursor обрывается или не устанавливается. Чтобы обойти это, трафик Cursor пускают через **прокси-сервер** ru.hunab.app (149.154.64.19). С вашего Windows до этого сервера создаётся зашифрованный **туннель** по SSH. Cursor тогда подключается к интернету не напрямую, а через этот туннель — и ошибка пропадает.
|
||||
|
||||
**Что вы сделаете по шагам:**
|
||||
1) проверите/установите программу для туннеля (OpenSSH) и ключ доступа к прокси;
|
||||
2) запустите туннель (одна команда или скрипт);
|
||||
3) настроите Cursor так, чтобы он использовал этот туннель;
|
||||
4) при желании настроите автозапуск туннеля при входе в Windows.
|
||||
|
||||
---
|
||||
|
||||
## Небольшой словарик
|
||||
|
||||
| Термин | По-простому |
|
||||
|--------|-------------|
|
||||
| **Туннель (SOCKS)** | Канал «ваш компьютер → прокси-сервер». Весь трафик Cursor к интернету идёт через этот канал. |
|
||||
| **Порт 10809** | Номер «входа» на вашем же компьютере. Cursor подключается к `127.0.0.1:10809` — то есть к себе же, но к программе туннеля, которая пересылает данные на прокси. |
|
||||
| **PowerShell** | Программа в Windows для ввода текстовых команд. Открыть: поиск в Пуске «PowerShell» или Win+X → «Windows PowerShell». |
|
||||
| **%USERPROFILE%** | Папка вашего пользователя Windows, например `C:\Users\Иван`. В PowerShell то же: `$env:USERPROFILE`. |
|
||||
| **Корень репо** | Папка, в которой лежит проект local_machine (внутри есть папки `docs`, `scripts` и т.д.). |
|
||||
|
||||
---
|
||||
|
||||
## Что нужно до начала
|
||||
|
||||
- **SSH-ключ** уже установлен на Windows и проверен (подключение к ahau@149.154.64.19 без пароля). Если ещё нет — сначала сделайте по инструкции [WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md).
|
||||
- **Cursor** установлен на Windows.
|
||||
- Настроено **подключение к интернету** (туннель будет идти через него до прокси).
|
||||
|
||||
---
|
||||
|
||||
## Содержание
|
||||
|
||||
1. [Шаг 1: Проверить OpenSSH и ключ](#-шаг-1-проверить-openssh-и-ключ)
|
||||
2. [Шаг 2: Запустить туннель](#-шаг-2-запустить-туннель)
|
||||
3. [Шаг 3: Настроить Cursor](#-шаг-3-настроить-cursor)
|
||||
4. [Порядок работы каждый раз](#-порядок-работы-каждый-раз)
|
||||
5. [Автозапуск туннеля при входе в Windows](#-автозапуск-туннеля-при-входе-в-windows)
|
||||
6. [Если что-то не работает](#-если-что-то-не-работает)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 1: Проверить OpenSSH и ключ
|
||||
|
||||
### 1.1 Открыть PowerShell
|
||||
|
||||
- Нажмите клавишу **Win** (или кнопку «Пуск») и начните вводить **PowerShell**.
|
||||
- Выберите **Windows PowerShell** (лучше не «от имени администратора», если не требуется).
|
||||
|
||||
Откроется синее окно с текстом вроде `PS C:\Users\ВашеИмя>`. В нём вы будете вводить команды.
|
||||
|
||||
### 1.2 Проверить, установлен ли OpenSSH
|
||||
|
||||
Введите команду и нажмите Enter:
|
||||
|
||||
```powershell
|
||||
ssh -V
|
||||
```
|
||||
|
||||
**Хороший результат:** появляется строка с версией, например `OpenSSH_for_Windows_8.1` или похоже.
|
||||
|
||||
**Если пишет «не распознано» или «command not found»:**
|
||||
Нужно установить клиент OpenSSH:
|
||||
|
||||
1. Откройте **Параметры Windows** (Win+I).
|
||||
2. Зайдите в **Приложения** → **Дополнительные компоненты** (или «Опциональные компоненты»).
|
||||
3. Нажмите **Добавить компонент**.
|
||||
4. Найдите в списке **OpenSSH-клиент** и нажмите **Установить**.
|
||||
|
||||
После установки закройте и снова откройте PowerShell и снова выполните `ssh -V`.
|
||||
|
||||
### 1.3 Убедиться, что ключ на месте и работает
|
||||
|
||||
Ключ должен лежать в папке вашего пользователя, в подпапке `.ssh`, с именем `id_ed25519`. То есть полный путь:
|
||||
|
||||
`C:\Users\**ВашеИмя**\.ssh\id_ed25519`
|
||||
|
||||
Проверка одной командой (скопируйте целиком и вставьте в PowerShell):
|
||||
|
||||
```powershell
|
||||
ssh -i $env:USERPROFILE\.ssh\id_ed25519 ahau@149.154.64.19 "echo OK"
|
||||
```
|
||||
|
||||
При первом запуске может спросить про доверие хосту — введите **yes**.
|
||||
**Ожидаемый результат:** в следующей строке выводится **OK**, пароль не запрашивается.
|
||||
|
||||
Если получили **OK** — переходите к [Шагу 2](#-шаг-2-запустить-туннель).
|
||||
Если ошибка (например, «Permission denied», «No such file») — вернитесь к [WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md) и доведите установку ключа до конца.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2: Запустить туннель
|
||||
|
||||
Туннель — это программа, которая держит соединение с прокси и «слушает» на вашем компьютере порт 10809. Cursor потом будет подключаться к этому порту. Окно, в котором запущен туннель, **лучше не закрывать** (можно свернуть).
|
||||
|
||||
### Вариант A: Запуск скриптом (если у вас есть папка с репо local_machine)
|
||||
|
||||
1. Откройте PowerShell.
|
||||
2. Перейдите в **корень репо** (папка, где лежат `docs`, `scripts`). Пример:
|
||||
```powershell
|
||||
cd C:\Users\ВашеИмя\code\local_machine
|
||||
```
|
||||
Подставьте свой путь к папке проекта.
|
||||
3. Разрешить выполнение скриптов (достаточно один раз):
|
||||
```powershell
|
||||
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
|
||||
```
|
||||
На вопрос ответьте **Y**.
|
||||
4. Запустите туннель:
|
||||
```powershell
|
||||
.\docs\cursor\scripts\cursor-socks-tunnel.ps1 start
|
||||
```
|
||||
5. **Ожидаемый вывод:** `... -> telegram-socks-via-do (DO exit)` — только цепочка **Mac→RU→DO**; если **hsites-ahau** недоступен, скрипт завершится с ошибкой (прямой Mac→DO не поднимается). Нужен `Host telegram-socks-via-do` в `~/.ssh/config`, см. [PROXY_GUIDE.md](./PROXY_GUIDE.md). Только выход с RU: `$env:CURSOR_SOCKS_VIA_DO="0"; .\docs\cursor\scripts\cursor-socks-tunnel.ps1 start`. Окно можно свернуть.
|
||||
|
||||
Проверить, что туннель работает: в **другом** окне PowerShell выполните:
|
||||
|
||||
```powershell
|
||||
.\docs\cursor\scripts\cursor-socks-tunnel.ps1 status
|
||||
```
|
||||
|
||||
Должно написать, что SOCKS слушает на порту 10809.
|
||||
|
||||
Остановить туннель (когда не нужен):
|
||||
|
||||
```powershell
|
||||
.\docs\cursor\scripts\cursor-socks-tunnel.ps1 stop
|
||||
```
|
||||
|
||||
### Вариант B: Запуск одной командой (без скрипта)
|
||||
|
||||
1. Откройте PowerShell.
|
||||
2. Выход через **DO** (как скрипт по умолчанию):
|
||||
|
||||
```powershell
|
||||
ssh -D 10809 -o ServerAliveInterval=60 -o ServerAliveCountMax=4 telegram-socks-via-do
|
||||
```
|
||||
|
||||
Только **RU** (без DO в цепочке выхода):
|
||||
|
||||
```powershell
|
||||
ssh -D 10809 -o ServerAliveInterval=30 -o ServerAliveCountMax=6 ahau@149.154.64.19
|
||||
```
|
||||
|
||||
3. При первом запуске может спросить про доверие хосту — введите **yes**. Пароль спрашивать не должно (работает ключ).
|
||||
4. **Окно не закрывайте** — пока оно открыто, туннель работает. В заголовке окна может ничего не меняться — это нормально. Можно свернуть окно.
|
||||
|
||||
Проверка: откройте **второе** окно PowerShell и выполните:
|
||||
|
||||
```powershell
|
||||
netstat -an | findstr "10809"
|
||||
```
|
||||
|
||||
Должна появиться строка, где есть `127.0.0.1` и `10809` и состояние **LISTENING**.
|
||||
|
||||
Чтобы остановить туннель — закройте то окно PowerShell, в котором была запущена команда `ssh -D 10809 ...`.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3: Настроить Cursor
|
||||
|
||||
Нужно один раз сказать Cursor использовать туннель как прокси.
|
||||
|
||||
1. Откройте **Cursor**.
|
||||
2. Откройте настройки:
|
||||
- либо меню **File** → **Preferences** → **Settings** (или **Файл** → **Параметры** → **Настройки**);
|
||||
- либо нажмите **Ctrl+,** (запятая).
|
||||
3. Вверху в поиске настроек введите: **proxy**.
|
||||
4. Найдите пункт **Http: Proxy** (или **Http: Proxy Support** и т.п.) и в поле значения введите **ровно**:
|
||||
```text
|
||||
socks5://127.0.0.1:10809
|
||||
```
|
||||
5. Если есть отдельное поле **Https: Proxy** — введите туда то же самое: `socks5://127.0.0.1:10809`.
|
||||
6. Убедитесь, что **Cursor > General: Disable Http2** выключен (галочка снята). HTTP/2 должен быть включён — так Cursor будет стабильнее работать через туннель.
|
||||
|
||||
**Альтернатива через JSON-настройки:**
|
||||
|
||||
- В Cursor откройте палитру команд: **Ctrl+Shift+P**.
|
||||
- Введите: **Open User Settings (JSON)** и выберите этот пункт.
|
||||
- В открывшийся файл добавьте (или допишите к существующему объекту) строки:
|
||||
|
||||
```json
|
||||
"http.proxy": "socks5://127.0.0.1:10809",
|
||||
"https.proxy": "socks5://127.0.0.1:10809"
|
||||
```
|
||||
|
||||
Сохраните файл. Настройки применятся автоматически.
|
||||
|
||||
---
|
||||
|
||||
## Порядок работы каждый раз
|
||||
|
||||
1. **Сначала** запустите туннель (скриптом или командой `ssh -D 10809 ...`). Дождитесь, что он поднялся (проверка через `status` или `netstat`).
|
||||
2. **Потом** откройте Cursor и работайте как обычно. Cursor будет отправлять трафик через туннель на порт 10809.
|
||||
|
||||
Если туннель не запущен, Cursor может снова показывать PING timeout или не подключаться к серверам.
|
||||
|
||||
---
|
||||
|
||||
## Автозапуск туннеля при входе в Windows
|
||||
|
||||
Чтобы не запускать туннель вручную каждый раз, можно настроить его старт при входе в систему.
|
||||
|
||||
### Способ 1: Планировщик заданий
|
||||
|
||||
1. Нажмите **Win+R**, введите **taskschd.msc** и нажмите Enter. Откроется **Планировщик заданий**.
|
||||
2. Справа нажмите **Создать задачу…** (не «Создать простую задачу»).
|
||||
3. Вкладка **Общие**:
|
||||
- Имя: например **Cursor SOCKS tunnel**.
|
||||
- Отметьте «Выполнять для всех пользователей» при необходимости; «Выполнять с наивысшими правами» можно не ставить.
|
||||
4. Вкладка **Триггеры** → **Создать**:
|
||||
- Начать задачу: **При входе в систему**.
|
||||
- Пользователь: ваш пользователь Windows. ОК.
|
||||
5. Вкладка **Действия** → **Создать**:
|
||||
- Действие: **Запуск программы**.
|
||||
- Программа или сценарий: **powershell.exe**.
|
||||
- Добавить аргументы:
|
||||
- Если используете скрипт из репо (подставьте свой путь к папке local_machine):
|
||||
```text
|
||||
-NoProfile -WindowStyle Hidden -File "C:\Users\ВашеИмя\путь\к\local_machine\docs\cursor\scripts\cursor-socks-tunnel.ps1" start
|
||||
```
|
||||
- Или без скрипта (фон; только Mac→RU→DO, нужен доступ к RU):
|
||||
```text
|
||||
-NoProfile -WindowStyle Minimized -Command "ssh -D 10809 -o ServerAliveInterval=60 -o ServerAliveCountMax=4 telegram-socks-via-do"
|
||||
```
|
||||
Нажмите ОК.
|
||||
6. ОК по задаче. При следующем входе в Windows туннель должен запускаться сам.
|
||||
|
||||
### Способ 2: Ярлык в папке «Автозагрузка»
|
||||
|
||||
1. Нажмите **Win+R**, введите **shell:startup** и нажмите Enter. Откроется папка автозагрузки вашего пользователя.
|
||||
2. В этой папке создайте ярлык (правый клик → Создать → Ярлык).
|
||||
3. В качестве расположения объекта укажите, например (подставьте свой путь к репо):
|
||||
```text
|
||||
powershell.exe -NoProfile -WindowStyle Normal -File "C:\Users\ВашеИмя\code\local_machine\docs\cursor\scripts\cursor-socks-tunnel.ps1" start
|
||||
```
|
||||
4. Имя ярлыка: например **Cursor tunnel**. Готово. При каждом входе в Windows будет запускаться PowerShell и подниматься туннель.
|
||||
|
||||
---
|
||||
|
||||
## Если что-то не работает
|
||||
|
||||
| Ситуация | Что проверить и сделать |
|
||||
|----------|-------------------------|
|
||||
| **Cursor не подключается, ошибки в чате** | 1) Туннель действительно запущен: в PowerShell `.\docs\cursor\scripts\cursor-socks-tunnel.ps1 status` или `netstat -an \| findstr 10809`. 2) В настройках Cursor указано ровно `socks5://127.0.0.1:10809`. 3) Перезапустите Cursor (полностью закрыть и открыть снова). |
|
||||
| **Всё ещё PING timed out** | Убедитесь, что в настройках Cursor **Disable Http2** выключен (HTTP/2 включён). Перезапустите туннель и Cursor. |
|
||||
| **Порт 10809 занят** | Другой программой уже занят. Можно сменить порт: например 10810. Тогда в команде туннеля замените 10809 на 10810 и в Cursor укажите `socks5://127.0.0.1:10810`. |
|
||||
| **Туннель обрывается через время** | В команде SSH должны быть параметры `ServerAliveInterval=30` и `ServerAliveCountMax=6` — в скрипте они уже есть; при ручном запуске используйте команду из Варианта B. |
|
||||
| **Ошибка при запуске скрипта .ps1** | Выполните один раз: `Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned` и ответьте Y. |
|
||||
| **SSH просит пароль** | Ключ не подхватывается. Проверьте, что файл лежит по пути `C:\Users\ВашеИмя\.ssh\id_ed25519` и в команде указан `-i $env:USERPROFILE\.ssh\id_ed25519`. При необходимости заново установите ключ по [WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md). |
|
||||
|
||||
Логи Cursor на Windows лежат в папке:
|
||||
`%APPDATA%\Cursor\logs\` (файл `main.log`). В проблемных местах ищите слова ERROR, PING, timeout, ECONNREFUSED, ETIMEDOUT.
|
||||
|
||||
---
|
||||
|
||||
## Ссылки
|
||||
|
||||
| Документ | Для чего |
|
||||
|----------|----------|
|
||||
| [WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md) | Установка SSH-ключа на Windows (если ещё не сделано). |
|
||||
| [PROXY_GUIDE.md](./PROXY_GUIDE.md) | Общее описание прокси ru.hunab.app. |
|
||||
| [README.md](./README.md) | Содержимое папки connectivity. |
|
||||
166
docs/connectivity/WINDOWS_SSH_KEY_INSTALL.md
Normal file
166
docs/connectivity/WINDOWS_SSH_KEY_INSTALL.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# Установка SSH-ключа на Windows (только для туннеля через прокси)
|
||||
|
||||
Инструкция для тех, кто впервые настраивает такой доступ. Все шаги расписаны по порядку.
|
||||
|
||||
---
|
||||
|
||||
## Зачем это нужно
|
||||
|
||||
Чтобы Cursor (или Telegram) на Windows могли работать через прокси-сервер **ru.hunab.app**, нужен **SSH-ключ**. Это пара файлов: «приватный» (секретный, хранится только у вас) и «публичный» (его один раз добавляют на сервер). После этого Windows сможет подключаться к серверу **без ввода пароля**, только по ключу. Ключ используется **только для туннеля** — никаких прав на сервере пользователю не нужно.
|
||||
|
||||
**Если с Windows нет доступа к интернет-серверу** (например, вы за корпоративным файрволом), ключ создают на другой машине (Mac), публичный ключ ставят на сервер, а **приватный ключ** переносят на Windows. Дальше в инструкции два варианта: A (ключ создан на Mac) и B (ключ создают на самой Windows).
|
||||
|
||||
---
|
||||
|
||||
## Небольшой словарик
|
||||
|
||||
| Слово | По-простому |
|
||||
|-------|-------------|
|
||||
| **SSH** | Способ безопасно подключаться к удалённому компьютеру по сети. |
|
||||
| **SSH-ключ** | Пара файлов (приватный + публичный). Вместо пароля сервер проверяет, что у вас есть «ваша половина» ключа. |
|
||||
| **Приватный ключ** | Файл `id_ed25519`. Храните только у себя, никому не отдавайте. |
|
||||
| **Публичный ключ** | Файл `id_ed25519.pub`. Его один раз добавляют на сервер в список разрешённых ключей. |
|
||||
| **%USERPROFILE%** | Папка вашего пользователя Windows, например `C:\Users\Иван`. В PowerShell то же самое записывается как `$env:USERPROFILE`. |
|
||||
| **PowerShell** | Программа в Windows для ввода текстовых команд. Открывается через поиск по названию «PowerShell» или через меню Win+X → «Windows PowerShell». |
|
||||
|
||||
---
|
||||
|
||||
## Вариант A: Ключ создан на Mac (с Windows до сервера доступа нет)
|
||||
|
||||
Этот вариант для ситуации, когда с Windows-компьютера вы **не** можете зайти на сервер 149.154.64.19 (нет доступа в интернет к нему или он закрыт). Ключ создаётся на Mac (или другой машине, с которой сервер доступен), затем **один файл** переносится на Windows.
|
||||
|
||||
### Часть 1. На Mac (или другой машине с доступом к серверу)
|
||||
|
||||
1. Откройте **Терминал** на Mac.
|
||||
2. Перейдите в папку с репозиторием **local_machine** (корень репо — та папка, где лежат папки `docs`, `scripts` и т.д.):
|
||||
```bash
|
||||
cd /путь/к/local_machine
|
||||
```
|
||||
Пример: `cd /Users/eternal/code/local_machine`
|
||||
3. Запустите скрипт:
|
||||
```bash
|
||||
./docs/connectivity/scripts/create-windows-proxy-key.sh
|
||||
```
|
||||
4. Скрипт создаст ключ и сам добавит публичный ключ на сервер. В конце он выведет текст вроде:
|
||||
- «Скопировать на Windows один файл: …/windows-proxy-key/id_ed25519»
|
||||
- «На Windows положить в: %USERPROFILE%\.ssh\id_ed25519»
|
||||
|
||||
Запомните или сохраните этот путь к файлу на Mac. Публичный ключ на сервер уже добавлен, больше на Mac ничего делать не нужно.
|
||||
|
||||
### Часть 2. На Windows — куда положить ключ
|
||||
|
||||
**Куда копировать:** в папку вашего пользователя, в подпапку `.ssh`. Полный путь выглядит так:
|
||||
|
||||
- `C:\Users\**ИмяПользователя**\.ssh\id_ed25519`
|
||||
|
||||
**ИмяПользователя** — это то имя, под которым вы входите в Windows (та же папка, что открывается, когда вы в проводнике заходите в «Этот компьютер» → «Локальный диск (C:)» → «Users»).
|
||||
|
||||
**Как сделать по шагам:**
|
||||
|
||||
1. **Создать папку `.ssh`**, если её ещё нет:
|
||||
- Нажмите **Win+R** (клавиша с логотипом Windows и буква R).
|
||||
- Введите: `%USERPROFILE%` и нажмите Enter. Откроется ваша папка пользователя (например, `C:\Users\Иван`).
|
||||
- В этой папке создайте новую папку с именем **`.ssh`** (точка в начале обязательна). Если Windows спросит про объединение имени — оставьте именно `.ssh`.
|
||||
|
||||
2. **Скопировать файл с Mac на Windows** (флешка, облако, мессенджер — как удобно). Файл должен называться **`id_ed25519`** (без расширения .txt и без .pub).
|
||||
|
||||
3. **Положить файл в папку `.ssh`:**
|
||||
- Перетащите `id_ed25519` в папку `C:\Users\**ВашеИмя**\.ssh\`
|
||||
- Итог: файл должен лежать по пути `C:\Users\**ВашеИмя**\.ssh\id_ed25519`.
|
||||
|
||||
### Часть 3. Проверка на Windows
|
||||
|
||||
1. Откройте **PowerShell** (поиск в меню Пуск: «PowerShell» → «Windows PowerShell»).
|
||||
2. Введите команду (можно скопировать целиком; путь подставится сам):
|
||||
```powershell
|
||||
ssh -i $env:USERPROFILE\.ssh\id_ed25519 ahau@149.154.64.19 "echo OK"
|
||||
```
|
||||
3. При первом запуске может появиться вопрос «Trust this host?» — введите **yes** и нажмите Enter.
|
||||
4. **Ожидаемый результат:** в следующей строке выводится только слово **OK**. Пароль спрашивать не должно.
|
||||
|
||||
Если вывело **OK** — ключ установлен правильно. Дальше: настройка туннеля и Cursor по инструкции [WINDOWS_CURSOR_TUNNEL.md](./WINDOWS_CURSOR_TUNNEL.md).
|
||||
|
||||
Если появилась ошибка (например, «Permission denied» или «Could not resolve hostname»), проверьте:
|
||||
- файл лежит именно в `C:\Users\**ВашеИмя**\.ssh\id_ed25519`;
|
||||
- файл скопирован полностью, не переименован в `id_ed25519.txt`;
|
||||
- с Mac скрипт действительно выполнился до конца и написал, что публичный ключ добавлен на сервер.
|
||||
|
||||
---
|
||||
|
||||
## Вариант B: Ключ создаётся на Windows (с Windows есть доступ к серверу)
|
||||
|
||||
Если с вашего Windows-компьютера **есть** доступ в интернет до 149.154.64.19, ключ можно создать прямо на Windows и один раз добавить публичный ключ на сервер (с этой же Windows или с Mac).
|
||||
|
||||
### Что понадобится
|
||||
|
||||
- Файл **`setup-ssh-key-for-proxy.ps1`** из репо: `docs/connectivity/scripts/setup-ssh-key-for-proxy.ps1`. Скопируйте его на Windows в любую папку (например, «Загрузки» или папку с репо).
|
||||
- В Windows должен быть установлен **OpenSSH-клиент**. Проверка: откройте PowerShell и введите `ssh -V`. Должна появиться строка с версией (например, OpenSSH_for_Windows_8.x). Если команда не найдена — установите: **Параметры Windows** → **Приложения** → **Дополнительные компоненты** → найдите **OpenSSH-клиент** → Установить.
|
||||
|
||||
### Шаг 1. Разрешить выполнение скриптов (сделать один раз)
|
||||
|
||||
1. Откройте **PowerShell** (не cmd). Лучше «Запуск от имени текущего пользователя».
|
||||
2. Введите команду:
|
||||
```powershell
|
||||
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
|
||||
```
|
||||
3. На вопрос о смене политики ответьте **Y** (или **A**) и нажмите Enter.
|
||||
|
||||
### Шаг 2. Запустить скрипт установки ключа
|
||||
|
||||
1. В PowerShell перейдите в папку, куда положили `setup-ssh-key-for-proxy.ps1`. Пример для папки «Загрузки»:
|
||||
```powershell
|
||||
cd $env:USERPROFILE\Downloads
|
||||
```
|
||||
Если файл в другой папке, подставьте свой путь вместо `Downloads`.
|
||||
2. Запустите скрипт:
|
||||
```powershell
|
||||
.\setup-ssh-key-for-proxy.ps1
|
||||
```
|
||||
3. **Если ключа ещё нет:** скрипт спросит, создать ли новый ключ. Введите **Y** и Enter. Он создаст файлы в папке `%USERPROFILE%\.ssh\` и выведет **одну длинную строку** (публичный ключ). Эту строку нужно один раз добавить на сервер (см. ниже).
|
||||
4. **Если ключ уже лежит в `%USERPROFILE%\.ssh\id_ed25519`:** скрипт просто проверит подключение и напишет что-то вроде `[OK] SSH works`.
|
||||
|
||||
### Шаг 3. Добавить публичный ключ на сервер (только если ключ создали на Windows)
|
||||
|
||||
Если вы только что сгенерировали ключ на Windows, скрипт вывел строку вида:
|
||||
|
||||
`ssh-ed25519 AAAAC3... много символов ... windows-proxy-tunnel`
|
||||
|
||||
Эту строку **целиком** нужно один раз добавить на сервер 149.154.64.19 в файл `~/.ssh/authorized_keys` пользователя **ahau**. Сделать это может кто-то с доступом к серверу (например, с Mac):
|
||||
|
||||
```bash
|
||||
# Выполнить на сервере 149.154.64.19 под пользователем ahau (или с Mac: ssh ahau@149.154.64.19)
|
||||
echo "ВСТАВЬТЕ_СЮДА_ЦЕЛИКОМ_СТРОКУ_ИЗ_СКРИПТА" >> ~/.ssh/authorized_keys
|
||||
chmod 600 ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
После этого на Windows снова запустите `.\setup-ssh-key-for-proxy.ps1` — должно появиться `[OK] SSH works`.
|
||||
|
||||
### Шаг 4. Проверить подключение вручную
|
||||
|
||||
В PowerShell:
|
||||
|
||||
```powershell
|
||||
ssh -i $env:USERPROFILE\.ssh\id_ed25519 ahau@149.154.64.19 "echo OK"
|
||||
```
|
||||
|
||||
Должно вывести **OK** без запроса пароля.
|
||||
|
||||
---
|
||||
|
||||
## Дальше
|
||||
|
||||
- Настройка туннеля и Cursor: [WINDOWS_CURSOR_TUNNEL.md](./WINDOWS_CURSOR_TUNNEL.md).
|
||||
- Приватный ключ (`id_ed25519`) никому не передавайте и не выкладывайте никуда.
|
||||
|
||||
---
|
||||
|
||||
## Кратко: какие файлы для чего
|
||||
|
||||
| Файл | Где запускать | Что делает |
|
||||
|------|----------------|------------|
|
||||
| **create-windows-proxy-key.sh** | На **Mac** (в папке репо) | Создаёт ключ, добавляет публичный ключ на сервер. Приватный ключ остаётся в папке `windows-proxy-key/` — его нужно скопировать на Windows. |
|
||||
| **setup-ssh-key-for-proxy.ps1** | На **Windows** | Проверяет или создаёт ключ в `%USERPROFILE%\.ssh\`, проверяет подключение к серверу, при необходимости дописывает в конфиг SSH хост `hsites-ahau`. |
|
||||
|
||||
Пути в репозитории:
|
||||
`docs/connectivity/scripts/create-windows-proxy-key.sh`
|
||||
`docs/connectivity/scripts/setup-ssh-key-for-proxy.ps1`
|
||||
@@ -1,17 +1,30 @@
|
||||
# LaunchAgent: SOCKS-туннель для Telegram при входе в систему
|
||||
|
||||
Поднимает `ssh -D 1081 ahau@149.154.64.19` при логине и перезапускает при обрыве.
|
||||
**Основной сценарий:** выход в интернет с **IP DO** только по цепочке **Mac→RU→DO** — `install-via-do.sh` ставит **`telegram-socks-launch.sh`**, который всегда запускает **`telegram-socks-via-do`**. Прямой Mac→DO для SOCKS не используется. Нужны **`Host telegram-socks-via-do`** (с `ProxyJump hsites-ahau`) и доступ к RU. См. [TELEGRAM_GUIDE.md](../TELEGRAM_GUIDE.md).
|
||||
|
||||
**Альтернатива:** только RU прокси — `install.sh` (`ssh -D 1081 ahau@149.154.64.19`).
|
||||
|
||||
- **Порт:** 1081 (отдельно от Cursor 10809, конфликтов нет)
|
||||
- **Сервер:** 149.154.64.19 (ru.hunab.app), пользователь ahau
|
||||
|
||||
## Установка (один раз — дальше работает при каждом входе)
|
||||
## Установка (один раз — дальше работает при каждом входе и после перезагрузки)
|
||||
|
||||
**Через DO (основной):** ключи **ahau** + **`hunab_deploy_key`**, Host **`telegram-socks-via-do`** — [PROXY_GUIDE.md](../PROXY_GUIDE.md).
|
||||
|
||||
```bash
|
||||
# из корня репо local_machine
|
||||
./connectivity/launchd/install.sh
|
||||
./docs/connectivity/launchd/install-via-do.sh
|
||||
```
|
||||
|
||||
Лог: `/tmp/telegram-socks-tunnel-via-do.log`. Снять: `./docs/connectivity/launchd/uninstall-via-do.sh`.
|
||||
|
||||
### Только RU (без DO)
|
||||
|
||||
```bash
|
||||
./docs/connectivity/launchd/install.sh
|
||||
```
|
||||
|
||||
Не держите оба plist на **1081** одновременно — перед `install-via-do` скрипт выгружает старый `com.hunab.telegram-socks` при наличии.
|
||||
|
||||
Скрипт копирует plist в `~/Library/LaunchAgents/` и выполняет `launchctl load`. После этого туннель будет автоматически подниматься при каждом старте/входе в систему.
|
||||
|
||||
Проверка: туннель уже должен быть поднят (RunAtLoad), порт слушает:
|
||||
@@ -19,26 +32,29 @@
|
||||
```bash
|
||||
lsof -i :1081
|
||||
# или
|
||||
./connectivity/scripts/telegram-socks-tunnel.sh status
|
||||
./docs/connectivity/scripts/telegram-socks-tunnel.sh status
|
||||
```
|
||||
|
||||
## Удаление
|
||||
|
||||
```bash
|
||||
./connectivity/launchd/uninstall.sh
|
||||
./docs/connectivity/launchd/uninstall-via-do.sh # сценарий через DO
|
||||
./docs/connectivity/launchd/uninstall.sh # сценарий только RU
|
||||
```
|
||||
|
||||
Файлы в репозитории: **telegram-socks-launch.sh** (только `telegram-socks-via-do`), **com.hunab.telegram-socks-via-do.plist**. Копия скрипта: **`~/Library/Application Support/hunab/telegram-socks-launch.sh`**.
|
||||
|
||||
## Поведение
|
||||
|
||||
- **RunAtLoad** — запуск при входе в систему
|
||||
- **KeepAlive** — при обрыве SSH launchd перезапускает туннель
|
||||
- **ThrottleInterval 30** — не чаще одного перезапуска в 30 секунд при постоянных падениях
|
||||
- Лог: `/tmp/telegram-socks-tunnel.log` (при желании замените путь в plist после копирования)
|
||||
- Логи: `/tmp/telegram-socks-tunnel-via-do.log` (via-DO), `/tmp/telegram-socks-tunnel.log` (только RU)
|
||||
|
||||
## Требования
|
||||
|
||||
- SSH-ключ для `ahau@149.154.64.19` должен быть доступен при логине (в клюchain или без пароля), иначе туннель не поднимется. Проверка вручную: `ssh -D 1081 -N ahau@149.154.64.19`.
|
||||
- Если используете алиас из `~/.ssh/config` (например `hsites-ahau`), в plist можно заменить `ahau@149.154.64.19` на `hsites-ahau`.
|
||||
- **via-DO:** Host `telegram-socks-via-do` (+ jump `hsites-ahau`); ключи **ahau** и **hunab** в keychain. Проверка: `ssh -N -D 1082 telegram-socks-via-do`.
|
||||
- **Только RU:** SSH-ключ для `ahau@149.154.64.19` при логине; проверка: `ssh -D 1081 -N hsites-ahau`.
|
||||
|
||||
## Конфликты портов
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<!-- Скрипт: ~/Library/Application Support/hunab/telegram-socks-launch.sh. Только Mac→RU→DO (telegram-socks-via-do). -->
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.hunab.telegram-socks-via-do</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/bin/bash</string>
|
||||
<string>-c</string>
|
||||
<string>exec /bin/bash "$HOME/Library/Application Support/hunab/telegram-socks-launch.sh"</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>ThrottleInterval</key>
|
||||
<integer>15</integer>
|
||||
<key>SoftResourceLimits</key>
|
||||
<dict>
|
||||
<key>NumberOfFiles</key>
|
||||
<integer>65536</integer>
|
||||
</dict>
|
||||
<key>HardResourceLimits</key>
|
||||
<dict>
|
||||
<key>NumberOfFiles</key>
|
||||
<integer>65536</integer>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/telegram-socks-tunnel-via-do.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/telegram-socks-tunnel-via-do.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
29
docs/connectivity/launchd/install-via-do.sh
Executable file
29
docs/connectivity/launchd/install-via-do.sh
Executable file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
# LaunchAgent: SOCKS на 1081 с выходом через DigitalOcean (прокси → DO), см. PROXY_GUIDE.md.
|
||||
# Требуется блок Host telegram-socks-via-do в ~/.ssh/config.
|
||||
set -e
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PLIST_NAME="com.hunab.telegram-socks-via-do.plist"
|
||||
DST="$HOME/Library/LaunchAgents/$PLIST_NAME"
|
||||
|
||||
mkdir -p "$HOME/Library/LaunchAgents"
|
||||
HUNAB_SUPPORT="$HOME/Library/Application Support/hunab"
|
||||
mkdir -p "$HUNAB_SUPPORT"
|
||||
cp "$SCRIPT_DIR/telegram-socks-launch.sh" "$HUNAB_SUPPORT/telegram-socks-launch.sh"
|
||||
chmod +x "$HUNAB_SUPPORT/telegram-socks-launch.sh"
|
||||
# Не использовать имя UID — в bash это readonly (присваивание ломает скрипт).
|
||||
GUI_UID=$(id -u)
|
||||
launchctl unload "$HOME/Library/LaunchAgents/com.hunab.telegram-socks.plist" 2>/dev/null || true
|
||||
launchctl bootout "gui/$GUI_UID/com.hunab.telegram-socks-via-do" 2>/dev/null || true
|
||||
launchctl unload "$DST" 2>/dev/null || true
|
||||
cp "$SCRIPT_DIR/$PLIST_NAME" "$DST"
|
||||
if launchctl bootstrap "gui/$GUI_UID" "$DST" 2>/dev/null; then
|
||||
:
|
||||
else
|
||||
launchctl load "$DST" || true
|
||||
fi
|
||||
echo "Installed: $DST (loaded). Survives reboot while this plist exists."
|
||||
echo "Launch helper: $HUNAB_SUPPORT/telegram-socks-launch.sh (only Mac→RU→DO via telegram-socks-via-do)."
|
||||
echo "Ensure ~/.ssh/config defines Host telegram-socks-via-do (+ ProxyJump hsites-ahau) — PROXY_GUIDE.md / TELEGRAM_GUIDE.md."
|
||||
echo "Verify autostart: launchctl list | grep telegram-socks"
|
||||
lsof -i :1081 -sTCP:LISTEN 2>/dev/null && echo "Port 1081 is listening." || echo "Check in a few seconds: lsof -i :1081"
|
||||
13
docs/connectivity/launchd/telegram-socks-launch.sh
Executable file
13
docs/connectivity/launchd/telegram-socks-launch.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# LaunchAgent: SOCKS на 1081 только по цепочке Mac → RU → DO (Host telegram-socks-via-do).
|
||||
# Прямой Mac → DO для SOCKS не используется.
|
||||
ulimit -n 65536 2>/dev/null || ulimit -n 10240 2>/dev/null || true
|
||||
|
||||
SSH_CMD=(/usr/bin/ssh -D 1081 -N \
|
||||
-o TCPKeepAlive=yes \
|
||||
-o IPQoS=throughput \
|
||||
-o ServerAliveInterval=60 \
|
||||
-o ServerAliveCountMax=4 \
|
||||
-o ConnectTimeout=30)
|
||||
|
||||
exec "${SSH_CMD[@]}" telegram-socks-via-do
|
||||
12
docs/connectivity/launchd/uninstall-via-do.sh
Executable file
12
docs/connectivity/launchd/uninstall-via-do.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# Снимает LaunchAgent com.hunab.telegram-socks-via-do.
|
||||
set -e
|
||||
PLIST_NAME="com.hunab.telegram-socks-via-do.plist"
|
||||
DST="$HOME/Library/LaunchAgents/$PLIST_NAME"
|
||||
|
||||
GUI_UID=$(id -u)
|
||||
launchctl bootout "gui/$GUI_UID/com.hunab.telegram-socks-via-do" 2>/dev/null || true
|
||||
launchctl unload "$DST" 2>/dev/null || true
|
||||
rm -f "$DST"
|
||||
rm -f "$HOME/Library/Application Support/hunab/telegram-socks-launch.sh"
|
||||
echo "Uninstalled: $DST (and launch helper if present)"
|
||||
27
docs/connectivity/matrix/Caddyfile.example
Normal file
27
docs/connectivity/matrix/Caddyfile.example
Normal file
@@ -0,0 +1,27 @@
|
||||
# Пример для Caddy 2: TLS автоматически (Let's Encrypt).
|
||||
# Замените matrix.example.com и example.com на свои домены.
|
||||
#
|
||||
# Запуск Caddy на том же хосте, что и docker-compose (Synapse на 127.0.0.1:8008/8448).
|
||||
|
||||
matrix.example.com {
|
||||
reverse_proxy /_matrix/* 127.0.0.1:8008
|
||||
reverse_proxy /_synapse/* 127.0.0.1:8008
|
||||
}
|
||||
|
||||
# Федерация Matrix: S2S часто идёт на :8448. Проброс на тот же процесс Synapse.
|
||||
matrix.example.com:8448 {
|
||||
reverse_proxy 127.0.0.1:8448
|
||||
}
|
||||
|
||||
# Клиенты ищут .well-known на apex-домене (если server_name = example.com).
|
||||
example.com {
|
||||
encode gzip
|
||||
handle /.well-known/matrix/server {
|
||||
header Content-Type application/json
|
||||
respond `{"m.server": "matrix.example.com:443"}`
|
||||
}
|
||||
handle /.well-known/matrix/client {
|
||||
header Content-Type application/json
|
||||
respond `{"m.homeserver": {"base_url": "https://matrix.example.com"}}`
|
||||
}
|
||||
}
|
||||
45
docs/connectivity/matrix/docker-compose.yml
Normal file
45
docs/connectivity/matrix/docker-compose.yml
Normal file
@@ -0,0 +1,45 @@
|
||||
# Synapse + PostgreSQL на одном хосте (DigitalOcean и т.п.).
|
||||
# Перед первым запуском: см. MATRIX_SYNAPSE_DO.md — generate и homeserver.yaml.
|
||||
#
|
||||
# Использование на сервере:
|
||||
# export MATRIX_DOMAIN=matrix.example.com # хост, где слушает Synapse за прокси
|
||||
# export SYNAPSE_SERVER_NAME=example.com # публичное имя сервера (часто apex)
|
||||
# docker compose up -d
|
||||
#
|
||||
# Порты 8008/8448 не публикуем наружу, если перед Synapse стоит Caddy/Nginx на 443.
|
||||
|
||||
services:
|
||||
db:
|
||||
image: docker.io/postgres:15-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: synapse
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
|
||||
POSTGRES_DB: synapse
|
||||
POSTGRES_INITDB_ARGS: --encoding=UTF-8 --lc-collate=C --lc-ctype=C
|
||||
volumes:
|
||||
- synapse-db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U synapse"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
synapse:
|
||||
image: docker.io/matrixdotorg/synapse:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- synapse-data:/data
|
||||
environment:
|
||||
SYNAPSE_NO_TLS: "1"
|
||||
ports:
|
||||
- "127.0.0.1:8008:8008"
|
||||
- "127.0.0.1:8448:8448"
|
||||
command: run
|
||||
|
||||
volumes:
|
||||
synapse-data:
|
||||
synapse-db:
|
||||
2
docs/connectivity/matrix/env.example
Normal file
2
docs/connectivity/matrix/env.example
Normal file
@@ -0,0 +1,2 @@
|
||||
# Скопируйте в .env рядом с docker-compose.yml и заполните.
|
||||
POSTGRES_PASSWORD=сгенерируйте_длинный_случайный_пароль
|
||||
51
docs/connectivity/scripts/create-windows-proxy-key.sh
Executable file
51
docs/connectivity/scripts/create-windows-proxy-key.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env bash
|
||||
# Создать SSH-ключ для туннеля на Windows и добавить публичный ключ на прокси.
|
||||
# Запускать на машине, с которой ЕСТЬ доступ к 149.154.64.19 (например Mac).
|
||||
# Приватный ключ остаётся в windows-proxy-key/ — скопировать на Windows в %USERPROFILE%\.ssh\id_ed25519
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
KEY_DIR="${SCRIPT_DIR}/windows-proxy-key"
|
||||
KEY_FILE="${KEY_DIR}/id_ed25519"
|
||||
PROXY_HOST="${CURSOR_TUNNEL_HOST:-hsites-ahau}"
|
||||
|
||||
echo "=== Ключ для туннеля на Windows (только туннелирование, прав на сервере не нужно) ==="
|
||||
echo " Прокси: $PROXY_HOST (149.154.64.19)"
|
||||
echo ""
|
||||
|
||||
mkdir -p "$KEY_DIR"
|
||||
chmod 700 "$KEY_DIR"
|
||||
|
||||
if [[ -f "$KEY_FILE" ]]; then
|
||||
echo "Ключ уже есть: $KEY_FILE"
|
||||
echo "Публичный ключ на сервере уже добавлен (если скрипт выполнялся до конца)."
|
||||
echo ""
|
||||
echo "Скопируйте на Windows один файл (приватный ключ):"
|
||||
echo " Источник: $KEY_FILE"
|
||||
echo " На Windows: %USERPROFILE%\\.ssh\\id_ed25519"
|
||||
echo ""
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Создаю ключ в $KEY_DIR ..."
|
||||
ssh-keygen -t ed25519 -f "$KEY_FILE" -N "" -C "windows-proxy-tunnel"
|
||||
|
||||
echo ""
|
||||
echo "Добавляю публичный ключ на сервер $PROXY_HOST ..."
|
||||
cat "${KEY_FILE}.pub" | ssh "$PROXY_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
|
||||
echo "[OK] Публичный ключ добавлен в ~/.ssh/authorized_keys на сервере."
|
||||
|
||||
echo ""
|
||||
echo "Проверка подключения с этим ключом..."
|
||||
ssh -i "$KEY_FILE" -o BatchMode=yes -o ConnectTimeout=10 "$PROXY_HOST" "echo OK" || { echo "Проверка не удалась."; exit 1; }
|
||||
echo "[OK] Подключение работает."
|
||||
echo ""
|
||||
echo "--- Что сделать дальше ---"
|
||||
echo "1. Скопировать на Windows ОДИН файл (приватный ключ, никому не передавать):"
|
||||
echo " $KEY_FILE"
|
||||
echo " На Windows положить в: %USERPROFILE%\\.ssh\\id_ed25519"
|
||||
echo " (папку .ssh создать, если нет.)"
|
||||
echo ""
|
||||
echo "2. На Windows запустить туннель: см. docs/connectivity/WINDOWS_CURSOR_TUNNEL.md"
|
||||
echo " или: ssh -D 10809 -o ServerAliveInterval=30 -o ServerAliveCountMax=6 ahau@149.154.64.19"
|
||||
echo ""
|
||||
105
docs/connectivity/scripts/macos-hotspot-network-recover.sh
Executable file
105
docs/connectivity/scripts/macos-hotspot-network-recover.sh
Executable file
@@ -0,0 +1,105 @@
|
||||
#!/bin/sh
|
||||
# Сброс сетевого стека macOS после смены хотспота / «интернет не поднимается без перезагрузки».
|
||||
# Типичная причина в связке с docs/connectivity: системный PAC на localhost:1089 при мёртвом/ещё не
|
||||
# поднятом PAC-сервере + кэш DNS / Wi‑Fi. См. HOTSPOT_NETWORK_EMERGENCY.md
|
||||
#
|
||||
# Использование (из корня репозитория):
|
||||
# ./docs/connectivity/scripts/macos-hotspot-network-recover.sh status
|
||||
# ./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
#
|
||||
# Переменные:
|
||||
# MACOS_PAC_SERVICES — как в macos-system-pac.sh (по умолчанию Wi-Fi|Thunderbolt Bridge 2)
|
||||
# WIFI_DEVICE — например en0; иначе авто: первый Device у Hardware Port: Wi-Fi
|
||||
|
||||
set -e
|
||||
ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||
PAC_SCRIPT="$ROOT/macos-system-pac.sh"
|
||||
|
||||
wifi_device() {
|
||||
if [ -n "${WIFI_DEVICE:-}" ]; then
|
||||
printf '%s\n' "$WIFI_DEVICE"
|
||||
return
|
||||
fi
|
||||
# "Device: en0" под блоком "Hardware Port: Wi-Fi"
|
||||
networksetup -listallhardwareports 2>/dev/null \
|
||||
| awk '/Hardware Port: Wi-Fi$/ {p=1; next} p && /^Device: / {print $2; exit}'
|
||||
}
|
||||
|
||||
usage() {
|
||||
printf '%s\n' "Usage: $(basename "$0") status|recover" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
[ "$#" -eq 1 ] || usage
|
||||
cmd=$1
|
||||
|
||||
case "$cmd" in
|
||||
status)
|
||||
echo "=== Wi-Fi device (hardware) ==="
|
||||
wifi_device || true
|
||||
echo "=== networksetup -listallnetworkservices (excerpt) ==="
|
||||
networksetup -listallnetworkservices 2>/dev/null | head -15 || true
|
||||
echo "=== PAC / autoproxy (Wi-Fi + Thunderbolt Bridge 2 if present) ==="
|
||||
if [ -x "$PAC_SCRIPT" ]; then
|
||||
MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" status || true
|
||||
fi
|
||||
echo "=== SOCKS firewall (Wi-Fi) ==="
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi" 2>/dev/null || true
|
||||
echo "=== Web proxy (Wi-Fi) ==="
|
||||
networksetup -getwebproxy "Wi-Fi" 2>/dev/null || true
|
||||
echo "=== Listener on 1089 (PAC URL default) ==="
|
||||
if lsof -i :1089 -sTCP:LISTEN 2>/dev/null | head -5; then
|
||||
:
|
||||
else
|
||||
echo "(none — при Enabled PAC в Safari/системе возможны сбои)"
|
||||
fi
|
||||
echo "=== Default route ==="
|
||||
route -n get default 2>/dev/null | head -12 || true
|
||||
echo "=== Quick reachability (ICMP may be blocked on some hotspots) ==="
|
||||
ping -c 1 -W 2000 1.1.1.1 >/dev/null 2>&1 && echo "ping 1.1.1.1: ok" || echo "ping 1.1.1.1: fail"
|
||||
;;
|
||||
recover)
|
||||
echo "1) Отключаем автоматический PAC на выбранных сервисах..."
|
||||
if [ -x "$PAC_SCRIPT" ]; then
|
||||
MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" off
|
||||
else
|
||||
echo "WARN: нет $PAC_SCRIPT — вручную: Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять «Автоматическая настройка прокси»" >&2
|
||||
fi
|
||||
echo "2) Отключаем системный SOCKS-прокси на Wi-Fi (если был включён Shadowsocks и т.п.)..."
|
||||
if networksetup -listallnetworkservices 2>/dev/null | grep -Fqx "Wi-Fi"; then
|
||||
networksetup -setsocksfirewallproxystate "Wi-Fi" off 2>/dev/null || true
|
||||
fi
|
||||
echo "3) Сброс DNS-кэша (нужен sudo)..."
|
||||
if sudo -n true 2>/dev/null; then
|
||||
sudo dscacheutil -flushcache 2>/dev/null || true
|
||||
sudo killall -HUP mDNSResponder 2>/dev/null || true
|
||||
echo " mDNSResponder перезагружен."
|
||||
else
|
||||
echo " Пропуск (нет sudo без пароля). Выполните вручную:"
|
||||
echo " sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder"
|
||||
fi
|
||||
dev="$(wifi_device)"
|
||||
if [ -n "$dev" ]; then
|
||||
echo "4) Обновление DHCP на $dev (нужен sudo)..."
|
||||
if sudo -n true 2>/dev/null; then
|
||||
sudo ipconfig set "$dev" DHCP 2>/dev/null || true
|
||||
else
|
||||
echo " Пропуск. Вручную: sudo ipconfig set $dev DHCP"
|
||||
fi
|
||||
echo "5) Краткое выключение/включение Wi‑Fi радиомодуля ($dev)..."
|
||||
networksetup -setairportpower "$dev" off 2>/dev/null || true
|
||||
sleep 2
|
||||
networksetup -setairportpower "$dev" on 2>/dev/null || true
|
||||
else
|
||||
echo "4–5) Не удалось определить Wi‑Fi device — пропуск DHCP/airport power. Вручную выключите/включите Wi‑Fi в меню."
|
||||
fi
|
||||
echo "=== Готово. Проверка: ==="
|
||||
"$0" status
|
||||
echo ""
|
||||
echo "Если интернет всё ещё нет: откройте хотспот в браузере (captive portal), затем при необходимости снова включите PAC:"
|
||||
echo " ./docs/connectivity/scripts/macos-pac-on.sh"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
2
docs/connectivity/scripts/macos-pac-off.sh
Executable file
2
docs/connectivity/scripts/macos-pac-off.sh
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
exec "$(dirname "$0")/macos-system-pac.sh" off
|
||||
2
docs/connectivity/scripts/macos-pac-on.sh
Executable file
2
docs/connectivity/scripts/macos-pac-on.sh
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
exec "$(dirname "$0")/macos-system-pac.sh" on
|
||||
76
docs/connectivity/scripts/macos-system-pac.sh
Executable file
76
docs/connectivity/scripts/macos-system-pac.sh
Executable file
@@ -0,0 +1,76 @@
|
||||
#!/bin/sh
|
||||
# Включает/выключает системный «автоматический прокси» (PAC) в macOS через networksetup.
|
||||
# По умолчанию: PAC http://localhost:1089/proxy.pac на сервисах Wi-Fi и Thunderbolt Bridge 2.
|
||||
#
|
||||
# Переменные окружения:
|
||||
# MACOS_PAC_URL — URL proxy.pac (по умолчанию http://localhost:1089/proxy.pac)
|
||||
# MACOS_PAC_SERVICES — список имён сетевых сервисов через «|» (см. networksetup -listallnetworkservices)
|
||||
|
||||
usage() {
|
||||
printf '%s\n' "Usage: $(basename "$0") on|off|status" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
[ "$#" -eq 1 ] || usage
|
||||
cmd=$1
|
||||
|
||||
PAC_URL="${MACOS_PAC_URL:-http://localhost:1089/proxy.pac}"
|
||||
SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}"
|
||||
|
||||
svc_exists() {
|
||||
networksetup -listallnetworkservices 2>/dev/null | grep -Fqx "$1"
|
||||
}
|
||||
|
||||
case "$cmd" in
|
||||
on)
|
||||
OLDIFS=$IFS
|
||||
IFS='|'
|
||||
for svc in $SERVICES; do
|
||||
IFS=$OLDIFS
|
||||
[ -z "$svc" ] && continue
|
||||
if ! svc_exists "$svc"; then
|
||||
echo "skip (нет сервиса): $svc" >&2
|
||||
continue
|
||||
fi
|
||||
networksetup -setautoproxyurl "$svc" "$PAC_URL"
|
||||
networksetup -setautoproxystate "$svc" on
|
||||
echo "PAC on: $svc"
|
||||
done
|
||||
;;
|
||||
off)
|
||||
OLDIFS=$IFS
|
||||
IFS='|'
|
||||
for svc in $SERVICES; do
|
||||
IFS=$OLDIFS
|
||||
[ -z "$svc" ] && continue
|
||||
if ! svc_exists "$svc"; then
|
||||
echo "skip (нет сервиса): $svc" >&2
|
||||
continue
|
||||
fi
|
||||
networksetup -setautoproxystate "$svc" off
|
||||
echo "PAC off: $svc"
|
||||
done
|
||||
;;
|
||||
status)
|
||||
printf '%s\n' "PAC_URL=$PAC_URL"
|
||||
printf '%s\n' "SERVICES=$SERVICES"
|
||||
printf '%s\n' "---"
|
||||
OLDIFS=$IFS
|
||||
IFS='|'
|
||||
for svc in $SERVICES; do
|
||||
IFS=$OLDIFS
|
||||
[ -z "$svc" ] && continue
|
||||
if svc_exists "$svc"; then
|
||||
echo "[$svc]"
|
||||
networksetup -getautoproxyurl "$svc"
|
||||
else
|
||||
echo "[$svc] (нет такого сервиса)"
|
||||
fi
|
||||
done
|
||||
printf '%s\n' "--- scutil --proxy ---"
|
||||
scutil --proxy 2>/dev/null || true
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
97
docs/connectivity/scripts/setup-ssh-key-for-proxy.ps1
Normal file
97
docs/connectivity/scripts/setup-ssh-key-for-proxy.ps1
Normal file
@@ -0,0 +1,97 @@
|
||||
# Setup SSH key for proxy tunneling only (ru.hunab.app / 149.154.64.19).
|
||||
# Usage: run in PowerShell from repo root or pass path; no admin rights needed.
|
||||
# The key is ONLY for SSH tunnels (-D SOCKS, -L). User ahau on server needs no extra rights.
|
||||
|
||||
param(
|
||||
[string]$SshDir = "$env:USERPROFILE\.ssh",
|
||||
[string]$KeyName = "id_ed25519",
|
||||
[string]$ProxyUser = "ahau",
|
||||
[string]$ProxyHost = "149.154.64.19"
|
||||
)
|
||||
|
||||
$KeyPath = Join-Path $SshDir $KeyName
|
||||
$KeyPubPath = "$KeyPath.pub"
|
||||
|
||||
Write-Host "=== SSH key for proxy tunnel (Cursor/Telegram) ===" -ForegroundColor Cyan
|
||||
Write-Host " Server: ${ProxyUser}@${ProxyHost} (ru.hunab.app)"
|
||||
Write-Host " Purpose: tunneling only. No shell or other rights on server."
|
||||
Write-Host ""
|
||||
|
||||
# Ensure .ssh exists
|
||||
if (-not (Test-Path $SshDir)) {
|
||||
New-Item -ItemType Directory -Path $SshDir -Force | Out-Null
|
||||
Write-Host "[OK] Created $SshDir"
|
||||
} else {
|
||||
Write-Host "[OK] Directory exists: $SshDir"
|
||||
}
|
||||
|
||||
# Check OpenSSH
|
||||
try {
|
||||
$null = Get-Command ssh -ErrorAction Stop
|
||||
} catch {
|
||||
Write-Host "[ERROR] OpenSSH client not found. Install: Settings -> Apps -> Optional features -> OpenSSH Client" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not (Test-Path $KeyPath)) {
|
||||
Write-Host ""
|
||||
Write-Host "No key found at $KeyPath" -ForegroundColor Yellow
|
||||
Write-Host " Option A: Copy id_ed25519 (and id_ed25519.pub) from your Mac to $SshDir"
|
||||
Write-Host " Option B: Generate a new key now (only for tunneling; add .pub to server once)"
|
||||
$choice = Read-Host "Generate new key? (y/N)"
|
||||
if ($choice -match '^[yY]') {
|
||||
ssh-keygen -t ed25519 -f $KeyPath -N '""'
|
||||
if (-not (Test-Path $KeyPath)) { Write-Host "Key creation failed." -ForegroundColor Red; exit 1 }
|
||||
Write-Host "[OK] Key created: $KeyPath"
|
||||
} else {
|
||||
Write-Host "Copy id_ed25519 and id_ed25519.pub to $SshDir then run this script again."
|
||||
exit 0
|
||||
}
|
||||
} else {
|
||||
Write-Host "[OK] Key exists: $KeyPath"
|
||||
}
|
||||
|
||||
# Show public key (user must add to server if new)
|
||||
if (Test-Path $KeyPubPath) {
|
||||
Write-Host ""
|
||||
Write-Host "Public key (add one line to ~/.ssh/authorized_keys of ${ProxyUser}@${ProxyHost}):" -ForegroundColor Cyan
|
||||
Write-Host (Get-Content $KeyPubPath -Raw).Trim()
|
||||
Write-Host ""
|
||||
Write-Host "On server (once): append the line above to /home/${ProxyUser}/.ssh/authorized_keys"
|
||||
Write-Host "This key is only used for tunneling; no sudo or other rights needed for ahau."
|
||||
} else {
|
||||
Write-Host "[WARN] No $KeyPubPath found. Generate or copy from Mac." -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Test connection
|
||||
Write-Host ""
|
||||
Write-Host "Testing connection to ${ProxyUser}@${ProxyHost} ..."
|
||||
$testResult = & ssh -i $KeyPath -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new "${ProxyUser}@${ProxyHost}" "echo OK" 2>&1
|
||||
if ($LASTEXITCODE -eq 0 -and $testResult -eq "OK") {
|
||||
Write-Host "[OK] SSH works. You can start the tunnel (cursor-socks-tunnel.ps1 start)." -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[FAIL] SSH test failed. Ensure the public key is in authorized_keys on the server." -ForegroundColor Red
|
||||
Write-Host $testResult
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Optional: ensure config has hsites-ahau
|
||||
$ConfigPath = Join-Path $SshDir "config"
|
||||
$configEntry = @"
|
||||
Host hsites-ahau
|
||||
HostName $ProxyHost
|
||||
User $ProxyUser
|
||||
IdentityFile ~/.ssh/$KeyName
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 6
|
||||
"@
|
||||
if (-not (Test-Path $ConfigPath)) {
|
||||
Set-Content -Path $ConfigPath -Value $configEntry.Trim()
|
||||
Write-Host "[OK] Created $ConfigPath with Host hsites-ahau"
|
||||
} elseif ((Get-Content $ConfigPath -Raw) -notmatch "hsites-ahau") {
|
||||
Add-Content -Path $ConfigPath -Value "`n$configEntry"
|
||||
Write-Host "[OK] Appended hsites-ahau to $ConfigPath"
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "Done. Run: .\docs\cursor\scripts\cursor-socks-tunnel.ps1 start" -ForegroundColor Green
|
||||
19
docs/connectivity/scripts/ssh-hunab-prod.sh
Executable file
19
docs/connectivity/scripts/ssh-hunab-prod.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
# SSH к проду: по умолчанию в конфиге hunab-prod уже через hsites-ahau.
|
||||
# Если прямой DO доступен — быстрее hunab-prod-direct (пробуем за 8 с).
|
||||
# HUNAB_PROD_FORCE_VIA=1 — не пробовать прямой, сразу hunab-prod (через RU).
|
||||
# HUNAB_PROD_FORCE_DIRECT=1 — только hunab-prod-direct.
|
||||
# Использование: ./ssh-hunab-prod.sh [аргументы ssh]
|
||||
set -e
|
||||
KA=( -o ServerAliveInterval=30 -o ServerAliveCountMax=8 -o TCPKeepAlive=yes )
|
||||
|
||||
if [ "${HUNAB_PROD_FORCE_DIRECT:-0}" = "1" ]; then
|
||||
exec ssh "${KA[@]}" hunab-prod-direct "$@"
|
||||
fi
|
||||
|
||||
if [ "${HUNAB_PROD_FORCE_VIA:-0}" != "1" ]; then
|
||||
if ssh "${KA[@]}" -o BatchMode=yes -o ConnectTimeout=8 -o ConnectionAttempts=1 hunab-prod-direct "exit 0" 2>/dev/null; then
|
||||
exec ssh "${KA[@]}" hunab-prod-direct "$@"
|
||||
fi
|
||||
fi
|
||||
exec ssh "${KA[@]}" hunab-prod "$@"
|
||||
@@ -1,26 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
# SOCKS5-туннель для Telegram (и др. приложений) через прокси 149.154.64.19.
|
||||
# Порт 1081 — отдельно от Cursor (10809). Использование: ./telegram-socks-tunnel.sh [start|stop|status]
|
||||
# См. connectivity/PROXY_GUIDE.md
|
||||
# См. connectivity/PROXY_GUIDE.md (в т.ч. цепочка через DigitalOcean: TELEGRAM_SOCKS_VIA_DO=1)
|
||||
|
||||
set -e
|
||||
TELEGRAM_SOCKS_PORT="${TELEGRAM_SOCKS_PORT:-1081}"
|
||||
SSH_HOST="${TELEGRAM_TUNNEL_HOST:-ahau@149.154.64.19}"
|
||||
TELEGRAM_SOCKS_VIA_DO="${TELEGRAM_SOCKS_VIA_DO:-0}"
|
||||
TELEGRAM_SOCKS_JUMP_HOST="${TELEGRAM_SOCKS_JUMP_HOST:-hsites-ahau}"
|
||||
TELEGRAM_SOCKS_FINAL_HOST="${TELEGRAM_SOCKS_FINAL_HOST:-hunab@209.38.32.21}"
|
||||
TELEGRAM_SOCKS_FINAL_PORT="${TELEGRAM_SOCKS_FINAL_PORT:-2222}"
|
||||
TELEGRAM_SOCKS_FINAL_IDENTITY="${TELEGRAM_SOCKS_FINAL_IDENTITY:-$HOME/.ssh/hunab_deploy_key}"
|
||||
# Пусто = только loopback (по умолчанию в OpenSSH). 0.0.0.0 — слушать на всех интерфейсах (телефон → SOCKS на Mac по хотспоту).
|
||||
TELEGRAM_SOCKS_BIND="${TELEGRAM_SOCKS_BIND:-}"
|
||||
# SOCKS держит много соединений (Telegram); без повышения ulimit — «Too many open files».
|
||||
TELEGRAM_SSH_STABLE_OPTS="-o TCPKeepAlive=yes -o IPQoS=throughput -o ServerAliveInterval=60 -o ServerAliveCountMax=4"
|
||||
|
||||
raise_fd_limit() {
|
||||
ulimit -n 65536 2>/dev/null || ulimit -n 10240 2>/dev/null || true
|
||||
}
|
||||
|
||||
socks_listening() {
|
||||
lsof -i :"$TELEGRAM_SOCKS_PORT" -sTCP:LISTEN -t >/dev/null 2>&1
|
||||
}
|
||||
|
||||
kill_listener_on_port() {
|
||||
# PIDs listening on TELEGRAM_SOCKS_PORT (usually ssh -D; LaunchAgent may respawn — loop a few times)
|
||||
local i=0
|
||||
while socks_listening && [ "$i" -lt 20 ]; do
|
||||
lsof -ti :"$TELEGRAM_SOCKS_PORT" -sTCP:LISTEN 2>/dev/null | xargs kill 2>/dev/null || true
|
||||
sleep 0.35
|
||||
i=$((i + 1))
|
||||
done
|
||||
}
|
||||
|
||||
start() {
|
||||
if lsof -i :"$TELEGRAM_SOCKS_PORT" -sTCP:LISTEN -t >/dev/null 2>&1; then
|
||||
echo "SOCKS already listening on 127.0.0.1:$TELEGRAM_SOCKS_PORT"
|
||||
return 0
|
||||
if socks_listening; then
|
||||
if [ "$TELEGRAM_SOCKS_VIA_DO" = "1" ]; then
|
||||
echo "Port $TELEGRAM_SOCKS_PORT busy — replacing with via-DO tunnel..."
|
||||
kill_listener_on_port
|
||||
if socks_listening; then
|
||||
echo "Port $TELEGRAM_SOCKS_PORT still in use. If LaunchAgent keeps respawning the old tunnel, run:"
|
||||
echo " launchctl unload \"\$HOME/Library/LaunchAgents/com.hunab.telegram-socks.plist\" 2>/dev/null"
|
||||
echo " (or ./docs/connectivity/launchd/uninstall.sh) then: TELEGRAM_SOCKS_VIA_DO=1 $0 start"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo "SOCKS already listening on port $TELEGRAM_SOCKS_PORT"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
raise_fd_limit
|
||||
local d_spec="$TELEGRAM_SOCKS_PORT"
|
||||
if [ -n "$TELEGRAM_SOCKS_BIND" ]; then
|
||||
d_spec="${TELEGRAM_SOCKS_BIND}:${TELEGRAM_SOCKS_PORT}"
|
||||
fi
|
||||
if [ "$TELEGRAM_SOCKS_VIA_DO" = "1" ]; then
|
||||
if ! ssh -o BatchMode=yes -o ConnectTimeout=6 -o ConnectionAttempts=1 hsites-ahau "exit 0" 2>/dev/null; then
|
||||
echo "Ошибка: hsites-ahau недоступен. TELEGRAM_SOCKS_VIA_DO=1 — только Mac→RU→DO; прямой Mac→DO для SOCKS отключён." >&2
|
||||
exit 1
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
ssh -D "$TELEGRAM_SOCKS_PORT" -f -N \
|
||||
$TELEGRAM_SSH_STABLE_OPTS \
|
||||
telegram-socks-via-do
|
||||
echo "SOCKS started: 127.0.0.1:$TELEGRAM_SOCKS_PORT -> hsites-ahau -> DO (telegram-socks-via-do)"
|
||||
else
|
||||
# shellcheck disable=SC2086
|
||||
ssh -D "$TELEGRAM_SOCKS_PORT" -f -N \
|
||||
$TELEGRAM_SSH_STABLE_OPTS \
|
||||
"$SSH_HOST"
|
||||
echo "SOCKS tunnel started: 127.0.0.1:$TELEGRAM_SOCKS_PORT -> $SSH_HOST"
|
||||
fi
|
||||
ssh -D "$TELEGRAM_SOCKS_PORT" -f -N \
|
||||
-o ServerAliveInterval=30 \
|
||||
-o ServerAliveCountMax=6 \
|
||||
"$SSH_HOST"
|
||||
echo "SOCKS tunnel started: 127.0.0.1:$TELEGRAM_SOCKS_PORT -> $SSH_HOST"
|
||||
}
|
||||
|
||||
stop() {
|
||||
pkill -f "ssh.*-D $TELEGRAM_SOCKS_PORT.*$SSH_HOST" 2>/dev/null || true
|
||||
pkill -f "ssh.*-D $TELEGRAM_SOCKS_PORT" 2>/dev/null || true
|
||||
echo "Tunnel stopped (if it was running)."
|
||||
}
|
||||
|
||||
@@ -39,7 +94,8 @@ case "${1:-start}" in
|
||||
status) status ;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|status}"
|
||||
echo "Env: TELEGRAM_SOCKS_PORT=$TELEGRAM_SOCKS_PORT, TELEGRAM_TUNNEL_HOST=$SSH_HOST"
|
||||
echo "Env: TELEGRAM_SOCKS_PORT, TELEGRAM_TUNNEL_HOST (default exit: ru proxy)"
|
||||
echo " TELEGRAM_SOCKS_VIA_DO=1 — только Mac→RU→DO (telegram-socks-via-do); без прямого DO"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
|
||||
---
|
||||
|
||||
## SSH SOCKS: выход в интернет через DO без WireGuard / Shadowsocks
|
||||
|
||||
Тот же сервер **209.38.32.21**. Для **Cursor** (10809) и **Telegram** (1081) можно обойтись без Docker-VPN: локальный SOCKS через SSH, снаружи — IP DO только по цепочке **Mac→RU→DO** (`telegram-socks-via-do`). Прямой Mac→DO для этих скриптов не используется. Быстрое переключение режимов: [SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md), скрипты в **`scripts/vpn/`** (из корня репозитория: `./scripts/vpn/ssh-exit-mode.sh`). Подробности по IDE: [docs/cursor/README.md](../../cursor/README.md).
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Shadowsocks (Рекомендуется для обхода блокировок)
|
||||
@@ -41,6 +47,8 @@ Method: chacha20-ietf-poly1305
|
||||
|
||||
### Основные руководства
|
||||
|
||||
- **[SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md)** — быстрое переключение: локальный IP / RU / Mac→RU→DO; скрипты: **`scripts/vpn/`** в корне репозитория (`./scripts/vpn/ssh-exit-mode.sh`)
|
||||
|
||||
- **[SHADOWSOCKS.md](./SHADOWSOCKS.md)** - Полное руководство по Shadowsocks
|
||||
- Развертывание сервера
|
||||
- Настройка клиентов (Android, macOS, CLI)
|
||||
@@ -69,6 +77,9 @@ Method: chacha20-ietf-poly1305
|
||||
|
||||
Все скрипты находятся в папке `scripts/`:
|
||||
|
||||
- **`scripts/vpn/ssh-exit-mode.sh`** — режимы SOCKS: `local` | `ru` | `ru-do` | `status` | `verify` (см. [SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md))
|
||||
- **`scripts/vpn/exit-via-local.sh`**, **`exit-via-ru.sh`**, **`exit-via-ru-do.sh`** — короткие вызовы тех же режимов
|
||||
|
||||
- `scripts/toggle-shadowsocks-proxy.sh` - Переключение системного прокси
|
||||
- `scripts/check-proxy-status.sh` - Проверка статуса прокси
|
||||
- `scripts/fix-shadowsocks.sh` - Автоматическое исправление
|
||||
|
||||
95
docs/connectivity/vpn/SSH_EXIT_MODES.md
Normal file
95
docs/connectivity/vpn/SSH_EXIT_MODES.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# SSH SOCKS: быстрое переключение выхода в интернет
|
||||
|
||||
Три режима без WireGuard/Shadowsocks: **локальный IP**, **RU-прокси**, **RU → DO** (снаружи виден **IP прод-сервера DO**).
|
||||
|
||||
Политика: для выхода с **IP DO** используется **только** цепочка **Mac → RU (`hsites-ahau`) → DO** (`telegram-socks-via-do`). Прямой Mac→DO скрипты не поднимают.
|
||||
|
||||
---
|
||||
|
||||
## Ожидаемые IP (проверка «снаружи»)
|
||||
|
||||
| Режим | Как проверить | Ожидаемый публичный IP (на момент настройки репо) |
|
||||
|--------|----------------|-----------------------------------------------------|
|
||||
| **local** | `curl -sS https://ipinfo.io/ip` | Ваш домашний/мобильный IP |
|
||||
| **ru** | `curl -sS -x socks5h://127.0.0.1:10809 https://ipinfo.io/ip` | **149.154.64.19** (RU VPS, `ru.hunab.app`) |
|
||||
| **ru-do** | то же `-x socks5h://127.0.0.1:10809` | **209.38.32.21** (DO, `hunab.app`) |
|
||||
|
||||
Если IP у VPS сменился — сверяйте с [PROXY_GUIDE.md](../PROXY_GUIDE.md) / [PROXY_EMERGENCY.md](../PROXY_EMERGENCY.md).
|
||||
|
||||
Быстрая проверка одной командой (порт SOCKS по умолчанию **10809**):
|
||||
|
||||
```bash
|
||||
./scripts/vpn/ssh-exit-mode.sh verify
|
||||
```
|
||||
|
||||
После **`ru-do`** в блоке «Через SOCKS» должно быть **209.38.32.21** (или актуальный IP DO). После **`ru`** — **149.154.64.19**.
|
||||
|
||||
---
|
||||
|
||||
## Скрипты (из корня репозитория `local_machine`)
|
||||
|
||||
**Один вход:**
|
||||
|
||||
```bash
|
||||
./scripts/vpn/ssh-exit-mode.sh COMMAND
|
||||
```
|
||||
|
||||
**Короткие алиасы** (то же самое):
|
||||
|
||||
```bash
|
||||
./scripts/vpn/exit-via-local.sh # стоп туннелей
|
||||
./scripts/vpn/exit-via-ru.sh # только RU
|
||||
./scripts/vpn/exit-via-ru-do.sh # RU → DO (IP DO снаружи)
|
||||
```
|
||||
|
||||
| Команда | Действие |
|
||||
|---------|----------|
|
||||
| **`local`** \| **`off`** \| **`stop`** | Гасит SSH SOCKS на портах **10809**, **1081**, **1082**. Дальше: в **Cursor** уберите `http.proxy` / `https.proxy` (или отключите системный SOCKS) — трафик пойдёт с **локального публичного IP**. |
|
||||
| **`ru`** | Поднимает SOCKS **`127.0.0.1:10809`** → выход с **RU** (`hsites-ahau`). В Cursor: `socks5://127.0.0.1:10809`. |
|
||||
| **`ru-do`** | Проверка RU (6 с), затем SOCKS на **10809** через **`telegram-socks-via-do`**. Снаружи — **IP DO**. В Cursor: тот же `socks5://127.0.0.1:10809`. |
|
||||
| **`status`** | Кто слушает порты из списка остановки. |
|
||||
| **`verify`** | IP без прокси и через SOCKS на `SSH_EXIT_MAIN_PORT`. |
|
||||
|
||||
**Переменные:** `SSH_EXIT_MAIN_PORT` (по умолчанию **10809**), `SSH_EXIT_STOP_PORTS`, `SSH_EXIT_RU_HOST` (по умолчанию `hsites-ahau`).
|
||||
|
||||
**`~/.ssh/config`:** `hsites-ahau`, **`telegram-socks-via-do`** с `ProxyJump hsites-ahau` — шаблоны в [PROXY_GUIDE.md](../PROXY_GUIDE.md).
|
||||
|
||||
---
|
||||
|
||||
## Cursor за 30 секунд
|
||||
|
||||
1. **`./scripts/vpn/exit-via-ru-do.sh`** (или `./scripts/vpn/ssh-exit-mode.sh ru-do`).
|
||||
2. **`./scripts/vpn/ssh-exit-mode.sh verify`** — убедиться, что через SOCKS IP **DO**.
|
||||
3. В Cursor: **Settings → proxy** → `socks5://127.0.0.1:10809` (и для HTTPS то же). **Disable Http2** — выкл.
|
||||
|
||||
На **локальный IP:** `exit-via-local.sh`, затем в Cursor **убрать** proxy.
|
||||
|
||||
---
|
||||
|
||||
## Telegram (порт 1081)
|
||||
|
||||
Скрипт **`local`** останавливает и **1081**. Если нужен Telegram через DO при том же «полном стопе», после `local` поднимите туннель отдельно: [TELEGRAM_GUIDE.md](../TELEGRAM_GUIDE.md), `telegram-socks-tunnel.sh` / LaunchAgent.
|
||||
|
||||
---
|
||||
|
||||
## Схема
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph off [local]
|
||||
A[Приложения без SOCKS] --> NET1[Интернет]
|
||||
end
|
||||
subgraph r [ru]
|
||||
B[SOCKS :10809] --> RU[hsites-ahau]
|
||||
RU --> NET2[Интернет]
|
||||
end
|
||||
subgraph rd [ru-do]
|
||||
C[SOCKS :10809] --> RU2[hsites-ahau]
|
||||
RU2 --> DO[DO 209.38.32.21]
|
||||
DO --> NET3[Интернет]
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Обновлено: 2026-04-08*
|
||||
Reference in New Issue
Block a user