feat: implementation of unified Docker container

This creates a Docker container with ZeroTier-One, zero-ui and ZeroNSd
all-in-one solution.
It also includes a trivial fix to allow ZeroNSd to work with zero-ui.
This commit is contained in:
Mauro Condarelli 2021-10-10 19:46:14 +02:00
commit 3e698df542
4 changed files with 200 additions and 0 deletions

View file

@ -0,0 +1,81 @@
# ---- initialize build stage
FROM node:current-alpine as builder
# ---- build ZeroTier-One
RUN apk add --update --no-cache alpine-sdk linux-headers \
&& git clone --quiet https://github.com/zerotier/ZeroTierOne.git /src \
&& make -C /src -f make-linux.mk
# ---- build Zero-UI
ENV INLINE_RUNTIME_CHUNK=false
ENV GENERATE_SOURCEMAP=false
RUN yarn set version berry
WORKDIR /app/frontend
COPY ./frontend/package*.json /app/frontend
COPY ./frontend/yarn.lock /app/frontend
RUN yarn install
COPY ./frontend /app/frontend
RUN yarn build
# ---- build ZeroNSd \
FROM rust:alpine as rbuild
ARG IS_LOCAL=0
ARG VERSION=main
ARG IS_TAG=0
RUN apk add --update --no-cache git libressl-dev musl-dev \
&& git clone https://github.com/zerotier/zeronsd.git \
&& cd zeronsd \
&& sh cargo-docker.sh
# ---- initialize deploy stage
FROM node:current-alpine
LABEL description="ZeroTier One as Docker Image"
LABEL org.opencontainers.image.authors="mcondarelli@soft-in.com"
# ---- copy ZeroTier-One
ARG ZT_VERSION
LABEL version="${ZT_VERSION}"
RUN apk add --update --no-cache libc6-compat libstdc++
COPY --from=builder /src/zerotier-one /usr/sbin/
RUN mkdir -p /var/lib/zerotier-one \
&& ln -s /usr/sbin/zerotier-one /usr/sbin/zerotier-idtool \
&& ln -s /usr/sbin/zerotier-one /usr/sbin/zerotier-cli
EXPOSE 9993/udp
# ---- copy Zero-UI
WORKDIR /app/frontend/build
COPY --from=builder /app/frontend/build /app/frontend/build/
WORKDIR /app/backend
COPY ./backend/package*.json /app/backend
COPY ./backend/yarn.lock /app/backend
RUN yarn install
COPY ./backend /app/backend
EXPOSE 4000
ENV NODE_ENV=production
ENV ZU_SECURE_HEADERS=true
ENV ZU_SERVE_FRONTEND=true
# ---- copy ZeroNSd
COPY --from=rbuild /usr/local/cargo/bin/zeronsd /usr/sbin/
# ---- final setup
VOLUME /var/lib/zerotier
COPY docker/all-in-one/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
CMD /entrypoint.sh

View file

@ -0,0 +1,75 @@
# ---- initialize build stage
FROM node:current-bullseye as builder
# ---- build ZeroTier-One
RUN apt-get update && apt-get install -y build-essential \
&& git clone --quiet https://github.com/zerotier/ZeroTierOne.git /src \
&& make -C /src -f make-linux.mk
# ---- build Zero-UI
ENV INLINE_RUNTIME_CHUNK=false
ENV GENERATE_SOURCEMAP=false
RUN yarn set version berry
WORKDIR /app/frontend
COPY ./frontend/package*.json /app/frontend
COPY ./frontend/yarn.lock /app/frontend
RUN yarn install
COPY ./frontend /app/frontend
RUN yarn build
# ---- build ZeroNSd \
FROM rust:bullseye as rbuild
ARG IS_LOCAL=0
ARG VERSION=main
ARG IS_TAG=0
COPY ./docker/all-in-one/zeronsd.patch /tmp/zeronsd.patch
RUN apt-get update && apt-get install --no-install-recommends -y git libssl-dev \
&& git clone https://github.com/zerotier/zeronsd.git \
&& cd zeronsd \
&& patch -p 1 </tmp/zeronsd.patch \
&& sh cargo-docker.sh
# ---- initialize deploy stage
FROM node:current-bullseye
LABEL description="ZeroTier One as Docker Image"
LABEL org.opencontainers.image.authors="mcondarelli@soft-in.com"
# ---- copy ZeroTier-One
ARG ZT_VERSION
LABEL version="${ZT_VERSION}"
COPY --from=builder /src/zerotier-one /usr/sbin/
RUN mkdir -p /var/lib/zerotier-one \
&& ln -s /usr/sbin/zerotier-one /usr/sbin/zerotier-idtool \
&& ln -s /usr/sbin/zerotier-one /usr/sbin/zerotier-cli
EXPOSE 9993/udp
# ---- copy Zero-UI
WORKDIR /app/frontend/build
COPY --from=builder /app/frontend/build /app/frontend/build/
WORKDIR /app/backend
COPY ./backend/package*.json /app/backend
COPY ./backend/yarn.lock /app/backend
RUN yarn install
COPY ./backend /app/backend
EXPOSE 4000
ENV NODE_ENV=production
ENV ZU_SECURE_HEADERS=false
ENV ZU_SERVE_FRONTEND=true
ENV ZU_DATAPATH=/var/lib/zerotier-one/db.json
# ---- copy ZeroNSd
COPY --from=rbuild /usr/local/cargo/bin/zeronsd /usr/sbin/
RUN apt-get update && apt-get install --no-install-recommends -y ca-certificates curl
# ---- final setup
VOLUME /var/lib/zerotier-one
COPY docker/all-in-one/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
CMD /entrypoint.sh

View file

@ -0,0 +1,32 @@
#!/bin/sh
grepzt() {
(find /proc -name exe | xargs -I{} readlink {}) 2>/dev/null | grep -q zerotier-one
return $?
}
echo "starting zerotier"
setsid /usr/sbin/zerotier-one &
while ! grepzt
do
echo "zerotier hasn't started, waiting a second"
sleep 1
done
echo "joining networks"
for i in "$@"
do
echo "joining $i"
while ! zerotier-cli join "$i"
do
echo "joining $i failed; trying again in 1s"
sleep 1
done
done
echo "starting node"
node ./bin/www
echo "at end"

View file

@ -0,0 +1,12 @@
diff --git a/src/utils.rs b/src/utils.rs
index 0f62d52..0f90e69 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -21,6 +21,7 @@ pub(crate) fn central_config(token: String) -> Configuration {
let mut config = Configuration::default();
config.user_agent = Some(version());
config.bearer_access_token = Some(token);
+ config.base_path = "http://localhost:3000/api".to_string();
return config;
}