Initial commit: local_machine docs and scripts
This commit is contained in:
679
docs/connectivity/BUILD_AAB_FROM_RUSSIA_GUIDE.md
Normal file
679
docs/connectivity/BUILD_AAB_FROM_RUSSIA_GUIDE.md
Normal file
@@ -0,0 +1,679 @@
|
||||
# 🏗️ Сборка AAB/APK из России — Полное руководство
|
||||
|
||||
> **Дата создания:** 2026-02-28
|
||||
> **Проблема:** Java TLS заблокирован российским DPI → Gradle не может скачать зависимости
|
||||
> **Решение:** Maven proxy на прод-сервере + SSH-туннель + обход SDK auto-download
|
||||
> **Время сборки:** ~1.5 мин (AAB), ~46 сек (APK после AAB)
|
||||
>
|
||||
> **📖 См. также:** [SETUP_AND_BUILD_GUIDE.md](./SETUP_AND_BUILD_GUIDE.md) — общее руководство по установке и сборке (для работы не из России)
|
||||
|
||||
---
|
||||
|
||||
## 📋 Содержание
|
||||
|
||||
1. [Суть проблемы](#-суть-проблемы)
|
||||
2. [Предварительные требования](#-предварительные-требования)
|
||||
3. [Шаг 1: Maven proxy на прод-сервере](#-шаг-1-maven-proxy-на-прод-сервере)
|
||||
4. [Шаг 2: SSH-туннель](#-шаг-2-ssh-туннель)
|
||||
5. [Шаг 3: Сборка AAB](#-шаг-3-сборка-aab)
|
||||
6. [Шаг 4: Сборка APK для эмулятора](#-шаг-4-сборка-apk-для-эмулятора)
|
||||
7. [Шаг 5: Установка в эмулятор](#-шаг-5-установка-в-эмулятор)
|
||||
8. [Быстрый скрипт «всё одной командой»](#-быстрый-скрипт-всё-одной-командой)
|
||||
9. [DOs & DON'Ts](#-dos--donts)
|
||||
10. [Конфигурация Gradle (что изменено и почему)](#-конфигурация-gradle-что-изменено-и-почему)
|
||||
11. [Troubleshooting](#-troubleshooting)
|
||||
12. [Версионирование](#-версионирование)
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Суть проблемы
|
||||
|
||||
### Почему Gradle не работает из России напрямую
|
||||
|
||||
```
|
||||
Gradle → Java TLS → dl.google.com / repo1.maven.org
|
||||
↑
|
||||
DPI (Deep Packet Inspection) блокирует TLS handshake
|
||||
Java получает: "Remote host terminated the handshake"
|
||||
```
|
||||
|
||||
**Ключевой факт:** `curl` работает нормально (macOS LibreSSL), а Java — нет (JSSE TLS implementation). DPI по-разному обрабатывает TLS Client Hello от разных реализаций.
|
||||
|
||||
### Решение: Maven proxy
|
||||
|
||||
```
|
||||
Gradle → HTTP (127.0.0.1:8765) → SSH-туннель → Прод-сервер (python proxy)
|
||||
↓
|
||||
HTTPS → dl.google.com
|
||||
HTTPS → repo1.maven.org
|
||||
HTTPS → plugins.gradle.org
|
||||
```
|
||||
|
||||
Java работает по **HTTP** (без TLS) до localhost. Прод-сервер в Digital Ocean скачивает по **HTTPS** без DPI.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Предварительные требования
|
||||
|
||||
> **📖 Перед началом:** Убедитесь, что выполнены базовые требования из [SETUP_AND_BUILD_GUIDE.md](./SETUP_AND_BUILD_GUIDE.md):
|
||||
> - Java OpenJDK 21+ установлен
|
||||
> - Android SDK установлен (через Android Studio GUI)
|
||||
> - Build Tools установлены
|
||||
> - Эмулятор настроен (см. [EMULATOR_STARTUP_GUIDE.md](./EMULATOR_STARTUP_GUIDE.md))
|
||||
|
||||
### Локальная машина (macOS)
|
||||
|
||||
| Компонент | Версия | Путь |
|
||||
|-----------|--------|------|
|
||||
| Java (OpenJDK) | 21.0.9 | `/opt/homebrew/opt/openjdk@21` |
|
||||
| Android SDK | API 34-36 | `$HOME/Library/Android/sdk` |
|
||||
| Build Tools | 35.0.1 | `$HOME/Library/Android/sdk/build-tools/35.0.1` |
|
||||
| Gradle Wrapper | 8.11.1 | `frontend/android/gradle/wrapper/` |
|
||||
| AGP | 8.7.2 | `frontend/android/build.gradle` |
|
||||
| Capacitor | 7.4.x | `frontend/package.json` |
|
||||
|
||||
### Прод-сервер
|
||||
|
||||
| Компонент | Значение |
|
||||
|-----------|----------|
|
||||
| SSH хост | `hunab-prod` (209.38.32.21) |
|
||||
| Python | 3.12+ (предустановлен) |
|
||||
| Порт proxy | 8765 (localhost) |
|
||||
|
||||
### Проверка готовности
|
||||
|
||||
```bash
|
||||
# Java
|
||||
/opt/homebrew/opt/openjdk@21/bin/java -version
|
||||
# → openjdk version "21.0.9"
|
||||
|
||||
# Android SDK
|
||||
ls $HOME/Library/Android/sdk/platforms/
|
||||
# → android-34 android-35 android-36
|
||||
|
||||
# Build Tools
|
||||
ls $HOME/Library/Android/sdk/build-tools/
|
||||
# → 35.0.1 36.1.0 (34.0.0 и 35.0.0 УДАЛЕНЫ — были пустые!)
|
||||
|
||||
# SSH к проду
|
||||
ssh hunab-prod "echo OK"
|
||||
# → OK
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Шаг 1: Maven proxy на прод-сервере
|
||||
|
||||
### 1.1 Скопировать скрипт прокси на прод
|
||||
|
||||
Создать файл `/tmp/maven-proxy.py` локально:
|
||||
|
||||
```bash
|
||||
cat > /tmp/maven-proxy.py << 'PYEOF'
|
||||
#!/usr/bin/env python3
|
||||
"""Многопоточный Maven reverse proxy для Gradle.
|
||||
Обходит Java TLS/DPI блокировку при сборке Android из РФ.
|
||||
Поддерживает GET и HEAD запросы (Gradle использует оба).
|
||||
"""
|
||||
import http.server, socketserver, urllib.request, ssl, sys
|
||||
|
||||
REPOS = {
|
||||
'/google/': 'https://dl.google.com/dl/android/maven2/',
|
||||
'/central/': 'https://repo1.maven.org/maven2/',
|
||||
'/gradle/': 'https://plugins.gradle.org/m2/',
|
||||
}
|
||||
|
||||
class H(http.server.BaseHTTPRequestHandler):
|
||||
def _p(self, m='GET'):
|
||||
for pfx, base in REPOS.items():
|
||||
if self.path.startswith(pfx):
|
||||
url = base + self.path[len(pfx):]
|
||||
try:
|
||||
r = urllib.request.urlopen(
|
||||
urllib.request.Request(url, headers={'User-Agent':'Gradle'}, method=m),
|
||||
timeout=300,
|
||||
context=ssl.create_default_context()
|
||||
)
|
||||
d = r.read() if m=='GET' else b''
|
||||
self.send_response(200)
|
||||
self.send_header('Content-Type', r.headers.get('Content-Type','application/octet-stream'))
|
||||
self.send_header('Content-Length', r.headers.get('Content-Length',str(len(d))))
|
||||
self.end_headers()
|
||||
if m=='GET': self.wfile.write(d)
|
||||
except urllib.error.HTTPError as e:
|
||||
self.send_response(e.code); self.end_headers()
|
||||
except Exception as e:
|
||||
sys.stderr.write(f"ERR {m} {url}: {e}\n"); sys.stderr.flush()
|
||||
self.send_response(502); self.end_headers()
|
||||
return
|
||||
self.send_response(404); self.end_headers()
|
||||
def do_GET(self): self._p('GET')
|
||||
def do_HEAD(self): self._p('HEAD')
|
||||
def log_message(self, fmt, *a):
|
||||
sys.stderr.write(f"{a[0]}\n"); sys.stderr.flush()
|
||||
|
||||
class S(socketserver.ThreadingMixIn, http.server.HTTPServer):
|
||||
daemon_threads = True; allow_reuse_address = True
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Maven proxy v2 on :8765 (threaded+logging)")
|
||||
sys.stdout.flush()
|
||||
S(('127.0.0.1',8765),H).serve_forever()
|
||||
PYEOF
|
||||
```
|
||||
|
||||
Скопировать на прод:
|
||||
|
||||
```bash
|
||||
scp /tmp/maven-proxy.py hunab-prod:/tmp/maven-proxy.py
|
||||
```
|
||||
|
||||
### 1.2 Запустить прокси на проде
|
||||
|
||||
```bash
|
||||
# Убить предыдущий экземпляр (НЕЛЬЗЯ использовать pkill -f maven-proxy — убьёт SSH сессию!)
|
||||
ssh hunab-prod "ps aux | grep maven-proxy | grep python | grep -v grep | awk '{print \$2}' | xargs -r kill"
|
||||
sleep 1
|
||||
|
||||
# Запустить
|
||||
ssh hunab-prod "nohup python3 /tmp/maven-proxy.py > /tmp/maven-proxy.log 2>&1 & echo PID=\$!"
|
||||
```
|
||||
|
||||
### 1.3 Проверить прокси на проде
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "curl -s -I http://127.0.0.1:8765/google/com/android/tools/build/gradle/8.7.2/gradle-8.7.2.pom | head -2"
|
||||
# Ожидаемый ответ:
|
||||
# HTTP/1.0 200 OK
|
||||
# Server: BaseHTTP/0.6 Python/3.12.7
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Шаг 2: SSH-туннель
|
||||
|
||||
### 2.1 Создать туннель
|
||||
|
||||
```bash
|
||||
# Убить старые туннели
|
||||
pkill -f "ssh.*-L.*8765" 2>/dev/null
|
||||
|
||||
# Новый туннель (фоновый режим)
|
||||
ssh -f -N -L 8765:127.0.0.1:8765 hunab-prod
|
||||
```
|
||||
|
||||
### 2.2 Проверить туннель локально
|
||||
|
||||
```bash
|
||||
curl -s -I http://127.0.0.1:8765/google/com/android/tools/build/gradle/8.7.2/gradle-8.7.2.pom | head -2
|
||||
# Ожидаемый ответ:
|
||||
# HTTP/1.0 200 OK
|
||||
# Server: BaseHTTP/0.6 Python/3.12.7
|
||||
```
|
||||
|
||||
**⚠️ Если ответ пустой или "Connection refused"** — прокси на проде не запущен или туннель не работает. Повторите шаги 1.2 и 2.1.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Шаг 3: Сборка AAB
|
||||
|
||||
### 3.1 Установка переменных окружения
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/opt/homebrew/opt/openjdk@21
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
export ANDROID_HOME=$HOME/Library/Android/sdk
|
||||
export PATH=$PATH:$ANDROID_HOME/platform-tools
|
||||
```
|
||||
|
||||
### 3.2 Сборка фронтенда (если не собран)
|
||||
|
||||
```bash
|
||||
cd /Users/eternal/code/hunabapp-dev/frontend
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### 3.3 Синхронизация Capacitor (если не сделано)
|
||||
|
||||
```bash
|
||||
cd /Users/eternal/code/hunabapp-dev/frontend
|
||||
npx cap sync android
|
||||
```
|
||||
|
||||
### 3.4 Сборка AAB
|
||||
|
||||
```bash
|
||||
cd /Users/eternal/code/hunabapp-dev/frontend/android
|
||||
|
||||
./gradlew clean bundleRelease --no-daemon --console=plain
|
||||
```
|
||||
|
||||
**Ожидаемое время:** ~1 мин 20 сек
|
||||
|
||||
### 3.5 Результат
|
||||
|
||||
```bash
|
||||
ls -lh ./app/build/outputs/bundle/release/app-release.aab
|
||||
# → 37M app-release.aab
|
||||
```
|
||||
|
||||
### 3.6 Копирование в temp/
|
||||
|
||||
```bash
|
||||
VERSION_NAME=$(grep 'versionName' ./app/build.gradle | grep -oE '"[^"]*"' | tr -d '"')
|
||||
VERSION_CODE=$(grep 'versionCode' ./app/build.gradle | grep -oE '[0-9]+')
|
||||
|
||||
mkdir -p /Users/eternal/code/hunabapp-dev/temp/android
|
||||
cp ./app/build/outputs/bundle/release/app-release.aab \
|
||||
/Users/eternal/code/hunabapp-dev/temp/android/hunab-app-v${VERSION_NAME}-v${VERSION_CODE}-release.aab
|
||||
|
||||
echo "📦 AAB: temp/android/hunab-app-v${VERSION_NAME}-v${VERSION_CODE}-release.aab"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Шаг 4: Сборка APK для эмулятора
|
||||
|
||||
> **AAB нельзя установить в эмулятор напрямую** — нужен APK.
|
||||
|
||||
```bash
|
||||
cd /Users/eternal/code/hunabapp-dev/frontend/android
|
||||
|
||||
./gradlew assembleRelease --no-daemon --console=plain
|
||||
```
|
||||
|
||||
**Ожидаемое время:** ~46 сек (после AAB сборки — кэш уже разогрет)
|
||||
|
||||
Результат:
|
||||
|
||||
```bash
|
||||
cp ./app/build/outputs/apk/release/app-release.apk \
|
||||
/Users/eternal/code/hunabapp-dev/temp/android/hunab-app-v${VERSION_NAME}-release.apk
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Шаг 5: Установка в эмулятор
|
||||
|
||||
### 5.1 Запуск эмулятора
|
||||
|
||||
```bash
|
||||
# Список доступных AVD
|
||||
$ANDROID_HOME/emulator/emulator -list-avds
|
||||
# → Pixel_5_API_35
|
||||
|
||||
# Запуск (в фоне)
|
||||
$ANDROID_HOME/emulator/emulator -avd Pixel_5_API_35 -no-snapshot-load -no-snapshot-save &
|
||||
|
||||
# Ожидание загрузки (30-60 сек)
|
||||
adb wait-for-device
|
||||
adb shell getprop sys.boot_completed
|
||||
# → 1 (когда загружено)
|
||||
```
|
||||
|
||||
### 5.2 Установка APK
|
||||
|
||||
```bash
|
||||
adb install -r /Users/eternal/code/hunabapp-dev/temp/android/hunab-app-v${VERSION_NAME}-release.apk
|
||||
```
|
||||
|
||||
### 5.3 Запуск приложения
|
||||
|
||||
```bash
|
||||
adb shell am start -n com.hunab.app/.MainActivity
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Быстрый скрипт «всё одной командой»
|
||||
|
||||
> **Предполагает:** прокси уже запущен и SSH-туннель активен (шаги 1-2).
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# === Настройка ===
|
||||
export JAVA_HOME=/opt/homebrew/opt/openjdk@21
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
export ANDROID_HOME=$HOME/Library/Android/sdk
|
||||
export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator
|
||||
|
||||
PROJECT_ROOT="/Users/eternal/code/hunabapp-dev"
|
||||
|
||||
# === Проверка прокси ===
|
||||
echo "🔍 Проверяю Maven proxy..."
|
||||
if ! curl -s -I http://127.0.0.1:8765/google/com/android/tools/build/gradle/8.7.2/gradle-8.7.2.pom | grep -q "200 OK"; then
|
||||
echo "❌ Maven proxy не работает! Запустите шаги 1-2 из BUILD_AAB_FROM_RUSSIA_GUIDE.md"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Proxy OK"
|
||||
|
||||
# === Сборка фронтенда ===
|
||||
echo "🔨 Сборка фронтенда..."
|
||||
cd "$PROJECT_ROOT/frontend"
|
||||
pnpm build
|
||||
|
||||
# === Capacitor sync ===
|
||||
echo "🔄 Capacitor sync..."
|
||||
npx cap sync android
|
||||
|
||||
# === Версия ===
|
||||
cd android
|
||||
VERSION_NAME=$(grep 'versionName' ./app/build.gradle | grep -oE '"[^"]*"' | tr -d '"')
|
||||
VERSION_CODE=$(grep 'versionCode' ./app/build.gradle | grep -oE '[0-9]+')
|
||||
echo "📊 Version: $VERSION_NAME (code: $VERSION_CODE)"
|
||||
|
||||
# === AAB ===
|
||||
echo "📦 Сборка AAB..."
|
||||
./gradlew clean bundleRelease --no-daemon --console=plain
|
||||
|
||||
mkdir -p "$PROJECT_ROOT/temp/android"
|
||||
cp ./app/build/outputs/bundle/release/app-release.aab \
|
||||
"$PROJECT_ROOT/temp/android/hunab-app-v${VERSION_NAME}-v${VERSION_CODE}-release.aab"
|
||||
echo "✅ AAB: temp/android/hunab-app-v${VERSION_NAME}-v${VERSION_CODE}-release.aab"
|
||||
|
||||
# === APK (для эмулятора) ===
|
||||
echo "📱 Сборка APK..."
|
||||
./gradlew assembleRelease --no-daemon --console=plain
|
||||
|
||||
cp ./app/build/outputs/apk/release/app-release.apk \
|
||||
"$PROJECT_ROOT/temp/android/hunab-app-v${VERSION_NAME}-release.apk"
|
||||
|
||||
# === Эмулятор ===
|
||||
echo "📲 Установка в эмулятор..."
|
||||
if adb devices 2>/dev/null | grep -q "device$"; then
|
||||
adb install -r "$PROJECT_ROOT/temp/android/hunab-app-v${VERSION_NAME}-release.apk"
|
||||
adb shell am start -n com.hunab.app/.MainActivity
|
||||
echo "🎮 Приложение запущено!"
|
||||
else
|
||||
echo "⚠️ Эмулятор не запущен. Запустите вручную и повторите установку."
|
||||
fi
|
||||
|
||||
ls -lh "$PROJECT_ROOT/temp/android/"
|
||||
echo ""
|
||||
echo "✅✅✅ ГОТОВО!"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚫 DOs & DON'Ts
|
||||
|
||||
### ✅ DO (ДЕЛАЙ)
|
||||
|
||||
| # | Правило | Почему |
|
||||
|---|---------|--------|
|
||||
| 1 | **Используй Maven proxy через SSH-туннель** | Java TLS заблокирован DPI в РФ |
|
||||
| 2 | **ТОЛЬКО прокси repos в build.gradle** (без `google()`, `mavenCentral()`) | Прямые HTTPS repos зависают навсегда |
|
||||
| 3 | **`allowInsecureProtocol = true`** для proxy repos | Прокси работает по HTTP, Gradle 8+ блокирует HTTP по умолчанию |
|
||||
| 4 | **`android.builder.sdkDownload=false`** в gradle.properties | SDK auto-download зависает на TLS |
|
||||
| 5 | **`compileSdkVersion = 36`** в variables.gradle | android-36 — base SDK, корректно установлен |
|
||||
| 6 | **`buildToolsVersion "35.0.1"`** явно в app/build.gradle | 34.0.0 и 35.0.0 не установлены (пустые папки были удалены) |
|
||||
| 7 | **Global buildToolsVersion override** через `subprojects{}` в root build.gradle | Capacitor модули тоже требуют build tools |
|
||||
| 8 | **`android.suppressUnsupportedCompileSdk=36`** в gradle.properties | Убирает warning от AGP 8.7.2 |
|
||||
| 9 | **`-Djdk.tls.client.protocols=TLSv1.2`** в org.gradle.jvmargs | Частично помогает с DPI для прямых Java TLS |
|
||||
| 10 | **`IsBaseSdk=true`** в source.properties platforms | Gradle не находит extension SDK без манифеста |
|
||||
| 11 | **`ThreadingMixIn`** в Python proxy | Gradle делает десятки параллельных запросов |
|
||||
| 12 | **HEAD + GET** в proxy | Gradle использует HEAD для проверки существования артефактов |
|
||||
| 13 | **Фоновая сборка** при запуске из Cursor | `./gradlew` через Cursor tool таймаутится через ~2 мин |
|
||||
| 14 | **Убивай pkill через `ps aux | grep | awk | xargs kill`** | Безопасный способ |
|
||||
|
||||
### ❌ DON'T (НЕ ДЕЛАЙ)
|
||||
|
||||
| # | Правило | Почему |
|
||||
|---|---------|--------|
|
||||
| 1 | **НЕ оставляй `google()` / `mavenCentral()` в repositories** | Gradle попробует их → зависнет на TLS handshake на НЕОПРЕДЕЛЁННОЕ время |
|
||||
| 2 | **НЕ используй `pkill -f maven-proxy`** через SSH | Паттерн совпадает с самой SSH командой → убивает SSH сессию (exit 255) |
|
||||
| 3 | **НЕ используй однопоточный Python HTTP server** | Gradle делает 10-50 параллельных запросов → очередь → таймаут |
|
||||
| 4 | **НЕ используй SOCKS proxy для Gradle** (`socksProxyHost`) | Java TLS через SOCKS тоже блокируется DPI |
|
||||
| 5 | **НЕ пытайся скачать Gradle cache на проде и скопировать** | Кэш привязан к хэшам и абсолютным путям — не переносим |
|
||||
| 6 | **НЕ устанавливай Android SDK через sdkmanager из РФ** | Тот же TLS блок. Устанавливай через Android Studio GUI (у студии свои настройки) |
|
||||
| 7 | **НЕ удаляй `android.builder.sdkDownload=false`** | Gradle будет пытаться скачать SDK манифесты → зависнет |
|
||||
| 8 | **НЕ используй `compileSdkVersion = 35`** | Установленный android-35 — extension SDK, Gradle без манифеста не может его найти |
|
||||
| 9 | **НЕ забывай `buildToolsVersion` в subprojects** | Capacitor-android и другие модули тоже требуют build tools |
|
||||
| 10 | **НЕ создавай APK для Google Play** | Google Play требует только AAB формат |
|
||||
| 11 | **НЕ оставляй пустые build-tools директории** | Gradle пытается их использовать → "Build Tools not found" |
|
||||
| 12 | **НЕ запускай Gradle через tool call Cursor напрямую** | Таймаут ~2 мин; запускай в фоне через `nohup ... &` |
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Конфигурация Gradle (что изменено и почему)
|
||||
|
||||
### `frontend/android/build.gradle` (корневой)
|
||||
|
||||
```groovy
|
||||
buildscript {
|
||||
repositories {
|
||||
// ТОЛЬКО прокси — прямые repos заблокированы DPI
|
||||
maven { url 'http://127.0.0.1:8765/google/'; allowInsecureProtocol = true }
|
||||
maven { url 'http://127.0.0.1:8765/central/'; allowInsecureProtocol = true }
|
||||
maven { url 'http://127.0.0.1:8765/gradle/'; allowInsecureProtocol = true }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.7.2'
|
||||
classpath 'com.google.gms:google-services:4.4.2'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
// ТОЛЬКО прокси
|
||||
maven { url 'http://127.0.0.1:8765/google/'; allowInsecureProtocol = true }
|
||||
maven { url 'http://127.0.0.1:8765/central/'; allowInsecureProtocol = true }
|
||||
maven { url 'http://127.0.0.1:8765/gradle/'; allowInsecureProtocol = true }
|
||||
}
|
||||
}
|
||||
|
||||
// Глобальный override buildToolsVersion для ВСЕХ модулей
|
||||
subprojects {
|
||||
afterEvaluate { project ->
|
||||
if (project.hasProperty('android')) {
|
||||
project.android.buildToolsVersion = "35.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Почему:**
|
||||
- `allowInsecureProtocol = true` — Gradle 8+ блокирует HTTP repos по умолчанию
|
||||
- Три прокси: Google Maven, Maven Central, Gradle Plugin Portal
|
||||
- `subprojects { afterEvaluate }` — Capacitor модули не указывают buildToolsVersion явно, AGP 8.7.2 по умолчанию ищет 34.0.0 (не установлен)
|
||||
|
||||
### `frontend/android/gradle.properties`
|
||||
|
||||
```properties
|
||||
org.gradle.jvmargs=-Xmx1536m -Djdk.tls.client.protocols=TLSv1.2
|
||||
android.useAndroidX=true
|
||||
android.builder.sdkDownload=false
|
||||
android.suppressUnsupportedCompileSdk=36
|
||||
```
|
||||
|
||||
**Почему:**
|
||||
- `-Djdk.tls.client.protocols=TLSv1.2` — принудительный TLS 1.2 (частично обходит DPI)
|
||||
- `sdkDownload=false` — блокирует авто-загрузку SDK (зависает на TLS)
|
||||
- `suppressUnsupportedCompileSdk=36` — AGP 8.7.2 не знает о SDK 36, подавляем warning
|
||||
|
||||
### `frontend/android/variables.gradle`
|
||||
|
||||
```groovy
|
||||
ext {
|
||||
compileSdkVersion = 36 // Было 35! android-35 — extension SDK, не находится без манифеста
|
||||
targetSdkVersion = 35 // Оставляем 35 для совместимости с Google Play
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**Почему:**
|
||||
- `android-35` установлен как extension SDK (path: `platforms;android-35-ext15`) — Gradle без сетевого манифеста не может его распознать как `android-35`
|
||||
- `android-36` установлен как base SDK (path: `platforms;android-36`, `IsBaseSdk=true`) — работает
|
||||
- `targetSdkVersion` остаётся 35 — это то, что Google Play учитывает
|
||||
|
||||
### `frontend/android/app/build.gradle`
|
||||
|
||||
```groovy
|
||||
android {
|
||||
compileSdk rootProject.ext.compileSdkVersion
|
||||
buildToolsVersion "35.0.1" // Добавлено явно
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### SDK Platform Patches
|
||||
|
||||
**`$HOME/Library/Android/sdk/platforms/android-35/source.properties`:**
|
||||
|
||||
```properties
|
||||
AndroidVersion.IsBaseSdk=true # Было false — Gradle не находил SDK без манифеста
|
||||
```
|
||||
|
||||
**`$HOME/Library/Android/sdk/platforms/android-35/package.xml`:**
|
||||
|
||||
```xml
|
||||
<localPackage path="platforms;android-35" ...> <!-- Было: platforms;android-35-ext15 -->
|
||||
```
|
||||
|
||||
> ⚠️ Аналогичные изменения для android-34
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### Проблема: «Still waiting for package manifests to be fetched remotely»
|
||||
|
||||
**Причина:** `android.builder.sdkDownload=true` (или не задан) → Gradle пытается скачать манифесты по HTTPS → DPI блокирует.
|
||||
|
||||
**Решение:**
|
||||
|
||||
```properties
|
||||
# gradle.properties
|
||||
android.builder.sdkDownload=false
|
||||
```
|
||||
|
||||
### Проблема: «Failed to find target with hash string 'android-35'»
|
||||
|
||||
**Причина:** Установленный SDK — extension SDK (`IsBaseSdk=false`, path `android-35-ext15`), а Gradle ищет base SDK `android-35`.
|
||||
|
||||
**Решение варианты:**
|
||||
1. Использовать `compileSdkVersion = 36` (android-36 = base SDK) ← **текущее решение**
|
||||
2. Или патчить `source.properties`: `IsBaseSdk=true` + `package.xml`: `path="platforms;android-35"`
|
||||
|
||||
### Проблема: «Failed to find Build Tools revision 34.0.0»
|
||||
|
||||
**Причина:** AGP 8.7.2 по умолчанию требует build-tools 34.0.0. При `sdkDownload=false` не может скачать.
|
||||
|
||||
**Решение:** Явно указать установленную версию в `app/build.gradle` и глобально через `subprojects` в root `build.gradle`:
|
||||
|
||||
```groovy
|
||||
buildToolsVersion "35.0.1"
|
||||
```
|
||||
|
||||
### Проблема: Gradle зависает, прокси лог пустой (0 строк)
|
||||
|
||||
**Причина:** Gradle обращается к `google()` / `mavenCentral()` напрямую, минуя прокси.
|
||||
|
||||
**Решение:** Убрать `google()` и `mavenCentral()` из repositories. Оставить ТОЛЬКО proxy URLs.
|
||||
|
||||
### Проблема: SSH exit code 255 при pkill
|
||||
|
||||
**Причина:** `pkill -f maven-proxy` совпадает с самой SSH командой и убивает сессию.
|
||||
|
||||
**Решение:**
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "ps aux | grep maven-proxy | grep python | grep -v grep | awk '{print \$2}' | xargs -r kill"
|
||||
```
|
||||
|
||||
### Проблема: Cursor tool timeout при сборке
|
||||
|
||||
**Причина:** Gradle билд занимает ~1.5 мин, Cursor tool таймаутится через ~2 мин.
|
||||
|
||||
**Решение:** Запускать в фоне:
|
||||
|
||||
```bash
|
||||
nohup bash -c '
|
||||
cd /path/to/frontend/android
|
||||
./gradlew bundleRelease --no-daemon --console=plain 2>&1 | tee /tmp/aab-build.log
|
||||
' &>/dev/null &
|
||||
|
||||
# Мониторинг
|
||||
tail -f /tmp/aab-build.log
|
||||
```
|
||||
|
||||
### Проблема: Однопоточный proxy таймаутится
|
||||
|
||||
**Причина:** Python `http.server.HTTPServer` обрабатывает 1 запрос за раз. Gradle делает 10-50 параллельных запросов.
|
||||
|
||||
**Решение:** `ThreadingMixIn`:
|
||||
|
||||
```python
|
||||
class S(socketserver.ThreadingMixIn, http.server.HTTPServer):
|
||||
daemon_threads = True
|
||||
allow_reuse_address = True
|
||||
```
|
||||
|
||||
### Проблема: Proxy возвращает 404 на HEAD запросы
|
||||
|
||||
**Причина:** `BaseHTTPRequestHandler` по умолчанию не имеет `do_HEAD`.
|
||||
|
||||
**Решение:** Добавить `do_HEAD`:
|
||||
|
||||
```python
|
||||
def do_HEAD(self): self._p('HEAD')
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Версионирование
|
||||
|
||||
### Текущая версия (2026-02-28)
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| versionName | 1.3.8 |
|
||||
| versionCode | 10308 |
|
||||
| compileSdkVersion | 36 |
|
||||
| targetSdkVersion | 35 |
|
||||
| minSdkVersion | 23 |
|
||||
| buildToolsVersion | 35.0.1 |
|
||||
| AGP | 8.7.2 |
|
||||
| Gradle | 8.11.1 |
|
||||
| Java | OpenJDK 21.0.9 |
|
||||
| Capacitor | 7.4.x |
|
||||
|
||||
### Для Google Play
|
||||
|
||||
- **AAB файл:** `temp/android/hunab-app-v1.3.8-v10308-release.aab`
|
||||
- **Размер:** ~37 MB
|
||||
- **Подписан:** `hunab-app.keystore` (release signing config)
|
||||
- **Формат:** AAB (NEVER APK for Google Play!)
|
||||
- **versionCode** должен быть **больше** предыдущего релиза!
|
||||
|
||||
### Перед новым релизом
|
||||
|
||||
1. Обновить `versionCode` и `versionName` в `frontend/android/app/build.gradle`
|
||||
2. Собрать фронтенд (`pnpm build`)
|
||||
3. `npx cap sync android`
|
||||
4. Следовать шагам 1-4 этого руководства
|
||||
|
||||
---
|
||||
|
||||
## 📁 Связанные файлы
|
||||
|
||||
| Файл | Назначение |
|
||||
|------|------------|
|
||||
| `frontend/android/build.gradle` | Корневой Gradle — repos, plugins, subprojects override |
|
||||
| `frontend/android/app/build.gradle` | App модуль — version, signing, buildTools |
|
||||
| `frontend/android/gradle.properties` | JVM args, SDK download, TLS, suppressWarnings |
|
||||
| `frontend/android/variables.gradle` | compileSdk, targetSdk, dependency versions |
|
||||
| `docs/android/guides/SETUP_AND_BUILD_GUIDE.md` | **Общее руководство по установке и сборке** (для работы не из России) |
|
||||
| `docs/android/guides/EMULATOR_STARTUP_GUIDE.md` | **Полное руководство по запуску эмулятора** |
|
||||
| `docs/android/TROUBLESHOOTING.md` | Общий troubleshooting (включая другие проблемы) |
|
||||
| `docs/android/MOBILE_BUILD_REGULATIONS.md` | Регламент сборки мобильного приложения |
|
||||
| `scripts/android/quick-build-and-launch.sh` | Старый скрипт быстрой сборки (требует адаптации под proxy) |
|
||||
|
||||
---
|
||||
|
||||
> **Последнее обновление:** 2026-02-28
|
||||
> **Автор:** Aura (Cursor AI Agent)
|
||||
> **Проверено:** Успешная сборка AAB v1.3.8 (BUILD SUCCESSFUL in 1m 21s, 112 tasks)
|
||||
|
||||
46
docs/connectivity/PROXY_CHANGELOG.md
Normal file
46
docs/connectivity/PROXY_CHANGELOG.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Changelog — Прокси ru.hunab.app
|
||||
|
||||
## [1.2] — 2026-03-14
|
||||
|
||||
### Telegram SOCKS и автозапуск при старте
|
||||
|
||||
- **Скрипт** `connectivity/scripts/telegram-socks-tunnel.sh` — подъём/остановка/проверка SOCKS5 на порту **1081** (`ssh -D 1081 ahau@149.154.64.19`). Переменные: `TELEGRAM_SOCKS_PORT`, `TELEGRAM_TUNNEL_HOST`. Порт 1081 не пересекается с Cursor (10809).
|
||||
- **LaunchAgent** `connectivity/launchd/com.hunab.telegram-socks.plist` — запуск туннеля при входе в macOS (RunAtLoad), перезапуск при обрыве (KeepAlive), ThrottleInterval 30. Лог: `/tmp/telegram-socks-tunnel.log`.
|
||||
- **Документация:** [launchd/README.md](./launchd/README.md) — установка/удаление, требования к ключу; в [PROXY_GUIDE.md](./PROXY_GUIDE.md) добавлен раздел «Telegram и SOCKS при старте» (ручная команда, автозапуск, скрипт).
|
||||
- **Обзор папки** [connectivity/README.md](./README.md) — индекс документов, скриптов, launchd и портов.
|
||||
|
||||
## [1.1] — 2026-03-03
|
||||
|
||||
### Безопасность
|
||||
|
||||
- **Расширен блок отсечения сканерских путей** (по [SCANNER_PROBES_REPORT_2026-03](../../security/SCANNER_PROBES_REPORT_2026-03.md)): в **apply-security-on-proxy.sh** и [SECURITY.md](./SECURITY.md) добавлены location не только для serverless, но и для `/.env*`, `/.git/`, `/.aws/`, `/.htaccess`, `/.htpasswd`, `/.docker/`, `/actuator/`, `wp-*`, `*.php`, `xmlrpc.php`, `config.php`, `wp-config`, `phpinfo`, дампов SQL, `secrets.yml`, `application*.yml`, `config.(yml|yaml|json)`, `database.yml`, а также путей вида `/app/.env`, `/api/.env`, `/backend/.env` и т.п.
|
||||
- Скрипт при повторном запуске на прокси с уже применённым старым блоком **заменяет** его на расширенный. Проверка «уже применено» — по наличию в конфиге строки про `.env, .git`.
|
||||
- В SECURITY.md добавлена **проверка fail2ban**: `sudo fail2ban-client status` и `sudo fail2ban-client status nginx-limit-req`.
|
||||
|
||||
## [1.0] — 2026-03-03
|
||||
|
||||
### Безопасность
|
||||
|
||||
- Добавлен **[SECURITY.md](./SECURITY.md)** — чеклист и готовые конфиги:
|
||||
- Rate limiting (limit_req_zone, limit_req) для ru.hunab.app.
|
||||
- Отсечение сканерских путей: `location` с `return 404` для `/api/serverless/*`, `serverless.yml`, `.serverless/` и т.п. (без проксирования на прод).
|
||||
- Fail2ban: пример jail и фильтра для лога `ru.hunab.app.proxy.access.log`.
|
||||
- На проде: `set_real_ip_from 149.154.64.19`, `real_ip_header X-Forwarded-For`.
|
||||
- `server_tokens off` на прокси.
|
||||
- Связь с [docs/security/SECURITY_STANDARDS.md](../../security/SECURITY_STANDARDS.md) (раздел Proxy & Edge Security).
|
||||
|
||||
### Скрипты
|
||||
|
||||
- **apply-security-on-proxy.sh** — применение правок nginx на прокси (бэкап, rate limit, server_tokens, location сканеров, `nginx -t`, reload). Запуск на сервере: `sudo bash /tmp/apply-security-on-proxy.sh`.
|
||||
- **setup-sudo-and-apply-security.sh** — один запуск: добавление NOPASSWD для ahau и вызов apply-security-on-proxy.sh (для ручного выполнения с вводом пароля sudo).
|
||||
|
||||
### Документация
|
||||
|
||||
- В [PROXY_GUIDE.md](./PROXY_GUIDE.md) добавлена секция «Безопасность» со ссылками на SECURITY.md и SECURITY_STANDARDS.
|
||||
- В SECURITY.md добавлен блок «Применение на прокси (скрипт)» с командами scp/ssh.
|
||||
|
||||
### Применено на сервере (2026-03-03)
|
||||
|
||||
- **Sudo для ahau:** добавлен `/etc/sudoers.d/ahau-nopasswd` (NOPASSWD: ALL) через root@149.154.64.19.
|
||||
- **Nginx:** внесены правки в `/etc/nginx/sites-available/ru.hunab.app.proxy`: limit_req_zone + limit_req, server_tokens off, location отсечения сканеров; выполнен `systemctl reload nginx`.
|
||||
- **Проверки:** proxy-health 200, /api/serverless/* → 404 на прокси, server без версии в ответах.
|
||||
151
docs/connectivity/PROXY_GUIDE.md
Normal file
151
docs/connectivity/PROXY_GUIDE.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 🔐 Прокси ru.hunab.app — руководство
|
||||
|
||||
**Сервер:** 149.154.64.19 | **Домен:** ru.hunab.app | **Прод:** hunab.app (209.38.32.21)
|
||||
|
||||
---
|
||||
|
||||
## Оглавление
|
||||
|
||||
1. [Доступ и файлы](#-доступ-и-файлы)
|
||||
2. [Команды управления](#-команды-управления)
|
||||
3. [Безопасность](#-безопасность)
|
||||
4. [Запросы-сканеры (serverless и др.)](#-запросы-сканеры-serverless-и-др)
|
||||
5. [Редирект на прокси](#-автоматический-редирект)
|
||||
6. [Скорость и тесты](#-проверка-скорости)
|
||||
7. [Telegram и SOCKS при старте](#-telegram-и-socks-при-старте)
|
||||
|
||||
---
|
||||
|
||||
## 🔑 Доступ и файлы
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| **SSH** | `ssh hsites-ahau` или `ssh -i ~/.ssh/id_ed25519 ahau@149.154.64.19` |
|
||||
| **SSH root** | `ssh -o StrictHostKeyChecking=accept-new -i ~/.ssh/hsites_new_deploy_key root@149.154.64.19` или `ssh hsites-new` |
|
||||
| **Пользователь** | ahau (sudo), root через ключ `hsites_new_deploy_key` |
|
||||
| **ОС** | Ubuntu 24.10 |
|
||||
|
||||
**Важные пути на сервере:**
|
||||
- Nginx: `/etc/nginx/sites-available/ru.hunab.app` (активный сайт может быть в `sites-enabled` как `ru.hunab.app.proxy`)
|
||||
- Логи: `/var/log/nginx/ru.hunab.app.proxy.access.log`, `ru.hunab.app.proxy.error.log`
|
||||
- SSL: `/etc/letsencrypt/live/ru.hunab.app/`
|
||||
- Кеш: `/var/cache/nginx/`
|
||||
|
||||
**Проверка:**
|
||||
- Сайт: https://ru.hunab.app/
|
||||
- Health: https://ru.hunab.app/proxy-health
|
||||
- API: https://ru.hunab.app/api/health
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Команды управления
|
||||
|
||||
**Nginx:** `sudo nginx -t` → `sudo systemctl reload nginx`
|
||||
**SSL:** `sudo certbot certificates`, `sudo certbot renew --dry-run`
|
||||
**Безопасность:** `sudo ufw status`, `sudo fail2ban-client status`
|
||||
**Логи:** `sudo tail -f /var/log/nginx/ru.hunab.app.proxy.access.log`
|
||||
**Кеш:** `sudo du -sh /var/cache/nginx/`; очистка: `sudo rm -rf /var/cache/nginx/*` + reload
|
||||
|
||||
**Backup конфига:** `sudo cp /etc/nginx/sites-available/ru.hunab.app /home/ahau/nginx-backup-$(date +%Y%m%d).conf`
|
||||
|
||||
**Экстренно:** `sudo systemctl stop nginx`; после правок: `sudo nginx -t && sudo systemctl start nginx`
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Безопасность
|
||||
|
||||
Чеклист и готовые конфиги (rate limiting, fail2ban, отсечение сканеров, доверенный прокси на проде, логи без утечек):
|
||||
|
||||
📖 **[SECURITY.md](./SECURITY.md)** — чеклист и nginx/fail2ban-сниппеты.
|
||||
|
||||
Связь с общими стандартами:
|
||||
|
||||
📖 **[docs/security/SECURITY_STANDARDS.md](../../security/SECURITY_STANDARDS.md)** — раздел **Proxy & Edge Security (ru.hunab.app)**.
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Запросы-сканеры (serverless и др.)
|
||||
|
||||
В логах прода с IP 149.154.64.19 видны запросы к `/api/serverless/*`, `serverless.yml`, `.serverless/` и т.п. — это **внешние боты**, не скрипты на прокси. Чтобы не гонять их на прод, на прокси добавляют `location` с `return 404` (см. [SECURITY.md](./SECURITY.md)).
|
||||
|
||||
---
|
||||
|
||||
## 🇷🇺 Автоматический редирект
|
||||
|
||||
Редирект пользователей из РФ на ru.hunab.app реализован на фронтенде (HTML + JS). Детали и тесты:
|
||||
|
||||
📖 **[AUTOMATIC_REDIRECT_SOLUTION.md](./AUTOMATIC_REDIRECT_SOLUTION.md)**
|
||||
|
||||
---
|
||||
|
||||
## 📤 Загрузка файлов на прод через туннель (scp)
|
||||
|
||||
Для передачи больших файлов (например, git bundle для очистки истории) на production (209.38.32.21) из РФ используйте SSH ProxyCommand через прокси:
|
||||
|
||||
```bash
|
||||
# Туннель: локальная машина → 149.154.64.19 (прокси) → 209.38.32.21 (прод)
|
||||
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.bundle hunab@209.38.32.21:/home/hunab/
|
||||
```
|
||||
|
||||
Проверка размера файла на сервере (через тот же туннель):
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/hunab_deploy_key -o ProxyCommand="$PROXY_CMD" hunab@209.38.32.21 "ls -la /home/hunab/file.bundle"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Проверка скорости
|
||||
|
||||
Через прокси соединение до прода быстрее, чем прямо из РФ. Замеры: ~0.29s через ru.hunab.app vs ~3.2s напрямую. Для проверки с прокси-сервера к проду: `expect temp/check_connection_speed.sh` (с локальной машины).
|
||||
|
||||
---
|
||||
|
||||
## Cursor IDE (PING timeout из РФ)
|
||||
|
||||
Если Cursor выдаёт **PING timed out** при работе из России, трафик можно пустить через тот же сервер по SOCKS (SSH -D). Подробно:
|
||||
|
||||
📖 **[docs/cursor/README.md](../docs/cursor/README.md)** — обход PING timeout через SOCKS-туннель (без отключения HTTP/2).
|
||||
|
||||
---
|
||||
|
||||
## 📱 Telegram и SOCKS при старте
|
||||
|
||||
Для стабильной связи Telegram (и других приложений) через тот же прокси поднимают SOCKS5 на **127.0.0.1:1081**:
|
||||
|
||||
```bash
|
||||
ssh -D 1081 ahau@149.154.64.19
|
||||
```
|
||||
|
||||
Порт **1081** не пересекается с туннелем Cursor (**10809**).
|
||||
|
||||
### Запуск при входе в систему (macOS)
|
||||
|
||||
Чтобы туннель поднимался при логине и перезапускался при обрыве:
|
||||
|
||||
```bash
|
||||
cp connectivity/launchd/com.hunab.telegram-socks.plist ~/Library/LaunchAgents/
|
||||
launchctl load ~/Library/LaunchAgents/com.hunab.telegram-socks.plist
|
||||
```
|
||||
|
||||
Подробности и снятие с автозапуска: **[connectivity/launchd/README.md](./launchd/README.md)**.
|
||||
|
||||
### Ручное управление
|
||||
|
||||
Скрипт из репо (start/stop/status):
|
||||
|
||||
```bash
|
||||
./connectivity/scripts/telegram-socks-tunnel.sh start # поднять
|
||||
./connectivity/scripts/telegram-socks-tunnel.sh status # проверить
|
||||
./connectivity/scripts/telegram-socks-tunnel.sh stop # остановить
|
||||
```
|
||||
|
||||
В Telegram (или другом клиенте) укажите прокси: **SOCKS5**, **127.0.0.1**, порт **1081**.
|
||||
|
||||
---
|
||||
|
||||
## SSL
|
||||
|
||||
Сертификат Let's Encrypt, обновление через certbot (timer). При первичной настройке или смене домена: временно nginx без SSL → certbot → включить полный конфиг с SSL. Скрипты в папке: `get-ssl-certificate.sh`, `setup-ssl-auto-renewal.sh` (при необходимости).
|
||||
55
docs/connectivity/README.md
Normal file
55
docs/connectivity/README.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# connectivity
|
||||
|
||||
Документация и скрипты для работы через прокси **ru.hunab.app** (149.154.64.19): доступ к продакшену, обход ограничений из РФ, туннели и автозапуск.
|
||||
|
||||
---
|
||||
|
||||
## Содержимое папки
|
||||
|
||||
| Файл / папка | Назначение |
|
||||
|--------------|------------|
|
||||
| **[PROXY_GUIDE.md](./PROXY_GUIDE.md)** | Основное руководство: SSH, Nginx, безопасность, scp через туннель, Cursor, скорость |
|
||||
| **[TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md)** | Гайд по Telegram: быстрые команды и порядок настройки с нуля на новой машине |
|
||||
| **[PROXY_CHANGELOG.md](./PROXY_CHANGELOG.md)** | История изменений (безопасность, скрипты, документация) |
|
||||
| **[BUILD_AAB_FROM_RUSSIA_GUIDE.md](./BUILD_AAB_FROM_RUSSIA_GUIDE.md)** | Сборка AAB/APK из России: Maven proxy на проде + SSH-туннель |
|
||||
| **[scripts/](./scripts/)** | Скрипты для туннелей и локальной работы |
|
||||
| **[launchd/](./launchd/)** | LaunchAgent для macOS: автозапуск SOCKS-туннеля при входе |
|
||||
|
||||
---
|
||||
|
||||
## Быстрые ссылки по задачам
|
||||
|
||||
- **Доступ по 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`
|
||||
- **Загрузка файлов на прод через прокси** — [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)
|
||||
|
||||
---
|
||||
|
||||
## Скрипты (scripts/)
|
||||
|
||||
| Скрипт | Описание |
|
||||
|--------|----------|
|
||||
| **telegram-socks-tunnel.sh** | Поднять/остановить/проверить SOCKS5 на 127.0.0.1:1081 для Telegram (и др.). Хост: ahau@149.154.64.19. Переменные: `TELEGRAM_SOCKS_PORT`, `TELEGRAM_TUNNEL_HOST`. |
|
||||
|
||||
---
|
||||
|
||||
## launchd/
|
||||
|
||||
Автозапуск SOCKS-туннеля для Telegram при входе в macOS:
|
||||
|
||||
- **com.hunab.telegram-socks.plist** — LaunchAgent (RunAtLoad, KeepAlive, порт 1081).
|
||||
- **install.sh** — один раз скопировать plist и загрузить; дальше туннель поднимается при каждом входе.
|
||||
- **uninstall.sh** — снять автозапуск.
|
||||
- **[launchd/README.md](./launchd/README.md)** — установка, удаление, требования (ключ в keychain), возможные конфликты портов.
|
||||
|
||||
---
|
||||
|
||||
## Порты (без пересечений)
|
||||
|
||||
| Порт | Назначение |
|
||||
|------|------------|
|
||||
| **1081** | Telegram (и др. приложения) — SOCKS через `scripts/telegram-socks-tunnel.sh` или LaunchAgent |
|
||||
| **10809** | Cursor IDE — SOCKS через `docs/cursor/scripts/cursor-socks-tunnel.sh` |
|
||||
146
docs/connectivity/TELEGRAM_GUIDE.md
Normal file
146
docs/connectivity/TELEGRAM_GUIDE.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# Telegram через SOCKS-туннель (ru.hunab.app)
|
||||
|
||||
Трафик Telegram идёт через прокси 149.154.64.19 по SOCKS5 на **127.0.0.1:1081**. Гайд для быстрых команд и для настройки с нуля на новой машине.
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Быстрые команды
|
||||
|
||||
```bash
|
||||
# Поднять туннель вручную
|
||||
./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. Проверка и диагностика
|
||||
|
||||
**Туннель слушает порт?**
|
||||
|
||||
```bash
|
||||
lsof -i :1081 -sTCP:LISTEN
|
||||
```
|
||||
|
||||
**Доступ к API Telegram через SOCKS?**
|
||||
|
||||
```bash
|
||||
curl -x socks5h://127.0.0.1:1081 -sI https://api.telegram.org | head -5
|
||||
```
|
||||
|
||||
Успех: в ответе есть HTTP-заголовки (например 302 или 200). Таймаут или отказ — туннель не работает или порт занят.
|
||||
|
||||
**Лог LaunchAgent (если туннель при старте не поднимается):**
|
||||
|
||||
```bash
|
||||
tail -50 /tmp/telegram-socks-tunnel.log
|
||||
```
|
||||
|
||||
Типичные причины: ключ не в keychain, ошибка «Permission denied», сеть ещё недоступна при RunAtLoad.
|
||||
|
||||
### 7. Конфликты портов
|
||||
|
||||
| Порт | Назначение |
|
||||
|-------|------------|
|
||||
| 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, логи).
|
||||
46
docs/connectivity/launchd/README.md
Normal file
46
docs/connectivity/launchd/README.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# LaunchAgent: SOCKS-туннель для Telegram при входе в систему
|
||||
|
||||
Поднимает `ssh -D 1081 ahau@149.154.64.19` при логине и перезапускает при обрыве.
|
||||
|
||||
- **Порт:** 1081 (отдельно от Cursor 10809, конфликтов нет)
|
||||
- **Сервер:** 149.154.64.19 (ru.hunab.app), пользователь ahau
|
||||
|
||||
## Установка (один раз — дальше работает при каждом входе)
|
||||
|
||||
```bash
|
||||
# из корня репо local_machine
|
||||
./connectivity/launchd/install.sh
|
||||
```
|
||||
|
||||
Скрипт копирует plist в `~/Library/LaunchAgents/` и выполняет `launchctl load`. После этого туннель будет автоматически подниматься при каждом старте/входе в систему.
|
||||
|
||||
Проверка: туннель уже должен быть поднят (RunAtLoad), порт слушает:
|
||||
|
||||
```bash
|
||||
lsof -i :1081
|
||||
# или
|
||||
./connectivity/scripts/telegram-socks-tunnel.sh status
|
||||
```
|
||||
|
||||
## Удаление
|
||||
|
||||
```bash
|
||||
./connectivity/launchd/uninstall.sh
|
||||
```
|
||||
|
||||
## Поведение
|
||||
|
||||
- **RunAtLoad** — запуск при входе в систему
|
||||
- **KeepAlive** — при обрыве SSH launchd перезапускает туннель
|
||||
- **ThrottleInterval 30** — не чаще одного перезапуска в 30 секунд при постоянных падениях
|
||||
- Лог: `/tmp/telegram-socks-tunnel.log` (при желании замените путь в plist после копирования)
|
||||
|
||||
## Требования
|
||||
|
||||
- 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`.
|
||||
|
||||
## Конфликты портов
|
||||
|
||||
- **10809** — Cursor SOCKS (скрипт `docs/cursor/scripts/cursor-socks-tunnel.sh`), не пересекается с 1081.
|
||||
- **1081** — если у вас уже слушает Shadowsocks или другой прокси, смените порт в plist (и в Telegram/приложениях) или отключите этот LaunchAgent.
|
||||
30
docs/connectivity/launchd/com.hunab.telegram-socks.plist
Normal file
30
docs/connectivity/launchd/com.hunab.telegram-socks.plist
Normal file
@@ -0,0 +1,30 @@
|
||||
<?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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.hunab.telegram-socks</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/usr/bin/ssh</string>
|
||||
<string>-D</string>
|
||||
<string>1081</string>
|
||||
<string>-N</string>
|
||||
<string>-o</string>
|
||||
<string>ServerAliveInterval=30</string>
|
||||
<string>-o</string>
|
||||
<string>ServerAliveCountMax=6</string>
|
||||
<string>ahau@149.154.64.19</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>ThrottleInterval</key>
|
||||
<integer>30</integer>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/telegram-socks-tunnel.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/telegram-socks-tunnel.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
13
docs/connectivity/launchd/install.sh
Executable file
13
docs/connectivity/launchd/install.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# Устанавливает LaunchAgent: копирует plist в ~/Library/LaunchAgents/ и загружает.
|
||||
# После этого туннель 127.0.0.1:1081 будет подниматься при каждом входе в систему.
|
||||
set -e
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PLIST_NAME="com.hunab.telegram-socks.plist"
|
||||
DST="$HOME/Library/LaunchAgents/$PLIST_NAME"
|
||||
|
||||
mkdir -p "$HOME/Library/LaunchAgents"
|
||||
cp "$SCRIPT_DIR/$PLIST_NAME" "$DST"
|
||||
launchctl load "$DST"
|
||||
echo "Installed: $DST (loaded). Tunnel will start at login."
|
||||
lsof -i :1081 -sTCP:LISTEN 2>/dev/null && echo "Port 1081 is listening." || echo "Check port 1081 in a few seconds: lsof -i :1081"
|
||||
9
docs/connectivity/launchd/uninstall.sh
Executable file
9
docs/connectivity/launchd/uninstall.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
# Снимает LaunchAgent: выгружает и удаляет plist из ~/Library/LaunchAgents/.
|
||||
set -e
|
||||
PLIST_NAME="com.hunab.telegram-socks.plist"
|
||||
DST="$HOME/Library/LaunchAgents/$PLIST_NAME"
|
||||
|
||||
launchctl unload "$DST" 2>/dev/null || true
|
||||
rm -f "$DST"
|
||||
echo "Uninstalled: $DST"
|
||||
45
docs/connectivity/scripts/telegram-socks-tunnel.sh
Executable file
45
docs/connectivity/scripts/telegram-socks-tunnel.sh
Executable file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
# SOCKS5-туннель для Telegram (и др. приложений) через прокси 149.154.64.19.
|
||||
# Порт 1081 — отдельно от Cursor (10809). Использование: ./telegram-socks-tunnel.sh [start|stop|status]
|
||||
# См. connectivity/PROXY_GUIDE.md
|
||||
|
||||
set -e
|
||||
TELEGRAM_SOCKS_PORT="${TELEGRAM_SOCKS_PORT:-1081}"
|
||||
SSH_HOST="${TELEGRAM_TUNNEL_HOST:-ahau@149.154.64.19}"
|
||||
|
||||
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
|
||||
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
|
||||
echo "Tunnel stopped (if it was running)."
|
||||
}
|
||||
|
||||
status() {
|
||||
if lsof -i :"$TELEGRAM_SOCKS_PORT" -sTCP:LISTEN -t >/dev/null 2>&1; then
|
||||
echo "SOCKS listening on 127.0.0.1:$TELEGRAM_SOCKS_PORT"
|
||||
lsof -i :"$TELEGRAM_SOCKS_PORT" -sTCP:LISTEN
|
||||
else
|
||||
echo "No SOCKS listener on port $TELEGRAM_SOCKS_PORT"
|
||||
fi
|
||||
}
|
||||
|
||||
case "${1:-start}" in
|
||||
start) start ;;
|
||||
stop) stop ;;
|
||||
status) status ;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|status}"
|
||||
echo "Env: TELEGRAM_SOCKS_PORT=$TELEGRAM_SOCKS_PORT, TELEGRAM_TUNNEL_HOST=$SSH_HOST"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
158
docs/connectivity/vpn/DEPLOY_WIREGUARD_RU.md
Normal file
158
docs/connectivity/vpn/DEPLOY_WIREGUARD_RU.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# 🚀 Развертывание WireGuard на ru.hunab.app
|
||||
|
||||
## Быстрая инструкция
|
||||
|
||||
### Шаг 1: Подключитесь к серверу
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19
|
||||
# Пароль: w99z2fBSkO4gU
|
||||
```
|
||||
|
||||
### Шаг 2: Выполните команды развертывания
|
||||
|
||||
```bash
|
||||
# Создание директорий
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
# Остановка существующего контейнера (если есть)
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
|
||||
# Запуск WireGuard контейнера
|
||||
cd /opt/app/vpn/wireguard
|
||||
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
# Ожидание создания конфигурации
|
||||
echo "Ожидание 30 секунд для создания конфигурации..."
|
||||
sleep 30
|
||||
|
||||
# Настройка Firewall
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU'
|
||||
sudo ufw reload
|
||||
|
||||
# Проверка статуса
|
||||
docker ps | grep wireguard
|
||||
|
||||
# Просмотр конфигурации клиента
|
||||
echo "=== Конфигурация клиента ==="
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
```
|
||||
|
||||
### Шаг 3: Скопируйте конфигурацию
|
||||
|
||||
**С вашего компьютера:**
|
||||
|
||||
```bash
|
||||
# Скопируйте конфигурацию
|
||||
scp ahau@149.154.64.19:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/wg-ru.conf
|
||||
```
|
||||
|
||||
**Или просмотрите и скопируйте вручную:**
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 'cat /opt/app/vpn/wireguard/config/peer1/peer1.conf'
|
||||
```
|
||||
|
||||
Затем скопируйте содержимое в файл `docs/hotspot/wg-ru.conf`.
|
||||
|
||||
### Шаг 4: Импортируйте в WireGuard на Android
|
||||
|
||||
1. Скопируйте файл `wg-ru.conf` на телефон
|
||||
2. Откройте приложение WireGuard
|
||||
3. Нажмите **"+"** → **"Создать из файла или архива"**
|
||||
4. Выберите файл `wg-ru.conf`
|
||||
5. Подключитесь!
|
||||
|
||||
---
|
||||
|
||||
## Проверка работы
|
||||
|
||||
После импорта конфигурации проверьте:
|
||||
|
||||
1. **IP адрес должен быть российским:**
|
||||
- Откройте https://whatismyipaddress.com/
|
||||
- Должен отображаться IP: **149.154.64.19**
|
||||
|
||||
2. **Подключение активно:**
|
||||
- В приложении WireGuard статус должен быть "Подключено"
|
||||
|
||||
---
|
||||
|
||||
## Управление
|
||||
|
||||
### Просмотр статуса
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "docker ps | grep wireguard"
|
||||
```
|
||||
|
||||
### Просмотр логов
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "docker logs hunab-vpn-wireguard-ru"
|
||||
```
|
||||
|
||||
### Перезапуск
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "docker restart hunab-vpn-wireguard-ru"
|
||||
```
|
||||
|
||||
### Остановка
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "docker stop hunab-vpn-wireguard-ru"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Решение проблем
|
||||
|
||||
### Конфигурация не создается
|
||||
|
||||
Подождите еще 30-60 секунд и проверьте:
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "ls -la /opt/app/vpn/wireguard/config/peer1/"
|
||||
```
|
||||
|
||||
### Контейнер не запускается
|
||||
|
||||
Проверьте логи:
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "docker logs hunab-vpn-wireguard-ru"
|
||||
```
|
||||
|
||||
### Порт занят
|
||||
|
||||
Проверьте, что порт 51820 свободен:
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "sudo netstat -tuln | grep 51820"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Готово!
|
||||
|
||||
После выполнения всех шагов у вас будет рабочий WireGuard конфиг `wg-ru.conf` для использования из России! 🎉
|
||||
43
docs/connectivity/vpn/FINAL_DEPLOY_INSTRUCTIONS.md
Normal file
43
docs/connectivity/vpn/FINAL_DEPLOY_INSTRUCTIONS.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# 🚀 Финальные инструкции для получения рабочего конфига
|
||||
|
||||
## Проблема
|
||||
SSH порт 22 на сервере 149.154.64.19 закрыт, поэтому автоматическое развертывание невозможно.
|
||||
|
||||
## Решение
|
||||
|
||||
### Вариант 1: Если у вас есть доступ к серверу через другой терминал
|
||||
|
||||
1. **Выполните команду из файла `ONE_LINE_DEPLOY.txt`:**
|
||||
```bash
|
||||
cat docs/vpn/ONE_LINE_DEPLOY.txt
|
||||
```
|
||||
Скопируйте команду и выполните в SSH сеансе на сервере.
|
||||
|
||||
2. **После выполнения получите конфигурацию:**
|
||||
```bash
|
||||
./docs/vpn/scripts/get-wg-ru-config.sh
|
||||
```
|
||||
Или вручную:
|
||||
```bash
|
||||
scp ahau@149.154.64.19:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/wg-ru.conf
|
||||
```
|
||||
|
||||
### Вариант 2: Если SSH порт открыт на другом порту
|
||||
|
||||
Используйте команду с указанием порта:
|
||||
```bash
|
||||
ssh -p <PORT> ahau@149.154.64.19
|
||||
```
|
||||
|
||||
### Вариант 3: Если WireGuard уже развернут
|
||||
|
||||
Просто получите конфигурацию:
|
||||
```bash
|
||||
./docs/vpn/scripts/get-wg-ru-config.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## После получения конфигурации
|
||||
|
||||
Файл `docs/vpn/wg-ru.conf` будет содержать рабочий конфиг для импорта в WireGuard на Android.
|
||||
288
docs/connectivity/vpn/MAC_CLIENTS.md
Normal file
288
docs/connectivity/vpn/MAC_CLIENTS.md
Normal file
@@ -0,0 +1,288 @@
|
||||
# 🍎 macOS - Клиенты для Shadowsocks
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Руководство по установке и настройке различных VPN клиентов для macOS.
|
||||
|
||||
**Параметры подключения:**
|
||||
```
|
||||
Server: 209.38.32.21
|
||||
Port: 8388
|
||||
Password: bNkSbuMQXgMXmuBLPQCA5cSUE
|
||||
Method: chacha20-ietf-poly1305
|
||||
```
|
||||
|
||||
**URI для импорта:**
|
||||
```
|
||||
ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpiTmtTYnVNUVhnTVhtdUJMUFFDQTVjU1VFQDIwOS4zOC4zMi4yMTo4Mzg4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Рекомендуемые клиенты
|
||||
|
||||
### 1. ⭐ shadowsocks-libev (CLI) - Рекомендуется
|
||||
|
||||
**Почему:**
|
||||
- ✅ Работает без GUI приложений
|
||||
- ✅ Автозапуск при входе в систему
|
||||
- ✅ Стабильная работа
|
||||
- ✅ Низкое потребление ресурсов
|
||||
|
||||
**Установка:**
|
||||
```bash
|
||||
brew install shadowsocks-libev
|
||||
```
|
||||
|
||||
**Настройка:** См. [SHADOWSOCKS.md](./SHADOWSOCKS.md#macos)
|
||||
|
||||
**Управление:**
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/toggle-shadowsocks-proxy.sh # Переключение прокси
|
||||
./scripts/check-proxy-status.sh # Проверка статуса
|
||||
./scripts/fix-shadowsocks.sh # Автоматическое исправление
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. ⭐ ClashX
|
||||
|
||||
**Почему:**
|
||||
- ✅ Очень популярный клиент
|
||||
- ✅ Правила маршрутизации
|
||||
- ✅ Поддержка множества протоколов
|
||||
|
||||
**Установка:**
|
||||
1. Скачайте с: https://github.com/yichengchen/clashX/releases
|
||||
2. Или используйте ClashX Meta: https://github.com/MetaCubeX/ClashX.Meta/releases
|
||||
|
||||
**Настройка:**
|
||||
|
||||
1. Откройте ClashX → **Config** → **Edit Config**
|
||||
2. Замените содержимое на:
|
||||
|
||||
```yaml
|
||||
port: 7890
|
||||
socks-port: 7891
|
||||
allow-lan: false
|
||||
mode: rule
|
||||
log-level: info
|
||||
external-controller: 127.0.0.1:9090
|
||||
|
||||
proxies:
|
||||
- name: "Hunab Shadowsocks"
|
||||
type: ss
|
||||
server: 209.38.32.21
|
||||
port: 8388
|
||||
cipher: chacha20-ietf-poly1305
|
||||
password: bNkSbuMQXgMXmuBLPQCA5cSUE
|
||||
|
||||
proxy-groups:
|
||||
- name: "Proxy"
|
||||
type: select
|
||||
proxies:
|
||||
- "Hunab Shadowsocks"
|
||||
- DIRECT
|
||||
|
||||
- name: "Auto"
|
||||
type: url-test
|
||||
proxies:
|
||||
- "Hunab Shadowsocks"
|
||||
url: 'http://www.gstatic.com/generate_204'
|
||||
interval: 300
|
||||
|
||||
rules:
|
||||
- DOMAIN-SUFFIX,local,DIRECT
|
||||
- IP-CIDR,127.0.0.0/8,DIRECT
|
||||
- IP-CIDR,172.16.0.0/12,DIRECT
|
||||
- IP-CIDR,192.168.0.0/16,DIRECT
|
||||
- IP-CIDR,10.0.0.0/8,DIRECT
|
||||
- GEOIP,CN,DIRECT
|
||||
- MATCH,Proxy
|
||||
```
|
||||
|
||||
3. **Config** → **Reload Config**
|
||||
4. **Proxy** → **Hunab Shadowsocks**
|
||||
5. Включите **Set as System Proxy**
|
||||
|
||||
**GitHub:** https://github.com/yichengchen/clashX
|
||||
|
||||
---
|
||||
|
||||
### 3. ⭐ V2rayU
|
||||
|
||||
**Почему:**
|
||||
- ✅ Простая установка через Homebrew
|
||||
- ✅ Поддержка Shadowsocks из коробки
|
||||
- ✅ Простой интерфейс
|
||||
|
||||
**Установка:**
|
||||
```bash
|
||||
brew install --cask v2rayu
|
||||
```
|
||||
|
||||
**Настройка:**
|
||||
1. Откройте V2rayU
|
||||
2. **Servers** → **Add Server** → **Shadowsocks**
|
||||
3. Введите параметры подключения
|
||||
4. Выберите сервер и подключитесь
|
||||
|
||||
**GitHub:** https://github.com/yanue/V2rayU
|
||||
|
||||
---
|
||||
|
||||
### 4. ⭐ Outline
|
||||
|
||||
**Почему:**
|
||||
- ✅ Очень простой интерфейс
|
||||
- ✅ Разработан Google (Jigsaw)
|
||||
- ✅ Автоматическая настройка
|
||||
|
||||
**Установка:**
|
||||
- Mac App Store: https://apps.apple.com/app/outline/id1356177741
|
||||
- Или прямая загрузка: https://github.com/Jigsaw-Code/outline-client/releases
|
||||
|
||||
**Настройка:**
|
||||
1. Откройте Outline
|
||||
2. Нажмите **"+"** → **"Enter access key"**
|
||||
3. Вставьте ключ:
|
||||
```
|
||||
ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpiTmtTYnVNUVhnTVhtdUJMUFFDQTVjU1VFQDIwOS4zOC4zMi4yMTo4Mzg4
|
||||
```
|
||||
4. Подключитесь
|
||||
|
||||
**GitHub:** https://github.com/Jigsaw-Code/outline-client
|
||||
|
||||
---
|
||||
|
||||
### 5. ShadowsocksX-NG
|
||||
|
||||
**Установка:**
|
||||
```bash
|
||||
brew install --cask shadowsocksx-ng
|
||||
```
|
||||
|
||||
**Настройка:**
|
||||
1. Откройте приложение → **Server Preferences** → **"+"**
|
||||
2. Введите параметры подключения
|
||||
3. Выберите сервер в меню и подключитесь
|
||||
4. Включите **"System Proxy"**
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Настройка системного прокси
|
||||
|
||||
### Автоматическая настройка (shadowsocks-libev)
|
||||
|
||||
Используйте скрипты:
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/enable-shadowsocks-full.sh # Включить для всего трафика
|
||||
```
|
||||
|
||||
### Ручная настройка
|
||||
|
||||
1. **System Settings** → **Network**
|
||||
2. Выберите активное подключение (Wi-Fi/Ethernet)
|
||||
3. **Details...** → **Proxies**
|
||||
4. Включите **SOCKS Proxy**:
|
||||
- Server: `127.0.0.1`
|
||||
- Port: `1080`
|
||||
5. Нажмите **OK**
|
||||
|
||||
**Или через командную строку:**
|
||||
```bash
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 1080
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" on
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Переключение между Chrome VPN и Shadowsocks
|
||||
|
||||
### Использовать Chrome VPN
|
||||
|
||||
1. Выключите системный прокси:
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/toggle-shadowsocks-proxy.sh
|
||||
```
|
||||
2. Используйте Chrome VPN как обычно
|
||||
|
||||
### Использовать Shadowsocks
|
||||
|
||||
1. Включите системный прокси:
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/toggle-shadowsocks-proxy.sh
|
||||
```
|
||||
2. **Полностью закройте Chrome** (Cmd+Q)
|
||||
3. Откройте Chrome заново
|
||||
4. Проверьте IP: https://whatismyipaddress.com/
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Решение проблем
|
||||
|
||||
### Браузер показывает старый IP
|
||||
|
||||
1. **Отключите Chrome VPN расширение** (если активно)
|
||||
2. **Проверьте настройки Chrome:** `chrome://settings/system` → "Use system proxy settings"
|
||||
3. **Полностью закройте Chrome:** Cmd+Q
|
||||
4. **Откройте Chrome заново**
|
||||
|
||||
**Или используйте скрипт:**
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/fix-shadowsocks.sh
|
||||
```
|
||||
|
||||
### Прокси не работает
|
||||
|
||||
1. Проверьте статус:
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/check-proxy-status.sh
|
||||
```
|
||||
|
||||
2. Перезапустите Shadowsocks:
|
||||
```bash
|
||||
launchctl unload ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
```
|
||||
|
||||
### Firefox не использует системный прокси
|
||||
|
||||
Настройте вручную:
|
||||
1. **Preferences** → **Network Settings**
|
||||
2. **Manual proxy configuration**
|
||||
3. **SOCKS Host:** `127.0.0.1`
|
||||
4. **Port:** `1080`
|
||||
5. **SOCKS v5**
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сравнение клиентов
|
||||
|
||||
| Клиент | Простота | Функции | Установка | Рекомендация |
|
||||
|--------|----------|---------|-----------|--------------|
|
||||
| **shadowsocks-libev** | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ **ЛУЧШИЙ** |
|
||||
| **ClashX** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ Очень популярный |
|
||||
| **V2rayU** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ Хороший баланс |
|
||||
| **Outline** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ Очень простой |
|
||||
| **ShadowsocksX-NG** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ Оригинал |
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [Shadowsocks полное руководство](./SHADOWSOCKS.md)
|
||||
- [Скрипты управления](./scripts/)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0
|
||||
**Дата:** 2025-01-XX
|
||||
|
||||
1
docs/connectivity/vpn/ONE_LINE_DEPLOY.txt
Normal file
1
docs/connectivity/vpn/ONE_LINE_DEPLOY.txt
Normal file
@@ -0,0 +1 @@
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config && sudo chown -R ahau:ahau /opt/app/vpn && docker stop hunab-vpn-wireguard-ru 2>/dev/null; docker rm hunab-vpn-wireguard-ru 2>/dev/null; cd /opt/app/vpn/wireguard && docker run -d --name hunab-vpn-wireguard-ru --cap-add=NET_ADMIN --cap-add=SYS_MODULE -e PUID=1000 -e PGID=1000 -e TZ=Europe/Moscow -e SERVERURL=149.154.64.19 -e SERVERPORT=51820 -e PEERS=1 -e PEERDNS=8.8.8.8 -e INTERNAL_SUBNET=10.14.14.0 -v /opt/app/vpn/wireguard/config:/config -p 51820:51820/udp --sysctl="net.ipv4.conf.all.src_valid_mark=1" --restart unless-stopped linuxserver/wireguard:latest && echo "Ожидание 45 секунд..." && sleep 45 && sudo ufw allow 51820/udp comment "WireGuard VPN RU" && sudo ufw reload && echo "=== КОНФИГУРАЦИЯ ===" && cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
54
docs/connectivity/vpn/QUICK_DEPLOY_WG_RU.md
Normal file
54
docs/connectivity/vpn/QUICK_DEPLOY_WG_RU.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# 🚀 Быстрое развертывание WireGuard на ru.hunab.app
|
||||
|
||||
## Выполните эти команды в SSH сеансе на сервере
|
||||
|
||||
```bash
|
||||
# 1. Создание директорий
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
# 2. Остановка старых контейнеров
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
|
||||
# 3. Запуск WireGuard
|
||||
cd /opt/app/vpn/wireguard
|
||||
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
# 4. Ожидание (45 секунд)
|
||||
sleep 45
|
||||
|
||||
# 5. Firewall
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU'
|
||||
sudo ufw reload
|
||||
|
||||
# 6. Просмотр конфигурации
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
```
|
||||
|
||||
## После выполнения команд
|
||||
|
||||
Скопируйте вывод команды `cat` и вставьте в файл `docs/vpn/wg-ru.conf`
|
||||
|
||||
Или выполните с вашего компьютера:
|
||||
|
||||
```bash
|
||||
scp ahau@149.154.64.19:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/wg-ru.conf
|
||||
```
|
||||
115
docs/connectivity/vpn/README.md
Normal file
115
docs/connectivity/vpn/README.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# 🔐 VPN Решения для Hunab.app
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Документация по VPN решениям для сервера 209.38.32.21. Все решения развернуты через Docker и готовы к использованию.
|
||||
|
||||
**Сервер:** 209.38.32.21 (Ubuntu 24.10)
|
||||
**Архитектура:** Docker-based deployment
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Shadowsocks (Рекомендуется для обхода блокировок)
|
||||
|
||||
**Лучший выбор для обхода строгих блокировок и цензуры.**
|
||||
|
||||
- 📖 [Полное руководство](./SHADOWSOCKS.md)
|
||||
- ⚡ Быстрый старт: `bash scripts/deployment/deploy-vpn-shadowsocks.sh`
|
||||
- 📱 [Android инструкция](./SHADOWSOCKS.md#android)
|
||||
- 🍎 [macOS инструкция](./SHADOWSOCKS.md#macos)
|
||||
|
||||
**Параметры подключения:**
|
||||
```
|
||||
Server: 209.38.32.21
|
||||
Port: 8388
|
||||
Password: bNkSbuMQXgMXmuBLPQCA5cSUE
|
||||
Method: chacha20-ietf-poly1305
|
||||
```
|
||||
|
||||
### WireGuard (Рекомендуется для обычного использования)
|
||||
|
||||
**Проще в настройке, полное туннелирование из коробки.**
|
||||
|
||||
- 📖 [Полное руководство](./WIREGUARD.md)
|
||||
- ⚡ Быстрый старт: `bash scripts/deployment/deploy-vpn-wireguard.sh`
|
||||
|
||||
---
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
### Основные руководства
|
||||
|
||||
- **[SHADOWSOCKS.md](./SHADOWSOCKS.md)** - Полное руководство по Shadowsocks
|
||||
- Развертывание сервера
|
||||
- Настройка клиентов (Android, macOS, CLI)
|
||||
- Решение проблем
|
||||
- Управление и мониторинг
|
||||
|
||||
- **[MAC_CLIENTS.md](./MAC_CLIENTS.md)** - Клиенты для macOS
|
||||
- ShadowsocksX-NG, ClashX, V2rayU, Outline
|
||||
- Настройка системного прокси
|
||||
- Решение проблем с браузерами
|
||||
- Альтернативные клиенты
|
||||
|
||||
- **[WIREGUARD.md](./WIREGUARD.md)** - Руководство по WireGuard
|
||||
- Развертывание
|
||||
- Настройка клиентов
|
||||
- Управление
|
||||
|
||||
- **[WHONIX.md](./WHONIX.md)** - Whonix для приватности
|
||||
- Установка на Mac
|
||||
- Настройка для Apple Silicon
|
||||
- Использование
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Скрипты
|
||||
|
||||
Все скрипты находятся в папке `scripts/`:
|
||||
|
||||
- `scripts/toggle-shadowsocks-proxy.sh` - Переключение системного прокси
|
||||
- `scripts/check-proxy-status.sh` - Проверка статуса прокси
|
||||
- `scripts/fix-shadowsocks.sh` - Автоматическое исправление
|
||||
- `scripts/enable-shadowsocks-full.sh` - Включение для всего трафика
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/toggle-shadowsocks-proxy.sh
|
||||
./scripts/check-proxy-status.sh
|
||||
./scripts/fix-shadowsocks.sh
|
||||
./scripts/enable-shadowsocks-full.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сравнение решений
|
||||
|
||||
| Критерий | Shadowsocks | WireGuard |
|
||||
|----------|-------------|-----------|
|
||||
| **Скорость** | 90-95% | 85-95% |
|
||||
| **Обход блокировок** | 🏆 Лучший | Хороший |
|
||||
| **Обнаружимость DPI** | 🏆 Сложнее | Легче |
|
||||
| **Настройка** | Простая | Очень простая |
|
||||
| **Полное туннелирование** | Требует настройку | Из коробки |
|
||||
|
||||
**Рекомендация:**
|
||||
- **Для обхода блокировок:** Shadowsocks
|
||||
- **Для обычного использования:** WireGuard
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [Shadowsocks Official](https://shadowsocks.org/)
|
||||
- [WireGuard Official](https://www.wireguard.com/)
|
||||
- [Whonix Official](https://www.whonix.org/)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0
|
||||
**Дата:** 2025-01-XX
|
||||
**Статус:** ✅ Актуально
|
||||
|
||||
214
docs/connectivity/vpn/RU_PROXY_SERVER_ACCESS.md
Normal file
214
docs/connectivity/vpn/RU_PROXY_SERVER_ACCESS.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# 🔐 Доступы и команды управления прокси-сервером
|
||||
|
||||
## 🌐 Сервер ru.hunab.app
|
||||
**IP:** 149.154.64.19
|
||||
**Провайдер:** Российский VPS
|
||||
**ОС:** Ubuntu 24.10
|
||||
|
||||
## 🔑 SSH Доступ
|
||||
```bash
|
||||
ssh ahau@149.154.64.19
|
||||
```
|
||||
**Пароль:** w99z2fBSkO4gU
|
||||
|
||||
**Альтернативный доступ с ключом:**
|
||||
```bash
|
||||
ssh -i ~/.ssh/id_rsa_ahau ahau@149.154.64.19
|
||||
```
|
||||
|
||||
## 👤 Пользователи
|
||||
- **ahau** - основной пользователь с sudo правами
|
||||
- **root** - доступен через ahau + sudo
|
||||
|
||||
## 🌍 URL'ы для проверки
|
||||
- **Основной сайт:** https://ru.hunab.app/
|
||||
- **Health check:** https://ru.hunab.app/proxy-health
|
||||
- **API:** https://ru.hunab.app/api/health
|
||||
|
||||
## 📁 Важные файлы
|
||||
```bash
|
||||
# NGINX конфигурация
|
||||
/etc/nginx/sites-available/ru.hunab.app
|
||||
|
||||
# SSL сертификаты
|
||||
/etc/letsencrypt/live/ru.hunab.app/
|
||||
|
||||
# Логи
|
||||
/var/log/nginx/ru.hunab.app.access.log
|
||||
/var/log/nginx/ru.hunab.app.error.log
|
||||
|
||||
# Кеш
|
||||
/var/cache/nginx/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 КОМАНДЫ УПРАВЛЕНИЯ
|
||||
|
||||
### 🌐 NGINX Управление
|
||||
```bash
|
||||
# Проверка статуса
|
||||
sudo systemctl status nginx
|
||||
|
||||
# Проверка конфигурации
|
||||
sudo nginx -t
|
||||
|
||||
# Перезагрузка конфигурации
|
||||
sudo systemctl reload nginx
|
||||
|
||||
# Полный перезапуск
|
||||
sudo systemctl restart nginx
|
||||
|
||||
# Просмотр активных сайтов
|
||||
sudo nginx -T | grep server_name
|
||||
```
|
||||
|
||||
### 🔒 SSL/TLS Управление
|
||||
```bash
|
||||
# Проверка сертификатов
|
||||
sudo certbot certificates
|
||||
|
||||
# Тест автообновления
|
||||
sudo certbot renew --dry-run
|
||||
|
||||
# Ручное обновление
|
||||
sudo certbot renew
|
||||
|
||||
# Проверка статуса автообновления
|
||||
sudo systemctl status certbot.timer
|
||||
sudo systemctl list-timers | grep certbot
|
||||
```
|
||||
|
||||
### 🛡️ Безопасность и Мониторинг
|
||||
```bash
|
||||
# UFW Firewall
|
||||
sudo ufw status verbose
|
||||
sudo ufw reload
|
||||
|
||||
# Fail2ban
|
||||
sudo systemctl status fail2ban
|
||||
sudo fail2ban-client status
|
||||
sudo fail2ban-client status nginx-limit-req
|
||||
|
||||
# Просмотр заблокированных IP
|
||||
sudo fail2ban-client get nginx-limit-req banip
|
||||
```
|
||||
|
||||
### 📊 Логи и Мониторинг
|
||||
```bash
|
||||
# NGINX логи
|
||||
sudo tail -f /var/log/nginx/ru.hunab.app.access.log
|
||||
sudo tail -f /var/log/nginx/ru.hunab.app.error.log
|
||||
|
||||
# Анализ трафика
|
||||
sudo grep "$(date '+%d/%b/%Y')" /var/log/nginx/ru.hunab.app.access.log | wc -l
|
||||
|
||||
# Поиск ошибок
|
||||
sudo grep -i error /var/log/nginx/ru.hunab.app.error.log | tail -20
|
||||
|
||||
# Системные логи
|
||||
sudo journalctl -u nginx -f
|
||||
sudo journalctl -u fail2ban -f
|
||||
```
|
||||
|
||||
### 🧪 Тестирование
|
||||
```bash
|
||||
# Health check прокси
|
||||
curl -I https://ru.hunab.app/proxy-health
|
||||
|
||||
# Проверка основного сайта
|
||||
curl -I https://ru.hunab.app/
|
||||
|
||||
# Проверка API
|
||||
curl -I https://ru.hunab.app/api/health
|
||||
|
||||
# Тест скорости ответа
|
||||
curl -w "@-" -o /dev/null -s https://ru.hunab.app/ <<'EOF'
|
||||
time_namelookup: %{time_namelookup}\n
|
||||
time_connect: %{time_connect}\n
|
||||
time_appconnect: %{time_appconnect}\n
|
||||
time_pretransfer: %{time_pretransfer}\n
|
||||
time_redirect: %{time_redirect}\n
|
||||
time_starttransfer: %{time_starttransfer}\n
|
||||
----------\n
|
||||
time_total: %{time_total}\n
|
||||
EOF
|
||||
```
|
||||
|
||||
### 💾 Кеширование
|
||||
```bash
|
||||
# Очистка кеша NGINX
|
||||
sudo rm -rf /var/cache/nginx/*
|
||||
sudo systemctl reload nginx
|
||||
|
||||
# Проверка размера кеша
|
||||
sudo du -sh /var/cache/nginx/
|
||||
|
||||
# Просмотр кешированных файлов
|
||||
sudo find /var/cache/nginx/ -type f | head -10
|
||||
```
|
||||
|
||||
### 🔄 Backup и Восстановление
|
||||
```bash
|
||||
# Backup конфигурации
|
||||
sudo cp /etc/nginx/sites-available/ru.hunab.app /home/ahau/nginx-backup-$(date +%Y%m%d).conf
|
||||
|
||||
# Backup SSL сертификатов
|
||||
sudo tar -czf /home/ahau/ssl-backup-$(date +%Y%m%d).tar.gz /etc/letsencrypt/
|
||||
|
||||
# Проверка свободного места
|
||||
df -h
|
||||
```
|
||||
|
||||
### ⚡ Быстрые диагностические команды
|
||||
```bash
|
||||
# Полная проверка состояния системы
|
||||
echo "=== NGINX Status ===" && sudo systemctl status nginx --no-pager && \
|
||||
echo "=== SSL Certificates ===" && sudo certbot certificates && \
|
||||
echo "=== Firewall Status ===" && sudo ufw status && \
|
||||
echo "=== Current Connections ===" && sudo ss -tuln | grep -E ':80|:443' && \
|
||||
echo "=== Recent Access ===" && sudo tail -5 /var/log/nginx/ru.hunab.app.access.log
|
||||
|
||||
# Проверка производительности
|
||||
echo "=== CPU Load ===" && uptime && \
|
||||
echo "=== Memory Usage ===" && free -h && \
|
||||
echo "=== Disk Usage ===" && df -h && \
|
||||
echo "=== Network Connections ===" && sudo netstat -anp | grep nginx | wc -l
|
||||
```
|
||||
|
||||
### 🚨 Экстренные команды
|
||||
```bash
|
||||
# Экстренная остановка NGINX
|
||||
sudo systemctl stop nginx
|
||||
|
||||
# Экстренный запуск с минимальной конфигурацией
|
||||
sudo nginx -t && sudo systemctl start nginx
|
||||
|
||||
# Откат к предыдущей конфигурации
|
||||
sudo cp /home/ahau/nginx-backup-YYYYMMDD.conf /etc/nginx/sites-available/ru.hunab.app
|
||||
sudo systemctl reload nginx
|
||||
|
||||
# Проверка процессов NGINX
|
||||
sudo ps aux | grep nginx
|
||||
sudo pgrep nginx | xargs sudo kill -9 # Крайний случай!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ ВАЖНЫЕ ЗАМЕТКИ
|
||||
- Прокси настроен и работает в production
|
||||
- SSL автообновление активно (certbot.timer)
|
||||
- Все security компоненты настроены
|
||||
- Требуется только мониторинг работоспособности
|
||||
|
||||
## 🇷🇺 АВТОМАТИЧЕСКИЙ РЕДИРЕКТ
|
||||
|
||||
**Статус:** ✅ РЕАЛИЗОВАНО И РАЗВЕРНУТО (8 декабря 2025)
|
||||
**Версия:** v3.0
|
||||
|
||||
Автоматический редирект российских пользователей на `ru.hunab.app` реализован на фронтенде:
|
||||
- Немедленный редирект в HTML (до загрузки JS)
|
||||
- Проверка загрузки статических ресурсов
|
||||
- Автоматический редирект в JavaScript
|
||||
|
||||
📖 **Детальная документация:** [`AUTOMATIC_REDIRECT_SOLUTION.md`](./AUTOMATIC_REDIRECT_SOLUTION.md)
|
||||
347
docs/connectivity/vpn/SHADOWSOCKS.md
Normal file
347
docs/connectivity/vpn/SHADOWSOCKS.md
Normal file
@@ -0,0 +1,347 @@
|
||||
# 🚀 Shadowsocks VPN - Полное руководство
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Shadowsocks VPN - **лучший выбор для обхода строгих блокировок**. Маскирует трафик под обычный веб-трафик, что делает его очень эффективным против DPI (Deep Packet Inspection) и интернет-цензуры.
|
||||
|
||||
**Преимущества:**
|
||||
- ✅ **90-95% от пропускной способности** (очень быстрый)
|
||||
- ✅ **Сложнее обнаружить** через DPI
|
||||
- ✅ **Эффективен против цензуры** (разработан для Китая)
|
||||
- ✅ **TCP протокол** (проходит через корпоративные прокси)
|
||||
|
||||
**Параметры подключения:**
|
||||
```
|
||||
Server: 209.38.32.21
|
||||
Port: 8388
|
||||
Password: bNkSbuMQXgMXmuBLPQCA5cSUE
|
||||
Method: chacha20-ietf-poly1305
|
||||
```
|
||||
|
||||
**URI для импорта:**
|
||||
```
|
||||
ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpiTmtTYnVNUVhnTVhtdUJMUFFDQTVjU1VFQDIwOS4zOC4zMi4yMTo4Mzg4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Развертывание сервера
|
||||
|
||||
### Автоматическое развертывание
|
||||
|
||||
```bash
|
||||
bash scripts/deployment/deploy-vpn-shadowsocks.sh
|
||||
```
|
||||
|
||||
Скрипт автоматически:
|
||||
1. ✅ Проверит подключение к серверу
|
||||
2. ✅ Сгенерирует безопасный пароль
|
||||
3. ✅ Создаст необходимые директории
|
||||
4. ✅ Настроит Docker контейнер
|
||||
5. ✅ Обновит firewall правила
|
||||
6. ✅ Запустит VPN сервер
|
||||
7. ✅ Создаст клиентскую конфигурацию
|
||||
|
||||
### Статус сервера
|
||||
|
||||
**Контейнер:** `hunab-vpn-shadowsocks`
|
||||
**Статус:** ✅ Запущен и работает
|
||||
**Порт:** 8388 (TCP/UDP)
|
||||
**Firewall:** ✅ Настроен
|
||||
|
||||
**Проверка статуса:**
|
||||
```bash
|
||||
ssh hunab-prod "docker ps | grep shadowsocks"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 Настройка клиентов
|
||||
|
||||
### Android
|
||||
|
||||
1. Установите приложение **Shadowsocks** из Google Play (разработчик: Max Lv)
|
||||
2. Нажмите **"+"** → **"Manual Settings"**
|
||||
3. Введите параметры:
|
||||
```
|
||||
Server: 209.38.32.21
|
||||
Remote Port: 8388
|
||||
Password: bNkSbuMQXgMXmuBLPQCA5cSUE
|
||||
Method: chacha20-ietf-poly1305
|
||||
```
|
||||
4. Нажмите **"Подключиться"**
|
||||
|
||||
**Альтернативные клиенты для Android:**
|
||||
- ShadowsocksR - больше функций
|
||||
- Outline - очень простой
|
||||
- V2rayNG - много протоколов
|
||||
- Clash for Android - правила маршрутизации
|
||||
|
||||
### macOS
|
||||
|
||||
#### Вариант 1: ShadowsocksX-NG (GUI)
|
||||
|
||||
```bash
|
||||
brew install --cask shadowsocksx-ng
|
||||
```
|
||||
|
||||
1. Откройте приложение → **Server Preferences** → **"+"**
|
||||
2. Введите параметры подключения
|
||||
3. Выберите сервер в меню и подключитесь
|
||||
4. Включите **"System Proxy"**
|
||||
|
||||
#### Вариант 2: shadowsocks-libev (CLI) - Рекомендуется
|
||||
|
||||
```bash
|
||||
brew install shadowsocks-libev
|
||||
```
|
||||
|
||||
**Настройка:**
|
||||
```bash
|
||||
mkdir -p ~/.shadowsocks
|
||||
cat > ~/.shadowsocks/config.json <<EOF
|
||||
{
|
||||
"server": "209.38.32.21",
|
||||
"server_port": 8388,
|
||||
"local_address": "127.0.0.1",
|
||||
"local_port": 1080,
|
||||
"password": "bNkSbuMQXgMXmuBLPQCA5cSUE",
|
||||
"method": "chacha20-ietf-poly1305",
|
||||
"timeout": 300,
|
||||
"fast_open": true
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
**Автозапуск:**
|
||||
```bash
|
||||
cat > ~/Library/LaunchAgents/com.shadowsocks.local.plist <<EOF
|
||||
<?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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.shadowsocks.local</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/opt/homebrew/bin/ss-local</string>
|
||||
<string>-c</string>
|
||||
<string>${HOME}/.shadowsocks/config.json</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/shadowsocks.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/shadowsocks.error.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
```
|
||||
|
||||
**Настройка системного прокси:**
|
||||
1. System Settings → Network → Wi-Fi/Ethernet → Details → Proxies
|
||||
2. Включите SOCKS Proxy: `127.0.0.1:1080`
|
||||
|
||||
**Или используйте скрипты:**
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/enable-shadowsocks-full.sh # Включить для всего трафика
|
||||
./scripts/toggle-shadowsocks-proxy.sh # Переключить прокси
|
||||
./scripts/check-proxy-status.sh # Проверить статус
|
||||
```
|
||||
|
||||
**Альтернативные клиенты для macOS:**
|
||||
- ClashX - очень популярный
|
||||
- V2rayU - простой интерфейс
|
||||
- Outline - очень простой
|
||||
- Surge - платный, но мощный
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Управление
|
||||
|
||||
### Проверка статуса
|
||||
|
||||
```bash
|
||||
# На сервере
|
||||
ssh hunab-prod "docker ps | grep shadowsocks"
|
||||
|
||||
# На клиенте (macOS CLI)
|
||||
launchctl list | grep shadowsocks
|
||||
```
|
||||
|
||||
### Просмотр логов
|
||||
|
||||
```bash
|
||||
# Сервер
|
||||
ssh hunab-prod "docker logs hunab-vpn-shadowsocks"
|
||||
|
||||
# Клиент (macOS)
|
||||
tail -f /tmp/shadowsocks.log
|
||||
tail -f /tmp/shadowsocks.error.log
|
||||
```
|
||||
|
||||
### Перезапуск
|
||||
|
||||
```bash
|
||||
# Сервер
|
||||
ssh hunab-prod "cd /opt/app && docker compose -f docker-compose.vpn-shadowsocks.yml restart"
|
||||
|
||||
# Клиент (macOS)
|
||||
launchctl unload ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
```
|
||||
|
||||
### Изменение пароля
|
||||
|
||||
```bash
|
||||
ssh hunab-prod
|
||||
cd /opt/app/vpn/shadowsocks
|
||||
|
||||
NEW_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-25)
|
||||
sed -i "s/\"password\": \".*\"/\"password\": \"${NEW_PASSWORD}\"/" config.json
|
||||
docker restart hunab-vpn-shadowsocks
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Тестирование
|
||||
|
||||
### Проверка подключения
|
||||
|
||||
```bash
|
||||
# Через SOCKS5 прокси (macOS CLI)
|
||||
curl --socks5 127.0.0.1:1080 ifconfig.me
|
||||
# Должен показать: 209.38.32.21
|
||||
|
||||
# Прямое подключение
|
||||
curl ifconfig.me
|
||||
# Покажет ваш реальный IP
|
||||
```
|
||||
|
||||
### Проверка через браузер
|
||||
|
||||
1. Настройте системный прокси (см. выше)
|
||||
2. Откройте: https://whatismyipaddress.com/
|
||||
3. Должен отображаться IP: **209.38.32.21**
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Решение проблем
|
||||
|
||||
### Весь трафик не проходит через Shadowsocks
|
||||
|
||||
**Используйте скрипты:**
|
||||
```bash
|
||||
cd docs/servers/vpn
|
||||
./scripts/check-proxy-status.sh # Проверка статуса
|
||||
./scripts/fix-shadowsocks.sh # Автоматическое исправление
|
||||
```
|
||||
|
||||
**Ручная диагностика:**
|
||||
|
||||
1. **Проверка Shadowsocks:**
|
||||
```bash
|
||||
launchctl list | grep shadowsocks
|
||||
curl --socks5 127.0.0.1:1080 ifconfig.me
|
||||
```
|
||||
|
||||
2. **Проверка системного прокси:**
|
||||
```bash
|
||||
networksetup -getsocksfirewallproxy "Wi-Fi"
|
||||
# Должно показать: Enabled: Yes, Server: 127.0.0.1, Port: 1080
|
||||
```
|
||||
|
||||
3. **Настройка прокси:**
|
||||
```bash
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 1080
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" on
|
||||
```
|
||||
|
||||
### Chrome не использует системный прокси
|
||||
|
||||
1. **Отключите Chrome VPN расширение** (если активно)
|
||||
2. **Проверьте настройки:** `chrome://settings/system` → "Use system proxy settings"
|
||||
3. **Полностью закройте Chrome:** Cmd+Q (не просто закрыть окно)
|
||||
4. **Откройте Chrome заново**
|
||||
|
||||
### Прокси не работает
|
||||
|
||||
1. Проверьте статус:
|
||||
```bash
|
||||
launchctl list | grep shadowsocks
|
||||
```
|
||||
|
||||
2. Проверьте логи:
|
||||
```bash
|
||||
cat /tmp/shadowsocks.error.log
|
||||
```
|
||||
|
||||
3. Перезапустите:
|
||||
```bash
|
||||
launchctl unload ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
```
|
||||
|
||||
### Порт 1080 занят
|
||||
|
||||
1. Проверьте, что использует порт:
|
||||
```bash
|
||||
lsof -i :1080
|
||||
```
|
||||
|
||||
2. Измените порт в `~/.shadowsocks/config.json`:
|
||||
```json
|
||||
"local_port": 1081
|
||||
```
|
||||
|
||||
3. Обновите системный прокси на новый порт
|
||||
|
||||
---
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
### Использование ресурсов
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "docker stats hunab-vpn-shadowsocks --no-stream"
|
||||
```
|
||||
|
||||
### Активные подключения
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "docker exec hunab-vpn-shadowsocks ss-server -c /etc/shadowsocks-libev/config.json -v"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
### Рекомендации
|
||||
|
||||
1. ✅ **Используйте порт 443** для маскировки под HTTPS трафик
|
||||
2. ✅ **Регулярно меняйте пароль** (каждые 1-3 месяца)
|
||||
3. ✅ **Используйте современные методы шифрования** (`chacha20-ietf-poly1305`)
|
||||
4. ✅ **Мониторинг трафика** - следите за использованием
|
||||
5. ✅ **Обновляйте контейнер** регулярно
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [Shadowsocks Official](https://shadowsocks.org/)
|
||||
- [Shadowsocks Docker Image](https://hub.docker.com/r/shadowsocks/shadowsocks-libev)
|
||||
- [Shadowsocks Clients](https://shadowsocks.org/en/download/clients.html)
|
||||
- [Shadowsocks GitHub](https://github.com/shadowsocks/shadowsocks-libev)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0
|
||||
**Дата:** 2025-01-XX
|
||||
|
||||
167
docs/connectivity/vpn/WHONIX.md
Normal file
167
docs/connectivity/vpn/WHONIX.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 🔐 Whonix - Полное руководство для Mac
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Whonix - приватная операционная система для максимальной анонимности. Состоит из двух виртуальных машин: Gateway (шлюз через Tor) и Workstation (изолированная рабочая среда).
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Установка
|
||||
|
||||
### Предварительные требования
|
||||
|
||||
- macOS (Intel или Apple Silicon)
|
||||
- Homebrew установлен
|
||||
- Минимум 4 GB RAM свободно
|
||||
- 20 GB свободного места на диске
|
||||
|
||||
### Шаг 1: Установка VirtualBox
|
||||
|
||||
**Для Intel Mac:**
|
||||
```bash
|
||||
brew install --cask virtualbox
|
||||
```
|
||||
|
||||
**Для Apple Silicon (M1/M2/M3):**
|
||||
VirtualBox не поддерживает эмуляцию x86 на Apple Silicon. Используйте:
|
||||
- **UTM** (бесплатно): `brew install --cask utm`
|
||||
- **Parallels Desktop** (платно, но лучше)
|
||||
|
||||
### Шаг 2: Скачивание образов Whonix
|
||||
|
||||
1. Перейдите на: https://www.whonix.org/wiki/Download
|
||||
2. Скачайте:
|
||||
- `Whonix-Gateway-*.ova` (~1.5 GB)
|
||||
- `Whonix-Workstation-*.ova` (~2.5 GB)
|
||||
|
||||
Сохраните в: `~/Downloads/whonix/`
|
||||
|
||||
### Шаг 3: Импорт в VirtualBox
|
||||
|
||||
**Через командную строку:**
|
||||
```bash
|
||||
VBoxManage import ~/Downloads/whonix/Whonix-Gateway-*.ova --vsys 0 --vmname "Whonix-Gateway"
|
||||
VBoxManage import ~/Downloads/whonix/Whonix-Workstation-*.ova --vsys 0 --vmname "Whonix-Workstation"
|
||||
```
|
||||
|
||||
**Через GUI:**
|
||||
1. Откройте VirtualBox
|
||||
2. File → Import Appliance
|
||||
3. Выберите `.ova` файлы
|
||||
|
||||
### Шаг 4: Настройка сети
|
||||
|
||||
**Gateway:**
|
||||
```bash
|
||||
VBoxManage modifyvm "Whonix-Gateway" --nic1 nat --nic2 intnet --intnet2 "whonix"
|
||||
```
|
||||
|
||||
**Workstation:**
|
||||
```bash
|
||||
VBoxManage modifyvm "Whonix-Workstation" --nic1 intnet --intnet1 "whonix"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Запуск Whonix
|
||||
|
||||
**Важно: Правильный порядок запуска**
|
||||
|
||||
1. **Сначала запустите Whonix-Gateway**
|
||||
```bash
|
||||
VBoxManage startvm "Whonix-Gateway" --type gui
|
||||
```
|
||||
Дождитесь полной загрузки (появится рабочий стол)
|
||||
|
||||
2. **Затем запустите Whonix-Workstation**
|
||||
```bash
|
||||
VBoxManage startvm "Whonix-Workstation" --type gui
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Валидация работы
|
||||
|
||||
В Whonix-Workstation проверьте:
|
||||
|
||||
1. **Проверка Tor:**
|
||||
- Откройте: https://check.torproject.org
|
||||
- Должно быть: "Congratulations. Your browser is configured to use Tor."
|
||||
|
||||
2. **Проверка IP:**
|
||||
- Откройте: https://whatismyipaddress.com
|
||||
- IP должен быть из сети Tor (не ваш реальный IP)
|
||||
|
||||
3. **Проверка DNS утечек:**
|
||||
- Откройте: https://dnsleaktest.com
|
||||
- Должны быть только DNS серверы Tor
|
||||
|
||||
---
|
||||
|
||||
## 🍎 Apple Silicon (M1/M2/M3)
|
||||
|
||||
### Проблема
|
||||
|
||||
VirtualBox не поддерживает эмуляцию x86 на Apple Silicon.
|
||||
|
||||
### Решение: UTM
|
||||
|
||||
1. Установите UTM:
|
||||
```bash
|
||||
brew install --cask utm
|
||||
```
|
||||
|
||||
2. Импортируйте Whonix в UTM:
|
||||
- Откройте UTM
|
||||
- Создать новую виртуальную машину
|
||||
- Выберите "Virtualize" → "Linux"
|
||||
- Импортируйте `.ova` файлы
|
||||
- **Важно:** Выберите архитектуру **x86_64** (эмуляция)
|
||||
|
||||
3. Настройте сеть:
|
||||
- Gateway: NAT для интернета
|
||||
- Workstation: Internal Network (shared с Gateway)
|
||||
|
||||
**Производительность:** Будет медленнее чем на Intel Mac (эмуляция), но работает.
|
||||
|
||||
### Альтернативы
|
||||
|
||||
- **Parallels Desktop** - лучше производительность, но платно
|
||||
- **Tails через USB** - нативная загрузка, быстрее
|
||||
- **VPN + Tor Browser** - нативное приложение, самое быстрое
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Решение проблем
|
||||
|
||||
### Gateway не запускается
|
||||
|
||||
1. Проверьте логи VirtualBox
|
||||
2. Проверьте настройки сети
|
||||
3. Убедитесь, что VirtualBox установлен правильно
|
||||
|
||||
### Workstation не может подключиться к интернету
|
||||
|
||||
1. Убедитесь, что Gateway запущен и полностью загружен
|
||||
2. Проверьте, что оба VM используют одну Internal Network "whonix"
|
||||
3. Перезапустите обе VM
|
||||
|
||||
### Медленная работа
|
||||
|
||||
1. Увеличьте RAM для VM (минимум 2 GB каждая)
|
||||
2. Увеличьте количество CPU ядер
|
||||
3. Используйте SSD (не внешний диск)
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [Whonix Official](https://www.whonix.org/)
|
||||
- [Whonix Documentation](https://www.whonix.org/wiki/Documentation)
|
||||
- [UTM Official](https://mac.getutm.app/)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0
|
||||
**Дата:** 2025-01-XX
|
||||
|
||||
199
docs/connectivity/vpn/WIREGUARD.md
Normal file
199
docs/connectivity/vpn/WIREGUARD.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# 🚀 WireGuard VPN - Полное руководство
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
WireGuard VPN позволяет подключаться к серверу 209.38.32.21 и использовать его как прокси для обхода интернет-ограничений.
|
||||
|
||||
**Преимущества:**
|
||||
- ✅ Современный протокол (state-of-the-art криптография)
|
||||
- ✅ Очень быстрый (85-95% от пропускной способности)
|
||||
- ✅ Простая настройка (минимум конфигурации)
|
||||
- ✅ Полное туннелирование из коробки
|
||||
- ✅ Низкое потребление ресурсов
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Развертывание сервера
|
||||
|
||||
### Автоматическое развертывание
|
||||
|
||||
```bash
|
||||
bash scripts/deployment/deploy-vpn-wireguard.sh
|
||||
```
|
||||
|
||||
Скрипт автоматически:
|
||||
1. ✅ Проверит подключение к серверу
|
||||
2. ✅ Создаст необходимые директории
|
||||
3. ✅ Настроит Docker контейнер
|
||||
4. ✅ Обновит firewall правила
|
||||
5. ✅ Запустит VPN сервер
|
||||
6. ✅ Создаст клиентскую конфигурацию
|
||||
|
||||
### Ручное развертывание
|
||||
|
||||
1. Подключитесь к серверу: `ssh hunab-prod`
|
||||
2. Создайте директории:
|
||||
```bash
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R hunab:hunab /opt/app/vpn
|
||||
```
|
||||
3. Создайте docker-compose файл
|
||||
4. Запустите контейнер: `docker compose -f docker-compose.vpn.yml up -d`
|
||||
5. Откройте порт: `sudo ufw allow 51820/udp comment 'WireGuard VPN'`
|
||||
|
||||
---
|
||||
|
||||
## 📱 Настройка клиентов
|
||||
|
||||
### Android / iOS
|
||||
|
||||
1. Установите приложение **WireGuard** из Google Play / App Store
|
||||
2. Нажмите **"+"** → **"Создать из файла или архива"**
|
||||
3. Выберите файл `wireguard-peer1.conf` (созданный скриптом)
|
||||
4. Нажмите **"Подключиться"**
|
||||
|
||||
### Windows / macOS / Linux
|
||||
|
||||
1. Установите WireGuard клиент:
|
||||
- **Windows:** https://www.wireguard.com/install/
|
||||
- **macOS:** `brew install wireguard-tools`
|
||||
- **Linux:** `sudo apt install wireguard`
|
||||
|
||||
2. Импортируйте конфигурацию:
|
||||
```bash
|
||||
# Linux/macOS
|
||||
sudo cp wireguard-peer1.conf /etc/wireguard/wg0.conf
|
||||
sudo wg-quick up wg0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Проверка подключения
|
||||
|
||||
### На сервере
|
||||
|
||||
```bash
|
||||
# Проверка статуса контейнера
|
||||
docker ps | grep hunab-vpn-wireguard
|
||||
|
||||
# Просмотр логов
|
||||
docker logs hunab-vpn-wireguard
|
||||
|
||||
# Проверка подключенных клиентов
|
||||
docker exec hunab-vpn-wireguard wg show
|
||||
```
|
||||
|
||||
### На клиенте
|
||||
|
||||
```bash
|
||||
# Linux/macOS
|
||||
sudo wg show
|
||||
|
||||
# Проверка IP адреса
|
||||
curl ifconfig.me
|
||||
# Должен показать IP сервера 209.38.32.21
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Управление
|
||||
|
||||
### Добавление нового клиента
|
||||
|
||||
```bash
|
||||
ssh hunab-prod
|
||||
cd /opt/app
|
||||
docker compose -f docker-compose.vpn.yml down
|
||||
# Измените PEERS=1 на PEERS=2 в docker-compose.vpn.yml
|
||||
docker compose -f docker-compose.vpn.yml up -d
|
||||
# Новый конфиг будет в /opt/app/vpn/wireguard/config/peer2/peer2.conf
|
||||
```
|
||||
|
||||
### Остановка VPN
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "cd /opt/app && docker compose -f docker-compose.vpn.yml down"
|
||||
```
|
||||
|
||||
### Перезапуск VPN
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "cd /opt/app && docker compose -f docker-compose.vpn.yml restart wireguard"
|
||||
```
|
||||
|
||||
### Просмотр статистики
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "docker exec hunab-vpn-wireguard wg show"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
### Рекомендации
|
||||
|
||||
1. ✅ **Храните конфигурационные файлы в безопасности**
|
||||
2. ✅ **Регулярно обновляйте ключи** (каждые 3-6 месяцев)
|
||||
3. ✅ **Мониторинг трафика**
|
||||
4. ✅ **Обновляйте контейнер** регулярно
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Решение проблем
|
||||
|
||||
### VPN не подключается
|
||||
|
||||
1. Проверьте статус контейнера: `docker ps | grep wireguard`
|
||||
2. Проверьте логи: `docker logs hunab-vpn-wireguard`
|
||||
3. Проверьте firewall: `sudo ufw status | grep 51820`
|
||||
4. Проверьте порт: `sudo netstat -tuln | grep 51820`
|
||||
|
||||
### Медленное подключение
|
||||
|
||||
1. Проверьте задержку: `ping 209.38.32.21`
|
||||
2. Проверьте нагрузку сервера: `docker stats hunab-vpn-wireguard`
|
||||
|
||||
### Клиент не получает IP
|
||||
|
||||
1. Проверьте конфигурацию: `sudo wg show`
|
||||
2. Перезапустите VPN на сервере
|
||||
|
||||
---
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
### Просмотр активных подключений
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "docker exec hunab-vpn-wireguard wg show"
|
||||
```
|
||||
|
||||
### Просмотр трафика
|
||||
|
||||
```bash
|
||||
ssh hunab-prod "docker exec hunab-vpn-wireguard wg show wg0 transfer"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Примечания
|
||||
|
||||
- **Порт:** UDP 51820 (можно изменить)
|
||||
- **Сеть VPN:** 10.13.13.0/24 (можно изменить)
|
||||
- **Контейнер:** `hunab-vpn-wireguard`
|
||||
- **Конфигурация:** `/opt/app/vpn/wireguard/config/`
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [WireGuard Official](https://www.wireguard.com/)
|
||||
- [WireGuard Docker Image](https://github.com/linuxserver/docker-wireguard)
|
||||
- [WireGuard Client Apps](https://www.wireguard.com/install/)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0
|
||||
**Дата:** 2025-01-XX
|
||||
|
||||
167
docs/connectivity/vpn/WIREGUARD_RU_SERVER.md
Normal file
167
docs/connectivity/vpn/WIREGUARD_RU_SERVER.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 🚀 WireGuard VPN на российском сервере (ru.hunab.app)
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Развертывание WireGuard VPN на российском прокси-сервере для доступа из России.
|
||||
|
||||
**Сервер:** 149.154.64.19 (ru.hunab.app)
|
||||
**ОС:** Ubuntu 24.10
|
||||
**Архитектура:** Docker-based deployment
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Архитектура решения
|
||||
|
||||
```
|
||||
[Android/iPhone]
|
||||
↓
|
||||
[WireGuard Client]
|
||||
↓
|
||||
[ru.hunab.app:51820] ← Российский сервер 149.154.64.19 (доступен из РФ)
|
||||
↓
|
||||
[209.38.32.21] ← Основной VPN сервер (опционально через туннель)
|
||||
↓
|
||||
[Интернет]
|
||||
```
|
||||
|
||||
**Преимущества:**
|
||||
- ✅ Доступен из России (российский IP)
|
||||
- ✅ Стандартный WireGuard протокол
|
||||
- ✅ Работает на всех платформах
|
||||
- ✅ Не требует специальных клиентов
|
||||
- ✅ Элегантная архитектура
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Развертывание на российском сервере
|
||||
|
||||
### Автоматическое развертывание
|
||||
|
||||
```bash
|
||||
# Подключитесь к российскому серверу
|
||||
ssh ahau@149.154.64.19
|
||||
# Пароль: w99z2fBSkO4gU
|
||||
|
||||
# Создайте директории
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
# Разверните WireGuard через Docker
|
||||
cd /opt/app/vpn/wireguard
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
```
|
||||
|
||||
### Настройка Firewall
|
||||
|
||||
```bash
|
||||
# Откройте порт WireGuard
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU'
|
||||
sudo ufw reload
|
||||
```
|
||||
|
||||
### Проверка развертывания
|
||||
|
||||
```bash
|
||||
# Проверка контейнера
|
||||
docker ps | grep wireguard
|
||||
|
||||
# Просмотр логов
|
||||
docker logs hunab-vpn-wireguard-ru
|
||||
|
||||
# Проверка конфигурации клиента
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 Получение конфигурации для Android
|
||||
|
||||
### Способ 1: Скачать с сервера
|
||||
|
||||
```bash
|
||||
# С вашего компьютера
|
||||
scp ahau@149.154.64.19:/opt/app/vpn/wireguard/config/peer1/peer1.conf ./wg-ru.conf
|
||||
```
|
||||
|
||||
### Способ 2: Просмотреть и скопировать
|
||||
|
||||
```bash
|
||||
ssh ahau@149.154.64.19 "cat /opt/app/vpn/wireguard/config/peer1/peer1.conf"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Альтернатива: Туннелирование через российский сервер
|
||||
|
||||
Если не хотите разворачивать отдельный WireGuard на российском сервере, можно настроить туннелирование:
|
||||
|
||||
### Вариант A: WireGuard через SSH туннель
|
||||
|
||||
```bash
|
||||
# На вашем компьютере создайте SSH туннель
|
||||
ssh -L 51820:209.38.32.21:51820 -N ahau@149.154.64.19
|
||||
|
||||
# В конфигурации WireGuard измените Endpoint:
|
||||
# Endpoint = 127.0.0.1:51820
|
||||
```
|
||||
|
||||
### Вариант B: WireProxy (если нужен SOCKS5)
|
||||
|
||||
WireProxy позволяет использовать WireGuard через SOCKS5 прокси, но требует установки дополнительного ПО на клиенте.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сравнение вариантов
|
||||
|
||||
| Критерий | Вариант 1 (WireGuard на RU) | Вариант 2 (SSH туннель) |
|
||||
|----------|----------------------------|-------------------------|
|
||||
| **Простота** | ✅ Просто | ⚠️ Требует SSH туннель |
|
||||
| **Производительность** | ✅ Высокая | ⚠️ Средняя |
|
||||
| **Мобильность** | ✅ Работает везде | ❌ Требует SSH клиент |
|
||||
| **Надежность** | ✅ Стабильно | ⚠️ Зависит от SSH |
|
||||
| **Рекомендация** | ✅ **Лучший выбор** | Для временного решения |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Рекомендуемое решение
|
||||
|
||||
**Развернуть WireGuard на российском сервере (Вариант 1)** - это самое элегантное и надежное решение:
|
||||
|
||||
1. ✅ Стандартный протокол WireGuard
|
||||
2. ✅ Работает на всех устройствах (Android, iOS, macOS, Windows)
|
||||
3. ✅ Не требует дополнительных туннелей
|
||||
4. ✅ Высокая производительность
|
||||
5. ✅ Простая настройка клиентов
|
||||
|
||||
---
|
||||
|
||||
## 📝 Следующие шаги
|
||||
|
||||
1. Разверните WireGuard на `149.154.64.19`
|
||||
2. Получите конфигурацию клиента
|
||||
3. Импортируйте в WireGuard на Android
|
||||
4. Проверьте подключение
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Связанная документация
|
||||
|
||||
- [WireGuard общее руководство](./WIREGUARD.md)
|
||||
- [Доступ к российскому серверу](./RU_PROXY_SERVER_ACCESS.md)
|
||||
- [Оптимизация хотспота](../hotspot/HOTSPOT_OPTIMIZATION.md)
|
||||
83
docs/connectivity/vpn/deploy-now.sh
Executable file
83
docs/connectivity/vpn/deploy-now.sh
Executable file
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
# Быстрое развертывание WireGuard на 149.154.64.19
|
||||
# Использование: ./docs/vpn/deploy-now.sh
|
||||
|
||||
set -e
|
||||
|
||||
SERVER="ahau@149.154.64.19"
|
||||
PASSWORD="w99z2fBSkO4gU"
|
||||
|
||||
echo "🚀 Развертывание WireGuard на ru.hunab.app (149.154.64.19)"
|
||||
echo "📝 Пароль: $PASSWORD"
|
||||
echo ""
|
||||
|
||||
echo "Выполняю команду на сервере..."
|
||||
echo "Пожалуйста, введите пароль когда потребуется: $PASSWORD"
|
||||
echo ""
|
||||
|
||||
ssh $SERVER << 'EOF'
|
||||
set -e
|
||||
|
||||
echo "1. Создание директорий..."
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
echo "2. Остановка старых контейнеров..."
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
|
||||
echo "3. Запуск WireGuard..."
|
||||
cd /opt/app/vpn/wireguard
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
echo "4. Ожидание создания конфигурации (45 секунд)..."
|
||||
sleep 45
|
||||
|
||||
echo "5. Настройка Firewall..."
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU' 2>/dev/null || true
|
||||
sudo ufw reload 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo "✅ Развертывание завершено!"
|
||||
echo ""
|
||||
echo "=== КОНФИГУРАЦИЯ КЛИЕНТА ==="
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
echo "==========================="
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "📥 Теперь получаю конфигурацию..."
|
||||
scp $SERVER:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/RuVPN.conf
|
||||
|
||||
if [ -f docs/vpn/RuVPN.conf ]; then
|
||||
echo ""
|
||||
echo "✅ Конфигурация сохранена в docs/vpn/RuVPN.conf"
|
||||
echo ""
|
||||
echo "📱 Импортируйте файл RuVPN.conf в WireGuard на телефоне!"
|
||||
echo ""
|
||||
cat docs/vpn/RuVPN.conf
|
||||
else
|
||||
echo ""
|
||||
echo "⚠️ Не удалось скопировать конфигурацию автоматически"
|
||||
echo "Выполните вручную:"
|
||||
echo " scp $SERVER:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/RuVPN.conf"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
64
docs/connectivity/vpn/scripts/check-proxy-status.sh
Executable file
64
docs/connectivity/vpn/scripts/check-proxy-status.sh
Executable file
@@ -0,0 +1,64 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== СТАТУС ПРОКСИ ==="
|
||||
echo ""
|
||||
|
||||
# Проверка Shadowsocks
|
||||
echo "1. Shadowsocks сервис:"
|
||||
if launchctl list | grep -q shadowsocks; then
|
||||
echo " ✅ Запущен"
|
||||
else
|
||||
echo " ❌ Не запущен"
|
||||
fi
|
||||
|
||||
# Проверка порта
|
||||
echo ""
|
||||
echo "2. Порт 1080:"
|
||||
if lsof -i :1080 | grep -q LISTEN; then
|
||||
echo " ✅ Слушает"
|
||||
else
|
||||
echo " ❌ Не слушает"
|
||||
fi
|
||||
|
||||
# Проверка системного прокси
|
||||
echo ""
|
||||
echo "3. Системный прокси:"
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
PROXY_STATUS=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Enabled:" | awk '{print $2}')
|
||||
if [ "$PROXY_STATUS" = "Yes" ]; then
|
||||
SERVER=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Server:" | awk '{print $2}')
|
||||
PORT=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Port:" | awk '{print $2}')
|
||||
echo " ✅ Включен: $SERVER:$PORT"
|
||||
else
|
||||
echo " ❌ Выключен"
|
||||
fi
|
||||
|
||||
# Проверка через curl
|
||||
echo ""
|
||||
echo "4. Тест подключения:"
|
||||
SS_IP=$(curl -s --socks5 127.0.0.1:1080 --max-time 5 ifconfig.me 2>/dev/null)
|
||||
DIRECT_IP=$(curl -s --max-time 5 ifconfig.me 2>/dev/null)
|
||||
|
||||
if [ -n "$SS_IP" ]; then
|
||||
echo " Через Shadowsocks: $SS_IP"
|
||||
if [ "$SS_IP" = "209.38.32.21" ]; then
|
||||
echo " ✅ Правильный IP"
|
||||
else
|
||||
echo " ⚠️ Неправильный IP"
|
||||
fi
|
||||
else
|
||||
echo " ❌ Shadowsocks не отвечает"
|
||||
fi
|
||||
|
||||
if [ -n "$DIRECT_IP" ]; then
|
||||
echo " Прямое подключение: $DIRECT_IP"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== РЕКОМЕНДАЦИИ ==="
|
||||
if [ "$PROXY_STATUS" != "Yes" ]; then
|
||||
echo "❌ Включите системный прокси: toggle-shadowsocks-proxy.sh"
|
||||
fi
|
||||
if [ -z "$SS_IP" ] || [ "$SS_IP" != "209.38.32.21" ]; then
|
||||
echo "❌ Shadowsocks не работает, проверьте: launchctl list | grep shadowsocks"
|
||||
fi
|
||||
61
docs/connectivity/vpn/scripts/deploy-wg-ru-simple.sh
Normal file
61
docs/connectivity/vpn/scripts/deploy-wg-ru-simple.sh
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
# Простые команды для развертывания WireGuard на ru.hunab.app
|
||||
# Выполните эти команды в SSH сеансе на сервере
|
||||
|
||||
echo "=== Шаг 1: Создание директорий ==="
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
echo "✅ Готово"
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 2: Остановка старых контейнеров ==="
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
echo "✅ Готово"
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 3: Запуск WireGuard ==="
|
||||
cd /opt/app/vpn/wireguard
|
||||
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
echo "✅ Контейнер запущен"
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 4: Ожидание создания конфигурации (45 секунд) ==="
|
||||
sleep 45
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 5: Настройка Firewall ==="
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU'
|
||||
sudo ufw reload
|
||||
echo "✅ Готово"
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 6: Проверка статуса ==="
|
||||
docker ps | grep wireguard
|
||||
|
||||
echo ""
|
||||
echo "=== Шаг 7: Конфигурация клиента ==="
|
||||
echo "---"
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
echo "---"
|
||||
|
||||
echo ""
|
||||
echo "✅ Готово! Скопируйте конфигурацию выше в файл wg-ru.conf"
|
||||
65
docs/connectivity/vpn/scripts/deploy-wireguard-ru-manual.sh
Normal file
65
docs/connectivity/vpn/scripts/deploy-wireguard-ru-manual.sh
Normal file
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Инструкция для ручного развертывания WireGuard на ru.hunab.app
|
||||
# Скопируйте и выполните эти команды на российском сервере
|
||||
|
||||
echo "=== Команды для развертывания WireGuard на ru.hunab.app ==="
|
||||
echo ""
|
||||
echo "1. Подключитесь к серверу:"
|
||||
echo " ssh ahau@149.154.64.19"
|
||||
echo " Пароль: w99z2fBSkO4gU"
|
||||
echo ""
|
||||
echo "2. Выполните следующие команды на сервере:"
|
||||
echo ""
|
||||
cat << 'COMMANDS'
|
||||
# Создание директорий
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
# Остановка и удаление существующего контейнера (если есть)
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
|
||||
# Запуск WireGuard контейнера
|
||||
cd /opt/app/vpn/wireguard
|
||||
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
# Ожидание создания конфигурации
|
||||
echo "Ожидание 30 секунд..."
|
||||
sleep 30
|
||||
|
||||
# Настройка Firewall
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU'
|
||||
sudo ufw reload
|
||||
|
||||
# Проверка статуса
|
||||
docker ps | grep wireguard
|
||||
|
||||
# Просмотр конфигурации клиента
|
||||
echo "=== Конфигурация клиента ==="
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
COMMANDS
|
||||
|
||||
echo ""
|
||||
echo "3. После выполнения команд на сервере, скопируйте конфигурацию:"
|
||||
echo " scp ahau@149.154.64.19:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/wg-ru.conf"
|
||||
echo ""
|
||||
echo " Или просмотрите и скопируйте вручную:"
|
||||
echo " ssh ahau@149.154.64.19 'cat /opt/app/vpn/wireguard/config/peer1/peer1.conf'"
|
||||
89
docs/connectivity/vpn/scripts/deploy-wireguard-ru.sh
Executable file
89
docs/connectivity/vpn/scripts/deploy-wireguard-ru.sh
Executable file
@@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт развертывания WireGuard на российском сервере ru.hunab.app
|
||||
|
||||
set -e
|
||||
|
||||
echo "=== Развертывание WireGuard на ru.hunab.app ==="
|
||||
echo ""
|
||||
|
||||
# Параметры подключения
|
||||
RU_SERVER="ahau@149.154.64.19"
|
||||
RU_IP="149.154.64.19"
|
||||
|
||||
echo "1. Подключение к серверу $RU_SERVER..."
|
||||
echo " (Введите пароль: w99z2fBSkO4gU)"
|
||||
echo ""
|
||||
|
||||
# Создание директорий
|
||||
ssh $RU_SERVER << 'EOF'
|
||||
set -e
|
||||
|
||||
echo "2. Создание директорий..."
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
echo " ✅ Директории созданы"
|
||||
|
||||
echo ""
|
||||
echo "3. Проверка существующих контейнеров..."
|
||||
if docker ps -a | grep -q hunab-vpn-wireguard-ru; then
|
||||
echo " ⚠️ Контейнер уже существует, останавливаем..."
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "4. Запуск WireGuard контейнера..."
|
||||
cd /opt/app/vpn/wireguard
|
||||
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest
|
||||
|
||||
echo " ✅ Контейнер запущен"
|
||||
|
||||
echo ""
|
||||
echo "5. Ожидание создания конфигурации (30 секунд)..."
|
||||
sleep 30
|
||||
|
||||
echo ""
|
||||
echo "6. Настройка Firewall..."
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU' 2>/dev/null || true
|
||||
sudo ufw reload 2>/dev/null || true
|
||||
echo " ✅ Firewall настроен"
|
||||
|
||||
echo ""
|
||||
echo "7. Проверка статуса..."
|
||||
docker ps | grep wireguard || echo " ⚠️ Контейнер не найден в списке"
|
||||
|
||||
echo ""
|
||||
echo "8. Конфигурация клиента:"
|
||||
echo "---"
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf 2>/dev/null || echo " ⚠️ Конфигурация еще не создана, подождите еще 30 секунд"
|
||||
echo "---"
|
||||
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "✅ Развертывание завершено!"
|
||||
echo ""
|
||||
echo "Следующие шаги:"
|
||||
echo "1. Скопируйте конфигурацию:"
|
||||
echo " scp $RU_SERVER:/opt/app/vpn/wireguard/config/peer1/peer1.conf docs/vpn/wg-ru.conf"
|
||||
echo ""
|
||||
echo "2. Или просмотрите конфигурацию:"
|
||||
echo " ssh $RU_SERVER 'cat /opt/app/vpn/wireguard/config/peer1/peer1.conf'"
|
||||
71
docs/connectivity/vpn/scripts/enable-shadowsocks-full.sh
Executable file
71
docs/connectivity/vpn/scripts/enable-shadowsocks-full.sh
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== ВКЛЮЧЕНИЕ SHADOWSOCKS ДЛЯ ВСЕГО ТРАФИКА ==="
|
||||
echo ""
|
||||
|
||||
# 1. Убедиться, что Shadowsocks запущен
|
||||
echo "1. Проверка Shadowsocks..."
|
||||
if ! launchctl list | grep -q shadowsocks; then
|
||||
echo " Запуск Shadowsocks..."
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
sleep 3
|
||||
fi
|
||||
|
||||
if launchctl list | grep -q shadowsocks; then
|
||||
echo " ✅ Shadowsocks запущен"
|
||||
else
|
||||
echo " ❌ Ошибка: Shadowsocks не запускается"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Проверка работы
|
||||
echo ""
|
||||
echo "2. Проверка подключения..."
|
||||
SS_IP=$(curl -s --socks5 127.0.0.1:1080 --max-time 5 ifconfig.me 2>/dev/null)
|
||||
if [ "$SS_IP" = "209.38.32.21" ]; then
|
||||
echo " ✅ Shadowsocks работает: IP = $SS_IP"
|
||||
else
|
||||
echo " ❌ Shadowsocks не работает правильно"
|
||||
echo " Проверьте логи: tail -f /tmp/shadowsocks.error.log"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Настройка системного прокси
|
||||
echo ""
|
||||
echo "3. Настройка системного прокси..."
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
echo " Интерфейс: $INTERFACE"
|
||||
|
||||
# Установить прокси
|
||||
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 1080
|
||||
sleep 1
|
||||
|
||||
# Включить прокси
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" on
|
||||
sleep 1
|
||||
|
||||
# Проверка
|
||||
PROXY_STATUS=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Enabled:" | awk '{print $2}')
|
||||
if [ "$PROXY_STATUS" = "Yes" ]; then
|
||||
SERVER=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Server:" | awk '{print $2}')
|
||||
PORT=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Port:" | awk '{print $2}')
|
||||
echo " ✅ Системный прокси включен: $SERVER:$PORT"
|
||||
else
|
||||
echo " ❌ Ошибка: Системный прокси не включен"
|
||||
echo " Попробуйте вручную: System Settings → Network → Proxies"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ SHADOWSOCKS ВКЛЮЧЕН ДЛЯ ВСЕГО ТРАФИКА!"
|
||||
echo ""
|
||||
echo "📋 ВАЖНО:"
|
||||
echo "1. ОТКЛЮЧИТЕ Chrome VPN расширение (если активно)"
|
||||
echo "2. ПОЛНОСТЬЮ закройте Chrome (Cmd+Q, не просто закрыть окно)"
|
||||
echo "3. Откройте Chrome заново"
|
||||
echo "4. Проверьте IP: https://whatismyipaddress.com/"
|
||||
echo " Должен показать: 209.38.32.21"
|
||||
echo ""
|
||||
echo "💡 Если не работает, проверьте:"
|
||||
echo " - Chrome Settings → System → Use system proxy settings"
|
||||
echo " - Отключите все VPN расширения в Chrome"
|
||||
54
docs/connectivity/vpn/scripts/fix-shadowsocks.sh
Executable file
54
docs/connectivity/vpn/scripts/fix-shadowsocks.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== ИСПРАВЛЕНИЕ SHADOWSOCKS ==="
|
||||
echo ""
|
||||
|
||||
# 1. Проверка и перезапуск Shadowsocks
|
||||
echo "1. Перезапуск Shadowsocks..."
|
||||
launchctl unload ~/Library/LaunchAgents/com.shadowsocks.local.plist 2>/dev/null
|
||||
sleep 1
|
||||
launchctl load ~/Library/LaunchAgents/com.shadowsocks.local.plist
|
||||
sleep 2
|
||||
|
||||
if launchctl list | grep -q shadowsocks; then
|
||||
echo " ✅ Shadowsocks запущен"
|
||||
else
|
||||
echo " ❌ Ошибка запуска Shadowsocks"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Настройка системного прокси
|
||||
echo ""
|
||||
echo "2. Настройка системного прокси..."
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 1080
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" on
|
||||
|
||||
PROXY_STATUS=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Enabled:" | awk '{print $2}')
|
||||
if [ "$PROXY_STATUS" = "Yes" ]; then
|
||||
echo " ✅ Системный прокси включен"
|
||||
else
|
||||
echo " ❌ Ошибка настройки прокси"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Проверка
|
||||
echo ""
|
||||
echo "3. Проверка подключения..."
|
||||
sleep 2
|
||||
SS_IP=$(curl -s --socks5 127.0.0.1:1080 --max-time 5 ifconfig.me 2>/dev/null)
|
||||
|
||||
if [ -n "$SS_IP" ] && [ "$SS_IP" = "209.38.32.21" ]; then
|
||||
echo " ✅ Shadowsocks работает: IP = $SS_IP"
|
||||
echo ""
|
||||
echo "✅ ВСЕ ИСПРАВЛЕНО!"
|
||||
echo ""
|
||||
echo "📋 Следующие шаги:"
|
||||
echo "1. Полностью закройте Chrome (Cmd+Q)"
|
||||
echo "2. Откройте Chrome заново"
|
||||
echo "3. Проверьте IP: https://whatismyipaddress.com/"
|
||||
echo " Должен показать: 209.38.32.21"
|
||||
else
|
||||
echo " ⚠️ Shadowsocks не отвечает правильно"
|
||||
echo " Проверьте логи: tail -f /tmp/shadowsocks.error.log"
|
||||
fi
|
||||
21
docs/connectivity/vpn/scripts/get-wg-ru-config.sh
Executable file
21
docs/connectivity/vpn/scripts/get-wg-ru-config.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
# Скрипт для получения конфигурации WireGuard с ru.hunab.app
|
||||
# Использование: ./get-wg-ru-config.sh
|
||||
|
||||
SERVER="ahau@149.154.64.19"
|
||||
CONFIG_PATH="/opt/app/vpn/wireguard/config/peer1/peer1.conf"
|
||||
OUTPUT_FILE="docs/vpn/wg-ru.conf"
|
||||
|
||||
echo "Получение конфигурации WireGuard с $SERVER..."
|
||||
scp "$SERVER:$CONFIG_PATH" "$OUTPUT_FILE" 2>/dev/null
|
||||
|
||||
if [ -f "$OUTPUT_FILE" ] && [ -s "$OUTPUT_FILE" ]; then
|
||||
echo "✅ Конфигурация получена: $OUTPUT_FILE"
|
||||
echo ""
|
||||
echo "=== Содержимое конфигурации ==="
|
||||
cat "$OUTPUT_FILE"
|
||||
else
|
||||
echo "⚠️ Конфигурация не найдена на сервере"
|
||||
echo "Сначала выполните развертывание на сервере:"
|
||||
echo " cat docs/vpn/ONE_LINE_DEPLOY.txt | ssh $SERVER"
|
||||
fi
|
||||
23
docs/connectivity/vpn/scripts/toggle-shadowsocks-proxy.sh
Executable file
23
docs/connectivity/vpn/scripts/toggle-shadowsocks-proxy.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для переключения системного прокси Shadowsocks
|
||||
|
||||
INTERFACE=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|Ethernet" | head -1)
|
||||
CURRENT_STATE=$(networksetup -getsocksfirewallproxy "$INTERFACE" | grep "Enabled:" | awk '{print $2}')
|
||||
|
||||
if [ "$CURRENT_STATE" = "Yes" ]; then
|
||||
# Выключить прокси
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" off
|
||||
echo "❌ Shadowsocks прокси ВЫКЛЮЧЕН"
|
||||
echo " Теперь можно использовать Chrome VPN"
|
||||
else
|
||||
# Включить прокси
|
||||
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 1080
|
||||
networksetup -setsocksfirewallproxystate "$INTERFACE" on
|
||||
echo "✅ Shadowsocks прокси ВКЛЮЧЕН"
|
||||
echo " IP: 209.38.32.21"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Текущий статус:"
|
||||
networksetup -getsocksfirewallproxy "$INTERFACE"
|
||||
16
docs/connectivity/vpn/scripts/wg-ru-deploy.sh
Normal file
16
docs/connectivity/vpn/scripts/wg-ru-deploy.sh
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
# Скопируйте и выполните эту команду в SSH сеансе на ru.hunab.app
|
||||
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config && sudo chown -R ahau:ahau /opt/app/vpn && \
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null; docker rm hunab-vpn-wireguard-ru 2>/dev/null; \
|
||||
cd /opt/app/vpn/wireguard && \
|
||||
docker run -d --name hunab-vpn-wireguard-ru --cap-add=NET_ADMIN --cap-add=SYS_MODULE \
|
||||
-e PUID=1000 -e PGID=1000 -e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 -e SERVERPORT=51820 -e PEERS=1 -e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 -v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped linuxserver/wireguard:latest && \
|
||||
echo "Ожидание 45 секунд..." && sleep 45 && \
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU' && sudo ufw reload && \
|
||||
echo "=== КОНФИГУРАЦИЯ ===" && \
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
119
docs/connectivity/vpn/setup-and-deploy.sh
Executable file
119
docs/connectivity/vpn/setup-and-deploy.sh
Executable file
@@ -0,0 +1,119 @@
|
||||
#!/bin/bash
|
||||
# Настройка SSH ключа и развертывание WireGuard на 149.154.64.19
|
||||
|
||||
set -e
|
||||
|
||||
SERVER="ahau@149.154.64.19"
|
||||
KEY_FILE="$HOME/.ssh/ru_server_key"
|
||||
PUB_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDJ48JZfUVwmVILkNsOqrmywqxCOK3zkxU3+2Z8G01RR ru.hunab.app"
|
||||
|
||||
echo "🔐 Настройка SSH и развертывание WireGuard"
|
||||
echo "═══════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Шаг 1: Проверка подключения с ключом
|
||||
echo "1️⃣ Проверяю существующее подключение..."
|
||||
if ssh -i "$KEY_FILE" -o PreferredAuthentications=publickey -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$SERVER" "exit" 2>/dev/null; then
|
||||
echo "✅ SSH ключ уже настроен!"
|
||||
else
|
||||
echo "⚠️ SSH ключ не настроен, добавляю..."
|
||||
echo ""
|
||||
echo "📝 Введите пароль: w99z2fBSkO4gU"
|
||||
echo ""
|
||||
|
||||
# Добавляем ключ на сервер
|
||||
ssh-copy-id -i "$KEY_FILE.pub" "$SERVER" || {
|
||||
echo ""
|
||||
echo "⚠️ Автоматическое добавление не сработало. Добавляю вручную..."
|
||||
cat "$KEY_FILE.pub" | ssh "$SERVER" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "✅ SSH ключ добавлен!"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "2️⃣ Проверяю подключение с ключом..."
|
||||
if ssh -i "$KEY_FILE" -o PreferredAuthentications=publickey -o ConnectTimeout=5 "$SERVER" "echo '✅ Подключение работает!'" 2>/dev/null; then
|
||||
echo "✅ SSH ключ работает!"
|
||||
else
|
||||
echo "❌ Не удалось подключиться с ключом"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "3️⃣ Развертывание WireGuard на сервере..."
|
||||
echo ""
|
||||
|
||||
ssh -i "$KEY_FILE" "$SERVER" << 'ENDSSH'
|
||||
set -e
|
||||
|
||||
echo " 📁 Создание директорий..."
|
||||
sudo mkdir -p /opt/app/vpn/wireguard/config
|
||||
sudo chown -R ahau:ahau /opt/app/vpn
|
||||
|
||||
echo " 🛑 Остановка старых контейнеров..."
|
||||
docker stop hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
docker rm hunab-vpn-wireguard-ru 2>/dev/null || true
|
||||
|
||||
echo " 🚀 Запуск WireGuard контейнера..."
|
||||
cd /opt/app/vpn/wireguard
|
||||
docker run -d \
|
||||
--name hunab-vpn-wireguard-ru \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Europe/Moscow \
|
||||
-e SERVERURL=149.154.64.19 \
|
||||
-e SERVERPORT=51820 \
|
||||
-e PEERS=1 \
|
||||
-e PEERDNS=8.8.8.8 \
|
||||
-e INTERNAL_SUBNET=10.14.14.0 \
|
||||
-v /opt/app/vpn/wireguard/config:/config \
|
||||
-p 51820:51820/udp \
|
||||
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
|
||||
--restart unless-stopped \
|
||||
linuxserver/wireguard:latest > /dev/null
|
||||
|
||||
echo " ⏳ Ожидание создания конфигурации (45 секунд)..."
|
||||
sleep 45
|
||||
|
||||
echo " 🔥 Настройка Firewall..."
|
||||
sudo ufw allow 51820/udp comment 'WireGuard VPN RU' 2>/dev/null || true
|
||||
sudo ufw reload 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo " ✅ WireGuard развернут и запущен!"
|
||||
echo ""
|
||||
docker ps | grep wireguard
|
||||
|
||||
echo ""
|
||||
echo " 📄 Конфигурация клиента:"
|
||||
echo " ═══════════════════════════════"
|
||||
cat /opt/app/vpn/wireguard/config/peer1/peer1.conf
|
||||
echo " ═══════════════════════════════"
|
||||
ENDSSH
|
||||
|
||||
echo ""
|
||||
echo "4️⃣ Получение конфигурации..."
|
||||
scp -i "$KEY_FILE" "$SERVER:/opt/app/vpn/wireguard/config/peer1/peer1.conf" docs/vpn/RuVPN.conf
|
||||
|
||||
if [ -f docs/vpn/RuVPN.conf ]; then
|
||||
echo ""
|
||||
echo "✅ Конфигурация сохранена в docs/vpn/RuVPN.conf"
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════"
|
||||
echo "📱 ГОТОВО! Импортируйте файл на телефон:"
|
||||
echo "═══════════════════════════════════════════"
|
||||
echo ""
|
||||
cat docs/vpn/RuVPN.conf
|
||||
echo ""
|
||||
echo "🎉 Всё готово! Подключайтесь через WireGuard!"
|
||||
else
|
||||
echo ""
|
||||
echo "⚠️ Не удалось скопировать конфигурацию"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user