* web: fix esbuild issue with style sheets
Getting ESBuild, Lit, and Storybook to all agree on how to read and parse stylesheets is a serious
pain. This fix better identifies the value types (instances) being passed from various sources in
the repo to the three *different* kinds of style processors we're using (the native one, the
polyfill one, and whatever the heck Storybook does internally).
Falling back to using older CSS instantiating techniques one era at a time seems to do the trick.
It's ugly, but in the face of the aggressive styling we use to avoid Flashes of Unstyled Content
(FLoUC), it's the logic with which we're left.
In standard mode, the following warning appears on the console when running a Flow:
```
Autofocus processing was blocked because a document already has a focused element.
```
In compatibility mode, the following **error** appears on the console when running a Flow:
```
crawler-inject.js:1106 Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.
at initDomMutationObservers (crawler-inject.js:1106:18)
at crawler-inject.js:1114:24
at Array.forEach (<anonymous>)
at initDomMutationObservers (crawler-inject.js:1114:10)
at crawler-inject.js:1549:1
initDomMutationObservers @ crawler-inject.js:1106
(anonymous) @ crawler-inject.js:1114
initDomMutationObservers @ crawler-inject.js:1114
(anonymous) @ crawler-inject.js:1549
```
Despite this error, nothing seems to be broken and flows work as anticipated.
* core: include version in built JS files
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* add fallback
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* include build hash
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* format
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* fix stuff
why does this even work locally
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* idk man node
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* just not use import assertions
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* web: add no-console, use proper dirname path
* web: retarget to use the base package.json file.
* web: encode path to root package.json using git
This is the most authoritative way of finding the root of the git project.
* use full version to match frontend
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* add fallback for missing .git folder
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
---------
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Ken Sternberg <ken@goauthentik.io>
178 lines
6.4 KiB
Docker
178 lines
6.4 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# Stage 1: Build website
|
|
FROM --platform=${BUILDPLATFORM} docker.io/node:22 as website-builder
|
|
|
|
ENV NODE_ENV=production
|
|
|
|
WORKDIR /work/website
|
|
|
|
RUN --mount=type=bind,target=/work/website/package.json,src=./website/package.json \
|
|
--mount=type=bind,target=/work/website/package-lock.json,src=./website/package-lock.json \
|
|
--mount=type=cache,id=npm-website,sharing=shared,target=/root/.npm \
|
|
npm ci --include=dev
|
|
|
|
COPY ./website /work/website/
|
|
COPY ./blueprints /work/blueprints/
|
|
COPY ./schema.yml /work/
|
|
COPY ./SECURITY.md /work/
|
|
|
|
RUN npm run build-bundled
|
|
|
|
# Stage 2: Build webui
|
|
FROM --platform=${BUILDPLATFORM} docker.io/node:22 as web-builder
|
|
|
|
ENV NODE_ENV=production
|
|
|
|
WORKDIR /work/web
|
|
|
|
RUN --mount=type=bind,target=/work/web/package.json,src=./web/package.json \
|
|
--mount=type=bind,target=/work/web/package-lock.json,src=./web/package-lock.json \
|
|
--mount=type=cache,id=npm-web,sharing=shared,target=/root/.npm \
|
|
npm ci --include=dev
|
|
|
|
COPY ./package.json /work
|
|
COPY ./web /work/web/
|
|
COPY ./website /work/website/
|
|
COPY ./gen-ts-api /work/web/node_modules/@goauthentik/api
|
|
|
|
RUN npm run build
|
|
|
|
# Stage 3: Build go proxy
|
|
FROM --platform=${BUILDPLATFORM} mcr.microsoft.com/oss/go/microsoft/golang:1.22-fips-bookworm AS go-builder
|
|
|
|
ARG TARGETOS
|
|
ARG TARGETARCH
|
|
ARG TARGETVARIANT
|
|
|
|
ARG GOOS=$TARGETOS
|
|
ARG GOARCH=$TARGETARCH
|
|
|
|
WORKDIR /go/src/goauthentik.io
|
|
|
|
RUN --mount=type=cache,id=apt-$TARGETARCH$TARGETVARIANT,sharing=locked,target=/var/cache/apt \
|
|
dpkg --add-architecture arm64 && \
|
|
apt-get update && \
|
|
apt-get install -y --no-install-recommends crossbuild-essential-arm64 gcc-aarch64-linux-gnu
|
|
|
|
RUN --mount=type=bind,target=/go/src/goauthentik.io/go.mod,src=./go.mod \
|
|
--mount=type=bind,target=/go/src/goauthentik.io/go.sum,src=./go.sum \
|
|
--mount=type=cache,target=/go/pkg/mod \
|
|
go mod download
|
|
|
|
COPY ./cmd /go/src/goauthentik.io/cmd
|
|
COPY ./authentik/lib /go/src/goauthentik.io/authentik/lib
|
|
COPY ./web/static.go /go/src/goauthentik.io/web/static.go
|
|
COPY --from=web-builder /work/web/robots.txt /go/src/goauthentik.io/web/robots.txt
|
|
COPY --from=web-builder /work/web/security.txt /go/src/goauthentik.io/web/security.txt
|
|
COPY ./internal /go/src/goauthentik.io/internal
|
|
COPY ./go.mod /go/src/goauthentik.io/go.mod
|
|
COPY ./go.sum /go/src/goauthentik.io/go.sum
|
|
|
|
RUN --mount=type=cache,sharing=locked,target=/go/pkg/mod \
|
|
--mount=type=cache,id=go-build-$TARGETARCH$TARGETVARIANT,sharing=locked,target=/root/.cache/go-build \
|
|
if [ "$TARGETARCH" = "arm64" ]; then export CC=aarch64-linux-gnu-gcc && export CC_FOR_TARGET=gcc-aarch64-linux-gnu; fi && \
|
|
CGO_ENABLED=1 GOEXPERIMENT="systemcrypto" GOFLAGS="-tags=requirefips" GOARM="${TARGETVARIANT#v}" \
|
|
go build -o /go/authentik ./cmd/server
|
|
|
|
# Stage 4: MaxMind GeoIP
|
|
FROM --platform=${BUILDPLATFORM} ghcr.io/maxmind/geoipupdate:v7.0.1 as geoip
|
|
|
|
ENV GEOIPUPDATE_EDITION_IDS="GeoLite2-City GeoLite2-ASN"
|
|
ENV GEOIPUPDATE_VERBOSE="1"
|
|
ENV GEOIPUPDATE_ACCOUNT_ID_FILE="/run/secrets/GEOIPUPDATE_ACCOUNT_ID"
|
|
ENV GEOIPUPDATE_LICENSE_KEY_FILE="/run/secrets/GEOIPUPDATE_LICENSE_KEY"
|
|
|
|
USER root
|
|
RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \
|
|
--mount=type=secret,id=GEOIPUPDATE_LICENSE_KEY \
|
|
mkdir -p /usr/share/GeoIP && \
|
|
/bin/sh -c "/usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0"
|
|
|
|
# Stage 5: Python dependencies
|
|
FROM ghcr.io/goauthentik/fips-python:3.12.3-slim-bookworm-fips-full AS python-deps
|
|
|
|
WORKDIR /ak-root/poetry
|
|
|
|
ENV VENV_PATH="/ak-root/venv" \
|
|
POETRY_VIRTUALENVS_CREATE=false \
|
|
PATH="/ak-root/venv/bin:$PATH"
|
|
|
|
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
|
|
|
|
RUN --mount=type=cache,id=apt-$TARGETARCH$TARGETVARIANT,sharing=locked,target=/var/cache/apt \
|
|
apt-get update && \
|
|
# Required for installing pip packages
|
|
apt-get install -y --no-install-recommends build-essential pkg-config libpq-dev
|
|
|
|
RUN --mount=type=bind,target=./pyproject.toml,src=./pyproject.toml \
|
|
--mount=type=bind,target=./poetry.lock,src=./poetry.lock \
|
|
--mount=type=cache,target=/root/.cache/pip \
|
|
--mount=type=cache,target=/root/.cache/pypoetry \
|
|
python -m venv /ak-root/venv/ && \
|
|
bash -c "source ${VENV_PATH}/bin/activate && \
|
|
pip3 install --upgrade pip && \
|
|
pip3 install poetry && \
|
|
poetry install --only=main --no-ansi --no-interaction --no-root && \
|
|
pip install --force-reinstall /wheels/*"
|
|
|
|
# Stage 6: Run
|
|
FROM ghcr.io/goauthentik/fips-python:3.12.3-slim-bookworm-fips-full AS final-image
|
|
|
|
ARG GIT_BUILD_HASH
|
|
ARG VERSION
|
|
ENV GIT_BUILD_HASH=$GIT_BUILD_HASH
|
|
|
|
LABEL org.opencontainers.image.url https://goauthentik.io
|
|
LABEL org.opencontainers.image.description goauthentik.io Main server image, see https://goauthentik.io for more info.
|
|
LABEL org.opencontainers.image.source https://github.com/goauthentik/authentik
|
|
LABEL org.opencontainers.image.version ${VERSION}
|
|
LABEL org.opencontainers.image.revision ${GIT_BUILD_HASH}
|
|
|
|
WORKDIR /
|
|
|
|
# We cannot cache this layer otherwise we'll end up with a bigger image
|
|
RUN apt-get update && \
|
|
# Required for runtime
|
|
apt-get install -y --no-install-recommends libpq5 libmaxminddb0 ca-certificates && \
|
|
# Required for bootstrap & healtcheck
|
|
apt-get install -y --no-install-recommends runit && \
|
|
apt-get clean && \
|
|
rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/ && \
|
|
adduser --system --no-create-home --uid 1000 --group --home /authentik authentik && \
|
|
mkdir -p /certs /media /blueprints && \
|
|
mkdir -p /authentik/.ssh && \
|
|
mkdir -p /ak-root && \
|
|
chown authentik:authentik /certs /media /authentik/.ssh /ak-root
|
|
|
|
COPY ./authentik/ /authentik
|
|
COPY ./pyproject.toml /
|
|
COPY ./poetry.lock /
|
|
COPY ./schemas /schemas
|
|
COPY ./locale /locale
|
|
COPY ./tests /tests
|
|
COPY ./manage.py /
|
|
COPY ./blueprints /blueprints
|
|
COPY ./lifecycle/ /lifecycle
|
|
COPY --from=go-builder /go/authentik /bin/authentik
|
|
COPY --from=python-deps /ak-root/venv /ak-root/venv
|
|
COPY --from=web-builder /work/web/dist/ /web/dist/
|
|
COPY --from=web-builder /work/web/authentik/ /web/authentik/
|
|
COPY --from=website-builder /work/website/build/ /website/help/
|
|
COPY --from=geoip /usr/share/GeoIP /geoip
|
|
|
|
USER 1000
|
|
|
|
ENV TMPDIR=/dev/shm/ \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONUNBUFFERED=1 \
|
|
PATH="/ak-root/venv/bin:/lifecycle:$PATH" \
|
|
VENV_PATH="/ak-root/venv" \
|
|
POETRY_VIRTUALENVS_CREATE=false
|
|
|
|
ENV GOFIPS=1
|
|
|
|
HEALTHCHECK --interval=30s --timeout=30s --start-period=60s --retries=3 CMD [ "ak", "healthcheck" ]
|
|
|
|
ENTRYPOINT [ "dumb-init", "--", "ak" ]
|