# Zoraxy multi-stage build Dockerfile
# Stage 1: Build Zoraxy from Go source
FROM docker.io/golang:alpine AS build-zoraxy
RUN mkdir -p /opt/zoraxy/source/ && \
mkdir -p /usr/local/bin/
# Copy Go source for zoraxy
COPY ./src/ /opt/zoraxy/source/
WORKDIR /opt/zoraxy/source/
# Resolve modules and build
RUN go mod tidy && \
go build -o /usr/local/bin/zoraxy && \
chmod 755 /usr/local/bin/zoraxy
# Stage 2: Build ZeroTier (Rust-based)
FROM docker.io/rust:1.79-alpine AS build-zerotier
RUN mkdir -p /opt/zerotier/source/ && \
mkdir -p /usr/local/bin/
WORKDIR /opt/zerotier/source/
RUN apk add --update --no-cache curl make gcc g++ linux-headers openssl-dev nano
# Pin the version for compatibility
RUN curl -Lo ZeroTierOne.tar.gz https://codeload.github.com/zerotier/ZeroTierOne/tar.gz/refs/tags/1.10.6 && \
tar -xzvf ZeroTierOne.tar.gz && \
cd ZeroTierOne-*/zeroidc && \
cargo update -p getrandom && \
cd .. && \
make -f make-linux.mk && \
mv ./zerotier-one /usr/local/bin/zerotier-one && \
chmod 755 /usr/local/bin/zerotier-one
# Stage 3: Final runtime image
FROM docker.io/alpine:3.22.4
RUN apk add --update --no-cache tzdata python3 sudo netcat-openbsd libressl-dev openssh ca-certificates libc6-compat libstdc++ && \
rm -rf /var/cache/apk/* /tmp/*
# Copy the entrypoint script
COPY --chmod=700 docker/entrypoint.py /opt/zoraxy/entrypoint.py
# Copy built binaries from previous stages
COPY --from=build-zerotier /usr/local/bin/zerotier-one /usr/local/bin/zerotier-one
COPY --from=build-zoraxy /usr/local/bin/zoraxy /usr/local/bin/zoraxy
# Create required directories and modules
RUN mkdir -p /opt/zoraxy/plugin/ && \
echo "tun" | tee -a /etc/modules # For ZeroTier
WORKDIR /opt/zoraxy/config/
ENV TZ="Etc/UTC"
ENV ZEROTIER="false"
ENV AUTORENEW="86400"
ENV CFGUPGRADE="true"
ENV DB="auto"
ENV DOCKER="true"
ENV EARLYRENEW="30"
ENV ENABLELOG="true"
ENV FASTGEOIP="false"
ENV MDNS="true"
ENV MDNSNAME="''"
ENV NOAUTH="false"
ENV PLUGIN="/opt/zoraxy/plugin/"
ENV PORT="8000"
ENV SSHLB="false"
ENV UPDATE_GEOIP="false"
ENV VERSION="false"
ENV WEBROOT="./www"
VOLUME [ "/opt/zoraxy/config/" ]
LABEL com.imuslab.zoraxy.container-identifier="Zoraxy"
ENTRYPOINT [ "python3", "-u", "/opt/zoraxy/entrypoint.py" ]
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 CMD nc -vz 127.0.0.1 $PORT || exit 1
# Zoraxy multi-stage build Dockerfile
# Stage 1: Build Zoraxy from Go source
FROM golang:1.25-alpine AS build-zoraxy
RUN mkdir -p /opt/zoraxy/source/ && \
mkdir -p /usr/local/bin/
# Copy Go source for zoraxy
COPY ./src/ /opt/zoraxy/source/
WORKDIR /opt/zoraxy/source/
# Resolve modules and build
RUN go mod tidy && \
go build -o /usr/local/bin/zoraxy && \
chmod 755 /usr/local/bin/zoraxy
# Stage 2: Build ZeroTier (Rust-based)
FROM rust:1.79-alpine AS build-zerotier
RUN mkdir -p /opt/zerotier/source/ && \
mkdir -p /usr/local/bin/
WORKDIR /opt/zerotier/source/
RUN apk add --update --no-cache curl make gcc g++ linux-headers openssl-dev
# Pin the version for compatibility
RUN curl -Lo ZeroTierOne.tar.gz https://codeload.github.com/zerotier/ZeroTierOne/tar.gz/refs/tags/1.10.6 && \
tar -xzvf ZeroTierOne.tar.gz && \
cd ZeroTierOne-*/zeroidc && \
cargo update -p getrandom && \
cd .. && \
make -f make-linux.mk && \
mv ./zerotier-one /usr/local/bin/zerotier-one && \
chmod 755 /usr/local/bin/zerotier-one
# Stage 3: Final runtime image
FROM alpine:3.22.4
RUN apk add --update --no-cache tzdata python3 sudo netcat-openbsd libressl-dev openssh ca-certificates libc6-compat libstdc++ && \
rm -rf /var/cache/apk/* /tmp/*
# Copy entrypoint script
COPY --chmod=700 docker/entrypoint.py /opt/zoraxy/entrypoint.py
# Copy built binaries from previous stages
COPY --from=build-zerotier /usr/local/bin/zerotier-one /usr/local/bin/zerotier-one
COPY --from=build-zoraxy /usr/local/bin/zoraxy /usr/local/bin/zoraxy
# Allow ZeroTier kernel module loading
RUN mkdir -p /opt/zoraxy/plugin/ && \
echo "tun" | tee -a /etc/modules # For ZeroTier
WORKDIR /opt/zoraxy/config/
ENV TZ="Etc/UTC"
ENV ZEROTIER="false"
ENV AUTORENEW="86400"
ENV CFGUPGRADE="true"
ENV DB="auto"
ENV DOCKER="true"
ENV EARLYRENEW="30"
ENV ENABLELOG="true"
ENV FASTGEOIP="false"
ENV MDNS="true"
ENV MDNSNAME="''"
ENV NOAUTH="false"
ENV PLUGIN="/opt/zoraxy/plugin/"
ENV PORT="8000"
ENV SSHLB="false"
ENV UPDATE_GEOIP="false"
ENV VERSION="false"
ENV WEBROOT="./www"
VOLUME [ "/opt/zoraxy/config/" ]
LABEL com.imuslab.zoraxy.container-identifier="Zoraxy"
ENTRYPOINT [ "python3", "-u", "/opt/zoraxy/entrypoint.py" ]
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 CMD nc -vz 127.0.0.1 $PORT || exit 1
__pycache__/ *.pyc *.pyo *.pyd *.swp *.swo .DS_Store .git .gitignore node_modules/ vendor/ build/ out/ *.tar.gz *.zip *.tar *.log .log *.db *.sqlite *.sqlite3 /tmp/