# Build stage FROM rust:1-trixie AS builder WORKDIR /app RUN rustup default nightly-2026-03-30 && rustup component add rust-src llvm-tools-preview --toolchain nightly-2026-03-30 # Install build dependencies RUN apt-get update && apt-get install -y \ pkg-config \ libssl-dev \ clang \ llvm \ build-essential \ curl \ wget \ file \ binutils \ libavcodec-dev \ libavformat-dev \ libavdevice-dev \ libavutil-dev \ libswscale-dev \ libavfilter-dev \ libsqlite3-dev \ binaryen \ && rm -rf /var/lib/apt/lists/* # Install wasm target and tools RUN rustup target add wasm32-unknown-unknown RUN cargo install wasm-bindgen-cli --locked --version 0.2.117 # Install dioxus-cli RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash RUN cargo binstall dioxus-cli --root /usr/local -y --force # Copy source code COPY . . RUN cp .env-prod .env # Build wasm worker RUN RUSTFLAGS='--cfg getrandom_backend="wasm_js"' cargo build -p vodplace-player-worker --bin player_worker \ --target wasm32-unknown-unknown --profile worker-release # Run wasm-bindgen on worker RUN wasm-bindgen target/wasm32-unknown-unknown/worker-release/player_worker.wasm \ --out-dir public \ --target web \ --no-typescript # Optimize wasm if binaryen is available RUN wasm-opt public/player_worker_bg.wasm \ -O4 \ --enable-bulk-memory \ --enable-simd \ --enable-nontrapping-float-to-int \ --enable-sign-ext \ -o public/player_worker_bg.wasm # Bundle the app RUN dx bundle --verbose --release --debug-symbols false -p vodplace # Runtime stage FROM debian:trixie-slim RUN apt-get update && apt-get install -y \ ca-certificates \ libssl3 \ libavcodec61 \ libavformat61 \ libavdevice61 \ libavutil59 \ libswscale8 \ libsqlite3-0 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Copy the bundled app COPY --from=builder /app/target/dx/vodplace/release/web/ /app/ # COPY --from=builder /app/public/ /app/public # Create data directory for sqlite cache RUN mkdir -p /app/data ENV PORT=8090 ENV IP=0.0.0.0 ENV VODPLACE_CACHE_DIR=/app/data EXPOSE 8090 ENTRYPOINT ["/app/server"]