110 lines
2.9 KiB
Docker
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"]
|