# Build Stage FROM rust:1.88-bookworm AS builder WORKDIR /app # Install sqlite3 for compile-time query checking RUN apt-get update && apt-get install -y sqlite3 && rm -rf /var/lib/apt/lists/* # Cache dependencies RUN cargo init --name blog_cms . COPY Cargo.toml Cargo.lock ./ RUN cargo build --release RUN rm src/*.rs # Copy real source COPY src ./src COPY templates ./templates # Create a temporary SQLite DB with the schema for sqlx compile-time checks RUN sqlite3 /tmp/build.db " \ CREATE TABLE users ( \ id INTEGER PRIMARY KEY AUTOINCREMENT, \ username TEXT NOT NULL UNIQUE, \ password_hash TEXT NOT NULL, \ role TEXT NOT NULL DEFAULT 'readonly' \ ); \ CREATE TABLE sessions ( \ id TEXT PRIMARY KEY, \ user_id INTEGER NOT NULL, \ expires_at INTEGER NOT NULL, \ FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE \ ); \ CREATE TABLE posts ( \ id INTEGER PRIMARY KEY AUTOINCREMENT, \ author_id INTEGER NOT NULL, \ title TEXT NOT NULL, \ content TEXT NOT NULL, \ tags TEXT NOT NULL DEFAULT '', \ categories TEXT NOT NULL DEFAULT '', \ visibility TEXT NOT NULL DEFAULT 'public', \ password TEXT, \ created_at INTEGER NOT NULL, \ updated_at INTEGER NOT NULL, \ FOREIGN KEY(author_id) REFERENCES users(id) ON DELETE CASCADE \ ); \ CREATE TABLE attachments ( \ id TEXT PRIMARY KEY, \ filename TEXT NOT NULL, \ content_type TEXT NOT NULL, \ size INTEGER NOT NULL, \ created_at INTEGER NOT NULL \ );" # Rebuild the real source with DATABASE_URL for sqlx macros ENV DATABASE_URL=sqlite:///tmp/build.db RUN touch src/main.rs && cargo build --release # Final Stage FROM debian:bookworm-slim WORKDIR /app # Install runtime dependencies RUN apt-get update && apt-get install -y \ ca-certificates \ libsqlite3-0 \ && rm -rf /var/lib/apt/lists/* # Copy the binary from the builder COPY --from=builder /app/target/release/blog_cms . # Create directories for attachments and database RUN mkdir -p attachments data # Default environment variables ENV PORT=3000 ENV DATABASE_URL=sqlite:///app/data/data.db EXPOSE 3000 CMD ["./blog_cms"]