Files
meta-fuse/Dockerfile
T
2026-01-11 17:26:07 +01:00

147 lines
3.8 KiB
Docker

# meta-fuse standalone Docker image
# Includes: Redis, nginx, FUSE driver, WebDAV, Node.js backend, React UI
#
# Build standalone:
# docker build -t meta-fuse .
#
# Build with custom meta-core (for development):
# docker build --build-arg META_CORE_IMAGE=meta-core:local -t meta-fuse .
# Stage 0: Get meta-core binary from published image
ARG META_CORE_IMAGE=ghcr.io/worph/meta-core:latest
FROM ${META_CORE_IMAGE} AS meta-core
# Stage 1: Build UI
FROM node:21-alpine AS ui-builder
WORKDIR /build
# Copy UI package and install
COPY packages/meta-fuse-ui/package.json ./
RUN npm install
# Copy UI source and build
COPY packages/meta-fuse-ui/ ./
RUN npm run build
# Stage 2: Build Backend
FROM node:21-alpine AS backend-builder
WORKDIR /build
# Copy backend package and install
COPY packages/meta-fuse-core/package.json ./
RUN npm install
# Copy backend source and build
COPY packages/meta-fuse-core/tsconfig.json ./
COPY packages/meta-fuse-core/src/ ./src/
RUN npm run build
# Stage 3: Build FUSE Driver
FROM rust:1.83-bookworm AS fuse-builder
WORKDIR /build
# Install FUSE development libraries
RUN apt-get update && apt-get install -y libfuse3-dev pkg-config
# Copy Rust project
COPY packages/meta-fuse-driver/Cargo.toml ./
COPY packages/meta-fuse-driver/src/ ./src/
# Build release binary
RUN cargo build --release
# Stage 4: Runtime
FROM ubuntu:22.04
# Container registry metadata
LABEL org.opencontainers.image.source=https://github.com/worph/meta-fuse
LABEL org.opencontainers.image.description="MetaMesh virtual filesystem via FUSE/WebDAV"
LABEL org.opencontainers.image.licenses=MIT
# Avoid prompts during install
ENV DEBIAN_FRONTEND=noninteractive
# Install system dependencies
RUN apt-get update && apt-get install -y \
curl \
gnupg \
ca-certificates \
nginx \
redis-server \
supervisor \
fuse3 \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Install Node.js 21
RUN curl -fsSL https://deb.nodesource.com/setup_21.x | bash - \
&& apt-get install -y nodejs
# Install WsgiDAV
RUN pip3 install wsgidav cheroot
# Create directories
RUN mkdir -p \
/app/backend \
/app/ui \
/app/welcome \
/app/fuse-driver \
/app/docker \
/data/watch \
/data/redis \
/mnt/virtual \
/var/log/supervisor \
/var/log/nginx
# Configure FUSE
RUN echo "user_allow_other" >> /etc/fuse.conf
# Copy built UI
COPY --from=ui-builder /build/dist /app/ui
RUN chmod -R 755 /app/ui
# Copy built backend
COPY --from=backend-builder /build/dist /app/backend/dist
COPY --from=backend-builder /build/node_modules /app/backend/node_modules
COPY --from=backend-builder /build/package.json /app/backend/
# Copy built FUSE driver
COPY --from=fuse-builder /build/target/release/meta-fuse-driver /app/fuse-driver/
RUN chmod +x /app/fuse-driver/meta-fuse-driver
# Copy meta-core sidecar binary
COPY --from=meta-core /usr/local/bin/meta-core /usr/local/bin/meta-core
RUN chmod +x /usr/local/bin/meta-core
# Copy configuration files
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY docker/wsgidav.yaml /app/docker/
COPY docker/welcome.html /app/welcome/
COPY docker/start-fuse-driver.sh /app/docker/
RUN chmod 644 /app/welcome/welcome.html && \
chmod +x /app/docker/start-fuse-driver.sh
# Environment variables
ENV NODE_ENV=production \
REDIS_URL=redis://127.0.0.1:6379 \
REDIS_PREFIX=meta-sort: \
API_HOST=0.0.0.0 \
API_PORT=3000 \
PUID=1000 \
PGID=1000
# Expose port 80 (nginx)
EXPOSE 80
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost/health || exit 1
# Start supervisord (manages redis, backend, fuse-driver, wsgidav, nginx)
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]