Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +92 -89
Dockerfile
CHANGED
|
@@ -1,132 +1,135 @@
|
|
| 1 |
-
FROM rust:
|
| 2 |
|
| 3 |
-
# 1. Установка зависимостей
|
| 4 |
RUN apt-get update && apt-get install -y \
|
| 5 |
-
|
| 6 |
unzip \
|
| 7 |
-
openjdk-17-jdk \
|
| 8 |
python3 \
|
| 9 |
build-essential \
|
|
|
|
|
|
|
| 10 |
&& rm -rf /var/lib/apt/lists/*
|
| 11 |
|
| 12 |
# 2. Установка Android NDK
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
mv android-ndk
|
| 18 |
-
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
| 21 |
RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
|
| 22 |
RUN cargo install cargo-ndk
|
| 23 |
|
| 24 |
-
# 4. Создание
|
| 25 |
WORKDIR /app
|
| 26 |
-
RUN cargo
|
| 27 |
-
WORKDIR /app/vless_core
|
| 28 |
|
| 29 |
-
# 5.
|
| 30 |
-
RUN echo '[
|
| 31 |
-
name = "vless_core"\n\
|
| 32 |
-
version = "0.1.0"\n\
|
| 33 |
-
edition = "2021"\n\
|
| 34 |
-
\n\
|
| 35 |
-
[lib]\n\
|
| 36 |
crate-type = ["cdylib"]\n\
|
| 37 |
\n\
|
| 38 |
[dependencies]\n\
|
|
|
|
| 39 |
libc = "0.2"\n\
|
| 40 |
-
|
| 41 |
log = "0.4"\n\
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
-
# 6.
|
|
|
|
| 45 |
RUN echo 'use std::ffi::{CStr, CString};\n\
|
| 46 |
use std::os::raw::{c_char, c_int};\n\
|
| 47 |
-
use
|
|
|
|
| 48 |
use android_logger::Config;\n\
|
|
|
|
|
|
|
| 49 |
\n\
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
);\n\
|
| 54 |
}\n\
|
| 55 |
\n\
|
| 56 |
-
static mut RUNTIME: Option<tokio::runtime::Runtime> = None;\n\
|
| 57 |
-
\n\
|
| 58 |
#[no_mangle]\n\
|
| 59 |
-
pub extern "C" fn
|
| 60 |
-
|
| 61 |
-
info!("
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
}\n\
|
| 76 |
-
0\n\
|
| 77 |
}\n\
|
| 78 |
\n\
|
| 79 |
#[no_mangle]\n\
|
| 80 |
-
pub extern "C" fn start_vless(
|
| 81 |
-
let
|
| 82 |
-
let
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
return 1;\n\
|
| 93 |
}\n\
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
}\n\
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
| 96 |
}\n\
|
| 97 |
\n\
|
| 98 |
#[no_mangle]\n\
|
| 99 |
pub extern "C" fn stop_vless() -> c_int {\n\
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
echo "Building for ARM64..."
|
| 110 |
-
cargo ndk -t arm64-v8a -o ./jniLibs build --release
|
| 111 |
-
|
| 112 |
-
echo "Building for ARMv7..."
|
| 113 |
-
cargo ndk -t armeabi-v7a -o ./jniLibs build --release
|
| 114 |
-
|
| 115 |
-
# echo "Building for x86_64 (Emulator)..."
|
| 116 |
-
# cargo ndk -t x86_64 -o ./jniLibs build --release
|
| 117 |
-
|
| 118 |
-
echo "Zipping..."
|
| 119 |
-
cd jniLibs
|
| 120 |
-
zip -r /app/vless_libs.zip .
|
| 121 |
-
echo "Done. File is at /app/vless_libs.zip"
|
| 122 |
-
EOF
|
| 123 |
|
| 124 |
-
|
|
|
|
| 125 |
|
| 126 |
-
# 8.
|
| 127 |
WORKDIR /app
|
| 128 |
-
|
| 129 |
-
RUN echo '<html><body><h1>Mandre VLESS Builder</h1><a href="vless_libs.zip">Download vless_libs.zip</a></body></html>' > index.html
|
| 130 |
|
|
|
|
| 131 |
EXPOSE 7860
|
| 132 |
CMD ["python3", "-m", "http.server", "7860"]
|
|
|
|
| 1 |
+
FROM rust:slim-bullseye
|
| 2 |
|
| 3 |
+
# 1. Установка зависимостей
|
| 4 |
RUN apt-get update && apt-get install -y \
|
| 5 |
+
curl \
|
| 6 |
unzip \
|
|
|
|
| 7 |
python3 \
|
| 8 |
build-essential \
|
| 9 |
+
libssl-dev \
|
| 10 |
+
pkg-config \
|
| 11 |
&& rm -rf /var/lib/apt/lists/*
|
| 12 |
|
| 13 |
# 2. Установка Android NDK
|
| 14 |
+
WORKDIR /opt
|
| 15 |
+
RUN curl -Lo ndk.zip https://dl.google.com/android/repository/android-ndk-r25c-linux.zip \
|
| 16 |
+
&& unzip ndk.zip \
|
| 17 |
+
&& rm ndk.zip \
|
| 18 |
+
&& mv android-ndk-r25c android-ndk
|
|
|
|
| 19 |
|
| 20 |
+
ENV ANDROID_NDK_HOME=/opt/android-ndk
|
| 21 |
+
ENV PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
|
| 22 |
+
|
| 23 |
+
# 3. Настройка Rust для Android
|
| 24 |
RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
|
| 25 |
RUN cargo install cargo-ndk
|
| 26 |
|
| 27 |
+
# 4. Создание проекта Rust
|
| 28 |
WORKDIR /app
|
| 29 |
+
RUN cargo init --lib --name vless_core
|
|
|
|
| 30 |
|
| 31 |
+
# 5. Настройка Cargo.toml (Зависимости: Tokio, Log, JNI/CTypes совместимость)
|
| 32 |
+
RUN echo '[lib]\n\
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
crate-type = ["cdylib"]\n\
|
| 34 |
\n\
|
| 35 |
[dependencies]\n\
|
| 36 |
+
tokio = { version = "1", features = ["full"] }\n\
|
| 37 |
libc = "0.2"\n\
|
| 38 |
+
anyhow = "1.0"\n\
|
| 39 |
log = "0.4"\n\
|
| 40 |
+
android_logger = "0.13"\n\
|
| 41 |
+
lazy_static = "1.4"\n\
|
| 42 |
+
serde = { version = "1.0", features = ["derive"] }\n\
|
| 43 |
+
serde_json = "1.0"\n\
|
| 44 |
+
# В реальном продакшене здесь были бы крейты для VLESS протокола (напр. v2ray-core rust port)\n\
|
| 45 |
+
# Для примера реализуем сокет-логику\n\
|
| 46 |
+
' > Cargo.toml
|
| 47 |
|
| 48 |
+
# 6. Написание исходного кода (src/lib.rs)
|
| 49 |
+
# Реализует экспорт функций для Python (ctypes) и базовый цикл VLESS клиента
|
| 50 |
RUN echo 'use std::ffi::{CStr, CString};\n\
|
| 51 |
use std::os::raw::{c_char, c_int};\n\
|
| 52 |
+
use std::sync::{Arc, Mutex};\n\
|
| 53 |
+
use log::{info, error, LevelFilter};\n\
|
| 54 |
use android_logger::Config;\n\
|
| 55 |
+
use tokio::runtime::Runtime;\n\
|
| 56 |
+
use tokio::task::JoinHandle;\n\
|
| 57 |
\n\
|
| 58 |
+
lazy_static::lazy_static! {\n\
|
| 59 |
+
static ref RUNTIME: Runtime = Runtime::new().unwrap();\n\
|
| 60 |
+
static ref VPN_HANDLE: Arc<Mutex<Option<JoinHandle<()>>>> = Arc::new(Mutex::new(None));\n\
|
|
|
|
| 61 |
}\n\
|
| 62 |
\n\
|
|
|
|
|
|
|
| 63 |
#[no_mangle]\n\
|
| 64 |
+
pub extern "C" fn init_logger() {\n\
|
| 65 |
+
android_logger::init_once(Config::default().with_max_level(LevelFilter::Info).with_tag("MandreVlessNative"));\n\
|
| 66 |
+
info!("Native Logger Initialized");\n\
|
| 67 |
+
}\n\
|
| 68 |
+
\n\
|
| 69 |
+
#[derive(serde::Deserialize)]\n\
|
| 70 |
+
struct VlessConfig {\n\
|
| 71 |
+
uuid: String,\n\
|
| 72 |
+
address: String,\n\
|
| 73 |
+
port: u16,\n\
|
| 74 |
+
}\n\
|
| 75 |
+
\n\
|
| 76 |
+
async fn vless_worker(config: VlessConfig) {\n\
|
| 77 |
+
info!("Starting VLESS Core connecting to {}:{}", config.address, config.port);\n\
|
| 78 |
+
// Имитация работы VLESS (Keepalive)\n\
|
| 79 |
+
loop {\n\
|
| 80 |
+
// В реальном коде здесь происходит TCP Handshake и VLESS Request\n\
|
| 81 |
+
// use tokio::net::TcpStream;\n\
|
| 82 |
+
// let stream = TcpStream::connect((config.address.as_str(), config.port)).await;\n\
|
| 83 |
+
info!("VLESS Keepalive: Ping to {}", config.address);\n\
|
| 84 |
+
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;\n\
|
| 85 |
}\n\
|
|
|
|
| 86 |
}\n\
|
| 87 |
\n\
|
| 88 |
#[no_mangle]\n\
|
| 89 |
+
pub extern "C" fn start_vless(config_json: *const c_char) -> c_int {\n\
|
| 90 |
+
let c_str = unsafe { if config_json.is_null() { return -1; } CStr::from_ptr(config_json) };\n\
|
| 91 |
+
let str_slice = match c_str.to_str() {\n\
|
| 92 |
+
Ok(s) => s,\n\
|
| 93 |
+
Err(_) => return -2,\n\
|
| 94 |
+
};\n\
|
| 95 |
+
\n\
|
| 96 |
+
let config: VlessConfig = match serde_json::from_str(str_slice) {\n\
|
| 97 |
+
Ok(c) => c,\n\
|
| 98 |
+
Err(e) => {\n\
|
| 99 |
+
error!("Config parse error: {}", e);\n\
|
| 100 |
+
return -3;\n\
|
|
|
|
| 101 |
}\n\
|
| 102 |
+
};\n\
|
| 103 |
+
\n\
|
| 104 |
+
let mut handle = VPN_HANDLE.lock().unwrap();\n\
|
| 105 |
+
if handle.is_some() {\n\
|
| 106 |
+
return 1; // Already running\n\
|
| 107 |
}\n\
|
| 108 |
+
\n\
|
| 109 |
+
*handle = Some(RUNTIME.spawn(vless_worker(config)));\n\
|
| 110 |
+
info!("VLESS Service Started");\n\
|
| 111 |
+
return 0;\n\
|
| 112 |
}\n\
|
| 113 |
\n\
|
| 114 |
#[no_mangle]\n\
|
| 115 |
pub extern "C" fn stop_vless() -> c_int {\n\
|
| 116 |
+
let mut handle = VPN_HANDLE.lock().unwrap();\n\
|
| 117 |
+
if let Some(h) = handle.take() {\n\
|
| 118 |
+
h.abort();\n\
|
| 119 |
+
info!("VLESS Service Stopped");\n\
|
| 120 |
+
return 0;\n\
|
| 121 |
+
}\n\
|
| 122 |
+
return 1; // Was not running\n\
|
| 123 |
+
}\n\
|
| 124 |
+
' > src/lib.rs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
|
| 126 |
+
# 7. Сборка библиотек под разные архитектуры
|
| 127 |
+
RUN cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -o ./jniLibs build --release
|
| 128 |
|
| 129 |
+
# 8. Упаковка в ZIP
|
| 130 |
WORKDIR /app
|
| 131 |
+
RUN zip -r vless_libs.zip jniLibs
|
|
|
|
| 132 |
|
| 133 |
+
# 9. Запуск сервера для скачивания (Hugging Face Spaces слушает 7860)
|
| 134 |
EXPOSE 7860
|
| 135 |
CMD ["python3", "-m", "http.server", "7860"]
|