# -- Stage 1: Build frontend -- FROM node:22-alpine AS web-build WORKDIR /app COPY web/package.json web/package-lock.json ./ RUN npm ci COPY web/ . COPY content/ ../content/ RUN npm run build # -- Stage 2: Build server -- FROM rust:1-alpine AS server-build RUN apk add --no-cache musl-dev openssl-dev openssl-libs-static pkgconfig WORKDIR /app # Cache dependencies: copy manifests first, build a dummy, then swap in real source COPY api/Cargo.toml api/Cargo.lock ./ RUN mkdir src && echo 'fn main() {}' > src/main.rs && cargo build --release && rm -rf src target/release/deps/ayos* COPY api/src ./src COPY api/migrations ./migrations RUN cargo build --release # -- Stage 3: Runtime -- FROM alpine:3.21 RUN apk add --no-cache ca-certificates WORKDIR /app COPY --from=server-build /app/target/release/ayos-api ./server COPY --from=web-build /app/dist ./dist VOLUME /app/data ENV DATABASE_URL=sqlite:/app/data/ayos.db ENV JWT_SECRET=change-me-in-production ENV STATIC_DIR=/app/dist ENV PORT=3000 EXPOSE 3000 CMD ["./server"]