sterepando commited on
Commit
0479bd4
·
verified ·
1 Parent(s): 92d868e

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +85 -52
Dockerfile CHANGED
@@ -1,13 +1,13 @@
1
  FROM rust:bullseye
2
 
3
- # 1. Установка зависимостей для кросс-компиляции
4
  RUN apt-get update && apt-get install -y \
5
  curl unzip git build-essential \
6
- libssl-dev pkg-config python3 python3-pip \
7
- clang llvm \
8
  && rm -rf /var/lib/apt/lists/*
9
 
10
- # 2. Установка Android NDK
11
  WORKDIR /opt
12
  RUN curl -Lo ndk.zip https://dl.google.com/android/repository/android-ndk-r25c-linux.zip \
13
  && unzip ndk.zip \
@@ -17,60 +17,93 @@ RUN curl -Lo ndk.zip https://dl.google.com/android/repository/android-ndk-r25c-l
17
  ENV ANDROID_NDK_HOME=/opt/android-ndk
18
  ENV PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
19
 
20
- # 3. Настройка Rust
21
  RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
22
  RUN cargo install cargo-ndk
23
 
24
- # 4. Клонирование Leaf (Rust VPN Core)
25
  WORKDIR /app
26
- # Используем форк или оригинал leaf, поддерживающий VLESS
27
- RUN git clone https://github.com/eycorsican/leaf.git .
28
-
29
- # 5. Патчинг Cargo.toml для сборки динамической библиотеки (.so)
30
- # Добавляем crate-type = ["cdylib"] если его нет
31
- RUN sed -i 's/crate-type = \["staticlib"\]/crate-type = ["cdylib"]/g' leaf-mobile/Cargo.toml || echo 'crate-type = ["cdylib"]' >> leaf-mobile/Cargo.toml
32
-
33
- # 6. Создание C-совместимого API (обертка)
34
- # Leaf Mobile уже имеет JNI, но нам нужен простой C API для Python (ctypes)
35
- # Создаем src/lib_c.rs в leaf-mobile
36
- WORKDIR /app/leaf-mobile
37
- RUN echo 'use std::os::raw::{c_char, c_int};\n\
38
- use std::ffi::{CStr, CString};\n\
39
- \n\
40
- #[no_mangle]\n\
41
- pub extern "C" fn leaf_run_auto(config_path: *const c_char) -> c_int {\n\
42
- let c_str = unsafe { CStr::from_ptr(config_path) };\n\
43
- let config_str = c_str.to_str().unwrap_or("");\n\
44
- // Запуск Leaf с конфигом\n\
45
- // (Упрощенный вызов, в реальности leaf::start)\n\
46
- match leaf::start(0, config_str.to_string()) {\n\
47
- Ok(_) => 0,\n\
48
- Err(_) => 1,\n\
49
- }\n\
50
- }\n\
51
- \n\
52
- #[no_mangle]\n\
53
- pub extern "C" fn leaf_stop_auto() -> c_int {\n\
54
- leaf::stop(0);\n\
55
- 0\n\
56
- }\n\
57
- \n\
58
- #[no_mangle]\n\
59
- pub extern "C" fn leaf_reload_auto(config_path: *const c_char) -> c_int {\n\
60
- let c_str = unsafe { CStr::from_ptr(config_path) };\n\
61
- let config_str = c_str.to_str().unwrap_or("");\n\
62
- match leaf::reload(0, config_str.to_string()) {\n\
63
- Ok(_) => 0,\n\
64
- Err(_) => 1,\n\
65
- }\n\
66
- }\n' >> src/lib.rs
67
-
68
- # 7. Компиляция Leaf Mobile
69
- # Мы собираем leaf-mobile, так как он содержит нужные зависимости
70
- RUN cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -o ./jniLibs build --release --lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
  # 8. Упаковка
73
- WORKDIR /app/leaf-mobile
74
  RUN zip -r vless_libs.zip jniLibs
75
 
76
  # 9. Сервер
 
1
  FROM rust:bullseye
2
 
3
+ # 1. Зависимости
4
  RUN apt-get update && apt-get install -y \
5
  curl unzip git build-essential \
6
+ libssl-dev pkg-config python3 \
7
+ clang llvm zip \
8
  && rm -rf /var/lib/apt/lists/*
9
 
10
+ # 2. Android NDK
11
  WORKDIR /opt
12
  RUN curl -Lo ndk.zip https://dl.google.com/android/repository/android-ndk-r25c-linux.zip \
13
  && unzip ndk.zip \
 
17
  ENV ANDROID_NDK_HOME=/opt/android-ndk
18
  ENV PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
19
 
20
+ # 3. Rust Targets
21
  RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
22
  RUN cargo install cargo-ndk
23
 
24
+ # 4. Создаем свой проект-обертку (wrapper)
25
  WORKDIR /app
26
+ RUN cargo init --lib --name leaf_wrapper
27
+
28
+ # 5. Настраиваем Cargo.toml
29
+ # Подключаем leaf как зависимость из git
30
+ RUN cat <<EOF > Cargo.toml
31
+ [package]
32
+ name = "leaf_wrapper"
33
+ version = "0.1.0"
34
+ edition = "2021"
35
+
36
+ [lib]
37
+ crate-type = ["cdylib"]
38
+
39
+ [dependencies]
40
+ # Используем оригинальный leaf или его форк с поддержкой VLESS
41
+ # eycorsican/leaf поддерживает VLESS, Trojan, SS
42
+ leaf = { git = "https://github.com/eycorsican/leaf.git", features = ["vless", "trojan", "shadowsocks"] }
43
+ tokio = { version = "1", features = ["full"] }
44
+ log = "0.4"
45
+ android_logger = "0.13"
46
+ EOF
47
+
48
+ # 6. Пишем код обертки (src/lib.rs)
49
+ # Экспортируем C-функции для Python
50
+ RUN cat <<EOF > src/lib.rs
51
+ use std::os::raw::{c_char, c_int};
52
+ use std::ffi::CStr;
53
+ use log::LevelFilter;
54
+ use android_logger::Config;
55
+
56
+ #[no_mangle]
57
+ pub extern "C" fn init_logger() {
58
+ android_logger::init_once(Config::default().with_max_level(LevelFilter::Info).with_tag("MandreLeaf"));
59
+ }
60
+
61
+ #[no_mangle]
62
+ pub extern "C" fn leaf_run_auto(config_path: *const c_char) -> c_int {
63
+ let c_str = unsafe { if config_path.is_null() { return -1; } CStr::from_ptr(config_path) };
64
+ let config_str = match c_str.to_str() {
65
+ Ok(s) => s,
66
+ Err(_) => return -2,
67
+ };
68
+
69
+ // Leaf требует ID рантайма (rt_id). Используем 0.
70
+ // Функция leaf::start запускает VPN/Proxy асинхронно в фоне.
71
+ if let Err(e) = leaf::start(0, leaf::Config::File(config_str.to_string())) {
72
+ log::error!("Leaf Start Error: {}", e);
73
+ return 1;
74
+ }
75
+ 0
76
+ }
77
+
78
+ #[no_mangle]
79
+ pub extern "C" fn leaf_stop_auto() -> c_int {
80
+ if leaf::stop(0) {
81
+ return 0;
82
+ }
83
+ 1
84
+ }
85
+
86
+ #[no_mangle]
87
+ pub extern "C" fn leaf_reload_auto(config_path: *const c_char) -> c_int {
88
+ let c_str = unsafe { if config_path.is_null() { return -1; } CStr::from_ptr(config_path) };
89
+ let config_str = match c_str.to_str() {
90
+ Ok(s) => s,
91
+ Err(_) => return -2,
92
+ };
93
+
94
+ if let Err(e) = leaf::reload(0, leaf::Config::File(config_str.to_string())) {
95
+ log::error!("Leaf Reload Error: {}", e);
96
+ return 1;
97
+ }
98
+ 0
99
+ }
100
+ EOF
101
+
102
+ # 7. Компиляция
103
+ RUN cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -o ./jniLibs build --release
104
 
105
  # 8. Упаковка
106
+ WORKDIR /app
107
  RUN zip -r vless_libs.zip jniLibs
108
 
109
  # 9. Сервер