# Kakeibo — canlı ortam imajı (tek servis: Axum hem /api'yi hem arayüzü sunar) # Yerelde deneme: docker build -t kakeibo . && docker run --rm -p 8090:8080 --env-file .env kakeibo # ─── 1) Arayüz (React + Vite) ───────────────────────────────────────────── FROM node:26-alpine AS web WORKDIR /app/frontend # Önce yalnızca paket dosyaları → bağımlılık katmanı önbellekte kalır COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci --no-audit --no-fund COPY frontend/ ./ RUN npm run build # ─── 2) Backend (Rust, release) ─────────────────────────────────────────── FROM rust:1.99-slim-trixie AS api WORKDIR /app/backend # Bağımlılıkları ayrı katmanda derle (kod değişince yeniden derlenmez) COPY backend/Cargo.toml backend/Cargo.lock ./ RUN mkdir src && echo 'fn main() {}' > src/main.rs && touch src/lib.rs \ && cargo build --release --locked \ && rm -rf src target/release/deps/*kakeibo* target/release/.fingerprint/kakeibo-* target/release/kakeibo* COPY backend/src ./src # touch: sahte lib.rs/main.rs'ten daha yeni olsun → Cargo gerçek kodu kesinlikle yeniden derler RUN touch src/lib.rs src/main.rs && cargo build --release --locked # ─── 3) Çalışma imajı (küçük, root olmayan kullanıcı) ───────────────────── FROM debian:trixie-slim RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl \ && rm -rf /var/lib/apt/lists/* \ && useradd --system --uid 10001 --no-create-home kakeibo COPY --from=api /app/backend/target/release/kakeibo /usr/local/bin/kakeibo COPY --from=web /app/frontend/dist /app/static ENV STATIC_DIR=/app/static \ PORT=8080 \ RUST_LOG=kakeibo=info,tower_http=info EXPOSE 8080 USER kakeibo # Dokploy/Docker sağlık kontrolü (uygulama + veritabanı) HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD curl -fsS http://localhost:${PORT}/api/health || exit 1 CMD ["kakeibo"]