Fix docker build (#237)
* include package-lock. * extract intel gpu support from dockerfile. * update arm support. * new workflows. * build intel images. * add to docs.
This commit is contained in:
parent
cd9ac70cb9
commit
32472a70bc
@ -61,11 +61,6 @@ ARG USER_UID=1000
|
|||||||
ARG USER_GID=$USER_UID
|
ARG USER_GID=$USER_UID
|
||||||
|
|
||||||
RUN set -eux; \
|
RUN set -eux; \
|
||||||
#
|
|
||||||
# add non-free repo for intel drivers
|
|
||||||
echo deb http://deb.debian.org/debian bullseye main contrib non-free > /etc/apt/sources.list; \
|
|
||||||
echo deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free >> /etc/apt/sources.list; \
|
|
||||||
echo deb http://deb.debian.org/debian bullseye-updates main contrib non-free >> /etc/apt/sources.list; \
|
|
||||||
apt-get update; \
|
apt-get update; \
|
||||||
#
|
#
|
||||||
# install dependencies
|
# install dependencies
|
||||||
@ -73,13 +68,9 @@ RUN set -eux; \
|
|||||||
apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \
|
apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \
|
||||||
apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \
|
apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \
|
||||||
#
|
#
|
||||||
# intel driver + vaapi
|
# gst
|
||||||
apt-get install -y --no-install-recommends intel-media-va-driver-non-free libva2 vainfo; \
|
|
||||||
#
|
|
||||||
# gst + vaapi plugin
|
|
||||||
apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
||||||
gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio \
|
gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio; \
|
||||||
gstreamer1.0-vaapi ;\
|
|
||||||
#
|
#
|
||||||
# install fonts
|
# install fonts
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
@ -122,7 +113,6 @@ COPY .docker/base/dbus /usr/bin/dbus
|
|||||||
COPY .docker/base/default.pa /etc/pulse/default.pa
|
COPY .docker/base/default.pa /etc/pulse/default.pa
|
||||||
COPY .docker/base/supervisord.conf /etc/neko/supervisord.conf
|
COPY .docker/base/supervisord.conf /etc/neko/supervisord.conf
|
||||||
COPY .docker/base/xorg.conf /etc/neko/xorg.conf
|
COPY .docker/base/xorg.conf /etc/neko/xorg.conf
|
||||||
COPY .docker/base/add-render-group.sh /usr/bin/add-render-group.sh
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# set default envs
|
# set default envs
|
||||||
@ -131,7 +121,6 @@ ENV DISPLAY=:99.0
|
|||||||
ENV NEKO_PASSWORD=neko
|
ENV NEKO_PASSWORD=neko
|
||||||
ENV NEKO_PASSWORD_ADMIN=admin
|
ENV NEKO_PASSWORD_ADMIN=admin
|
||||||
ENV NEKO_BIND=:8080
|
ENV NEKO_BIND=:8080
|
||||||
ENV RENDER_GID=
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# copy static files from previous stages
|
# copy static files from previous stages
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# STAGE 1: SERVER
|
# STAGE 1: SERVER
|
||||||
#
|
#
|
||||||
FROM arm32v7/golang:1.18-buster as server
|
FROM golang:1.18-bullseye as server
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -13,7 +13,7 @@ RUN set -eux; apt-get update; \
|
|||||||
# install libclipboard
|
# install libclipboard
|
||||||
set -eux; \
|
set -eux; \
|
||||||
cd /tmp; \
|
cd /tmp; \
|
||||||
git clone https://github.com/jtanx/libclipboard; \
|
git clone --depth=1 https://github.com/jtanx/libclipboard; \
|
||||||
cd libclipboard; \
|
cd libclipboard; \
|
||||||
cmake .; \
|
cmake .; \
|
||||||
make -j4; \
|
make -j4; \
|
||||||
@ -32,7 +32,7 @@ RUN go get -v -t -d . && go build -o bin/neko cmd/neko/main.go
|
|||||||
#
|
#
|
||||||
# STAGE 2: CLIENT
|
# STAGE 2: CLIENT
|
||||||
#
|
#
|
||||||
FROM node:14-buster-slim as client
|
FROM node:14-bullseye-slim as client
|
||||||
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
RUN set -eux; apt-get update; \
|
RUN set -eux; apt-get update; \
|
||||||
@ -53,7 +53,7 @@ RUN npm run build
|
|||||||
#
|
#
|
||||||
# STAGE 3: RUNTIME
|
# STAGE 3: RUNTIME
|
||||||
#
|
#
|
||||||
FROM arm32v7/debian:buster-slim
|
FROM debian:bullseye-slim
|
||||||
|
|
||||||
#
|
#
|
||||||
# avoid warnings by switching to noninteractive
|
# avoid warnings by switching to noninteractive
|
||||||
@ -65,19 +65,27 @@ ARG USERNAME=neko
|
|||||||
ARG USER_UID=1000
|
ARG USER_UID=1000
|
||||||
ARG USER_GID=$USER_UID
|
ARG USER_GID=$USER_UID
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
apt-get update; \
|
||||||
#
|
#
|
||||||
# install dependencies
|
# install dependencies
|
||||||
RUN set -eux; apt-get update; \
|
|
||||||
apt-get install -y --no-install-recommends wget ca-certificates supervisor; \
|
apt-get install -y --no-install-recommends wget ca-certificates supervisor; \
|
||||||
apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \
|
apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \
|
||||||
apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx5; \
|
apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \
|
||||||
#
|
#
|
||||||
# gst
|
# gst
|
||||||
apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
||||||
gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-omx; \
|
gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio \
|
||||||
|
gstreamer1.0-omx; \
|
||||||
#
|
#
|
||||||
# fonts
|
# install fonts
|
||||||
apt-get install -y --no-install-recommends fonts-takao-mincho fonts-wqy-zenhei; \
|
apt-get install -y --no-install-recommends \
|
||||||
|
# Google emojis
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
# Japanese fonts
|
||||||
|
fonts-takao-mincho \
|
||||||
|
# Chinese fonts
|
||||||
|
fonts-wqy-zenhei; \
|
||||||
#
|
#
|
||||||
# create a non-root user
|
# create a non-root user
|
||||||
groupadd --gid $USER_GID $USERNAME; \
|
groupadd --gid $USER_GID $USERNAME; \
|
||||||
@ -131,4 +139,3 @@ HEALTHCHECK --interval=10s --timeout=5s --retries=8 \
|
|||||||
#
|
#
|
||||||
# run neko
|
# run neko
|
||||||
CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"]
|
CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"]
|
||||||
|
|
||||||
|
146
.docker/base/Dockerfile.intel
Normal file
146
.docker/base/Dockerfile.intel
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
#
|
||||||
|
# STAGE 1: SERVER
|
||||||
|
#
|
||||||
|
FROM golang:1.18-bullseye as server
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
#
|
||||||
|
# install dependencies
|
||||||
|
RUN set -eux; apt-get update; \
|
||||||
|
apt-get install -y --no-install-recommends git cmake make libx11-dev libxrandr-dev libxtst-dev \
|
||||||
|
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly; \
|
||||||
|
#
|
||||||
|
# install libclipboard
|
||||||
|
set -eux; \
|
||||||
|
cd /tmp; \
|
||||||
|
git clone --depth=1 https://github.com/jtanx/libclipboard; \
|
||||||
|
cd libclipboard; \
|
||||||
|
cmake .; \
|
||||||
|
make -j4; \
|
||||||
|
make install; \
|
||||||
|
rm -rf /tmp/libclipboard; \
|
||||||
|
#
|
||||||
|
# clean up
|
||||||
|
apt-get clean -y; \
|
||||||
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
||||||
|
|
||||||
|
#
|
||||||
|
# build server
|
||||||
|
COPY server/ .
|
||||||
|
RUN go get -v -t -d . && go build -o bin/neko cmd/neko/main.go
|
||||||
|
|
||||||
|
#
|
||||||
|
# STAGE 2: CLIENT
|
||||||
|
#
|
||||||
|
FROM node:14-bullseye-slim as client
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
#
|
||||||
|
# install dependencies
|
||||||
|
COPY client/package*.json ./
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
#
|
||||||
|
# build client
|
||||||
|
COPY client/ .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
#
|
||||||
|
# STAGE 3: RUNTIME
|
||||||
|
#
|
||||||
|
FROM debian:bullseye-slim
|
||||||
|
|
||||||
|
#
|
||||||
|
# avoid warnings by switching to noninteractive
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
#
|
||||||
|
# set custom user
|
||||||
|
ARG USERNAME=neko
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=$USER_UID
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
#
|
||||||
|
# add non-free repo for intel drivers
|
||||||
|
echo deb http://deb.debian.org/debian bullseye main contrib non-free > /etc/apt/sources.list; \
|
||||||
|
echo deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free >> /etc/apt/sources.list; \
|
||||||
|
echo deb http://deb.debian.org/debian bullseye-updates main contrib non-free >> /etc/apt/sources.list; \
|
||||||
|
apt-get update; \
|
||||||
|
#
|
||||||
|
# install dependencies
|
||||||
|
apt-get install -y --no-install-recommends wget ca-certificates supervisor; \
|
||||||
|
apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \
|
||||||
|
apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \
|
||||||
|
#
|
||||||
|
# intel driver + vaapi
|
||||||
|
apt-get install -y --no-install-recommends intel-media-va-driver-non-free libva2 vainfo; \
|
||||||
|
#
|
||||||
|
# gst + vaapi plugin
|
||||||
|
apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
||||||
|
gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio \
|
||||||
|
gstreamer1.0-vaapi; \
|
||||||
|
#
|
||||||
|
# install fonts
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
# Google emojis
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
# Japanese fonts
|
||||||
|
fonts-takao-mincho \
|
||||||
|
# Chinese fonts
|
||||||
|
fonts-wqy-zenhei; \
|
||||||
|
#
|
||||||
|
# create a non-root user
|
||||||
|
groupadd --gid $USER_GID $USERNAME; \
|
||||||
|
useradd --uid $USER_UID --gid $USERNAME --shell /bin/bash --create-home $USERNAME; \
|
||||||
|
adduser $USERNAME audio; \
|
||||||
|
adduser $USERNAME video; \
|
||||||
|
adduser $USERNAME pulse; \
|
||||||
|
#
|
||||||
|
# setup pulseaudio
|
||||||
|
mkdir -p /home/$USERNAME/.config/pulse/; \
|
||||||
|
echo "default-server=unix:/tmp/pulseaudio.socket" > /home/$USERNAME/.config/pulse/client.conf; \
|
||||||
|
#
|
||||||
|
# workaround for an X11 problem: http://blog.tigerteufel.de/?p=476
|
||||||
|
mkdir /tmp/.X11-unix; \
|
||||||
|
chmod 1777 /tmp/.X11-unix; \
|
||||||
|
chown $USERNAME /tmp/.X11-unix/; \
|
||||||
|
#
|
||||||
|
# make directories for neko
|
||||||
|
mkdir -p /etc/neko /var/www /var/log/neko; \
|
||||||
|
chmod 1777 /var/log/neko; \
|
||||||
|
chown $USERNAME /var/log/neko/; \
|
||||||
|
chown -R $USERNAME:$USERNAME /home/$USERNAME; \
|
||||||
|
#
|
||||||
|
# clean up
|
||||||
|
apt-get clean -y; \
|
||||||
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
||||||
|
|
||||||
|
#
|
||||||
|
# copy config files
|
||||||
|
COPY .docker/base/dbus /usr/bin/dbus
|
||||||
|
COPY .docker/base/default.pa /etc/pulse/default.pa
|
||||||
|
COPY .docker/base/intel/supervisord.conf /etc/neko/supervisord.conf
|
||||||
|
COPY .docker/base/xorg.conf /etc/neko/xorg.conf
|
||||||
|
COPY .docker/base/intel/add-render-group.sh /usr/bin/add-render-group.sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# set default envs
|
||||||
|
ENV USER=$USERNAME
|
||||||
|
ENV DISPLAY=:99.0
|
||||||
|
ENV NEKO_PASSWORD=neko
|
||||||
|
ENV NEKO_PASSWORD_ADMIN=admin
|
||||||
|
ENV NEKO_BIND=:8080
|
||||||
|
ENV RENDER_GID=
|
||||||
|
|
||||||
|
#
|
||||||
|
# copy static files from previous stages
|
||||||
|
COPY --from=server /src/bin/neko /usr/bin/neko
|
||||||
|
COPY --from=client /src/dist/ /var/www
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=10s --timeout=5s --retries=8 \
|
||||||
|
CMD wget -O - http://localhost:${NEKO_BIND#*:}/health || exit 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# run neko
|
||||||
|
CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"]
|
69
.docker/base/intel/supervisord.conf
Normal file
69
.docker/base/intel/supervisord.conf
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
[supervisord]
|
||||||
|
nodaemon=true
|
||||||
|
user=root
|
||||||
|
pidfile=/var/run/supervisord.pid
|
||||||
|
logfile=/dev/null
|
||||||
|
logfile_maxbytes=0
|
||||||
|
loglevel=debug
|
||||||
|
|
||||||
|
[include]
|
||||||
|
files=/etc/neko/supervisord/*.conf
|
||||||
|
|
||||||
|
[program:rendergroup-init]
|
||||||
|
environment=RENDER_GID="%(ENV_RENDER_GID)s",USER="%(ENV_USER)s"
|
||||||
|
command=/usr/bin/add-render-group.sh
|
||||||
|
startsecs=0
|
||||||
|
startretries=0
|
||||||
|
autorestart=false
|
||||||
|
priority=10
|
||||||
|
user=root
|
||||||
|
stdout_logfile=/var/log/neko/rendergroup.log
|
||||||
|
stdout_logfile_maxbytes=1MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
redirect_stderr=true
|
||||||
|
|
||||||
|
[program:dbus]
|
||||||
|
environment=HOME="/root",USER="root"
|
||||||
|
command=/usr/bin/dbus
|
||||||
|
autorestart=true
|
||||||
|
priority=100
|
||||||
|
user=root
|
||||||
|
stdout_logfile=/var/log/neko/dbus.log
|
||||||
|
stdout_logfile_maxbytes=100MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
redirect_stderr=true
|
||||||
|
|
||||||
|
[program:x-server]
|
||||||
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
||||||
|
command=/usr/bin/X -config /etc/neko/xorg.conf %(ENV_DISPLAY)s
|
||||||
|
autorestart=true
|
||||||
|
priority=300
|
||||||
|
user=%(ENV_USER)s
|
||||||
|
stdout_logfile=/var/log/neko/xorg.log
|
||||||
|
stdout_logfile_maxbytes=100MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
redirect_stderr=true
|
||||||
|
|
||||||
|
[program:pulseaudio]
|
||||||
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
|
||||||
|
command=/usr/bin/pulseaudio --log-level=info --disallow-module-loading --disallow-exit --exit-idle-time=-1
|
||||||
|
autorestart=true
|
||||||
|
priority=300
|
||||||
|
user=%(ENV_USER)s
|
||||||
|
stdout_logfile=/var/log/neko/pulseaudio.log
|
||||||
|
stdout_logfile_maxbytes=100MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
redirect_stderr=true
|
||||||
|
|
||||||
|
[program:neko]
|
||||||
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
|
||||||
|
command=/usr/bin/neko serve --static "/var/www"
|
||||||
|
stopsignal=INT
|
||||||
|
stopwaitsecs=5
|
||||||
|
autorestart=true
|
||||||
|
priority=800
|
||||||
|
user=%(ENV_USER)s
|
||||||
|
stdout_logfile=/var/log/neko/neko.log
|
||||||
|
stdout_logfile_maxbytes=100MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
redirect_stderr=true
|
@ -9,19 +9,6 @@ loglevel=debug
|
|||||||
[include]
|
[include]
|
||||||
files=/etc/neko/supervisord/*.conf
|
files=/etc/neko/supervisord/*.conf
|
||||||
|
|
||||||
[program:rendergroup-init]
|
|
||||||
environment=RENDER_GID="%(ENV_RENDER_GID)s",USER="%(ENV_USER)s"
|
|
||||||
command=/usr/bin/add-render-group.sh
|
|
||||||
startsecs=0
|
|
||||||
startretries=0
|
|
||||||
autorestart=false
|
|
||||||
priority=10
|
|
||||||
user=root
|
|
||||||
stdout_logfile=/var/log/neko/rendergroup.log
|
|
||||||
stdout_logfile_maxbytes=1MB
|
|
||||||
stdout_logfile_backups=10
|
|
||||||
redirect_stderr=true
|
|
||||||
|
|
||||||
[program:dbus]
|
[program:dbus]
|
||||||
environment=HOME="/root",USER="root"
|
environment=HOME="/root",USER="root"
|
||||||
command=/usr/bin/dbus
|
command=/usr/bin/dbus
|
||||||
|
@ -77,6 +77,21 @@ build_arm() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
build_intel() {
|
||||||
|
if [ "$1" = "base" ]
|
||||||
|
then
|
||||||
|
# build intel base
|
||||||
|
docker build -t "${BUILD_IMAGE}:intel-base" -f base/Dockerfile.intel "${BASE}"
|
||||||
|
elif [ -f "$1/Dockerfile.intel" ]
|
||||||
|
then
|
||||||
|
# build dedicated intel image
|
||||||
|
docker build -t "${BUILD_IMAGE}:intel-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:intel-base" -f "$1/Dockerfile.intel" "$1/"
|
||||||
|
else
|
||||||
|
# try to build intel image with common Dockerfile
|
||||||
|
docker build -t "${BUILD_IMAGE}:intel-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:intel-base" -f "$1/Dockerfile" "$1/"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
client) build_client;;
|
client) build_client;;
|
||||||
server) build_server;;
|
server) build_server;;
|
||||||
@ -84,6 +99,9 @@ case $1 in
|
|||||||
# build arm- images
|
# build arm- images
|
||||||
arm-*) build_arm "${1#arm-}";;
|
arm-*) build_arm "${1#arm-}";;
|
||||||
|
|
||||||
|
# build intel- images
|
||||||
|
intel-*) build_intel "${1#intel-}";;
|
||||||
|
|
||||||
# build images
|
# build images
|
||||||
*) build "$1";;
|
*) build "$1";;
|
||||||
esac
|
esac
|
||||||
|
@ -4,7 +4,7 @@ FROM $BASE_IMAGE
|
|||||||
#
|
#
|
||||||
# install neko chromium
|
# install neko chromium
|
||||||
RUN set -eux; apt-get update; \
|
RUN set -eux; apt-get update; \
|
||||||
# TODO: Bring back DRM support with arm32v7/debian:buster-slim image.
|
# TODO: Bring back DRM support.
|
||||||
apt-get install -y --no-install-recommends chromium openbox; \
|
apt-get install -y --no-install-recommends chromium openbox; \
|
||||||
#
|
#
|
||||||
# clean up
|
# clean up
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
name: "CI for builds"
|
name: "build and push amd64 images to Docker Hub"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
@ -1,4 +1,4 @@
|
|||||||
name: "CI for version tags"
|
name: "amd64 images"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@ -8,6 +8,9 @@ on:
|
|||||||
env:
|
env:
|
||||||
REGISTRY: ghcr.io
|
REGISTRY: ghcr.io
|
||||||
IMAGE_NAME: m1k1o/neko
|
IMAGE_NAME: m1k1o/neko
|
||||||
|
TAG_PREFIX: ""
|
||||||
|
BASE_DOCKERFILE: Dockerfile
|
||||||
|
PLATFORMS: linux/amd64
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-base:
|
build-base:
|
||||||
@ -31,7 +34,7 @@ jobs:
|
|||||||
uses: docker/metadata-action@v3
|
uses: docker/metadata-action@v3
|
||||||
id: meta
|
id: meta
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/base
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base
|
||||||
tags: |
|
tags: |
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
@ -49,8 +52,8 @@ jobs:
|
|||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
context: ./
|
context: ./
|
||||||
file: .docker/base/Dockerfile
|
file: .docker/base/${{ env.BASE_DOCKERFILE }}
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: ${{ env.PLATFORMS }}
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
@ -67,32 +70,19 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- tag: firefox
|
- tag: firefox
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
- tag: chromium
|
- tag: chromium
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
- tag: google-chrome
|
- tag: google-chrome
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: ungoogled-chromium
|
- tag: ungoogled-chromium
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
- tag: microsoft-edge
|
- tag: microsoft-edge
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: brave
|
- tag: brave
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: vivaldi
|
- tag: vivaldi
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: opera
|
- tag: opera
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: tor-browser
|
- tag: tor-browser
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
- tag: remmina
|
- tag: remmina
|
||||||
platforms: linux/amd64
|
|
||||||
- tag: vlc
|
- tag: vlc
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
- tag: xfce
|
- tag: xfce
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
env:
|
env:
|
||||||
TAG_NAME: ${{ matrix.tag }}
|
TAG_NAME: ${{ matrix.tag }}
|
||||||
PLATFORMS: ${{ matrix.platforms }}
|
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
@ -108,11 +98,12 @@ jobs:
|
|||||||
uses: docker/metadata-action@v3
|
uses: docker/metadata-action@v3
|
||||||
id: meta
|
id: meta
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}${{ env.TAG_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
type=semver,pattern={{major}}
|
type=semver,pattern={{major}}
|
||||||
|
type=sha,format=long
|
||||||
-
|
-
|
||||||
name: Log in to the Container registry
|
name: Log in to the Container registry
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v1
|
||||||
@ -130,4 +121,4 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-args: |
|
build-args: |
|
||||||
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/base:sha-${{ github.sha }}
|
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base:sha-${{ github.sha }}
|
126
.github/workflows/ghcr-arm.yml
vendored
Normal file
126
.github/workflows/ghcr-arm.yml
vendored
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
name: "arm64v8 and arm32v7 images"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: m1k1o/neko
|
||||||
|
TAG_PREFIX: arm-
|
||||||
|
BASE_DOCKERFILE: Dockerfile.arm
|
||||||
|
PLATFORMS: linux/arm64,linux/arm/v7
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-base:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
#
|
||||||
|
# do not run on forks
|
||||||
|
#
|
||||||
|
if: github.repository_owner == 'm1k1o'
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Extract metadata (tags, labels) for Docker
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha,format=long
|
||||||
|
-
|
||||||
|
name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GHCR_ACCESS_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: ./
|
||||||
|
file: .docker/base/${{ env.BASE_DOCKERFILE }}
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
#
|
||||||
|
# do not run on forks
|
||||||
|
#
|
||||||
|
if: github.repository_owner == 'm1k1o'
|
||||||
|
needs: [ build-base ]
|
||||||
|
strategy:
|
||||||
|
# Will build all images even if some fail.
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- tag: firefox
|
||||||
|
dockerfile: Dockerfile.arm
|
||||||
|
- tag: chromium
|
||||||
|
dockerfile: Dockerfile.arm
|
||||||
|
- tag: ungoogled-chromium
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
- tag: tor-browser
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
- tag: vlc
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
- tag: xfce
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
env:
|
||||||
|
TAG_NAME: ${{ matrix.tag }}
|
||||||
|
DOCKERFILE: ${{ matrix.dockerfile }}
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Extract metadata (tags, labels) for Docker
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}${{ env.TAG_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha,format=long
|
||||||
|
-
|
||||||
|
name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GHCR_ACCESS_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .docker/${{ env.TAG_NAME }}
|
||||||
|
file: .docker/${{ env.TAG_NAME }}/${{ env.DOCKERFILE }}
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
build-args: |
|
||||||
|
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base:sha-${{ github.sha }}
|
125
.github/workflows/ghcr-intel.yml
vendored
Normal file
125
.github/workflows/ghcr-intel.yml
vendored
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
name: "intel gpu supported images"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: m1k1o/neko
|
||||||
|
TAG_PREFIX: intel-
|
||||||
|
BASE_DOCKERFILE: Dockerfile.intel
|
||||||
|
PLATFORMS: linux/amd64
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-base:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
#
|
||||||
|
# do not run on forks
|
||||||
|
#
|
||||||
|
if: github.repository_owner == 'm1k1o'
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Extract metadata (tags, labels) for Docker
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha,format=long
|
||||||
|
-
|
||||||
|
name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GHCR_ACCESS_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: ./
|
||||||
|
file: .docker/base/${{ env.BASE_DOCKERFILE }}
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
#
|
||||||
|
# do not run on forks
|
||||||
|
#
|
||||||
|
if: github.repository_owner == 'm1k1o'
|
||||||
|
needs: [ build-base ]
|
||||||
|
strategy:
|
||||||
|
# Will build all images even if some fail.
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- tag: firefox
|
||||||
|
- tag: chromium
|
||||||
|
- tag: google-chrome
|
||||||
|
- tag: ungoogled-chromium
|
||||||
|
- tag: microsoft-edge
|
||||||
|
- tag: brave
|
||||||
|
- tag: vivaldi
|
||||||
|
- tag: opera
|
||||||
|
- tag: tor-browser
|
||||||
|
- tag: remmina
|
||||||
|
- tag: vlc
|
||||||
|
- tag: xfce
|
||||||
|
env:
|
||||||
|
TAG_NAME: ${{ matrix.tag }}
|
||||||
|
DOCKERFILE: ${{ matrix.dockerfile }}
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Extract metadata (tags, labels) for Docker
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}${{ env.TAG_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha,format=long
|
||||||
|
-
|
||||||
|
name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GHCR_ACCESS_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .docker/${{ env.TAG_NAME }}
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
build-args: |
|
||||||
|
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.TAG_PREFIX }}base:sha-${{ github.sha }}
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -23,10 +23,6 @@ pids
|
|||||||
*.seed
|
*.seed
|
||||||
*.pid.lock
|
*.pid.lock
|
||||||
|
|
||||||
# Lock files
|
|
||||||
yarn.lock
|
|
||||||
package-lock.json
|
|
||||||
|
|
||||||
# TypeScript incremental compilation cache
|
# TypeScript incremental compilation cache
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
14643
client/package-lock.json
generated
Normal file
14643
client/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,7 @@
|
|||||||
<img src="../_media/icons/xfce.svg" title="m1k1o/neko:xfce" width="60" height="auto"/>
|
<img src="../_media/icons/xfce.svg" title="m1k1o/neko:xfce" width="60" height="auto"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Use the following docker images:
|
Use the following docker images from [Docker Hub](https://hub.docker.com/r/m1k1o/neko) for x86_64:
|
||||||
- `m1k1o/neko:latest` or `m1k1o/neko:firefox` - for Firefox.
|
- `m1k1o/neko:latest` or `m1k1o/neko:firefox` - for Firefox.
|
||||||
- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
- `m1k1o/neko:chromium` - for Chromium (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||||
- `m1k1o/neko:google-chrome` - for Google Chrome (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
- `m1k1o/neko:google-chrome` - for Google Chrome (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
|
||||||
@ -31,12 +31,47 @@ Use the following docker images:
|
|||||||
- `m1k1o/neko:xfce` - for a shared desktop / installing shared software.
|
- `m1k1o/neko:xfce` - for a shared desktop / installing shared software.
|
||||||
- `m1k1o/neko:base` - for custom base.
|
- `m1k1o/neko:base` - for custom base.
|
||||||
|
|
||||||
For ARM-based devices (like Raspberry Pi, with GPU hardware acceleration):
|
Dockerhub images are built using GitHub actions on every push and on weekly basis to keep all browsers up-to-date.
|
||||||
- `m1k1o/neko:arm-firefox` - for Firefox.
|
|
||||||
- `m1k1o/neko:arm-chromium` - for Chromium.
|
|
||||||
- `m1k1o/neko:arm-base` - for custom arm based.
|
|
||||||
|
|
||||||
Images (except `arm-`) are built using GitHub actions on every push and on weekly basis to keep all browsers up-to-date,
|
All images are also available on [GitHub Container Registry](https://github.com/m1k1o?tab=packages&repo_name=neko) for faster pulls:
|
||||||
|
|
||||||
|
- `ghcr.io/m1k1o/neko/firefox:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/google-chrome:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/ungoogled-chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/microsoft-edge:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/brave:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/vivaldi:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/opera:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/tor-browser:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/remmina:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/vlc:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/xfce:latest`
|
||||||
|
|
||||||
|
For ARM-based images (like Raspberry Pi - with GPU hardware acceleration, Oracle Cloud ARM tier). Currently not all images are available for ARM, because not all applications are available for ARM.
|
||||||
|
|
||||||
|
- `ghcr.io/m1k1o/neko/arm-firefox:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/arm-chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/arm-ungoogled-chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/arm-vlc:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/arm-xfce:latest`
|
||||||
|
|
||||||
|
For images with VAAPI GPU hardware acceleration using intel drivers use:
|
||||||
|
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-firefox:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-google-chrome:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-ungoogled-chromium:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-microsoft-edge:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-brave:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-vivaldi:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-opera:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-tor-browser:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-remmina:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-vlc:latest`
|
||||||
|
- `ghcr.io/m1k1o/neko/intel-xfce:latest`
|
||||||
|
|
||||||
|
GHCR images are built using GitHub actions for every tag.
|
||||||
|
|
||||||
### Networking:
|
### Networking:
|
||||||
- If you want to use n.eko in **external** network, you can omit `NEKO_NAT1TO1`. It will automatically get your Public IP.
|
- If you want to use n.eko in **external** network, you can omit `NEKO_NAT1TO1`. It will automatically get your Public IP.
|
||||||
|
Reference in New Issue
Block a user