diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..e2c608c2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.git +.github +*.md +tests/ +docs/ \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 8e659de3..36aab916 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,30 +1,71 @@ -FROM golang:1.24 AS awg-go +# +# AWG GOLANG BUILDING STAGE +# Base: Debian +# +FROM golang:1.25 AS awg-go -RUN git clone https://github.com/WGDashboard/amneziawg-go /awg -WORKDIR /awg +# Standard working directory for WGDashboard +RUN mkdir -p /workspace && \ + git clone https://github.com/WGDashboard/amneziawg-go /workspace/awg + +WORKDIR /workspace/awg RUN go mod download && \ go mod verify && \ go build -ldflags '-linkmode external -extldflags "-fno-PIC -static"' -v -o /usr/bin -FROM alpine:latest AS awg-tools +# +# AWG TOOLS BUILDING STAGE +# Base: Debian +# +FROM debian:stable-slim AS awg-tools -RUN apk update && apk add --no-cache \ - make git build-base linux-headers \ - && git clone https://github.com/WGDashboard/amneziawg-tools \ - && cd amneziawg-tools/src \ - && make \ - && chmod +x wg* +RUN apt-get update && apt-get install -y --no-install-recommends \ + make git build-essential linux-headers-generic ca-certificates && \ + rm -rf /var/lib/apt/lists/* -FROM alpine:latest +RUN mkdir -p /workspace && \ + git clone https://github.com/WGDashboard/amneziawg-tools /workspace/awg-tools + +WORKDIR /workspace/awg-tools/src +RUN make && chmod +x wg* + +# +# PIP DEPENDENCY BUILDING +# Base: Alpine +# +FROM python:3.13-alpine AS pip-builder + +RUN apk add --no-cache --virtual .build-deps \ + build-base \ + mariadb-dev \ + pkgconfig \ + python3-dev \ + libffi-dev \ + linux-headers \ + && mkdir -p /opt/wgdashboard/src \ + && python3 -m venv /opt/wgdashboard/src/venv + +COPY ./src/requirements.txt /opt/wgdashboard/src +RUN . /opt/wgdashboard/src/venv/bin/activate && \ + pip3 install --upgrade pip && \ + pip3 install -r /opt/wgdashboard/src/requirements.txt + +RUN apk del .build-deps + +# +# WGDashboard RUNNING STAGE +# Base: Alpine +# +FROM python:3.13-alpine LABEL maintainer="dselen@nerthus.nl" RUN apk update && apk add --no-cache \ - iproute2 iptables bash curl wget unzip procps sudo \ - tzdata wireguard-tools python3 py3-psutil py3-bcrypt openresolv + iproute2 iptables bash curl wget unzip procps \ + sudo tzdata wireguard-tools openresolv COPY --from=awg-go /usr/bin/amneziawg-go /usr/bin/amneziawg-go -COPY --from=awg-tools /amneziawg-tools/src/wg /usr/bin/awg -COPY --from=awg-tools /amneziawg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick +COPY --from=awg-tools /workspace/awg-tools/src/wg /usr/bin/awg +COPY --from=awg-tools /workspace/awg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick # Declaring environment variables, change Peernet to an address you like, standard is a 24 bit subnet. ARG wg_net="10.0.0.1" \ @@ -41,10 +82,13 @@ ENV WGDASH=/opt/wgdashboard # Doing WireGuard Dashboard installation measures. Modify the git clone command to get the preferred version, with a specific branch for example. RUN mkdir /data \ - && mkdir /configs \ - && mkdir -p ${WGDASH}/src \ - && mkdir -p /etc/amnezia/amneziawg + && mkdir /configs \ + && mkdir -p ${WGDASH}/src \ + && mkdir -p /etc/amnezia/amneziawg + COPY ./src ${WGDASH}/src +COPY --from=pip-builder /opt/wgdashboard/src/venv /opt/wgdashboard/src/venv +RUN python3 -m venv /opt/wgdashboard/src/venv # Generate basic WireGuard interface. Echoing the WireGuard interface config for readability, adjust if you want it for efficiency. # Also setting the pipefail option, verbose: https://github.com/hadolint/hadolint/wiki/DL4006. @@ -71,6 +115,6 @@ COPY ./docker/entrypoint.sh /entrypoint.sh # Exposing the default WireGuard Dashboard port for web access. EXPOSE 10086 -WORKDIR $WGDASH +WORKDIR $WGDASH/src -ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] \ No newline at end of file diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 85427e32..64df0122 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -56,17 +56,8 @@ ensure_installation() { fi # Create the Python virtual environment. - python3 -m venv "${WGDASH}"/src/venv . "${WGDASH}/src/venv/bin/activate" - # Due to this pip dependency being available as a system package we can just move it to the venv. - echo "Moving PIP dependency from ephemerality to runtime environment: psutil" - mv /usr/lib/python3.12/site-packages/psutil* "${WGDASH}"/src/venv/lib/python3.12/site-packages - - # Due to this pip dependency being available as a system package we can just move it to the venv. - echo "Moving PIP dependency from ephemerality to runtime environment: bcrypt" - mv /usr/lib/python3.12/site-packages/bcrypt* "${WGDASH}"/src/venv/lib/python3.12/site-packages - # Use the bash interpreter to install WGDashboard according to the wgd.sh script. /bin/bash ./wgd.sh install