Rustelo/Dockerfile
2025-07-07 23:52:06 +01:00

110 lines
2.9 KiB
Docker

# Multi-stage Dockerfile for Rustelo application
FROM rust:1.75-slim-bullseye as builder
# Build arguments for feature selection
ARG CARGO_FEATURES="production"
ARG NO_DEFAULT_FEATURES="true"
# Install system dependencies
RUN apt-get update && apt-get install -y \
pkg-config \
libssl-dev \
curl \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Install Node.js and npm for frontend builds
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs
# Install cargo-leptos for building the application
RUN cargo install cargo-leptos --version 0.2.20
# Set working directory
WORKDIR /app
# Copy package.json and install node dependencies first (for better caching)
COPY package.json package-lock.json* ./
RUN npm ci --only=production
# Copy Cargo files for dependency caching
COPY Cargo.toml Cargo.lock ./
COPY server/Cargo.toml ./server/
COPY client/Cargo.toml ./client/
COPY shared/Cargo.toml ./shared/
# Create dummy source files to build dependencies
RUN mkdir -p server/src client/src shared/src && \
echo "fn main() {}" > server/src/main.rs && \
echo "pub fn lib() {}" > server/src/lib.rs && \
echo "pub fn lib() {}" > client/src/lib.rs && \
echo "pub fn lib() {}" > shared/src/lib.rs
# Build dependencies
RUN cargo build --release --bin server
RUN cargo leptos build --release
# Remove dummy source files
RUN rm -rf server/src client/src shared/src
# Copy the actual source code
COPY . .
# Build the application with specified features
RUN if [ "$NO_DEFAULT_FEATURES" = "true" ]; then \
cargo leptos build --release --features "$CARGO_FEATURES" --no-default-features; \
else \
cargo leptos build --release --features "$CARGO_FEATURES"; \
fi
# Runtime stage
FROM debian:bullseye-slim
# Install runtime dependencies
RUN apt-get update && apt-get install -y \
ca-certificates \
libssl1.1 \
&& rm -rf /var/lib/apt/lists/*
# Create app user
RUN useradd -m -u 1000 app
# Set working directory
WORKDIR /app
# Copy built application from builder stage
COPY --from=builder /app/target/release/server /app/server
COPY --from=builder /app/target/site /app/target/site
COPY --from=builder /app/public /app/public
# Copy configuration files
COPY --from=builder /app/config.toml /app/config.toml
COPY --from=builder /app/config.prod.toml /app/config.prod.toml
# Copy templates and other runtime assets
COPY --from=builder /app/templates /app/templates
COPY --from=builder /app/migrations /app/migrations
# Create necessary directories
RUN mkdir -p /app/logs /app/uploads /app/tmp /app/cache /app/data /app/backups
# Change ownership to app user
RUN chown -R app:app /app
# Switch to app user
USER app
# Expose port
EXPOSE 3030
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3030/health || exit 1
# Set environment variables
ENV RUST_LOG=info
ENV ENVIRONMENT=production
# Run the application
CMD ["./server"]