Add Object B and self-growth canons with Cursor ledger rules; refresh connectivity and VPN runbooks.
Track day metrics/anamnesis HARD rules under .cursor/rules and personal docs so each screening updates days/{KIN}, dynamics, and big-data ledger.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
Запросит **пароль sudo**, затем: PAC/SOCKS off → **DHCP** → `ifconfig down` → **`route -n flush`** → DNS → DHCP → **Joplin alias `*.100`**.
|
||||
Запросит **пароль sudo**, затем: PAC/SOCKS off → **DHCP** (снять stale Manual) → `ifconfig down` → **`route -n flush`** → DNS → DHCP → **Joplin primary `*.100`** (`setmanual` с текущим шлюзом).
|
||||
|
||||
Диагностика:
|
||||
|
||||
@@ -24,11 +24,9 @@ bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-n
|
||||
|
||||
Скрипт проверял `sudo -n` (passwordless). Без NOPASSWD в sudoers он **пропускал** `route flush` и делал только toggle Wi‑Fi — **недостаточно** при ARP `REJECT`.
|
||||
|
||||
Ручная «ядерная кнопка» работала, потому что вы вводили пароль и реально сбрасывали маршруты.
|
||||
|
||||
**Исправлено:** `recover` всегда вызывает `sudo` с запросом пароля.
|
||||
|
||||
### 2. Manual IPv4 на Wi‑Fi (Joplin) ломал маршрут
|
||||
### 2. Stale Manual IPv4 на Wi‑Fi (Joplin)
|
||||
|
||||
`/var/log/wifi.log` при reconnect:
|
||||
|
||||
@@ -36,17 +34,20 @@ bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-n
|
||||
IP Address: 10.219.227.100
|
||||
Default Gateway IP Address: 10.219.227.39
|
||||
No Router MAC Address
|
||||
ROUTER_MAC_ADDR = 0x000000000000
|
||||
```
|
||||
|
||||
В prefs оставался шлюз `10.219.227.39`, хотспот уже в `10.36.136.x` → `ping` → `Host is down`, `curl` мёртв.
|
||||
|
||||
**Исправлено:** Wi‑Fi **только DHCP**; Joplin — **alias** `<подсеть>.100` на `en0` (не трогает default route). См. [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md).
|
||||
**Исправлено:** `recover` сначала **DHCP**, затем `joplin-hotspot-alias repair` — **setmanual** `*.100` с **актуальным** gateway (не старый из prefs). См. [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md).
|
||||
|
||||
На хотспоте Manual `*.100` — **норма** для Joplin. Опасен только **устаревший** Manual после смены подсети.
|
||||
|
||||
### 3. PAC / SOCKS (вторично)
|
||||
|
||||
PAC на `:1089` без сервера усиливает сбои, но **не объясняет** `ping 8.8.8.8 → No route to host`.
|
||||
|
||||
Отдельно: системный SOCKS на **`127.0.0.1:10809`** без слушателя (после `exit-via-ru`) ломает приложения с системным прокси (Thunderbird — все ящики) при живом `curl`. Это не хотспот — см. [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md) и [vpn/RUNBOOK.md](./vpn/RUNBOOK.md).
|
||||
|
||||
---
|
||||
|
||||
## Что делает `recover` сейчас
|
||||
@@ -55,12 +56,12 @@ PAC на `:1089` без сервера усиливает сбои, но **не
|
||||
|-----|----------|
|
||||
| 1 | PAC off |
|
||||
| 2 | SOCKS off |
|
||||
| 3 | `networksetup -setdhcp Wi-Fi` (снимает Manual) |
|
||||
| 3 | `networksetup -setdhcp Wi-Fi` (снимает stale Manual) |
|
||||
| 4 | `sudo ifconfig en0 down` |
|
||||
| 5 | `sudo route -n flush` |
|
||||
| 6 | DNS flush + `ifconfig up` + `ipconfig DHCP` |
|
||||
| 7 | Ждёт gateway (до 30 с) |
|
||||
| 8 | `ifconfig en0 alias <subnet>.100` для Joplin |
|
||||
| 8 | `joplin-hotspot-alias.sh repair` → setmanual `<subnet>.100` |
|
||||
|
||||
---
|
||||
|
||||
@@ -77,6 +78,12 @@ sudo ipconfig set en0 DHCP
|
||||
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
Перед переходом на **домашний Wi‑Fi** (без Joplin с телефона):
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh dhcp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Диагностика
|
||||
@@ -92,17 +99,17 @@ grep -E 'Router MAC|No Router' /var/log/wifi.log | tail -5
|
||||
|
||||
| Признак | Причина |
|
||||
|---------|---------|
|
||||
| Manual + другая подсеть в gateway | Старый Joplin static |
|
||||
| Manual router ≠ runtime gateway | Stale Joplin static → `recover` |
|
||||
| `No Router MAC` в wifi.log | ARP на шлюз не прошёл |
|
||||
| `REJECT` в route get gateway | Нужен route flush |
|
||||
| Primary DHCP OK, нет `*.100` alias | Запустить `recover` |
|
||||
| primary ≠ `*.100` на хотспоте | `./joplin-hotspot-alias.sh repair` |
|
||||
|
||||
---
|
||||
|
||||
## Профилактика
|
||||
|
||||
1. **Не** использовать Manual Wi‑Fi для Joplin — только DHCP + alias.
|
||||
2. После **каждого** reconnect: одна команда `recover` выше.
|
||||
1. После **каждого** reconnect хотспота: `recover` или `joplin-ensure-sync.sh`.
|
||||
2. Не править Manual Wi‑Fi вручную — только `joplin-hotspot-alias.sh`.
|
||||
3. PAC on — только если на **1089** слушает сервер.
|
||||
4. `exit-via-ru-do.sh` — **после** рабочего `curl https://1.1.1.1`.
|
||||
|
||||
@@ -112,6 +119,6 @@ grep -E 'Router MAC|No Router' /var/log/wifi.log | tail -5
|
||||
|
||||
| Документ | Зачем |
|
||||
|----------|--------|
|
||||
| [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md) | DHCP + alias |
|
||||
| [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md) | primary `*.100`, синк |
|
||||
| [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md) | SSH / SOCKS |
|
||||
| [README.md](./README.md) | Оглавление |
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Changelog — Прокси ru.hunab.app
|
||||
|
||||
## [1.3] — 2026-07-22
|
||||
|
||||
### Мёртвый системный SOCKS 10809 (Thunderbird / apps)
|
||||
|
||||
- **Инцидент:** после `exit-via-ru` / `exit-via-ru-do` системный SOCKS Wi‑Fi оставался на `127.0.0.1:10809` при мёртвом SSH-туннеле → Thunderbird не загружал почту со **всех** ящиков; `curl` и прямые IMAP/POP были OK.
|
||||
- **Мягкий сброс** (сохраняет Telegram **1081**): `networksetup -setsocksfirewallproxystate "Wi-Fi" off`.
|
||||
- **Полный сброс:** `scripts/vpn/exit-via-local.sh` (гасит 10809/1081/1082 + системный SOCKS).
|
||||
- **Документация:** [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md), [vpn/RUNBOOK.md](./vpn/RUNBOOK.md), [vpn/SSH_EXIT_MODES.md](./vpn/SSH_EXIT_MODES.md), [README.md](./README.md) (порты / быстрые ссылки).
|
||||
|
||||
## [1.2] — 2026-03-14
|
||||
|
||||
### Telegram SOCKS и автозапуск при старте
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
|
||||
**Сеть / хотспот (интернет есть только после перезагрузки):** чаще всего **Manual IPv4 на Wi‑Fi (Joplin)** при смене подсети Android + битые маршруты; также PAC **1089** / SOCKS **1080** без клиента. Пошагово: **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)**.
|
||||
|
||||
**RU‑сервисы режут доступ из‑за рубежа:** ранбук **[vpn/RUNBOOK.md](./vpn/RUNBOOK.md)** — старт `exit-via-ru.sh`, сброс `exit-via-local.sh` (абсолютные пути).
|
||||
|
||||
**Thunderbird / браузер / «все приложения» не ходят в сеть при живом `curl`:** системный SOCKS на **`127.0.0.1:10809`**, а SSH-туннель на 10809 уже мёртв (после `exit-via-ru` / `exit-via-ru-do`). Почта падает **со всех ящиков сразу** — TB берёт системный прокси. См. раздел ниже и **[vpn/RUNBOOK.md](./vpn/RUNBOOK.md)**.
|
||||
|
||||
---
|
||||
|
||||
## Константы (запомнить / вставить в заметки)
|
||||
@@ -118,9 +122,44 @@ scp -i ~/.ssh/hunab_deploy_key -o ProxyCommand="$PROXY_CMD" -o ServerAliveInterv
|
||||
|
||||
---
|
||||
|
||||
## Cursor / PING timeout из РФ
|
||||
## Мёртвый системный SOCKS **10809** (Thunderbird, браузер)
|
||||
|
||||
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).
|
||||
**Симптом (проверено 2026-07-22):** `curl https://…` OK, порты IMAP/POP до серверов OK, а Thunderbird не загружает почту **ни с одного** ящика; Safari/Chrome тоже могут «висеть».
|
||||
|
||||
**RCA:** `exit-via-ru.sh` / `exit-via-ru-do.sh` включают системный SOCKS Wi‑Fi → `127.0.0.1:10809`. SSH на 10809 умер, а `Enabled: Yes` остался. Приложения с системным прокси (Thunderbird по умолчанию) стучатся в никуда.
|
||||
|
||||
**Диагностика:**
|
||||
|
||||
```bash
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi"
|
||||
# Enabled: Yes + Port: 10809 при пустом слушателе = баг
|
||||
lsof -nP -iTCP:10809 -sTCP:LISTEN || echo "10809: nothing"
|
||||
nc -z -G 2 127.0.0.1 10809 || echo "10809 closed"
|
||||
```
|
||||
|
||||
**Мягкий сброс** (системный SOCKS off, **не** трогает Telegram на **1081**):
|
||||
|
||||
```bash
|
||||
networksetup -setsocksfirewallproxystate "Wi-Fi" off
|
||||
```
|
||||
|
||||
**Полный сброс** (гасит и 10809, и 1081/1082):
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh
|
||||
```
|
||||
|
||||
После сброса в Thunderbird — «Получить сообщения» (или перезапуск). Если снова нужен RU/DO: `exit-via-ru.sh` / `exit-via-ru-do.sh` + `ssh-exit-mode.sh verify`. Подробнее: [vpn/RUNBOOK.md](./vpn/RUNBOOK.md).
|
||||
|
||||
**Отдельно:** ящик cock.li в TB может быть на локальном туннеле `127.0.0.1:9143` — это не системный SOCKS; см. `docs/firemail/COCKLI_THUNDERBIRD_SETUP.md`.
|
||||
|
||||
---
|
||||
|
||||
## Cursor не подключается
|
||||
|
||||
**Смена страны / интернет OK, Cursor мёртв:** сначала проверь `settings.json` на мёртвый SOCKS (`127.0.0.1:1090` или **10809** + `http.proxySupport: override`). Отключение прокси помогало. Runbook: **[docs/apps/cursor/RUNBOOK.md](../apps/cursor/RUNBOOK.md)**.
|
||||
|
||||
**PING timeout из РФ:** SOCKS **10809** — [docs/apps/cursor/README.md](../apps/cursor/README.md), скрипт `docs/apps/cursor/scripts/cursor-socks-tunnel.sh` (`CURSOR_SOCKS_VIA_DO=1` → Mac→RU→DO). Не путать с **1081** (Telegram) и устаревшим **1090**. Тот же порт использует `scripts/vpn/ssh-exit-mode.sh` (режимы `ru` / `ru-do`).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
| Файл / папка | Назначение |
|
||||
|--------------|------------|
|
||||
| **[PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md)** | Экстренное восстановление SSH/прокси; мёртвый системный SOCKS **10809** (Thunderbird) |
|
||||
| **[PROXY_GUIDE.md](./PROXY_GUIDE.md)** | Основное руководство: SSH, Nginx, безопасность, scp через туннель, Cursor, скорость |
|
||||
| **[TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md)** | Telegram SOCKS: быстрые команды → регламент → развёртывание с нуля по сценариям |
|
||||
| **[PROXY_CHANGELOG.md](./PROXY_CHANGELOG.md)** | История изменений (безопасность, скрипты, документация) |
|
||||
@@ -24,13 +25,15 @@
|
||||
|
||||
## Быстрые ссылки по задачам
|
||||
|
||||
- **Выход с IP RU из‑за рубежа** — [vpn/RUNBOOK.md](./vpn/RUNBOOK.md) (старт / сброс), режимы: [vpn/SSH_EXIT_MODES.md](./vpn/SSH_EXIT_MODES.md)
|
||||
- **Thunderbird / все ящики молчат при живом интернете** — мёртвый системный SOCKS **10809**: [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md), [vpn/RUNBOOK.md](./vpn/RUNBOOK.md)
|
||||
- **Доступ по 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` (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)
|
||||
- **Joplin: синк Mac ↔ телефон** — настройка [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md), поломки [apps/joplin/RUNBOOK.md](./apps/joplin/RUNBOOK.md), `./docs/apps/joplin/scripts/joplin-webdav-status.sh`
|
||||
- **Joplin: синк Mac ↔ телефон** — [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md), `./docs/apps/joplin/scripts/joplin-ensure-sync.sh`
|
||||
|
||||
---
|
||||
|
||||
@@ -39,7 +42,7 @@
|
||||
| Скрипт | Описание |
|
||||
|--------|----------|
|
||||
| **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** | Reconnect хотспота: `bash …/macos-hotspot-network-recover.sh recover` — DHCP, route flush (sudo), Joplin alias `*.100`. См. HOTSPOT_NETWORK_EMERGENCY.md. |
|
||||
| **macos-hotspot-network-recover.sh** | Reconnect хотспота: `bash …/macos-hotspot-network-recover.sh recover` — DHCP, route flush (sudo), Joplin setmanual `*.100`. См. HOTSPOT_NETWORK_EMERGENCY.md. |
|
||||
| **ssh-hunab-prod.sh** | Опционально: сначала `hunab-prod-direct`, иначе `hunab-prod` (в конфиге по умолчанию уже через RU). См. PROXY_GUIDE. |
|
||||
|
||||
---
|
||||
@@ -61,4 +64,4 @@
|
||||
| Порт | Назначение |
|
||||
|------|------------|
|
||||
| **1081** | Telegram (и др. приложения) — SOCKS через `scripts/telegram-socks-tunnel.sh` или LaunchAgent |
|
||||
| **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`) |
|
||||
| **10809** | SSH-exit (`scripts/vpn/ssh-exit-mode.sh` → `ru` / `ru-do`) **и** Cursor IDE (`docs/cursor/scripts/cursor-socks-tunnel.sh`); на macOS режимы exit часто ставят **системный SOCKS** на этот порт. Мёртвый слушатель + `Enabled: Yes` → Thunderbird/браузер ломаются ([PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md)) |
|
||||
|
||||
@@ -1,23 +1,18 @@
|
||||
# Joplin (локальный синк Mac ↔ телефон)
|
||||
|
||||
WebDAV через rclone на Mac, Android-хотспот.
|
||||
WebDAV (rclone) на Mac. Без облака Joplin и без VPN.
|
||||
|
||||
| Документ | Назначение |
|
||||
|----------|------------|
|
||||
| **[STABLE_SETUP.md](./STABLE_SETUP.md)** | Рабочая схема: alias `*.100` |
|
||||
| **[RUNBOOK.md](./RUNBOOK.md)** | Синк сломался |
|
||||
| [docs/apps/joplin/scripts/](../../../apps/joplin/scripts/) | Скрипты |
|
||||
| [STABLE_SETUP.md](./STABLE_SETUP.md) | **Основная схема** — primary `*.100`, хотспот |
|
||||
| [RUNBOOK.md](./RUNBOOK.md) | Диагностика |
|
||||
|
||||
## URL (Android-хотспот)
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Mac | `http://127.0.0.1:8080` |
|
||||
| Телефон | `http://<подсеть>.100:8080` (см. `joplin-hotspot-alias.sh status`) |
|
||||
|
||||
**Не** `http://*.local:8080` — с телефона-хотспота не работает.
|
||||
## Одна команда (Mac)
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-webdav-status.sh
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status
|
||||
./docs/apps/joplin/scripts/joplin-ensure-sync.sh
|
||||
```
|
||||
|
||||
Mac должен быть на **Wi‑Fi хотспота телефона**. URL на телефоне: `http://<подсеть>.100:8080` из вывода status.
|
||||
|
||||
Скрипты: [docs/apps/joplin/scripts/](../../../apps/joplin/scripts/)
|
||||
|
||||
@@ -4,14 +4,93 @@
|
||||
|
||||
Стек: **rclone serve webdav** на Mac → `~/JoplinSync` → Joplin (Mac + Android) по HTTP. Облако Joplin не используется.
|
||||
|
||||
**Рабочая схема (2026-06, проверено):** Mac на **DHCP**, alias **`*.100`** на `en0`, телефон → `http://<подсеть>.100:8080`. Подробно: [STABLE_SETUP.md](./STABLE_SETUP.md).
|
||||
**Рабочая схема (2026-06–07):** Mac на **хотспоте**, primary IP **`*.100`** через `networksetup -setmanual`, телефон → `http://<подсеть>.100:8080`. Подробно: [STABLE_SETUP.md](./STABLE_SETUP.md).
|
||||
|
||||
**Последняя проверка: 2026-07-04** — синк работает на подсети `10.121.169.x` (см. ниже).
|
||||
|
||||
---
|
||||
|
||||
## Проверенный рабочий сетап (зафиксировано 2026-07-04)
|
||||
|
||||
### Условия (все обязательны)
|
||||
|
||||
| # | Условие | Как проверить |
|
||||
|---|---------|---------------|
|
||||
| 1 | Mac — **клиент Wi‑Fi хотспота Android** (не домашний Wi‑Fi) | `joplin-hotspot-alias.sh status` → `network: похоже на Android-хотспот` |
|
||||
| 2 | **rclone** слушает `:8080` | `joplin-webdav-status.sh` → процесс / порт |
|
||||
| 3 | Mac primary IP = **`<подсеть>.100`** (setmanual) | `static IP: OK`, `ipconfig getifaddr en0` → `*.100` |
|
||||
| 4 | Шлюз Wi‑Fi = **телефон** (Android) | gateway `10.x.x.x` / `192.168.43.x` — не `192.168.1.1` роутера |
|
||||
| 5 | **Mac Joplin** → `http://127.0.0.1:8080` | `settings.json` → `sync.6.path` |
|
||||
| 6 | **Телефон Joplin** → `http://<подсеть>.100:8080` | URL из `status`, **без** `/` и пробелов в конце |
|
||||
| 7 | Учётка WebDAV: логин `joplin`, пароль из env | после смены пароля — `joplin-webdav-reload.sh` |
|
||||
| 8 | В rclone.log — запросы **не только** с `127.0.0.1` | `GET`/`PUT from 10.x.x.x` (часто IP **шлюза**, не Mac) |
|
||||
|
||||
### Пример сессии, когда синк **работал** (2026-07-04)
|
||||
|
||||
```
|
||||
Подсеть: 10.121.169.x
|
||||
Gateway: 10.121.169.246 ← телефон (виден в rclone.log)
|
||||
Mac primary: 10.121.169.100 ← networksetup -setmanual
|
||||
URL Mac: http://127.0.0.1:8080
|
||||
URL телефон: http://10.121.169.100:8080
|
||||
rclone.log: GET from 10.121.169.246:59442 …
|
||||
alias.log: networksetup -setmanual 10.121.169.100 gw 10.121.169.246
|
||||
```
|
||||
|
||||
### Одна команда перед синком
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-ensure-sync.sh
|
||||
```
|
||||
|
||||
Один раз (LaunchAgent без пароля):
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install.sh
|
||||
```
|
||||
|
||||
Перед возвратом на домашний Wi‑Fi:
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh dhcp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Что НЕ работает (не пробовать)
|
||||
|
||||
| Подход | Почему не работает | Что делать вместо |
|
||||
|--------|-------------------|-------------------|
|
||||
| **Tailscale / VPN mesh** | На Mac нет App Store; brew tailscale без GUI/daemon — не подняли стабильно; пользователь отказался | Хотспот + LAN WebDAV (эта схема) |
|
||||
| **`ifconfig alias *.100`** | Mac видит alias (`curl` с Mac OK), **Android не маршрутизирует** к alias — в rclone.log **нет** `from 10.x` | **`networksetup -setmanual`** → primary `*.100` |
|
||||
| **`http://*.local:8080`** (mDNS) | Android-хотспот **не резолвит** `.local` клиентов Wi‑Fi | IP: `http://<подсеть>.100:8080` |
|
||||
| **URL = DHCP primary Mac** (`10.x.x.84`) | IP **меняется** при каждом reconnect хотспота | Фиксированный хвост **`.100`** |
|
||||
| **Старый URL после смены подсети** (`10.74.21.100` при Mac в `10.121.169.x`) | ETIMEDOUT; телефон стучится не туда | `./joplin-hotspot-alias.sh status` → **один раз** новый URL |
|
||||
| **Stale Manual Wi‑Fi** (старый шлюз в prefs) | `No Router MAC`, нет интернета, ping gateway fail | `macos-hotspot-network-recover.sh recover` → DHCP → `repair` |
|
||||
| **Mac дома (`192.168.1.x`), телефон на LTE** | Разные сети — маршрута нет | Mac к **хотспоту** телефона **или** телефон в ту же Wi‑Fi |
|
||||
| **Смотреть только UI Joplin на Mac** | Mac синкается на `127.0.0.1` — **OK даже когда телефон молчит** | `tail -f ~/Library/Logs/joplin-webdav/rclone.log \| grep -v 127.0.0.1` |
|
||||
| **WebDAV URL в разделе «Прокси»** | Прокси — для HTTP/SOCKS, не адрес синка | **Синхронизация → Self-hosting → WebDAV** |
|
||||
| **Пробел / `/` в конце URL** | `Not a valid URL: …8080 /info.json` | Переписать URL без пробела и без trailing `/` |
|
||||
| **Joplin Cloud / Docker Server** | Не выбрано: нужен **локальный** WebDAV без облака | rclone на Mac (`~/JoplinSync`) |
|
||||
| **Обновлять URL на Mac при смене хотспота** | Mac всегда на localhost | Mac: **только** `127.0.0.1:8080`; менять URL **на телефоне** |
|
||||
|
||||
### Быстрая отличительная диагностика
|
||||
|
||||
| Симптом | Вероятная причина из таблицы выше |
|
||||
|---------|-----------------------------------|
|
||||
| rclone только `from 127.0.0.1` | alias вместо setmanual, разные сети, или неверный URL на телефоне |
|
||||
| `curl` с Mac на `*.100` OK, телефон — timeout | **alias** (типичный кейс 2026-07-04) → `repair` |
|
||||
| Mac «Completed», заметок нет | Mac не на WebDAV / пробел в URL |
|
||||
| `401 Unauthorized` | пароль env ≠ Joplin или старый rclone → `reload` |
|
||||
| Интернет на Mac мёртв после reconnect | stale Manual → `recover` |
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
Телефон (Joplin) ──HTTP──► Mac en0 alias *.100:8080 ──► rclone ──► ~/JoplinSync/
|
||||
Телефон (Joplin) ──HTTP──► Mac en0 primary *.100:8080 ──► rclone ──► ~/JoplinSync/
|
||||
Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone)
|
||||
```
|
||||
|
||||
@@ -20,9 +99,9 @@ Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone)
|
||||
| Данные | `~/JoplinSync` |
|
||||
| Учётка | `~/.config/joplin-webdav/env` (`600`, не в git) |
|
||||
| WebDAV | LaunchAgent `com.eternal.joplin-webdav` |
|
||||
| Alias `*.100` | LaunchAgent `com.eternal.joplin-hotspot-alias` (опционально + sudoers) |
|
||||
| Static `*.100` | LaunchAgent `com.eternal.joplin-hotspot-alias` (setmanual; опционально + sudoers) |
|
||||
| Лог rclone | `~/Library/Logs/joplin-webdav/rclone.log` |
|
||||
| Лог alias | `~/Library/Logs/joplin-webdav/alias.log` |
|
||||
| Лог static IP | `~/Library/Logs/joplin-webdav/alias.log` |
|
||||
| Лог Joplin Mac | `~/.config/joplin-desktop/log.txt` |
|
||||
| Настройки Mac | `~/.config/joplin-desktop/settings.json` → `sync.6.path` |
|
||||
|
||||
@@ -40,7 +119,7 @@ Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone)
|
||||
| Что смотреть | OK | Проблема |
|
||||
|--------------|-----|----------|
|
||||
| rclone / `:8080` | процесс слушает | `joplin-webdav-serve.sh` или `joplin-webdav-install.sh` |
|
||||
| `alias: OK` | `*.100` на en0 | `joplin-hotspot-alias.sh ensure` (sudo) |
|
||||
| `static IP: OK` | primary `*.100` | `joplin-hotspot-alias.sh repair` (sudo) |
|
||||
| rclone.log | `from 10.` или `from 192.` | только `127.0.0.1` — телефон не достучался |
|
||||
| Mac URL | `127.0.0.1:8080` | настроить WebDAV на Mac |
|
||||
|
||||
@@ -53,7 +132,7 @@ Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone)
|
||||
| Устройство | WebDAV URL |
|
||||
|------------|------------|
|
||||
| **Mac** | `http://127.0.0.1:8080` |
|
||||
| **Телефон** | `http://<подсеть>.100:8080` — сейчас часто `http://10.74.21.100:8080` |
|
||||
| **Телефон** | `http://<подсеть>.100:8080` — актуально: `http://10.121.169.100:8080` (2026-07-04) |
|
||||
|
||||
Узнать актуальный URL:
|
||||
|
||||
@@ -63,13 +142,15 @@ Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone)
|
||||
grep JOPLIN_PHONE_URL ~/.config/joplin-webdav/env
|
||||
```
|
||||
|
||||
**Не использовать на телефоне:**
|
||||
**Не использовать на телефоне** (подробнее — раздел «Что НЕ работает» выше):
|
||||
|
||||
| URL | Почему |
|
||||
| URL / подход | Почему |
|
||||
|-----|--------|
|
||||
| `http://eternals.local:8080` | Android-хотспот **не резолвит** `.local` клиентов; в rclone.log нет запросов с телефона |
|
||||
| `http://10.219.227.100:8080` | старая подсеть, если хотспот уже выдал `10.74.x` |
|
||||
| `http://10.x.x.84:8080` (primary DHCP) | IP меняется при reconnect |
|
||||
| `http://eternals.local:8080` | Android-хотспот **не резолвит** `.local` |
|
||||
| `http://10.219.227.100:8080` | старая подсеть (пример) |
|
||||
| `http://10.74.21.100:8080` | старая подсеть (пример) |
|
||||
| `http://10.x.x.84:8080` (DHCP primary Mac) | IP меняется при reconnect |
|
||||
| alias `*.100` без setmanual | телефон не достучится (2026-07-04) |
|
||||
|
||||
### Общее для Joplin
|
||||
|
||||
@@ -96,7 +177,7 @@ Mac Joplin не на WebDAV — в `~/JoplinSync` только данные с
|
||||
|
||||
### 2. `ETIMEDOUT` / `connect ETIMEDOUT 10.x.x.x:8080`
|
||||
|
||||
**Причина:** на телефоне **устаревший IP** (другая подсеть или нет alias `.100`).
|
||||
**Причина:** на телефоне **устаревший IP** (другая подсеть или primary `.100` не выставлен).
|
||||
|
||||
**Признаки:** Joplin `ETIMEDOUT`; rclone — нет свежих `GET`/`PUT` с `10.`.
|
||||
|
||||
@@ -139,9 +220,47 @@ grep JOPLIN_WEBDAV_PASS ~/.config/joplin-webdav/env
|
||||
|
||||
---
|
||||
|
||||
### 6. `ECONNREFUSED` / телефон «не достаёт», Mac — да
|
||||
### 6. Mac «синкается», телефон — нет (2026-07-04)
|
||||
|
||||
**Причина:** alias **`*.100` отсутствует** на `en0` (слетел после reconnect).
|
||||
**Самый частый кейс.** Mac → `127.0.0.1:8080` OK. Телефон молчит.
|
||||
|
||||
**Три причины (часто вместе):**
|
||||
|
||||
1. **Подсеть сменилась** — на телефоне старый URL (`10.74.21.100`), Mac уже в `10.121.169.x`
|
||||
2. **Primary `.100` не выставлен** — LaunchAgent не смог `sudo networksetup` (sudoers + `repair`)
|
||||
3. **Разные сети** — Mac на домашнем Wi‑Fi (`192.168.1.x`), телефон на мобильном
|
||||
|
||||
**Диагностика:**
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-webdav-status.sh
|
||||
grep JOPLIN_PHONE_URL ~/.config/joplin-webdav/env
|
||||
tail -5 ~/Library/Logs/joplin-webdav/rclone.log | grep -v 127.0.0.1
|
||||
```
|
||||
|
||||
| Признак | Значение |
|
||||
|---------|----------|
|
||||
| rclone только `from 127.0.0.1` | телефон **не достучался** |
|
||||
| `static IP: MISSING` | `./joplin-hotspot-alias.sh repair` |
|
||||
| `stale ifconfig: …` | старый alias → `repair` (скрипт снимет alias, выставит setmanual) |
|
||||
| `JOPLIN_PHONE_URL` ≠ URL из status | обновить URL **на телефоне** |
|
||||
| gateway `192.168.1.1` | домашний Wi‑Fi — телефон должен быть **в той же сети** |
|
||||
|
||||
**Фикс:**
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh # если sudo просит пароль
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh repair
|
||||
./docs/apps/joplin/scripts/joplin-webdav-status.sh # URL для телефона
|
||||
```
|
||||
|
||||
→ Обновить URL в Joplin на телефоне → **Синхронизировать**
|
||||
|
||||
---
|
||||
|
||||
### 7. `ECONNREFUSED` / телефон «не достаёт», Mac — да
|
||||
|
||||
**Причина:** primary **`*.100` отсутствует** на `en0` (слетел после reconnect или DHCP вместо setmanual).
|
||||
|
||||
```bash
|
||||
ifconfig en0 | grep inet
|
||||
@@ -155,7 +274,7 @@ curl -s -o /dev/null -w '%{http_code}\n' http://10.74.21.100:8080/ # подс
|
||||
|
||||
---
|
||||
|
||||
### 7. `eternals.local` / `*.local` не работает с телефона
|
||||
### 8. `eternals.local` / `*.local` не работает с телефона
|
||||
|
||||
**Ожидаемо.** mDNS на Mac резолвится, Android-хотспот — нет. Использовать **`http://<subnet>.100:8080`**, не `.local`.
|
||||
|
||||
@@ -171,32 +290,32 @@ curl -s -o /dev/null -w '%{http_code}\n' http://10.74.21.100:8080/ # подс
|
||||
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
Wi‑Fi должен быть **DHCP**, не Manual ([HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md)).
|
||||
Wi‑Fi на хотспоте: **Manual `*.100`** через `joplin-hotspot-alias` (шлюз = текущий gateway). Перед домашним Wi‑Fi: `joplin-hotspot-alias.sh dhcp`. См. [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md).
|
||||
|
||||
### 2. Joplin
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-webdav-status.sh
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh ensure # если alias MISSING
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh ensure # если static IP MISSING
|
||||
```
|
||||
|
||||
Чеклист:
|
||||
|
||||
- [ ] rclone слушает `:8080`
|
||||
- [ ] `alias: OK` (или `ensure` выполнен)
|
||||
- [ ] `static IP: OK` (или `repair` выполнен)
|
||||
- [ ] **Mac:** `http://127.0.0.1:8080` — без изменений
|
||||
- [ ] **Телефон:** URL из `status` — **не менять**, если подсеть та же (`10.74.21.x`)
|
||||
- [ ] Подсеть **сменилась** → один раз новый `http://<new-subnet>.100:8080`
|
||||
- [ ] В rclone.log появились `from 10.` после синка на телефоне
|
||||
|
||||
### 3. Авто-alias (рекомендуется один раз)
|
||||
### 3. Авто `*.100` (рекомендуется один раз)
|
||||
|
||||
```bash
|
||||
bash ./docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh install
|
||||
bash ./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh
|
||||
```
|
||||
|
||||
LaunchAgent поднимает `*.100` каждые 60 с после reconnect.
|
||||
LaunchAgent выставляет primary `*.100` каждые 60 с после reconnect.
|
||||
|
||||
---
|
||||
|
||||
@@ -205,9 +324,9 @@ LaunchAgent поднимает `*.100` каждые 60 с после reconnect.
|
||||
| Скрипт | Когда |
|
||||
|--------|--------|
|
||||
| `joplin-webdav-status.sh` | Первая диагностика |
|
||||
| `joplin-hotspot-alias.sh status\|ensure` | URL телефона, поднять alias |
|
||||
| `joplin-hotspot-alias.sh status\|ensure\|repair\|dhcp` | URL телефона, primary `*.100`, вернуть DHCP |
|
||||
| `joplin-android-hotspot-setup.sh install` | Полная настройка хотспота |
|
||||
| `joplin-hotspot-alias-install-sudo.sh` | Alias без пароля (LaunchAgent) |
|
||||
| `joplin-hotspot-alias-install-sudo.sh` | setmanual/dhcp без пароля (LaunchAgent) |
|
||||
| `joplin-webdav-install.sh` | Первая установка rclone + launchd |
|
||||
| `joplin-webdav-reload.sh` | После смены пароля в env |
|
||||
| `joplin-mdns-setup.sh` | Справочно; **не для URL на телефоне-хотспоте** |
|
||||
@@ -240,7 +359,7 @@ grep -E 'Synchronizer: \[error\]|ETIMEDOUT|ECONNREFUSED|Unauthorized|Not a valid
|
||||
|
||||
| Документ | Зачем |
|
||||
|----------|--------|
|
||||
| [STABLE_SETUP.md](./STABLE_SETUP.md) | Схема alias `*.100`, установка |
|
||||
| [STABLE_SETUP.md](./STABLE_SETUP.md) | Primary `*.100`, установка |
|
||||
| [README.md](./README.md) | Оглавление |
|
||||
| [docs/apps/joplin/README.md](../../../apps/joplin/README.md) | Установка с нуля |
|
||||
| [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md) | Сеть macOS после reconnect |
|
||||
@@ -253,10 +372,12 @@ grep -E 'Synchronizer: \[error\]|ETIMEDOUT|ECONNREFUSED|Unauthorized|Not a valid
|
||||
|------|---------|--------|------|
|
||||
| 2026-06-02 | 401 | Пароль env ≠ Joplin | `joplin-webdav-reload.sh` |
|
||||
| 2026-06-08 | ETIMEDOUT | Старый IP на телефоне | Обновить URL |
|
||||
| 2026-06-09 | Телефон не достаёт `.100` | Mac без alias | `joplin-hotspot-alias ensure` |
|
||||
| 2026-06-15 | Нет интернета после reconnect | Manual Wi‑Fi + битые маршруты | `macos-hotspot-network-recover.sh recover`, DHCP |
|
||||
| 2026-06-19 | `eternals.local` не работает | Android-хотспот не резолвит mDNS клиентов | URL `http://10.74.21.100:8080` + alias |
|
||||
| 2026-06-19 | Синк OK | alias `.100` + LaunchAgent | [STABLE_SETUP.md](./STABLE_SETUP.md) |
|
||||
| 2026-06-09 | Телефон не достаёт `.100` | Mac без primary `.100` | `setmanual` / `joplin-hotspot-alias repair` |
|
||||
| 2026-06-15 | Нет интернета после reconnect | Stale Manual + битые маршруты | `macos-hotspot-network-recover.sh recover` |
|
||||
| 2026-06-19 | `eternals.local` не работает | Android-хотспот не резолвит mDNS | URL `http://10.74.21.100:8080` + setmanual |
|
||||
| 2026-06-19 | Синк OK | primary `.100` + LaunchAgent | [STABLE_SETUP.md](./STABLE_SETUP.md) |
|
||||
| 2026-07-04 | Mac OK, телефон нет | alias `.100`; подсеть `10.74`→`10.121` | setmanual + URL `10.121.169.100` |
|
||||
| 2026-07-04 | **Синк OK** | setmanual `10.121.169.100`, gateway `.246` | [рабочий сетап](#проверенный-рабочий-сетап-зафиксировано-2026-07-04) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,17 +1,38 @@
|
||||
# Стабильная настройка: Android-хотспот + Mac + Joplin
|
||||
# Стабильная настройка: Joplin Mac ↔ телефон
|
||||
|
||||
Без облака и без VPN. Mac — WebDAV (rclone), телефон — клиент по HTTP в одной LAN (обычно **хотспот Android**).
|
||||
|
||||
---
|
||||
|
||||
## Важно: `.local` с телефона **не работает**
|
||||
## Схема
|
||||
|
||||
`http://eternals.local:8080` резолвится на **Mac**, но **Android, раздающий хотспот, не умеет** резолвить `.local` имён **подключённых** клиентов (Mac). Запросы до rclone не доходят.
|
||||
| Устройство | WebDAV URL |
|
||||
|------------|------------|
|
||||
| **Mac** | `http://127.0.0.1:8080` (никогда не менять) |
|
||||
| **Телефон** | `http://<подсеть>.100:8080` — из `joplin-webdav-status.sh` |
|
||||
|
||||
**Рабочая схема:** alias **`*.100`** на `en0` + URL `http://<подсеть>.100:8080`.
|
||||
На Mac **primary IP** Wi‑Fi = `*.100` через `networksetup -setmanual` (не ifconfig alias). Android маршрутизирует к **primary**; alias `.100` телефон часто не видит.
|
||||
|
||||
| Устройство | URL |
|
||||
|------------|-----|
|
||||
| Mac | `http://127.0.0.1:8080` |
|
||||
| Телефон | `http://10.74.21.100:8080` (подсеть меняется → см. ниже) |
|
||||
`.local` / mDNS **с Android-хотспота не работает** — только IP.
|
||||
|
||||
---
|
||||
|
||||
## Перед каждым синком (чеклист)
|
||||
|
||||
1. **Mac на Wi‑Fi хотспота этого телефона** — не домашний Wi‑Fi (отключить auto-join домашней сети).
|
||||
2. На Mac:
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-ensure-sync.sh
|
||||
```
|
||||
3. В выводе: `static IP: OK`, rclone слушает `:8080`.
|
||||
4. **Телефон:** URL `http://<подсеть>.100:8080` — сначала проверить в **браузере** (логин за 2–3 сек), потом Joplin → синк.
|
||||
5. В `~/Library/Logs/joplin-webdav/rclone.log` — `GET`/`PUT from <IP шлюза/телефона>`.
|
||||
|
||||
Переход на **домашний Wi‑Fi** (без Joplin с телефона):
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh dhcp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -19,37 +40,75 @@
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-webdav-install.sh
|
||||
bash ./docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh install
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install.sh # LaunchAgent
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh # sudo без пароля
|
||||
```
|
||||
|
||||
На телефоне — URL из вывода (`joplin-hotspot-alias.sh status`).
|
||||
|
||||
Автоподнятие alias после reconnect:
|
||||
На телефоне в Joplin → WebDAV — URL из:
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh # sudoers, без пароля
|
||||
./docs/apps/joplin/scripts/joplin-webdav-status.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## После reconnect
|
||||
## После reconnect / смены подсети
|
||||
|
||||
1. Alias поднимается LaunchAgent (если sudoers установлен)
|
||||
2. Проверка: `./docs/apps/joplin/scripts/joplin-webdav-status.sh`
|
||||
3. Если подсеть **та же** (`10.74.21.x`) — URL на телефоне **не менять**
|
||||
4. Если подсеть **сменилась** (`10.219` → `10.74`) — **один раз** новый URL из `status`
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-ensure-sync.sh
|
||||
```
|
||||
|
||||
Интернет пропал: `bash .../macos-hotspot-network-recover.sh recover`
|
||||
| Ситуация | URL на телефоне |
|
||||
|----------|-----------------|
|
||||
| Та же подсеть (`10.121.169.x` → `10.121.169.x`) | **Не менять** |
|
||||
| Подсеть сменилась (`10.74.21.x` → `10.121.169.x`) | **Один раз** новый URL из `status` |
|
||||
| Mac и телефон в одной домашней Wi‑Fi | `http://192.168.1.100:8080` (пример) |
|
||||
| Mac на домашнем Wi‑Fi, телефон на мобильном | **Синк невозможен** — Mac к хотспоту телефона |
|
||||
|
||||
Если `static IP: MISSING`:
|
||||
|
||||
```bash
|
||||
./docs/apps/joplin/scripts/joplin-hotspot-alias.sh repair
|
||||
```
|
||||
|
||||
Сеть «умерла» после reconnect хотспота:
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Почему URL иногда меняется
|
||||
## Почему десктоп «синкается», а телефон — нет
|
||||
|
||||
Android выдаёт **разные подсети** (`10.219.227.x`, `10.74.21.x`). Без Tailscale/VPN **нельзя** иметь один HTTP-URL при любой подсети с телефона-хотспота. Фиксированный **хвост `.100`** + автоподнятие alias минимизируют ручную работу.
|
||||
Mac ходит на **`127.0.0.1:8080`** — всегда работает. Телефон зависит от:
|
||||
|
||||
1. **Одна сеть** — Mac и телефон в одной LAN
|
||||
2. **Primary `.100`** — `static IP: OK` в status
|
||||
3. **URL на телефоне = текущая подсеть** — не старый `10.74.21.100`
|
||||
4. **rclone.log** — есть `GET`/`PUT from <IP>`
|
||||
|
||||
Joplin на Mac **скрывает** ошибки — смотреть `rclone.log`, не только UI.
|
||||
|
||||
---
|
||||
|
||||
## Подсети меняются
|
||||
|
||||
Без VPN нельзя иметь **один** URL при любой подсети. Фиксированный **хвост `.100`** минимизирует правки: меняется только префикс (`10.74` → `10.121` → `10.219`).
|
||||
|
||||
---
|
||||
|
||||
## История рабочих подсетей
|
||||
|
||||
| Дата | Подсеть | URL телефона |
|
||||
|------|---------|--------------|
|
||||
| 2026-06-09 | `10.219.227.x` | `http://10.219.227.100:8080` (setmanual) |
|
||||
| 2026-06-19 | `10.74.21.x` | `http://10.74.21.100:8080` |
|
||||
| 2026-07-04 | `10.121.169.x` | `http://10.121.169.100:8080` — **проверено, синк OK** (setmanual) |
|
||||
|
||||
---
|
||||
|
||||
## Связанное
|
||||
|
||||
- [RUNBOOK.md](./RUNBOOK.md)
|
||||
- [RUNBOOK.md](./RUNBOOK.md) — диагностика
|
||||
- [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md)
|
||||
|
||||
20
docs/connectivity/pac/ru-socks-exit.pac
Normal file
20
docs/connectivity/pac/ru-socks-exit.pac
Normal file
@@ -0,0 +1,20 @@
|
||||
// PAC для exit-via-ru / exit-via-ru-do: весь внешний трафик через SOCKS на 10809.
|
||||
// Локальные/LAN — напрямую (Joplin, роутер, localhost).
|
||||
function FindProxyForURL(url, host) {
|
||||
if (isPlainHostName(host) ||
|
||||
host === "localhost" ||
|
||||
shExpMatch(host, "127.*") ||
|
||||
shExpMatch(host, "10.*") ||
|
||||
shExpMatch(host, "192.168.*") ||
|
||||
shExpMatch(host, "172.16.*") ||
|
||||
shExpMatch(host, "172.17.*") ||
|
||||
shExpMatch(host, "172.18.*") ||
|
||||
shExpMatch(host, "172.19.*") ||
|
||||
shExpMatch(host, "172.2*.*") ||
|
||||
shExpMatch(host, "172.30.*") ||
|
||||
shExpMatch(host, "172.31.*") ||
|
||||
shExpMatch(host, "*.local")) {
|
||||
return "DIRECT";
|
||||
}
|
||||
return "SOCKS5 127.0.0.1:10809; SOCKS 127.0.0.1:10809";
|
||||
}
|
||||
@@ -7,15 +7,14 @@
|
||||
# - Manual IPv4 на Wi‑Fi (Joplin 10.219.227.100) конфликтует с новой подсетью хотспота (10.36.x).
|
||||
#
|
||||
# Решение:
|
||||
# - Wi‑Fi всегда DHCP (правильный шлюз после reconnect).
|
||||
# - Joplin: вторичный IP (alias) *.100 в текущей подсети — не трогает default route.
|
||||
# - recover всегда запрашивает sudo (пароль) для полного сброса.
|
||||
# - recover: DHCP → сброс маршрутов → joplin-hotspot-alias repair (setmanual *.100 + текущий gw).
|
||||
# - Stale Manual (старый шлюз) — снимается DHCP на шаге 3, затем setmanual с актуальным gw.
|
||||
#
|
||||
# Из любой папки (одна команда, чинит интернет + Joplin alias):
|
||||
# Из любой папки (одна команда, чинит интернет + Joplin *.100):
|
||||
# bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
#
|
||||
# Переменные:
|
||||
# HOTSPOT_JOPLIN_MODE=alias|manual|off alias (по умолчанию при ~/.config/joplin-webdav/env), manual, off
|
||||
# HOTSPOT_JOPLIN_MODE=static|alias|manual|off static (по умолчанию при env), alias/manual legacy, off
|
||||
# HOTSPOT_RECOVER_SKIP_JOPLIN=1 не трогать Joplin alias
|
||||
# JOPLIN_STATIC_IP последний октет .100 из env; подсеть — текущая
|
||||
# MACOS_PAC_SERVICES, WIFI_DEVICE
|
||||
@@ -75,8 +74,7 @@ joplin_mode() {
|
||||
echo "$HOTSPOT_JOPLIN_MODE"
|
||||
return
|
||||
fi
|
||||
# mDNS (joplin-mac.local) — URL на телефоне не зависит от подсети; alias не нужен
|
||||
echo off
|
||||
[ -f "$JOPLIN_ENV" ] && echo static || echo off
|
||||
}
|
||||
|
||||
joplin_target_ip() {
|
||||
@@ -233,7 +231,7 @@ usage() {
|
||||
cat <<EOF
|
||||
Usage: $(basename "$0") status|recover
|
||||
|
||||
recover — PAC/SOCKS off, DHCP, ядерный сброс (sudo), Joplin alias *.100
|
||||
recover — PAC/SOCKS off, DHCP, ядерный сброс (sudo), Joplin primary *.100 (setmanual)
|
||||
status — диагностика
|
||||
|
||||
Полная команда из любой папки:
|
||||
@@ -290,11 +288,11 @@ case "$cmd" in
|
||||
wait_for_connectivity "$dev" || true
|
||||
mode="$(joplin_mode)"
|
||||
case "$mode" in
|
||||
alias)
|
||||
echo "6) Joplin: alias IP (не ломает маршрутизацию)..."
|
||||
static|alias)
|
||||
echo "6) Joplin: primary *.100 (setmanual)..."
|
||||
if [ -x "$JOPLIN_ALIAS_SCRIPT" ]; then
|
||||
"$JOPLIN_ALIAS_SCRIPT" ensure || true
|
||||
else
|
||||
"$JOPLIN_ALIAS_SCRIPT" repair || "$JOPLIN_ALIAS_SCRIPT" ensure || true
|
||||
elif [ "$mode" = alias ]; then
|
||||
setup_joplin_alias "$dev" || true
|
||||
fi
|
||||
;;
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
|
||||
## 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).
|
||||
Тот же сервер **209.38.32.21**. Для **Cursor** / SSH-exit (**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), операционный сброс: [RUNBOOK.md](./RUNBOOK.md), скрипты в **`scripts/vpn/`** (из корня репозитория: `./scripts/vpn/ssh-exit-mode.sh`).
|
||||
|
||||
**Важно:** `ru` / `ru-do` на macOS включают **системный SOCKS** на 10809. Если туннель умер, а SOCKS в системе остался — Thunderbird и браузер ломаются при живом `curl`. Мягкий off: `networksetup -setsocksfirewallproxystate "Wi-Fi" off`. Подробности по IDE: [docs/cursor/README.md](../../cursor/README.md).
|
||||
|
||||
---
|
||||
|
||||
@@ -47,7 +49,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`)
|
||||
- **[RUNBOOK.md](./RUNBOOK.md)** — старт RU / сброс при мёртвом интернете (абсолютные пути)
|
||||
- **[SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md)** — режимы: локальный IP / RU / Mac→RU→DO; скрипты: **`scripts/vpn/`**
|
||||
|
||||
- **[SHADOWSOCKS.md](./SHADOWSOCKS.md)** - Полное руководство по Shadowsocks
|
||||
- Развертывание сервера
|
||||
@@ -77,8 +80,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/ssh-exit-mode.sh`** — режимы SOCKS: `local` | `ru` | `ru-do` | `status` | `verify` (см. [SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md)); на macOS `ru`/`ru-do` включают системный SOCKS
|
||||
- **`scripts/vpn/exit-via-local.sh`**, **`exit-via-ru.sh`**, **`exit-via-ru-do.sh`** — короткие вызовы тех же режимов
|
||||
- **`scripts/vpn/install-exit-aliases.sh`** — алиасы `exit-ru` / `exit-local` / `exit-ru-do` в `~/.zshrc`
|
||||
|
||||
- `scripts/toggle-shadowsocks-proxy.sh` - Переключение системного прокси
|
||||
- `scripts/check-proxy-status.sh` - Проверка статуса прокси
|
||||
|
||||
257
docs/connectivity/vpn/RUNBOOK.md
Normal file
257
docs/connectivity/vpn/RUNBOOK.md
Normal file
@@ -0,0 +1,257 @@
|
||||
# Runbook: выход в интернет через RU-хостинг (SSH SOCKS)
|
||||
|
||||
Симптом: **RU-сервисы режут доступ из‑за рубежа** (бан иностранного IP). Нужен выход с IP `ru.hunab.app` (**149.154.64.19**).
|
||||
|
||||
Команды ниже — **из любой папки** (абсолютные пути).
|
||||
|
||||
Корень репо: `/Users/eternal/code/local_machine`
|
||||
|
||||
---
|
||||
|
||||
## Быстрый старт (включить RU)
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh
|
||||
```
|
||||
|
||||
Что делает: SOCKS `127.0.0.1:10809` → `hsites-ahau` + **системный SOCKS** на Wi‑Fi.
|
||||
|
||||
Проверка:
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh verify
|
||||
```
|
||||
|
||||
Ожидание в блоке «Через SOCKS»: **149.154.64.19**, `country: RU`.
|
||||
В браузере: https://ipinfo.io → RU.
|
||||
|
||||
Статус портов / системного прокси:
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Другие режимы
|
||||
|
||||
| Цель | Команда |
|
||||
|------|---------|
|
||||
| Выход с **IP RU** | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh` |
|
||||
| Выход с **IP DO** (через RU) | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru-do.sh` |
|
||||
| Снять туннели + системный SOCKS | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh` |
|
||||
|
||||
---
|
||||
|
||||
## Мёртвый системный SOCKS 10809
|
||||
|
||||
**Симптомы:** `curl` / `nc` до почтовых серверов OK, но Thunderbird не качает **все** ящики; браузер «висит»; Cursor с `socks5://127.0.0.1:10809` мёртв.
|
||||
|
||||
**RCA (2026-07-22):** после `exit-via-ru` / `exit-via-ru-do` системный SOCKS Wi‑Fi остаётся на `127.0.0.1:10809`, а SSH-туннель на порту уже не слушает. Thunderbird (и др.) используют системный прокси → отказ сразу на всех аккаунтах.
|
||||
|
||||
**Проверка:**
|
||||
|
||||
```bash
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi"
|
||||
lsof -nP -iTCP:10809 -sTCP:LISTEN || echo "10809: nothing"
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh status
|
||||
```
|
||||
|
||||
Паттерн: `Enabled: Yes`, Port `10809`, а `lsof` пустой.
|
||||
|
||||
---
|
||||
|
||||
## Сброс при проблемах с интернетом
|
||||
|
||||
Если после `exit-via-ru` «пропал интернет», браузер не грузит, Thunderbird молчит при живом `curl`, или туннель умер при включённом системном SOCKS — **сначала снять мёртвый системный SOCKS**, потом при необходимости recover хотспота.
|
||||
|
||||
### 0. Мягкий сброс (сохранить Telegram на 1081)
|
||||
|
||||
Только выключить системный SOCKS — **не** убивает LaunchAgent / SSH на **1081**:
|
||||
|
||||
```bash
|
||||
networksetup -setsocksfirewallproxystate "Wi-Fi" off
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi" # Enabled: No
|
||||
```
|
||||
|
||||
После этого в Thunderbird — «Получить сообщения».
|
||||
|
||||
### 1. Полный сброс SSH-exit
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh
|
||||
```
|
||||
|
||||
Снимает SSH SOCKS на **10809 / 1081 / 1082** и выключает системный SOCKS на Wi‑Fi. Telegram через 1081 после этого нужно поднять снова (LaunchAgent или `telegram-socks-tunnel.sh`).
|
||||
|
||||
Проверка, что системный SOCKS выключен:
|
||||
|
||||
```bash
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi"
|
||||
```
|
||||
|
||||
Ожидание: `Enabled: No`.
|
||||
|
||||
Быстрый тест сети без прокси:
|
||||
|
||||
```bash
|
||||
curl -sS --max-time 8 https://1.1.1.1
|
||||
curl -sS --max-time 8 https://ipinfo.io/ip
|
||||
```
|
||||
|
||||
### 2. Если интернет всё ещё мёртв (хотспот / stale Manual / route)
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
|
||||
```
|
||||
|
||||
Запросит sudo. Подробно: [HOTSPOT_NETWORK_EMERGENCY.md](../HOTSPOT_NETWORK_EMERGENCY.md).
|
||||
|
||||
### 3. Ядерный сброс прокси вручную (если скрипт недоступен)
|
||||
|
||||
```bash
|
||||
networksetup -setautoproxystate "Wi-Fi" off
|
||||
networksetup -setsocksfirewallproxystate "Wi-Fi" off
|
||||
pkill -f 'ssh.*-D 10809' 2>/dev/null || true
|
||||
pkill -f 'ssh.*-D 1081' 2>/dev/null || true
|
||||
pkill -f 'ssh.*-D 1082' 2>/dev/null || true
|
||||
curl -sS --max-time 8 https://ipinfo.io/ip
|
||||
```
|
||||
|
||||
### 4. Снова включить RU (после рабочего интернета)
|
||||
|
||||
```bash
|
||||
curl -sS --max-time 8 https://1.1.1.1 && \
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh && \
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh verify
|
||||
```
|
||||
|
||||
Не поднимайте `exit-via-ru`, пока не работает обычный `curl https://1.1.1.1`.
|
||||
|
||||
---
|
||||
|
||||
## WireGuard на телефоне (выход через RU `149.154.64.19`)
|
||||
|
||||
На RU уже крутится **wg-quick@wg0**, UDP **51820**, full-tunnel (`AllowedIPs = 0.0.0.0/0`) → снаружи IP **RU**.
|
||||
|
||||
### Установка
|
||||
|
||||
1. App Store / Google Play → **WireGuard**
|
||||
2. **+** → **Create from QR code** (или «Создать из файла»)
|
||||
3. Сканируйте QR peer3 (неиспользуемый слот `192.168.15.3`) — файл: `/tmp/wg-ru-mobile-peer3-qr.png`
|
||||
Пересоздать QR:
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes hsites-ahau 'sudo -n cat /etc/wireguard/peer3.conf' | qrencode -t PNG -s 8 -o /tmp/wg-ru-mobile-peer3-qr.png && open /tmp/wg-ru-mobile-peer3-qr.png
|
||||
```
|
||||
|
||||
4. Имя туннеля: например `ru-hunab`
|
||||
5. Включить туннель → в браузене https://ipinfo.io → **RU** / `149.154.64.19`
|
||||
|
||||
### Файл вместо QR
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes hsites-ahau 'sudo -n cat /etc/wireguard/peer3.conf' > /tmp/wg-ru-mobile.conf
|
||||
```
|
||||
|
||||
Импорт в WireGuard: **+** → Create from file → `/tmp/wg-ru-mobile.conf`.
|
||||
|
||||
### Важно
|
||||
|
||||
| | |
|
||||
|--|--|
|
||||
| Endpoint | `149.154.64.19:51820` |
|
||||
| peer3 | свободен (не подключался); peer2 уже использовался |
|
||||
| Не коммитьте | `.conf` / QR с PrivateKey в git |
|
||||
| Kill switch | в приложении WireGuard (Android) при необходимости |
|
||||
|
||||
Если handshake не идёт: UDP **51820** до RU не доходит (оператор/Wi‑Fi режет) — проверьте с другой сети.
|
||||
|
||||
---
|
||||
|
||||
## Brave не открывает tbank.ru (Chrome открывает)
|
||||
|
||||
Туннель OK (`curl -x socks5h://127.0.0.1:10809` → 200), Chrome с системным SOCKS проходит, **Brave** — нет.
|
||||
|
||||
**Причина:** у Brave включён **Secure DNS (DoH)** на Cloudflare (`mode: secure`). Запросы DNS/часть трафика идут мимо SOCKS → с зарубежного IP до `tbank.ru` таймаут. У Chrome DoH обычно выключен.
|
||||
|
||||
### В Brave (UI, 30 секунд)
|
||||
|
||||
1. `brave://settings/security` → **Use secure DNS** → **Off**
|
||||
2. `brave://settings/system` → **Use system proxy settings when available** → **On**
|
||||
3. (если всё ещё тупит) `brave://flags/#enable-quic` → **Disabled** → Relaunch
|
||||
4. Проверка: https://ipinfo.io → должно быть **RU** / `149.154.64.19`, затем https://www.tbank.ru/
|
||||
|
||||
### Если правили prefs скриптом
|
||||
|
||||
Brave должен быть **закрыт**, иначе перезапишет `Local State`.
|
||||
|
||||
```bash
|
||||
osascript -e 'quit app "Brave Browser"' 2>/dev/null || true
|
||||
sleep 2
|
||||
python3 - <<'PY'
|
||||
import json
|
||||
from pathlib import Path
|
||||
p = Path.home() / "Library/Application Support/BraveSoftware/Brave-Browser/Local State"
|
||||
st = json.loads(p.read_text())
|
||||
st["dns_over_https"] = {"mode": "off"}
|
||||
p.write_text(json.dumps(st, separators=(",", ":")))
|
||||
print("Brave Secure DNS → off")
|
||||
PY
|
||||
open -a "Brave Browser"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Диагностика
|
||||
|
||||
| Признак | Что делать |
|
||||
|---------|------------|
|
||||
| Thunderbird не грузит **все** ящики, `curl` OK | Системный SOCKS на мёртвом **10809** → мягкий off (шаг 0) или `exit-via-local.sh` |
|
||||
| `Enabled: Yes` / Port 10809, `lsof :10809` пусто | То же: снять системный SOCKS; при нужде снова `exit-via-ru.sh` |
|
||||
| SOCKS verify = RU, браузер всё ещё «за рубежом» | Системный SOCKS off → снова `exit-via-ru.sh`; в Chrome: «Use system proxy» |
|
||||
| Chrome OK, Brave нет (tbank и т.п.) | Выключить Secure DNS в Brave — см. выше |
|
||||
| `verify` — «нет ответа» | `exit-via-local.sh`, затем `exit-via-ru.sh`; `ssh -o ConnectTimeout=10 hsites-ahau 'echo OK'` |
|
||||
| Интернет умер после RU | `exit-via-local.sh` → при необходимости hotspot `recover` |
|
||||
| Cursor мёртв при живой сети | Снять мёртвый proxy в settings; [apps/cursor/RUNBOOK.md](../../apps/cursor/RUNBOOK.md) |
|
||||
| Только CLI нужен RU, без системного SOCKS | `SSH_EXIT_SYSTEM_PROXY=0 bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh` |
|
||||
|
||||
Проверка SSH до RU:
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes -o ConnectTimeout=10 hsites-ahau 'echo RU_OK'
|
||||
```
|
||||
|
||||
Без алиаса:
|
||||
|
||||
```bash
|
||||
ssh -o BatchMode=yes -o ConnectTimeout=10 -i ~/.ssh/id_ed25519 ahau@149.154.64.19 'echo RU_OK'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cursor (опционально)
|
||||
|
||||
Тот же порт **10809**:
|
||||
|
||||
```json
|
||||
"http.proxy": "socks5://127.0.0.1:10809",
|
||||
"http.proxySupport": "override"
|
||||
```
|
||||
|
||||
На локальный выход: `exit-via-local.sh` **и** в Cursor `"http.proxy": ""`, `"http.proxySupport": "off"`.
|
||||
|
||||
---
|
||||
|
||||
## Связанные документы
|
||||
|
||||
| Документ | Зачем |
|
||||
|----------|--------|
|
||||
| [SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md) | Режимы local / ru / ru-do, схема |
|
||||
| [HOTSPOT_NETWORK_EMERGENCY.md](../HOTSPOT_NETWORK_EMERGENCY.md) | Сеть после reconnect хотспота |
|
||||
| [PROXY_EMERGENCY.md](../PROXY_EMERGENCY.md) | SSH / прокси «всё слетело» |
|
||||
| [apps/cursor/RUNBOOK.md](../../apps/cursor/RUNBOOK.md) | Cursor + мёртвый SOCKS |
|
||||
|
||||
---
|
||||
|
||||
*Обновлено: 2026-07-22*
|
||||
@@ -1,9 +1,32 @@
|
||||
# SSH SOCKS: быстрое переключение выхода в интернет
|
||||
|
||||
**Операционный ранбук** (старт / сброс / из любой папки): **[RUNBOOK.md](./RUNBOOK.md)**.
|
||||
|
||||
Три режима без WireGuard/Shadowsocks: **локальный IP**, **RU-прокси**, **RU → DO** (снаружи виден **IP прод-сервера DO**).
|
||||
|
||||
Политика: для выхода с **IP DO** используется **только** цепочка **Mac → RU (`hsites-ahau`) → DO** (`telegram-socks-via-do`). Прямой Mac→DO скрипты не поднимают.
|
||||
|
||||
На **macOS** режимы `ru` / `ru-do` по умолчанию включают **системный SOCKS** (`networksetup` на Wi‑Fi → `127.0.0.1:10809`), чтобы браузер и приложения выходили с нужным IP. `local` его выключает. Отключить поведение: `SSH_EXIT_SYSTEM_PROXY=0`.
|
||||
|
||||
**Ловушка:** если SSH на 10809 умер, а системный SOCKS остался `Enabled: Yes`, приложения с системным прокси (Thunderbird, Safari/Chrome) перестают ходить в сеть при живом `curl`. Почта в TB падает **со всех ящиков**. Мягкий сброс: `networksetup -setsocksfirewallproxystate "Wi-Fi" off` (не трогает Telegram **1081**). Полный: `exit-via-local.sh`. Ранбук: [RUNBOOK.md](./RUNBOOK.md).
|
||||
|
||||
---
|
||||
|
||||
## Из‑за рубежа: RU‑сервисы режут иностранный IP
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh verify
|
||||
```
|
||||
|
||||
Сброс при проблемах с сетью:
|
||||
|
||||
```bash
|
||||
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh
|
||||
```
|
||||
|
||||
Полный чеклист: [RUNBOOK.md](./RUNBOOK.md).
|
||||
|
||||
---
|
||||
|
||||
## Ожидаемые IP (проверка «снаружи»)
|
||||
@@ -24,6 +47,8 @@
|
||||
|
||||
После **`ru-do`** в блоке «Через SOCKS» должно быть **209.38.32.21** (или актуальный IP DO). После **`ru`** — **149.154.64.19**.
|
||||
|
||||
`curl` **не** использует системный SOCKS macOS — для CLI всегда `-x socks5h://127.0.0.1:10809` или `exit-verify`. Браузер с системным прокси проверяйте на ipinfo.io.
|
||||
|
||||
---
|
||||
|
||||
## Скрипты (из корня репозитория `local_machine`)
|
||||
@@ -37,20 +62,21 @@
|
||||
**Короткие алиасы** (то же самое):
|
||||
|
||||
```bash
|
||||
./scripts/vpn/exit-via-local.sh # стоп туннелей
|
||||
./scripts/vpn/exit-via-ru.sh # только RU
|
||||
./scripts/vpn/exit-via-local.sh # стоп туннелей + системный SOCKS off
|
||||
./scripts/vpn/exit-via-ru.sh # только RU + системный SOCKS on
|
||||
./scripts/vpn/exit-via-ru-do.sh # RU → DO (IP DO снаружи)
|
||||
./scripts/vpn/install-exit-aliases.sh # exit-ru / exit-local в ~/.zshrc
|
||||
```
|
||||
|
||||
| Команда | Действие |
|
||||
|---------|----------|
|
||||
| **`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`** | Кто слушает порты из списка остановки. |
|
||||
| **`local`** \| **`off`** \| **`stop`** | Гасит SSH SOCKS на портах **10809**, **1081**, **1082**; на macOS — системный SOCKS off. Дальше: в **Cursor** уберите `http.proxy` / `https.proxy` при необходимости. |
|
||||
| **`ru`** | Поднимает SOCKS **`127.0.0.1:10809`** → выход с **RU** (`hsites-ahau`) + системный SOCKS. В Cursor: `socks5://127.0.0.1:10809`. |
|
||||
| **`ru-do`** | Проверка RU (6 с), затем SOCKS на **10809** через **`telegram-socks-via-do`** + системный SOCKS. Снаружи — **IP DO**. |
|
||||
| **`status`** | Кто слушает порты + системный SOCKS. |
|
||||
| **`verify`** | IP без прокси и через SOCKS на `SSH_EXIT_MAIN_PORT`. |
|
||||
|
||||
**Переменные:** `SSH_EXIT_MAIN_PORT` (по умолчанию **10809**), `SSH_EXIT_STOP_PORTS`, `SSH_EXIT_RU_HOST` (по умолчанию `hsites-ahau`).
|
||||
**Переменные:** `SSH_EXIT_MAIN_PORT` (по умолчанию **10809**), `SSH_EXIT_STOP_PORTS`, `SSH_EXIT_RU_HOST` (по умолчанию `hsites-ahau`), `SSH_EXIT_SYSTEM_PROXY` (`1`/`0`), `SSH_EXIT_NET_SERVICE` (по умолчанию `Wi-Fi`).
|
||||
|
||||
**`~/.ssh/config`:** `hsites-ahau`, **`telegram-socks-via-do`** с `ProxyJump hsites-ahau` — шаблоны в [PROXY_GUIDE.md](../PROXY_GUIDE.md).
|
||||
|
||||
@@ -60,9 +86,16 @@
|
||||
|
||||
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** — выкл.
|
||||
3. В Cursor: **Settings → proxy** → `socks5://127.0.0.1:10809`, **`http.proxySupport`: `override`**. **Disable Http2** — выкл. Порт **10809**, не **1090**.
|
||||
|
||||
На **локальный IP:** `exit-via-local.sh`, затем в Cursor **убрать** proxy.
|
||||
На **локальный IP:** `exit-via-local.sh`, затем в Cursor **обязательно**:
|
||||
|
||||
```json
|
||||
"http.proxy": "",
|
||||
"http.proxySupport": "off"
|
||||
```
|
||||
|
||||
иначе останется мёртвый SOCKS и Agent/API упадут при живом интернете (типично после смены страны). См. [docs/apps/cursor/RUNBOOK.md](../../apps/cursor/RUNBOOK.md).
|
||||
|
||||
---
|
||||
|
||||
@@ -70,6 +103,8 @@
|
||||
|
||||
Скрипт **`local`** останавливает и **1081**. Если нужен Telegram через DO при том же «полном стопе», после `local` поднимите туннель отдельно: [TELEGRAM_GUIDE.md](../TELEGRAM_GUIDE.md), `telegram-socks-tunnel.sh` / LaunchAgent.
|
||||
|
||||
Если проблема только в мёртвом системном SOCKS (TB/браузер), а Telegram на 1081 жив — **не** вызывайте `local`: достаточно `networksetup -setsocksfirewallproxystate "Wi-Fi" off`.
|
||||
|
||||
---
|
||||
|
||||
## Схема
|
||||
@@ -92,4 +127,4 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
*Обновлено: 2026-04-08*
|
||||
*Обновлено: 2026-07-22*
|
||||
|
||||
Reference in New Issue
Block a user