74 lines
2.5 KiB
Docker
74 lines
2.5 KiB
Docker
# Stage 1: Build frontend
|
|
FROM node:22-alpine AS frontend-build
|
|
WORKDIR /app/frontend
|
|
COPY frontend/package.json frontend/package-lock.json ./
|
|
RUN npm ci
|
|
COPY frontend/ ./
|
|
RUN npm run build
|
|
|
|
# Stage 2: Build Rust binary
|
|
FROM ubuntu:24.04 AS rust-build
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
curl ca-certificates \
|
|
cmake g++ make pkg-config \
|
|
libssl-dev libdlib-dev libatlas-base-dev liblapack-dev \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
|
|
ENV PATH="/root/.cargo/bin:${PATH}"
|
|
|
|
WORKDIR /app
|
|
|
|
# Cache dependency build
|
|
COPY Cargo.toml Cargo.lock ./
|
|
RUN mkdir src && \
|
|
echo 'fn main() { println!("dummy"); }' > src/main.rs && \
|
|
echo '' > src/lib.rs && \
|
|
cargo build --release && \
|
|
rm -rf src
|
|
|
|
# Build real binary
|
|
COPY src/ src/
|
|
RUN touch src/main.rs src/lib.rs && cargo build --release
|
|
|
|
# Stage 3: Runtime image
|
|
FROM ubuntu:24.04
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ffmpeg \
|
|
libdlib19.1 \
|
|
libatlas3-base \
|
|
liblapack3 \
|
|
libssl3 \
|
|
libgomp1 \
|
|
ca-certificates \
|
|
curl \
|
|
bzip2 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Download models
|
|
RUN mkdir -p models && \
|
|
curl -fsSL -o models/dmhead_nomask_Nx3x224x224.onnx \
|
|
https://github.com/PINTO0309/DMHead/releases/download/1.1.2/dmhead_nomask_Nx3x224x224.onnx && \
|
|
echo "8dd5643923680b3a8e27507c4fc3d7331e0044a2554169e5658770d5b27fd122 models/dmhead_nomask_Nx3x224x224.onnx" | sha256sum -c && \
|
|
curl -fsSL -o /tmp/shape_predictor.dat.bz2 \
|
|
https://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 && \
|
|
echo "7d6637b8f34ddb0c1363e09a4628acb34314019ec3566fd66b80c04dda6980f5 /tmp/shape_predictor.dat.bz2" | sha256sum -c && \
|
|
bzip2 -d < /tmp/shape_predictor.dat.bz2 > models/shape_predictor_68_face_landmarks.dat && \
|
|
rm /tmp/shape_predictor.dat.bz2 && \
|
|
apt-get purge -y --autoremove bzip2
|
|
|
|
# Copy artifacts from build stages
|
|
COPY --from=rust-build /app/target/release/immich-timelapse ./
|
|
COPY --from=frontend-build /app/frontend/dist/ ./frontend/dist/
|
|
|
|
# Create non-root user
|
|
RUN useradd --create-home --shell /bin/bash timelapse && \
|
|
mkdir -p output config && \
|
|
chown -R timelapse:timelapse /app
|
|
|
|
USER timelapse
|
|
EXPOSE 5000
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD curl -fs http://localhost:5000/api/health || exit 1
|
|
CMD ["./immich-timelapse"]
|