Spaces:
Paused
Paused
| # --- START OF FILE Dockerfile --- | |
| FROM golang:latest | |
| # Обновление и зависимости | |
| RUN apt-get update && apt-get install -y wget unzip git build-essential python3 | |
| # Настройка Android NDK | |
| ENV ANDROID_NDK_HOME /opt/android-ndk | |
| ENV ANDROID_NDK_VERSION r25c | |
| RUN wget -q https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \ | |
| unzip -q android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \ | |
| mv android-ndk-${ANDROID_NDK_VERSION} /opt/android-ndk && \ | |
| rm android-ndk-${ANDROID_NDK_VERSION}-linux.zip | |
| ENV PATH ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH | |
| WORKDIR /app | |
| # Настройка Go | |
| ENV GOTOOLCHAIN=auto | |
| RUN go mod init vless-client | |
| # Исправленный код main.go | |
| RUN cat <<EOF > main.go | |
| package main | |
| import "C" | |
| import ( | |
| "encoding/base64" | |
| "strings" | |
| "sync" | |
| "github.com/xtls/xray-core/core" | |
| "github.com/xtls/xray-core/infra/conf/serial" | |
| _ "github.com/xtls/xray-core/main/distro/all" | |
| ) | |
| var ( | |
| instance *core.Instance | |
| mu sync.Mutex | |
| ) | |
| //export StartCore | |
| func StartCore(configContent *C.char) *C.char { | |
| mu.Lock() | |
| defer mu.Unlock() | |
| if instance != nil { | |
| return C.CString("Core already running") | |
| } | |
| configStr := C.GoString(configContent) | |
| // 1. Декодируем JSON в структуру conf.Config | |
| confConfig, err := serial.DecodeJSONConfig(strings.NewReader(configStr)) | |
| if err != nil { | |
| return C.CString("Config parse error: " + err.Error()) | |
| } | |
| // 2. !!! ВАЖНО !!! Конвертируем conf.Config в core.Config | |
| coreConfig, err := confConfig.Build() | |
| if err != nil { | |
| return C.CString("Config build error: " + err.Error()) | |
| } | |
| // 3. Создаем инстанс ядра | |
| coreInstance, err := core.New(coreConfig) | |
| if err != nil { | |
| return C.CString("Core create error: " + err.Error()) | |
| } | |
| if err := coreInstance.Start(); err != nil { | |
| return C.CString("Core start error: " + err.Error()) | |
| } | |
| instance = coreInstance | |
| return C.CString("") | |
| } | |
| //export StopCore | |
| func StopCore() { | |
| mu.Lock() | |
| defer mu.Unlock() | |
| if instance != nil { | |
| instance.Close() | |
| instance = nil | |
| } | |
| } | |
| //export Base64Decode | |
| func Base64Decode(str *C.char) *C.char { | |
| data := C.GoString(str) | |
| if l := len(data) % 4; l > 0 { | |
| data += strings.Repeat("=", 4-l) | |
| } | |
| decoded, err := base64.StdEncoding.DecodeString(data) | |
| if err != nil { | |
| decoded, err = base64.URLEncoding.DecodeString(data) | |
| } | |
| if err != nil { | |
| return C.CString("") | |
| } | |
| return C.CString(string(decoded)) | |
| } | |
| func main() {} | |
| EOF | |
| # Зависимости | |
| RUN go get -u github.com/xtls/xray-core@latest | |
| RUN go mod tidy | |
| # Компиляция | |
| RUN CGO_ENABLED=1 \ | |
| GOOS=android \ | |
| GOARCH=arm64 \ | |
| CC=aarch64-linux-android33-clang \ | |
| go build -buildmode=c-shared -o libvless.so main.go | |
| # Выдача файла | |
| RUN mkdir /output && mv libvless.so /output/ | |
| WORKDIR /output | |
| CMD ["python3", "-m", "http.server", "7860"] | |
| # --- END OF FILE Dockerfile --- |