# Multi-stage build - Build forego with golang FROM golang:1.21-alpine AS build-forego RUN apk add --no-cache git WORKDIR /app RUN git clone https://github.com/wahyd4/forego.git \ && cd forego \ && git checkout fix-go-mod \ && go mod download \ && CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o forego \ && chmod +x forego # Build stage for downloading and preparing binaries FROM alpine:3.19 AS build-deps # Set versions - centralized for easy updates ARG CADDY_VERSION=2.9.1 ARG FILEBROWSER_VERSION=v2.32.0 ARG RCLONE_VERSION=v1.69.1 ARG ARIANG_VERSION=1.3.10 # Install build dependencies RUN apk add --no-cache \ wget \ unzip \ tar \ curl WORKDIR /tmp # Detect architecture and set platform variables RUN case "$(arch)" in \ x86_64) \ PLATFORM=linux-amd64; \ CADDY_FILE=caddy_${CADDY_VERSION}_linux_amd64.tar.gz; \ RCLONE_FILE=rclone-${RCLONE_VERSION}-linux-amd64.zip; \ ;; \ armv7l) \ PLATFORM=linux-armv7; \ CADDY_FILE=caddy_${CADDY_VERSION}_linux_armv7.tar.gz; \ RCLONE_FILE=rclone-${RCLONE_VERSION}-linux-arm-v7.zip; \ ;; \ aarch64) \ PLATFORM=linux-arm64; \ CADDY_FILE=caddy_${CADDY_VERSION}_linux_arm64.tar.gz; \ RCLONE_FILE=rclone-${RCLONE_VERSION}-linux-arm64.zip; \ ;; \ *) \ echo "[ERROR] unsupported arch $(arch), exit now"; \ exit 1; \ ;; \ esac \ && echo "PLATFORM=${PLATFORM}" > /tmp/platform.env \ && echo "CADDY_FILE=${CADDY_FILE}" >> /tmp/platform.env \ && echo "RCLONE_FILE=${RCLONE_FILE}" >> /tmp/platform.env # Download and extract binaries RUN . /tmp/platform.env \ && mkdir -p /app/bin /app/www \ # Download Caddy && wget -O caddy.tar.gz "https://github.com/caddyserver/caddy/releases/download/v${CADDY_VERSION}/${CADDY_FILE}" \ && tar -xzf caddy.tar.gz -C /app/bin \ # Download Filebrowser && wget -O filebrowser.tar.gz "https://github.com/filebrowser/filebrowser/releases/download/${FILEBROWSER_VERSION}/${PLATFORM}-filebrowser.tar.gz" \ && tar -xzf filebrowser.tar.gz -C /app/bin \ # Download Rclone && wget -O rclone.zip "https://downloads.rclone.org/${RCLONE_VERSION}/${RCLONE_FILE}" \ && unzip rclone.zip \ && cp rclone-*/rclone /app/bin/ \ # Download AriaNg && wget -O ariang.zip "https://github.com/mayswind/AriaNg/releases/download/${ARIANG_VERSION}/AriaNg-${ARIANG_VERSION}.zip" \ && unzip ariang.zip -d /app/www/aria2 \ # Download custom browse.html && wget -O /app/browse.html "https://raw.githubusercontent.com/glowinthedark/caddy-file-server-browse-extension/39e997c91539d0f04fcce53a3cb6605b2ae9e50c/browse.html" \ # Clean up && rm -rf *.tar.gz *.zip rclone-* # Final runtime stage - use Alpine for minimal size FROM alpine:3.19 LABEL AUTHOR=Junv WORKDIR /app # Runtime environment variables ENV RPC_SECRET="" \ ENABLE_AUTH=false \ ENABLE_RCLONE=true \ DOMAIN=:80 \ ARIA2_USER=user \ ARIA2_PWD=password \ ARIA2_SSL=false \ ARIA2_EXTERNAL_PORT=80 \ PUID=1000 \ PGID=1000 \ CADDYPATH=/app \ RCLONE_CONFIG=/app/conf/rclone.conf \ XDG_DATA_HOME=/app/.caddy/data \ XDG_CONFIG_HOME=/app/.caddy/config \ XDG_CACHE_HOME=/app/.cache \ RCLONE_CONFIG_BASE64="" \ ENABLE_APP_CHECKER=true \ ENABLE_FILEBROWSER=true \ CADDY_LOG_LEVEL=INFO \ RCLONE_AUTO_UPLOAD_PROVIDER= \ RCLONE_AUTO_UPLOAD_REMOTE_PATH=/downloads \ RCLONE_AUTO_UPLOAD_FILE_MIN_SIZE=1K \ RCLONE_AUTO_UPLOAD_FILE_MAX_SIZE=100G \ FIX_DATA_VOLUME_PERMISSIONS=false \ CADDY_FILE_SERVER_BROWSE_HTML=/app/browse.html # Install runtime dependencies RUN apk add --no-cache \ aria2 \ curl \ bash \ libcap \ runit \ shadow \ && addgroup -g 1000 junv \ && adduser -D -u 1000 -G junv -s /bin/bash junv \ && rm -rf /var/cache/apk/* # Copy pre-built binaries from build stage COPY --from=build-deps /app/bin/* /usr/local/bin/ COPY --from=build-deps /app/www /usr/local/www/ COPY --from=build-deps /app/browse.html /app/ COPY --from=build-forego /app/forego/forego /app/ # Copy application files COPY --chmod=755 aria2c.sh caddy.sh filebrowser.sh init.sh start.sh rclone.sh new-version-checker.sh /app/ COPY Procfile APP_VERSION /app/ COPY conf /app/conf/ COPY Caddyfile SecureCaddyfile HerokuCaddyfile /usr/local/caddy/ # Set up permissions and directories RUN chmod +x /usr/local/bin/* \ && mkdir -p /usr/local/www/aria2/Download \ && chmod +rw /app/conf/aria2.session \ && chmod -R 755 /usr/local/www/aria2 \ && mkdir -p /data /data/cloud /app/.caddy /app/.cache/aria2 \ && chown -R junv:junv /data /app/.caddy /app/.cache \ && ln -s /data/cloud /app/cloud \ && setcap cap_net_bind_service=+ep /usr/local/bin/caddy # Volumes VOLUME ["/app/conf", "/data", "/app/.cache"] # Expose ports EXPOSE 80 443 6881 # Health check HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ping || exit 1 CMD ["./start.sh"]