* 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.
* root: fix migrations missing using db_alias
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
* more
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
* web: add wireit as a dependency and move SFE into an independent package
* web: make `sfe` a legitimite subpackage and use `wireit` to control the build
- Move sfe to a `packages` subfolder: this is a more standard format for subpackages
- `Move sfe/index.ts` to `sfe/src/index.ts`: this is a more standard layout for a package
- Adjusted paths is `package.json` and `sfe/rollup.config.js` accordingly.
- Add prettier and safety linting to `sfe`.
- fix a naming issues in `build-locales`, highlighted by eslint
- fix some minor linting issues is `build-locales`
- add comments to `build-locales`, to make it clear what it does
- updated the README and LICENSE files
- start using `wireit` heavily as the task-runner definition language
Primarily, to look professional and pave the way for future enhancements.
Aside from the standardization and so forth, the primary goal here is to move our task runner to
wireit. Wireit offers a number of intriguing abilities with respect to caching, building, and
testing, such as an ability to `watch` our folders and files and automatically re-run the build when
the relevant code changes, without having to rebuild the copied content or sub-packages such as
`sfe`.
The ability to pass in environment variables without needed `cross-env` makes code that required it
much easier to read.
Commands that take a long time can be prefixed with the environment variable `${NODE_RUNNER} `,
which then would allow you to default to using `node`, but by setting `NODE_RUNNER` in your shell
you could specify `bun` (or `deno`, maybe, but I haven't tested it with `deno`). `bun` runs the
`eslint` pass in about three-quarters the time `node` takes.
This commit exists primarily to ensure that the build runs as expected under CI, and the result is
as expected under CI.
Wireit was produced by Google and is used by Adobe Spectrum Components, Patternfly Components,
Material Web, Red Hat Design, and the Lit-Element teams, so I'm confident that it's robust and
reliable as a build runner.
* Merge failed to account for this.
* web: fix bad reference to lint command
* Adding sfe to workspaces means its install is run automatically.
* sfe build is now orchestrated by the web build process
* web: slowly tracking down the old ways.
* Trying to fix lit-analyze pass.
* Still struggling with the build.
* Monorepo, please.
* Still trying to solve swc binding issue.
* Reformat package.json so that scripts and wireit are closer to one another.
* Use the right formatter for packagefiles.
* Retarget dockerfile to have the right paths to sfe during build.
* Comment to explain gitignore update.
* Add lint correcting to package.json as well as package-lock
* Restored lost package-lock.json
* Updating the authentik version.
* Trying to force version consistency.
---------
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
182 lines
6.7 KiB
Docker
182 lines
6.7 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# Stage 1: Build website
|
|
FROM --platform=${BUILDPLATFORM} docker.io/library/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/library/node:22 as web-builder
|
|
|
|
ARG GIT_BUILD_HASH
|
|
ENV GIT_BUILD_HASH=$GIT_BUILD_HASH
|
|
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=bind,target=/work/web/packages/sfe/package.json,src=./web/packages/sfe/package.json \
|
|
--mount=type=bind,target=/work/web/scripts,src=./web/scripts \
|
|
--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" ]
|