sterepando commited on
Commit
3bc674e
·
verified ·
1 Parent(s): 0479bd4

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +40 -80
Dockerfile CHANGED
@@ -21,89 +21,49 @@ ENV PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
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. Сервер
 
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 (стабильный коммит)
25
  WORKDIR /app
26
+ RUN git clone https://github.com/eycorsican/leaf.git .
27
+
28
+ # 5. Настраиваем leaf-mobile для сборки .so
29
+ WORKDIR /app/leaf-mobile
30
+
31
+ # Патчим Cargo.toml: меняем тип на cdylib для сборки .so
32
+ RUN sed -i 's/crate-type = \["staticlib"\]/crate-type = ["cdylib"]/g' Cargo.toml || echo 'crate-type = ["cdylib"]' >> Cargo.toml
33
+
34
+ # 6. Добавляем C-совместимый API (для ctypes)
35
+ # Мы добавляем этот код в конец файла src/lib.rs
36
+ RUN echo '\n\
37
+ use std::os::raw::{c_char, c_int};\n\
38
+ use std::ffi::CStr;\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 { if config_path.is_null() { return -1; } CStr::from_ptr(config_path) };\n\
43
+ let config_str = match c_str.to_str() {\n\
44
+ Ok(s) => s,\n\
45
+ Err(_) => return -2,\n\
46
+ };\n\
47
+ // Запуск Leaf (rt_id = 0)\n\
48
+ if let Err(e) = leaf::start(0, leaf::Config::File(config_str.to_string())) {\n\
49
+ return 1;\n\
50
+ }\n\
51
+ 0\n\
52
+ }\n\
53
+ \n\
54
+ #[no_mangle]\n\
55
+ pub extern "C" fn leaf_stop_auto() -> c_int {\n\
56
+ if leaf::stop(0) {\n\
57
+ return 0;\n\
58
+ }\n\
59
+ 1\n\
60
+ }\n' >> src/lib.rs
61
+
62
+ # 7. Компиляция leaf-mobile
63
+ # Используем --lib чтобы собрать именно библиотеку
64
+ RUN cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -o ./jniLibs build --release --lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
  # 8. Упаковка
 
67
  RUN zip -r vless_libs.zip jniLibs
68
 
69
  # 9. Сервер