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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +118 -115
Dockerfile CHANGED
@@ -1,126 +1,129 @@
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 \
14
- && rm ndk.zip \
15
- && mv android-ndk-r25c android-ndk
16
-
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
- # ВАЖНО: Указываем 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. Сервер
125
- EXPOSE 7860
126
- CMD ["python3", "-m", "http.server", "7860"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # --- START OF FILE Dockerfile ---
2
+ FROM golang:1.21-bullseye
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
+ # Установка зависимостей
5
+ RUN apt-get update && apt-get install -y wget unzip git build-essential python3
 
 
 
 
6
 
7
+ # Настройка переменных Android NDK
8
+ ENV ANDROID_NDK_HOME /opt/android-ndk
9
+ ENV ANDROID_NDK_VERSION r25c
 
10
 
11
+ # Скачивание и распаковка NDK
12
+ RUN wget -q https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
13
+ unzip -q android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
14
+ mv android-ndk-${ANDROID_NDK_VERSION} /opt/android-ndk && \
15
+ rm android-ndk-${ANDROID_NDK_VERSION}-linux.zip
16
+
17
+ # Добавление toolchain в PATH
18
+ ENV PATH ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
19
+
20
+ # Рабочая директория
21
+ WORKDIR /app
22
+
23
+ # Инициализация Go модуля
24
+ RUN go mod init vless-client
25
+
26
+ # Создание Go кода (Main Wrapper)
27
+ # Мы используем Xray-Core как библиотеку для поддержки Reality/VLESS/XTLS
28
+ RUN cat <<EOF > main.go
29
+ package main
30
+
31
+ import "C"
32
+
33
+ import (
34
+ "context"
35
+ "fmt"
36
+ "sync"
37
+ "encoding/base64"
38
+ "strings"
39
+
40
+ "github.com/xtls/xray-core/core"
41
+ "github.com/xtls/xray-core/infra/conf/serial"
42
+ _ "github.com/xtls/xray-core/main/distro/all"
43
+ )
44
+
45
+ var (
46
+ instance *core.Instance
47
+ mu sync.Mutex
48
+ )
49
+
50
+ //export StartCore
51
+ func StartCore(configContent *C.char) *C.char {
52
+ mu.Lock()
53
+ defer mu.Unlock()
54
+
55
+ if instance != nil {
56
+ return C.CString("Core already running")
57
+ }
58
+
59
+ configStr := C.GoString(configContent)
60
+
61
+ // Конвертация JSON конфига в Protobuf для ядра
62
+ config, err := serial.DecodeJSONConfig(strings.NewReader(configStr))
63
+ if err != nil {
64
+ return C.CString("Config decode error: " + err.Error())
65
+ }
66
+
67
+ coreInstance, err := core.New(config)
68
+ if err != nil {
69
+ return C.CString("Core create error: " + err.Error())
70
+ }
71
+
72
+ if err := coreInstance.Start(); err != nil {
73
+ return C.CString("Core start error: " + err.Error())
74
+ }
75
+
76
+ instance = coreInstance
77
+ return C.CString("") // Пустая строка = успех
78
  }
79
 
80
+ //export StopCore
81
+ func StopCore() {
82
+ mu.Lock()
83
+ defer mu.Unlock()
84
+
85
+ if instance != nil {
86
+ instance.Close()
87
+ instance = nil
88
+ }
89
  }
90
 
91
+ //export Base64Decode
92
+ func Base64Decode(str *C.char) *C.char {
93
+ data := C.GoString(str)
94
+ // Fix padding
95
+ if l := len(data) % 4; l > 0 {
96
+ data += strings.Repeat("=", 4-l)
97
+ }
98
+ decoded, err := base64.StdEncoding.DecodeString(data)
99
+ if err != nil {
100
+ decoded, err = base64.URLEncoding.DecodeString(data)
 
101
  }
102
+ if err != nil {
103
+ return C.CString("")
104
+ }
105
+ return C.CString(string(decoded))
106
  }
 
107
 
108
+ func main() {}
109
+ EOF
 
 
 
 
110
 
111
+ # Скачивание зависимостей
112
+ RUN go get github.com/xtls/xray-core
113
+ RUN go mod tidy
114
+
115
+ # Компиляция Shared Library (.so) для Android ARM64
116
+ # CC указывает на C-компилятор из NDK
117
+ RUN CGO_ENABLED=1 \
118
+ GOOS=android \
119
+ GOARCH=arm64 \
120
+ CC=aarch64-linux-android33-clang \
121
+ go build -buildmode=c-shared -o libvless.so main.go
122
+
123
+ # Подготовка к раздаче файла
124
+ RUN mkdir /output && mv libvless.so /output/
125
+
126
+ # Запуск простого HTTP сервера чтобы отдать файл
127
+ WORKDIR /output
128
+ CMD ["python3", "-m", "http.server", "7860"]
129
+ # --- END OF FILE Dockerfile ---