Ctrl K
ComunidadGuías…

Dockerfile

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Multi-stage build for efficiency

# Stage 1: Build the Flutter web app
FROM --platform=$BUILDPLATFORM dart:stable AS flutter_builder

# Install Flutter
RUN apt-get update && apt-get install -y curl git unzip xz-utils zip libglu1-mesa

# Get Stable Branch
RUN git clone https://github.com/flutter/flutter.git /flutter && \
  git -C /flutter checkout stable
ENV PATH="/flutter/bin:${PATH}"

# Copy the Flutter app source
WORKDIR /app
COPY client/ ./client/
WORKDIR /app/client

# Build the Flutter web app
RUN flutter pub get
RUN flutter build web --release

# Stage 2: Build the Go server - Using Debian instead of Alpine for CGO compatibility
FROM --platform=$BUILDPLATFORM golang:1.23 AS go_builder

ARG TARGETARCH
ARG TARGETOS

# Install build dependencies including audio libraries for malgo
# Add cross-compilation tools for ARM64
RUN apt-get update && apt-get install -y \
    bash \
    git \
    gcc \
    libasound2-dev \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    libc6-dev-arm64-cross \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy go mod files first for better caching
COPY go.mod go.sum ./
RUN go mod download

# Copy the Go app source
COPY server/ ./server/

# Build the Go application with cross-compilation
# Set cross-compiler for ARM64 when needed
RUN if [ "$TARGETARCH" = "arm64" ]; then \
        export CC=aarch64-linux-gnu-gcc && \
        export CXX=aarch64-linux-gnu-g++ && \
        export AR=aarch64-linux-gnu-ar && \
        CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o sumika-server ./server; \
    else \
        CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o sumika-server ./server; \
    fi

# Stage 3: Create the final image using Debian instead of Alpine
FROM debian:bookworm-slim

# Install runtime dependencies including Python and audio libraries
RUN apt-get update && apt-get install -y \
    ca-certificates \
    nodejs \
    npm \
    python3 \
    python3-pip \
    python3-venv \
    libasound2 \
    portaudio19-dev \
    ffmpeg \
    wget \
    libasound2-dev \
    libpulse-dev \
    libjack-jackd2-dev \
    alsa-utils \
    pulseaudio-utils \
    && ln -s /usr/bin/python3 /usr/bin/python \
    && rm -rf /var/lib/apt/lists/*

# Create Python virtual environment and install packages
# RUN python3 -m venv /opt/venv
# ENV PATH="/opt/venv/bin:$PATH"

# Install Python packages for voice processing
RUN pip install --break-system-packages --no-cache-dir \
    "numpy<2" \
    faster-whisper \
    pyaudio \
    soundfile \
    openwakeword \
    librosa \
    pydub

# Optional: Install PyTorch with CUDA support (uncomment if needed)
# RUN pip install --no-cache-dir \
#     torch \
#     torchaudio \
#     --index-url https://download.pytorch.org/whl/cu121

# Create a non-root user to run the app
RUN useradd -m -u 1000 appuser
RUN usermod -a -G audio appuser

RUN chown -R appuser /usr/local/lib/python3.11/dist-packages/

USER appuser

WORKDIR /app

# Copy the compiled Go binary from the builder stage
COPY --chown=appuser --from=go_builder /app/sumika-server /app/

# Copy the Flutter web build to the static directory
COPY --chown=appuser --from=flutter_builder /app/client/build/web /app/web

# Copy server assets (scene images, voice assets, etc.) from the Go builder stage
COPY --chown=appuser --from=go_builder /app/server/assets /app/assets

# Run /app/assets/voice/preload.py
RUN python /app/assets/voice/preload.py

# Copy device metadata script and install dependencies
COPY device-metadata-script/ /app/device-metadata-script/
USER root
WORKDIR /app/device-metadata-script
RUN npm install --production
WORKDIR /app
USER appuser

# Expose the port the server listens on
EXPOSE 8081

# Run the server
CMD ["/app/sumika-server"]