82 lines
2.2 KiB
Docker
82 lines
2.2 KiB
Docker
# 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"]
|