# ============================================ # Stage 1: Build Flutter Web Application # ============================================ FROM ghcr.io/cirruslabs/flutter:stable AS builder USER root WORKDIR /app # Safe directory configuration for git RUN git config --global --add safe.directory /app # Optimize DART VM Memory for build to prevent OOM ENV DART_VM_OPTIONS="--old_gen_heap_size=2048" # Enable web support (idempotent) RUN flutter config --enable-web # Copy dependency files first for better caching # Note: pubspec.lock will be generated by flutter pub get if missing COPY pubspec.yaml ./ # Get dependencies (generates pubspec.lock automatically) RUN flutter pub get # Copy source code COPY . . # Re-run pub get after copying source to ensure lockfile consistency RUN flutter pub get # Build web application (CanvasKit renderer is now default) # Added --no-tree-shake-icons to prevent potential font issues in some environments RUN flutter build web --release --base-href="/" --no-tree-shake-icons # ============================================ # Stage 2: Serve with custom Dart server (with API proxy) # ============================================ FROM dart:stable WORKDIR /app # Install SQLite3 library for FFI and FFmpeg for IPTV stream transcoding RUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev ffmpeg && rm -rf /var/lib/apt/lists/* # Create directory for HLS stream output RUN mkdir -p /tmp/streams && chmod 777 /tmp/streams # Copy entire bin directory (API, database, etc.) COPY bin/ ./bin/ # Get dependencies RUN dart pub get --directory=bin # Copy built web application from builder stage COPY --from=builder /app/build/web /app/web # Expose port (internal only, not mapped to host) EXPOSE 8089 # Serve web application with API proxy CMD ["dart", "run", "bin/server.dart", "--port", "8089", "--path", "/app/web"]