sterepando commited on
Commit
167887d
·
verified ·
1 Parent(s): 3bc674e

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +95 -40
Dockerfile CHANGED
@@ -21,49 +21,104 @@ 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. Клонируем 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. Сервер
 
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
+ # ВАЖНО: Указываем features, чтобы включить нужные протоколы
31
+ RUN cat <<EOF > Cargo.toml
32
+ [package]
33
+ name = "leaf_wrapper"
34
+ version = "0.1.0"
35
+ edition = "2021"
36
+
37
+ [lib]
38
+ crate-type = ["cdylib"]
39
+
40
+ [dependencies]
41
+ # Подключаем Leaf напрямую из Git
42
+ leaf = { git = "https://github.com/eycorsican/leaf.git", default-features = false, features = [
43
+ "vless",
44
+ "trojan",
45
+ "shadowsocks",
46
+ "ws",
47
+ "tls",
48
+ "h2",
49
+ "quic",
50
+ "inbound-socks",
51
+ "outbound-direct",
52
+ "outbound-drop",
53
+ "outbound-redirect",
54
+ "outbound-socks",
55
+ "outbound-vless",
56
+ "outbound-trojan",
57
+ "outbound-shadowsocks"
58
+ ] }
59
+ tokio = { version = "1", features = ["full"] }
60
+ log = "0.4"
61
+ android_logger = "0.13"
62
+ EOF
63
+
64
+ # 6. Пишем код обертки (src/lib.rs)
65
+ RUN cat <<EOF > src/lib.rs
66
+ use std::os::raw::{c_char, c_int};
67
+ use std::ffi::CStr;
68
+ use log::LevelFilter;
69
+ use android_logger::Config;
70
+
71
+ #[no_mangle]
72
+ pub extern "C" fn init_logger() {
73
+ android_logger::init_once(Config::default().with_max_level(LevelFilter::Info).with_tag("MandreLeaf"));
74
+ }
75
+
76
+ #[no_mangle]
77
+ pub extern "C" fn leaf_run_auto(config_path: *const c_char) -> c_int {
78
+ let c_str = unsafe { if config_path.is_null() { return -1; } CStr::from_ptr(config_path) };
79
+ let config_str = match c_str.to_str() {
80
+ Ok(s) => s,
81
+ Err(_) => return -2,
82
+ };
83
+
84
+ // Запуск Leaf (rt_id = 0)
85
+ // Используем leaf::start с путем к конфигу
86
+ if let Err(e) = leaf::start(0, leaf::Config::File(config_str.to_string())) {
87
+ log::error!("Leaf Start Error: {}", e);
88
+ return 1;
89
+ }
90
+ 0
91
+ }
92
+
93
+ #[no_mangle]
94
+ pub extern "C" fn leaf_stop_auto() -> c_int {
95
+ if leaf::stop(0) {
96
+ return 0;
97
+ }
98
+ 1
99
+ }
100
+
101
+ #[no_mangle]
102
+ pub extern "C" fn leaf_reload_auto(config_path: *const c_char) -> c_int {
103
+ let c_str = unsafe { if config_path.is_null() { return -1; } CStr::from_ptr(config_path) };
104
+ let config_str = match c_str.to_str() {
105
+ Ok(s) => s,
106
+ Err(_) => return -2,
107
+ };
108
+
109
+ if let Err(e) = leaf::reload(0, leaf::Config::File(config_str.to_string())) {
110
+ log::error!("Leaf Reload Error: {}", e);
111
+ return 1;
112
+ }
113
+ 0
114
+ }
115
+ EOF
116
+
117
+ # 7. Компиляция
118
+ RUN cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -o ./jniLibs build --release
119
 
120
  # 8. Упаковка
121
+ WORKDIR /app
122
  RUN zip -r vless_libs.zip jniLibs
123
 
124
  # 9. Сервер