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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +124 -119
Dockerfile CHANGED
@@ -1,127 +1,132 @@
1
- FROM ubuntu:22.04
2
 
3
- # === 1. Установка системных зависимостей ===
4
- ENV DEBIAN_FRONTEND=noninteractive
5
  RUN apt-get update && apt-get install -y \
6
- wget curl unzip git python3 python3-pip python3-venv \
7
- build-essential cmake ninja-build pkg-config \
8
- bison flex jq file libffi-dev \
 
 
9
  && rm -rf /var/lib/apt/lists/*
10
 
11
- ENV WORKDIR=/build
12
- WORKDIR ${WORKDIR}
13
- ENV OUTDIR=/output
14
- RUN mkdir -p ${OUTDIR}
15
-
16
- # === 2. Умная установка NDK и GFortran ===
17
- # Мы используем Python скрипт для поиска последней рабочей версии gfortran
18
- # и скачиваем соответствующую ей версию NDK, чтобы избежать ошибок совместимости.
19
- RUN python3 -c 'import requests, os, sys; \
20
- print("Searching for latest gfortran release..."); \
21
- repo = "mzakharo/android-gfortran"; \
22
- r = requests.get(f"https://api.github.com/repos/{repo}/releases/latest"); \
23
- data = r.json(); \
24
- # Ищем ассет для aarch64 (целевая архитектура) под Linux (хост) \
25
- asset = next((a for a in data["assets"] if "aarch64" in a["name"] and "linux" in a["name"] and "tar.xz" in a["name"]), None); \
26
- if not asset: print("Error: No suitable gfortran asset found"); sys.exit(1); \
27
- url = asset["browser_download_url"]; \
28
- name = asset["name"]; \
29
- print(f"Found gfortran: {name}"); \
30
- # Пытаемся извлечь версию NDK из имени файла (например, r21e, r25c) \
31
- import re; \
32
- ndk_match = re.search(r"(r\d+[a-z]?)", name); \
33
- ndk_ver = ndk_match.group(1) if ndk_match else "r25c"; \
34
- print(f"Detected NDK version requirement: {ndk_ver}"); \
35
- # Сохраняем переменные в файл для следующих шагов \
36
- with open("env_vars.sh", "w") as f: \
37
- f.write(f"export GFORTRAN_URL={url}\n"); \
38
- f.write(f"export GFORTRAN_ARCHIVE={name}\n"); \
39
- f.write(f"export NDK_VERSION={ndk_ver}\n"); \
40
- '
41
-
42
- # Загружаем переменные и скачиваем NDK и GFortran
43
- RUN . ./env_vars.sh && \
44
- echo "Downloading NDK ${NDK_VERSION}..." && \
45
- wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
46
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
47
- rm android-ndk-${NDK_VERSION}-linux.zip && \
48
- mv android-ndk-${NDK_VERSION} android-ndk && \
49
- \
50
- echo "Downloading GFortran..." && \
51
- wget -q ${GFORTRAN_URL} && \
52
- tar -xf ${GFORTRAN_ARCHIVE} -C android-ndk && \
53
- rm ${GFORTRAN_ARCHIVE}
54
-
55
- # Настройка путей
56
- ENV ANDROID_NDK_HOME=${WORKDIR}/android-ndk
57
- ENV PATH=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH}
58
-
59
- # Создаем симлинки для gfortran (делаем его доступным под стандартным именем для кросс-компиляции)
60
- # Scipy/Meson ищут aarch64-linux-android-gfortran или аналогичные
61
- RUN ln -sf ${ANDROID_NDK_HOME}/bin/aarch64-linux-android-gfortran ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-gfortran && \
62
- ln -sf ${ANDROID_NDK_HOME}/bin/aarch64-linux-android-gfortran ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/gfortran
63
-
64
- # === 3. Создание Cross-File для Meson ===
65
- # Настраиваем параметры кросс-компиляции для Android API 30
66
- RUN echo "[binaries]" > android.cross && \
67
- echo "c = 'aarch64-linux-android30-clang'" >> android.cross && \
68
- echo "cpp = 'aarch64-linux-android30-clang++'" >> android.cross && \
69
- echo "fortran = 'aarch64-linux-android30-gfortran'" >> android.cross && \
70
- echo "ar = 'llvm-ar'" >> android.cross && \
71
- echo "strip = 'llvm-strip'" >> android.cross && \
72
- echo "pkgconfig = 'pkg-config'" >> android.cross && \
73
- echo "" >> android.cross && \
74
- echo "[host_machine]" >> android.cross && \
75
- echo "system = 'android'" >> android.cross && \
76
- echo "cpu_family = 'aarch64'" >> android.cross && \
77
- echo "cpu = 'armv8-a'" >> android.cross && \
78
- echo "endian = 'little'" >> android.cross
79
-
80
- # === 4. Сборка OpenBLAS (Критический шаг) ===
81
- # Версия OpenBLAS должна быть стабильной. 0.3.21 хорошо работает с андроидом.
82
- ENV OPENBLAS_VERSION=0.3.21
83
- RUN git clone --branch v${OPENBLAS_VERSION} --depth 1 https://github.com/OpenMathLib/OpenBLAS.git
84
- WORKDIR ${WORKDIR}/OpenBLAS
85
- # Сборка под ARMv8. Важно: NO_SHARED=0, чтобы собрать .so библиотеку, но для Scipy часто лучше статик,
86
- # однако мы соберем статик для вшивки внутрь wheel.
87
- RUN make TARGET=ARMV8 AR=llvm-ar CC="aarch64-linux-android30-clang" FC="aarch64-linux-android30-gfortran" HOSTCC=gcc -j$(nproc)
88
- RUN make install PREFIX=${WORKDIR}/openblas_install
89
-
90
- # Указываем pkg-config путь
91
- ENV PKG_CONFIG_PATH=${WORKDIR}/openblas_install/lib/pkgconfig
92
-
93
- # === 5. Подготовка окружения Python ===
94
- WORKDIR ${WORKDIR}
95
- # Устанавливаем зависимости для сборки Scipy
96
- # Используем numpy 1.24.x, так как 1.26 иногда вызывает проблемы при кросс-компиляции старых Scipy
97
- RUN pip3 install --upgrade pip wheel build meson ninja "numpy==1.24.3" cython pybind11 pythran requests
98
-
99
- # === 6. Сборка Scipy ===
100
- # Версия 1.10.1 более стабильна для кастомных сборок, чем 1.11+
101
- ENV SCIPY_VERSION=1.10.1
102
- RUN pip3 download scipy==${SCIPY_VERSION} --no-binary=:all: --no-deps
103
- RUN tar -xf scipy-${SCIPY_VERSION}.tar.gz
104
- WORKDIR ${WORKDIR}/scipy-${SCIPY_VERSION}
105
-
106
- # Патчим meson.build, если он требует numpy > установленного (иногда бывает в новых версиях),
107
- # но для 1.10.1 это не нужно.
108
-
109
- # Запускаем сборку
110
- # -Csetup-args="-Dblas=openblas" указывает использовать наш скомпилированный OpenBLAS
111
- RUN python3 -m build --wheel --no-isolation --skip-dependency-check \
112
- -Csetup-args="--cross-file=${WORKDIR}/android.cross" \
113
- -Csetup-args="-Dblas=openblas" \
114
- -Csetup-args="-Dlapack=openblas" \
115
- -Csetup-args="-Duse-g77-abi=true"
116
-
117
- # === 7. Финализация ===
118
- # Перемещаем результат
119
- RUN mv dist/*.whl ${OUTDIR}/
120
-
121
- WORKDIR ${OUTDIR}
122
- # Переименовываем файл для Android совместимости (хак тегов)
123
- RUN for f in *.whl; do mv "$f" "$(echo $f | sed s/linux_aarch64/android_30_arm64_v8a/)"; done || true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- # === 8. Отдача файла ===
126
  EXPOSE 7860
127
  CMD ["python3", "-m", "http.server", "7860"]
 
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"]