Initial commit: local_machine docs and scripts

This commit is contained in:
ahauimix
2026-03-14 20:03:57 +03:00
commit a39ef89125
85 changed files with 14500 additions and 0 deletions

View 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)

View 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 без версии в ответах.

View 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` (при необходимости).

View 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` |

View 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, логи).

View 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.

View 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>

View 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"

View 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"

View 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

View 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` для использования из России! 🎉

View 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.

View 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

View 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

View 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
```

View 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
**Статус:** ✅ Актуально

View 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)

View 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

View 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

View 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

View 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)

View 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

View 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

View 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"

View 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'"

View 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'"

View 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"

View 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

View 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

View 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"

View 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

View 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