# Stage 1: Build Ollama with Vulkan support
FROM ubuntu:26.04 AS builder

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && apt upgrade -y && apt install -y \
    build-essential \
    git \
    curl \
    wget \
    cmake \
    golang-go \
    ca-certificates

# Directly install glslc via Debian arm64 package
RUN wget http://ftp.debian.org/debian/pool/main/s/shaderc/glslc_2023.2-1_arm64.deb \
    && apt-get update && apt-get install -y ./glslc_2023.2-1_arm64.deb \
    && rm glslc_2023.2-1_arm64.deb

# install the rest of the requirements
RUN apt update && apt upgrade -y && apt install -y \
    libvulkan-dev \
    vulkan-tools \
    glslang-tools \
    ninja-build \
    spirv-headers \
    spirv-tools

WORKDIR /app
RUN git clone --recursive https://github.com/ollama/ollama.git .

# Configure and safely build with constrained parallelism to protect 96GB RAM
RUN cmake -B build . -DOLLAMA_LLAMA_BACKENDS="vulkan" -DGGML_VULKAN=ON -DCMAKE_BUILD_TYPE=Release
RUN cmake --build build --parallel 16

# Build the main Go application binary
RUN go build -o ollama .

# Start the server
EXPOSE 11434
ENV OLLAMA_HOST=0.0.0.0:11434
ENV GGML_VULKAN_DISABLE_FMA=1
ENV RADV_PERFOPTS="no_outoforder"
ENV AMD_DEBUG="notcc"
ENV OLLAMA_MODELS=/root/.ollama/models

ENTRYPOINT ["/app/ollama", "serve"]