sterepando commited on
Commit
e0fa400
·
verified ·
1 Parent(s): 7255911

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +92 -89
Dockerfile CHANGED
@@ -1,132 +1,135 @@
1
- FROM rust:1.75-slim-bookworm
2
 
3
- # 1. Установка зависимостей системы
4
  RUN apt-get update && apt-get install -y \
5
- wget \
6
  unzip \
7
- openjdk-17-jdk \
8
  python3 \
9
  build-essential \
 
 
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
  # 2. Установка Android NDK
13
- ENV ANDROID_NDK_HOME /opt/android-ndk
14
- ENV NDK_VERSION r25c
15
- RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
16
- unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
17
- mv android-ndk-${NDK_VERSION} ${ANDROID_NDK_HOME} && \
18
- rm android-ndk-${NDK_VERSION}-linux.zip
19
 
20
- # 3. Настройка Rust Targets и Cargo-NDK
 
 
 
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 new --lib vless_core
27
- WORKDIR /app/vless_core
28
 
29
- # 5. Запись конфигурации Cargo.toml
30
- RUN echo '[package]\n\
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
- android_logger = "0.13"\n\
41
  log = "0.4"\n\
42
- tokio = { version = "1", features = ["full"] }' > Cargo.toml
 
 
 
 
 
 
43
 
44
- # 6. Запись исходного кода (Код из Части 1)
 
45
  RUN echo 'use std::ffi::{CStr, CString};\n\
46
  use std::os::raw::{c_char, c_int};\n\
47
- use log::{info, error};\n\
 
48
  use android_logger::Config;\n\
 
 
49
  \n\
50
- fn init_logger() {\n\
51
- android_logger::init_once(\n\
52
- Config::default().with_tag("MandreVLESS"),\n\
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 init_core() -> c_int {\n\
60
- init_logger();\n\
61
- info!("Rust Core initialized");\n\
62
- unsafe {\n\
63
- if RUNTIME.is_none() {\n\
64
- match tokio::runtime::Builder::new_multi_thread().enable_all().build() {\n\
65
- Ok(rt) => {\n\
66
- RUNTIME = Some(rt);\n\
67
- return 0;\n\
68
- }\n\
69
- Err(e) => {\n\
70
- error!("Failed to create runtime: {}", e);\n\
71
- return -1;\n\
72
- }\n\
73
- }\n\
74
- }\n\
 
 
 
 
 
75
  }\n\
76
- 0\n\
77
  }\n\
78
  \n\
79
  #[no_mangle]\n\
80
- pub extern "C" fn start_vless(uuid: *const c_char, addr: *const c_char, port: c_int, local_port: c_int) -> c_int {\n\
81
- let uuid_str = unsafe { CStr::from_ptr(uuid).to_str().unwrap_or("") };\n\
82
- let addr_str = unsafe { CStr::from_ptr(addr).to_str().unwrap_or("") };\n\
83
- info!("Starting VLESS Remote:{}:{} UUID:{} Local:{}", addr_str, port, uuid_str, local_port);\n\
84
- unsafe {\n\
85
- if let Some(rt) = &RUNTIME {\n\
86
- rt.spawn(async move {\n\
87
- loop {\n\
88
- tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;\n\
89
- info!("VLESS service running...");\n\
90
- }\n\
91
- });\n\
92
- return 1;\n\
93
  }\n\
 
 
 
 
 
94
  }\n\
95
- -1\n\
 
 
 
96
  }\n\
97
  \n\
98
  #[no_mangle]\n\
99
  pub extern "C" fn stop_vless() -> c_int {\n\
100
- info!("Stopping VLESS...");\n\
101
- 0\n\
102
- }' > src/lib.rs
103
-
104
- # 7. Скрипт сборки и упаковки
105
- COPY <<EOF /app/build.sh
106
- #!/bin/bash
107
- set -e
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
- RUN chmod +x /app/build.sh && /app/build.sh
 
125
 
126
- # 8. Запуск HTTP сервера для отдачи файла
127
  WORKDIR /app
128
- # Создадим index.html для удобства
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"]