From 4a9620ab8b3df00b24edf0077b1ec03de34c376a Mon Sep 17 00:00:00 2001 From: amurcanov Date: Sun, 24 May 2026 06:59:01 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D0=B8=D0=B4=D0=B5=D0=BE=D0=B3=D0=B0=D0=B9=D0=B4?= =?UTF-8?q?=20=D0=BF=D0=BE=20WDTT=20=D0=B2=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен видеогайд по настройке и использованию WDTT с ссылкой на YouTube. --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 9ca2cc6..6a40135 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,20 @@ Android-приложение → VpnService / WireGuard GoBackend → локал 6. Android-часть парсит полученный WireGuard-конфиг, поднимает системный VPN-туннель и применяет исключения приложений. 7. Watchdog следит за Go-процессом, активными воркерами и сетевыми изменениями, перезапуская транспорт при сбоях. +
+ +## Видеогайд по настройке и использованию WDTT (Показано на версии v1.1.4.) + +hq720 + +[**Смотреть гайд на YouTube**](https://www.youtube.com/watch?v=JFHn9jmPbfY&t=54s) + +
+ +```Важно гайд показан на уже устаревшей версии 1.1.4 но в нем есть много полезной информации, показана работа и настройка. Приобретение VPS и т,д. В новых версиях 1.1.8+ формат хешей изменен - достаточно вставить просто чистый хеш или проще = целиком ссылку звонка.``` + +
+ ## Быстрый старт 1. Скачайте актуальный `APK` со **[страницы релизов](https://github.com/amurcanov/proxy-turn-vk-android/releases)**. From c58febcbcfc9693c0e2422b7b1bffedac4f9dedb Mon Sep 17 00:00:00 2001 From: GAME-OVER-op Date: Sun, 24 May 2026 23:17:47 +0300 Subject: [PATCH 2/6] add automatic workflow assembly --- .github/workflows/build-release.yml | 303 ++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100755 .github/workflows/build-release.yml diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml new file mode 100755 index 0000000..c7764bf --- /dev/null +++ b/.github/workflows/build-release.yml @@ -0,0 +1,303 @@ +name: Build WDTT Release + +on: + push: + branches: + - "**" + workflow_dispatch: + +jobs: + build-release: + name: Build release APK + runs-on: ubuntu-latest + + permissions: + contents: read + + env: + ANDROID_MIN_API: "29" + ANDROID_COMPILE_SDK: "35" + ANDROID_BUILD_TOOLS: "35.0.0" + ANDROID_NDK_VERSION: "27.2.12479018" + SERVER_BINARY_NAME: "server" + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + + - name: Install Android SDK packages + shell: bash + run: | + set -euo pipefail + + sdkmanager \ + "platforms;android-${ANDROID_COMPILE_SDK}" \ + "build-tools;${ANDROID_BUILD_TOOLS}" \ + "ndk;${ANDROID_NDK_VERSION}" + + echo "ANDROID_NDK_HOME=${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}" >> "$GITHUB_ENV" + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: "1.26.x" + cache: true + cache-dependency-path: | + go.mod + go_client/go.mod + + - name: Generate Go sums + shell: bash + run: | + set -euo pipefail + + echo "== Root Go module ==" + go mod tidy + + echo "== Go client module ==" + cd go_client + go mod tidy + + - name: Build Linux server binaries + shell: bash + run: | + set -euo pipefail + + mkdir -p build/server + + echo "== Build server linux/amd64 ==" + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ + go build \ + -trimpath \ + -ldflags="-s -w -checklinkname=0" \ + -o build/server/wdtt-server-linux-amd64 \ + ./server.go + + echo "== Build server linux/arm64 ==" + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 \ + go build \ + -trimpath \ + -ldflags="-s -w -checklinkname=0" \ + -o build/server/wdtt-server-linux-arm64 \ + ./server.go + + chmod +x build/server/wdtt-server-linux-amd64 + chmod +x build/server/wdtt-server-linux-arm64 + + - name: Put server binary into Android assets + shell: bash + run: | + set -euo pipefail + + mkdir -p app/src/main/assets + + # Android deploy code expects this exact asset name. + cp build/server/wdtt-server-linux-amd64 app/src/main/assets/${SERVER_BINARY_NAME} + chmod +x app/src/main/assets/${SERVER_BINARY_NAME} + + echo "Server asset:" + ls -lh app/src/main/assets/${SERVER_BINARY_NAME} + + - name: Build Android Go client libraries + shell: bash + run: | + set -euo pipefail + + NDK_ROOT="${ANDROID_NDK_HOME}" + TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin" + + if [ ! -d "$TOOLCHAIN" ]; then + echo "Android NDK toolchain not found: $TOOLCHAIN" + exit 1 + fi + + echo "Using NDK: $NDK_ROOT" + echo "Using toolchain: $TOOLCHAIN" + + mkdir -p app/src/main/jniLibs/arm64-v8a + mkdir -p app/src/main/jniLibs/armeabi-v7a + mkdir -p app/src/main/jniLibs/x86_64 + mkdir -p build/go-client + + cd go_client + + echo "== Build libclient.so for arm64-v8a ==" + CGO_ENABLED=1 \ + GOOS=android \ + GOARCH=arm64 \ + CC="$TOOLCHAIN/aarch64-linux-android${ANDROID_MIN_API}-clang" \ + go build \ + -buildmode=c-shared \ + -trimpath \ + -ldflags="-s -w -checklinkname=0" \ + -o ../app/src/main/jniLibs/arm64-v8a/libclient.so \ + . + + cp ../app/src/main/jniLibs/arm64-v8a/libclient.so \ + ../build/go-client/libclient-arm64-v8a.so + + echo "== Build libclient.so for armeabi-v7a ==" + CGO_ENABLED=1 \ + GOOS=android \ + GOARCH=arm \ + GOARM=7 \ + CC="$TOOLCHAIN/armv7a-linux-androideabi${ANDROID_MIN_API}-clang" \ + go build \ + -buildmode=c-shared \ + -trimpath \ + -ldflags="-s -w -checklinkname=0" \ + -o ../app/src/main/jniLibs/armeabi-v7a/libclient.so \ + . + + cp ../app/src/main/jniLibs/armeabi-v7a/libclient.so \ + ../build/go-client/libclient-armeabi-v7a.so + + echo "== Build libclient.so for x86_64 ==" + CGO_ENABLED=1 \ + GOOS=android \ + GOARCH=amd64 \ + CC="$TOOLCHAIN/x86_64-linux-android${ANDROID_MIN_API}-clang" \ + go build \ + -buildmode=c-shared \ + -trimpath \ + -ldflags="-s -w -checklinkname=0" \ + -o ../app/src/main/jniLibs/x86_64/libclient.so \ + . + + cp ../app/src/main/jniLibs/x86_64/libclient.so \ + ../build/go-client/libclient-x86_64.so + + cd .. + + echo "Built JNI libraries:" + find app/src/main/jniLibs -type f -name "libclient.so" -exec ls -lh {} \; + + - name: Make Gradle wrapper executable + shell: bash + run: chmod +x ./gradlew + + - name: Generate temporary release keystore + shell: bash + run: | + set -euo pipefail + + KEYSTORE_PASSWORD="wdtt_temp_release_password" + KEY_PASSWORD="$KEYSTORE_PASSWORD" + KEY_ALIAS="wdtt-release" + + rm -f release.keystore local.properties signing.env + + keytool -genkeypair -v -keystore release.keystore -storetype PKCS12 -storepass "$KEYSTORE_PASSWORD" -keypass "$KEY_PASSWORD" -alias "$KEY_ALIAS" -keyalg RSA -keysize 4096 -validity 10000 -dname "CN=WDTT,O=WDTT,C=LV" + + { + echo "KEYSTORE_PASSWORD=$KEYSTORE_PASSWORD" + echo "KEY_PASSWORD=$KEY_PASSWORD" + echo "KEY_ALIAS=$KEY_ALIAS" + } > signing.env + + echo "Generated temporary release keystore" + ls -lh release.keystore + + - name: Build Android release APK + shell: bash + run: | + set -euo pipefail + + # No local.properties is created here, so Gradle produces unsigned release APKs. + # The workflow signs them manually in the next step using apksigner. + ./gradlew clean :app:assembleRelease --stacktrace + + - name: Sign release APKs manually + shell: bash + run: | + set -euo pipefail + + source signing.env + + BUILD_TOOLS="$(find "$ANDROID_HOME/build-tools" -mindepth 1 -maxdepth 1 -type d | sort -V | tail -n 1)" + ZIPALIGN="$BUILD_TOOLS/zipalign" + APKSIGNER="$BUILD_TOOLS/apksigner" + + echo "Using zipalign: $ZIPALIGN" + echo "Using apksigner: $APKSIGNER" + + mkdir -p build/signed-apk + shopt -s nullglob + unsigned_apks=(app/build/outputs/apk/release/*-unsigned.apk) + + if [ ${#unsigned_apks[@]} -eq 0 ]; then + echo "No unsigned release APKs found" + echo "Available APK outputs:" + find app/build/outputs/apk -type f -name "*.apk" -print || true + exit 1 + fi + + for apk in "${unsigned_apks[@]}"; do + name="$(basename "$apk" -unsigned.apk)" + aligned="build/signed-apk/${name}-aligned.apk" + signed="build/signed-apk/${name}-signed.apk" + + echo "== Align $apk ==" + "$ZIPALIGN" -p -f 4 "$apk" "$aligned" + + echo "== Sign $aligned ==" + "$APKSIGNER" sign --ks release.keystore --ks-key-alias "$KEY_ALIAS" --ks-pass "pass:$KEYSTORE_PASSWORD" --key-pass "pass:$KEY_PASSWORD" --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled true --v4-signing-enabled false --out "$signed" "$aligned" + + echo "== Verify $signed ==" + "$APKSIGNER" verify --verbose --print-certs "$signed" + done + + echo "Signed APKs:" + ls -lh build/signed-apk/*-signed.apk + + - name: Collect build outputs + shell: bash + run: | + set -euo pipefail + + mkdir -p build/artifacts/apk + mkdir -p build/artifacts/server + mkdir -p build/artifacts/go-client + + echo "== Signed APK outputs ==" + find build/signed-apk -type f -name "*-signed.apk" -print -exec ls -lh {} \; + + cp build/signed-apk/*-signed.apk build/artifacts/apk/ + cp build/server/* build/artifacts/server/ + cp build/go-client/* build/artifacts/go-client/ + + echo "== Final artifacts ==" + find build/artifacts -type f -exec ls -lh {} \; + + - name: Upload release APK artifact + uses: actions/upload-artifact@v4 + with: + name: WDTT-release-apk + path: build/artifacts/apk/*.apk + if-no-files-found: error + retention-days: 14 + + - name: Upload server binaries artifact + uses: actions/upload-artifact@v4 + with: + name: WDTT-server-binaries + path: build/artifacts/server/* + if-no-files-found: error + retention-days: 14 + + - name: Upload Go client libraries artifact + uses: actions/upload-artifact@v4 + with: + name: WDTT-go-client-libraries + path: build/artifacts/go-client/* + if-no-files-found: error + retention-days: 14 From d0a8fd3f4ee60e12c996d5c6b36f895e29523606 Mon Sep 17 00:00:00 2001 From: amurcanov Date: Tue, 26 May 2026 13:30:18 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md=20=D1=81=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B8=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=BC=D0=B8=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено содержание и ссылки на другие рабочие решения, обновлены разделы о возможностях и лицензии. --- README.md | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6a40135..ed9a17d 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,21 @@ **WDTT** — это Android-приложение для создания защищённого **WireGuard-туннеля поверх TURN/DTLS**. Клиент поднимает локальный VPN-интерфейс на устройстве, получает WireGuard-конфигурацию от вашего VPS и передаёт транспорт через TURN-серверы VK, маскируя соединение под обычный зашифрованный медиатрафик звонка. ---- - MyCollages (1) +## Содержание + +- [Возможности Android-версии](#возможности-android-версии) +- [Что нового в версии 1.1.8](#что-нового-в-версии-118) +- [**Другие рабочие решения**](#другие-рабочие-решения) +- [Как это работает](#как-это-работает) +- [Быстрый старт](#быстрый-старт) +- [Получение VK-хеша](#получение-vk-хеша) +- [Деплой VPS](#деплой-vps) +- [Управление доступом](#управление-доступом) +- [Дополнительные возможности](#дополнительные-возможности) +- [Лицензия](#лицензия) + ## Возможности Android-версии - **Полноценный VPN-режим:** приложение использует `VpnService` и WireGuard GoBackend, поэтому трафик выбранных приложений проходит через системный VPN-интерфейс без ручного импорта конфигов. @@ -53,7 +64,18 @@ * **Автообновление:** исправлена проверка обновлений, которая раньше могла выполняться только один раз при старте приложения. * **Keepalive:** добавлен DTLS keepalive для длительных сессий, чтобы снизить вероятность `reader EOF`. ---- +## Другие рабочие решения + +Рабочие решения с обходом шейпинга скорости и частыми обновлениями: + +**Моё любимое** +- [Moroka8/vk-turn-proxy](https://github.com/Moroka8/vk-turn-proxy) — Качественные ядра клиента и сервера + +**Android** +- [samosvalishe/turn-proxy-android](https://github.com/samosvalishe/turn-proxy-android) — альтернативная андроид версия + +**iOS** +- [anton48/vk-turn-proxy-ios](https://github.com/anton48/vk-turn-proxy-ios) — версия под ios ## Как это работает @@ -97,8 +119,6 @@ Android-приложение → VpnService / WireGuard GoBackend → локал 9. Во вкладке **«Туннель»** укажите IP/домен сервера, VK-хеши, пароль подключения и количество потоков. 10. Нажмите **«Подключить»** предварительно выдав все необходимые разрешения приложению. ---- - ## Получение VK-хеша ```text @@ -143,8 +163,6 @@ WDTT-сервер поддерживает две модели подключе Команда `/list` показывает активные пароли и устройства. Через inline-кнопки можно отвязать устройство или удалить пароль. При удалении или истечении пароля соответствующий WRAP-ключ удаляется из памяти сервера. ---- - ## Дополнительные возможности #### Исключения приложений @@ -170,8 +188,6 @@ WDTT-сервер поддерживает две модели подключе В разделе **«Информация»** есть кнопка **«Собрать отчёт»**. Она копирует версию приложения, Android SDK, ABI, модель устройства, SoC, ROM и fingerprint — эти данные полезны при разборе крашей и проблем с запуском. ---- - > [!NOTE] > ### Отчёты об ошибках > WDTT зависит от мобильной сети, Android-ограничений фоновой работы, состояния VK-звонка, TURN-квот, DNS и настроек VPS. @@ -182,8 +198,7 @@ WDTT-сервер поддерживает две модели подключе > ### Назначение проекта > Приложение является техническим инструментом для защищённого туннелирования собственного трафика через ваш сервер. Автор не призывает использовать WDTT для противоправных целей или нарушения правил сторонних сервисов. ---- - ## Лицензия Этот проект распространяется под лицензией **GNU General Public License v3.0**. +``` From 95d2fd56143c8cda70931411867cedfdc17cfe5a Mon Sep 17 00:00:00 2001 From: amurcanov Date: Tue, 26 May 2026 13:36:57 +0300 Subject: [PATCH 4/6] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ed9a17d..f5cc170 100644 --- a/README.md +++ b/README.md @@ -201,4 +201,3 @@ WDTT-сервер поддерживает две модели подключе ## Лицензия Этот проект распространяется под лицензией **GNU General Public License v3.0**. -``` From 55057b836ae806724c8bbd3e607a92c92e5207a1 Mon Sep 17 00:00:00 2001 From: amurcanov Date: Tue, 26 May 2026 13:45:59 +0300 Subject: [PATCH 5/6] Update README.md with additional section links --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f5cc170..1e3fcc7 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,11 @@ - [Возможности Android-версии](#возможности-android-версии) - [Что нового в версии 1.1.8](#что-нового-в-версии-118) +
+ - [**Другие рабочие решения**](#другие-рабочие-решения) +
+ - [Как это работает](#как-это-работает) - [Быстрый старт](#быстрый-старт) - [Получение VK-хеша](#получение-vk-хеша) From ca53e4804c00539aca4742c44cd66acf56f6a5f8 Mon Sep 17 00:00:00 2001 From: amurcanov Date: Tue, 26 May 2026 16:52:45 +0300 Subject: [PATCH 6/6] Clean up table of contents in README.md Removed unnecessary line breaks from the table of contents. --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 1e3fcc7..f5cc170 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,7 @@ - [Возможности Android-версии](#возможности-android-версии) - [Что нового в версии 1.1.8](#что-нового-в-версии-118) -
- - [**Другие рабочие решения**](#другие-рабочие-решения) -
- - [Как это работает](#как-это-работает) - [Быстрый старт](#быстрый-старт) - [Получение VK-хеша](#получение-vk-хеша)