mirror of
https://github.com/linuxserver/docker-swag.git
synced 2026-11-06 00:49:24 +09:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f68d40a7a | ||
|
|
4ec09cbad5 | ||
|
|
f503b59b62 | ||
|
|
aeb7370675 | ||
|
|
12d8c0329c | ||
|
|
4d08a0d2a4 |
No files matched your search
Vendored
+265
-68
@@ -52,6 +52,57 @@ pipeline {
|
||||
'''
|
||||
}
|
||||
}
|
||||
/* ############################
|
||||
Bash Function For GHCR Retry
|
||||
############################ */
|
||||
// Create a reusable script for a ghcr retry bash function
|
||||
stage("Create Bash Function"){
|
||||
steps{
|
||||
sh '''#! /bin/bash
|
||||
# create our retry function
|
||||
retry_ghcr() {
|
||||
local max_attempts=7
|
||||
local base_delay=10
|
||||
local max_delay=90
|
||||
local attempt=1
|
||||
local errfile exit_code delay pause
|
||||
errfile=$(mktemp)
|
||||
while true; do
|
||||
# run inside an if so a caller's set -e cannot abort before we get to retry
|
||||
if "$@" 2> >(tee "${errfile}" >&2); then
|
||||
exit_code=0
|
||||
else
|
||||
exit_code=$?
|
||||
fi
|
||||
# make sure tee has finished writing before we read the file
|
||||
wait $! 2>/dev/null || true
|
||||
if [[ "${exit_code}" == "0" ]]; then
|
||||
rm -f "${errfile}"
|
||||
return 0
|
||||
elif ! grep -q -i -E "retry-after:|toomanyrequests|too many requests" "${errfile}"; then
|
||||
rm -f "${errfile}"
|
||||
return "${exit_code}"
|
||||
elif (( attempt >= max_attempts )); then
|
||||
rm -f "${errfile}"
|
||||
echo "retry: $* failed after ${attempt} attempts (exit ${exit_code})" >&2
|
||||
return "${exit_code}"
|
||||
else
|
||||
# exponential delay: base * 2^(attempt-1), capped at max_delay
|
||||
delay=$(( base_delay * 2 ** (attempt - 1) ))
|
||||
(( delay > max_delay )) && delay="${max_delay}"
|
||||
# jitter between half and full delay so parallel builds spread out
|
||||
pause=$(( delay / 2 + RANDOM % (delay / 2 + 1) ))
|
||||
echo "retry: attempt ${attempt}/${max_attempts} failed (exit ${exit_code}); waiting ${pause}s..." >&2
|
||||
sleep "${pause}"
|
||||
((attempt++))
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
declare -f retry_ghcr > ${WORKSPACE}/retry_ghcr.sh
|
||||
'''
|
||||
}
|
||||
}
|
||||
// Setup all the basic environment variables needed for the build
|
||||
stage("Set ENV Variables base"){
|
||||
steps{
|
||||
@@ -79,7 +130,9 @@ pipeline {
|
||||
env.CI_TEST_ATTEMPTED = ''
|
||||
env.PUSH_ATTEMPTED = ''
|
||||
env.LS_RELEASE = sh(
|
||||
script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
|
||||
script: '''#! /bin/bash
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
|
||||
returnStdout: true).trim()
|
||||
env.LS_RELEASE_NOTES = sh(
|
||||
script: '''cat readme-vars.yml | awk -F \\" '/date: "[0-9][0-9].[0-9][0-9].[0-9][0-9]:/ {print $4;exit;}' | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''',
|
||||
@@ -100,8 +153,12 @@ pipeline {
|
||||
if ( env.SYFT_IMAGE_TAG == null ) {
|
||||
env.SYFT_IMAGE_TAG = 'latest'
|
||||
}
|
||||
if ( env.GITLAB_TIMEOUT == null ) {
|
||||
env.GITLAB_TIMEOUT = '600'
|
||||
}
|
||||
}
|
||||
echo "Using syft image tag ${SYFT_IMAGE_TAG}"
|
||||
echo "Using gitlab registry timeout ${GITLAB_TIMEOUT}"
|
||||
sh '''#! /bin/bash
|
||||
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
|
||||
script{
|
||||
@@ -281,6 +338,8 @@ pipeline {
|
||||
}
|
||||
sh '''curl -sL https://raw.githubusercontent.com/linuxserver/docker-jenkins-builder/master/checkrun.sh | /bin/bash'''
|
||||
sh '''#! /bin/bash
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker pull ghcr.io/linuxserver/baseimage-alpine:3.23
|
||||
docker run --rm \
|
||||
-v ${WORKSPACE}:/mnt \
|
||||
-e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \
|
||||
@@ -307,7 +366,8 @@ pipeline {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
TEMPDIR=$(mktemp -d)
|
||||
docker pull ghcr.io/linuxserver/jenkins-builder:latest
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker pull ghcr.io/linuxserver/jenkins-builder:latest
|
||||
# Cloned repo paths for templating:
|
||||
# ${TEMPDIR}/docker-${CONTAINER_NAME}: Cloned branch master of ${LS_USER}/${LS_REPO} for running the jenkins builder on
|
||||
# ${TEMPDIR}/repo/${LS_REPO}: Cloned branch master of ${LS_USER}/${LS_REPO} for commiting various templated file changes and pushing back to Github
|
||||
@@ -366,6 +426,7 @@ pipeline {
|
||||
sed -i 's|^changelogs:|# init diagram\\ninit_diagram:\\n\\n# changelog\\nchangelogs:|' readme-vars.yml
|
||||
fi
|
||||
mkdir -p ${TEMPDIR}/d2
|
||||
retry_ghcr docker pull ghcr.io/linuxserver/d2-builder:latest
|
||||
docker run --rm -v ${TEMPDIR}/d2:/output -e PUID=$(id -u) -e PGID=$(id -g) -e RAW="true" ghcr.io/linuxserver/d2-builder:latest ${CONTAINER_NAME}:latest
|
||||
ls -al ${TEMPDIR}/d2
|
||||
yq -ei ".init_diagram |= load_str(\\"${TEMPDIR}/d2/${CONTAINER_NAME}-latest.d2\\")" readme-vars.yml
|
||||
@@ -582,22 +643,25 @@ pipeline {
|
||||
steps {
|
||||
echo "Running on node: ${NODE_NAME}"
|
||||
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile"
|
||||
sh "docker buildx build \
|
||||
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
|
||||
--label \"org.opencontainers.image.authors=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages\" \
|
||||
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag\" \
|
||||
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-swag\" \
|
||||
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
|
||||
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
|
||||
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.title=Swag\" \
|
||||
--label \"org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.\" \
|
||||
--no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
|
||||
sh '''#! /bin/bash
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker buildx build \
|
||||
--label "org.opencontainers.image.created=${GITHUB_DATE}" \
|
||||
--label "org.opencontainers.image.authors=linuxserver.io" \
|
||||
--label "org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages" \
|
||||
--label "org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag" \
|
||||
--label "org.opencontainers.image.source=https://github.com/linuxserver/docker-swag" \
|
||||
--label "org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}" \
|
||||
--label "org.opencontainers.image.revision=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.vendor=linuxserver.io" \
|
||||
--label "org.opencontainers.image.licenses=GPL-3.0-only" \
|
||||
--label "org.opencontainers.image.ref.name=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.title=Swag" \
|
||||
--label "org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention." \
|
||||
--no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION="${VERSION_TAG}" --build-arg BUILD_DATE=${GITHUB_DATE} .
|
||||
'''
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
@@ -616,6 +680,17 @@ pipeline {
|
||||
retry_backoff(5,5) {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
# run a registry.gitlab.com command under what is left of the gitlab time budget
|
||||
gitlab_timeout() {
|
||||
local remaining=$(( GITLAB_DEADLINE - SECONDS ))
|
||||
if (( remaining <= 0 )); then
|
||||
echo "gitlab timeout budget of ${GITLAB_TIMEOUT}s used up, skipping: $*" >&2
|
||||
return 124
|
||||
fi
|
||||
timeout "${remaining}" "$@"
|
||||
}
|
||||
GITLAB_DEADLINE=$(( SECONDS + GITLAB_TIMEOUT ))
|
||||
|
||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
|
||||
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
|
||||
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
|
||||
@@ -625,11 +700,16 @@ pipeline {
|
||||
declare -A pids
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
for i in "${CACHE[@]}"; do
|
||||
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
if [[ "${i}" == *"registry.gitlab.com"* ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
${TIMEOUT_CMD} docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
pids[$!]="$i"
|
||||
done
|
||||
for p in "${!pids[@]}"; do
|
||||
wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]] && exit 1; }
|
||||
wait "$p" || { if [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]]; then exit 1; fi; }
|
||||
done
|
||||
fi
|
||||
'''
|
||||
@@ -651,22 +731,25 @@ pipeline {
|
||||
steps {
|
||||
echo "Running on node: ${NODE_NAME}"
|
||||
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile"
|
||||
sh "docker buildx build \
|
||||
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
|
||||
--label \"org.opencontainers.image.authors=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages\" \
|
||||
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag\" \
|
||||
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-swag\" \
|
||||
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
|
||||
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
|
||||
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.title=Swag\" \
|
||||
--label \"org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.\" \
|
||||
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
|
||||
sh '''#! /bin/bash
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker buildx build \
|
||||
--label "org.opencontainers.image.created=${GITHUB_DATE}" \
|
||||
--label "org.opencontainers.image.authors=linuxserver.io" \
|
||||
--label "org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages" \
|
||||
--label "org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag" \
|
||||
--label "org.opencontainers.image.source=https://github.com/linuxserver/docker-swag" \
|
||||
--label "org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}" \
|
||||
--label "org.opencontainers.image.revision=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.vendor=linuxserver.io" \
|
||||
--label "org.opencontainers.image.licenses=GPL-3.0-only" \
|
||||
--label "org.opencontainers.image.ref.name=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.title=Swag" \
|
||||
--label "org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention." \
|
||||
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION="${VERSION_TAG}" --build-arg BUILD_DATE=${GITHUB_DATE} .
|
||||
'''
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
@@ -685,6 +768,17 @@ pipeline {
|
||||
retry_backoff(5,5) {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
# run a registry.gitlab.com command under what is left of the gitlab time budget
|
||||
gitlab_timeout() {
|
||||
local remaining=$(( GITLAB_DEADLINE - SECONDS ))
|
||||
if (( remaining <= 0 )); then
|
||||
echo "gitlab timeout budget of ${GITLAB_TIMEOUT}s used up, skipping: $*" >&2
|
||||
return 124
|
||||
fi
|
||||
timeout "${remaining}" "$@"
|
||||
}
|
||||
GITLAB_DEADLINE=$(( SECONDS + GITLAB_TIMEOUT ))
|
||||
|
||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
|
||||
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
|
||||
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
|
||||
@@ -694,11 +788,16 @@ pipeline {
|
||||
declare -A pids
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
for i in "${CACHE[@]}"; do
|
||||
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
if [[ "${i}" == *"registry.gitlab.com"* ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
${TIMEOUT_CMD} docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
pids[$!]="$i"
|
||||
done
|
||||
for p in "${!pids[@]}"; do
|
||||
wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]] && exit 1; }
|
||||
wait "$p" || { if [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]]; then exit 1; fi; }
|
||||
done
|
||||
fi
|
||||
'''
|
||||
@@ -713,22 +812,64 @@ pipeline {
|
||||
steps {
|
||||
echo "Running on node: ${NODE_NAME}"
|
||||
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
|
||||
sh "docker buildx build \
|
||||
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
|
||||
--label \"org.opencontainers.image.authors=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages\" \
|
||||
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag\" \
|
||||
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-swag\" \
|
||||
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
|
||||
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
|
||||
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
|
||||
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
|
||||
--label \"org.opencontainers.image.title=Swag\" \
|
||||
--label \"org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.\" \
|
||||
--no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
|
||||
sh '''#! /bin/bash
|
||||
# create our retry function
|
||||
retry_ghcr() {
|
||||
local max_attempts=7
|
||||
local base_delay=10
|
||||
local max_delay=90
|
||||
local attempt=1
|
||||
local errfile exit_code delay pause
|
||||
errfile=$(mktemp)
|
||||
while true; do
|
||||
# run inside an if so a caller's set -e cannot abort before we get to retry
|
||||
if "$@" 2> >(tee "${errfile}" >&2); then
|
||||
exit_code=0
|
||||
else
|
||||
exit_code=$?
|
||||
fi
|
||||
# make sure tee has finished writing before we read the file
|
||||
wait $! 2>/dev/null || true
|
||||
if [[ "${exit_code}" == "0" ]]; then
|
||||
rm -f "${errfile}"
|
||||
return 0
|
||||
elif ! grep -q -i -E "retry-after:|toomanyrequests|too many requests" "${errfile}"; then
|
||||
rm -f "${errfile}"
|
||||
return "${exit_code}"
|
||||
elif (( attempt >= max_attempts )); then
|
||||
rm -f "${errfile}"
|
||||
echo "retry: $* failed after ${attempt} attempts (exit ${exit_code})" >&2
|
||||
return "${exit_code}"
|
||||
else
|
||||
# exponential delay: base * 2^(attempt-1), capped at max_delay
|
||||
delay=$(( base_delay * 2 ** (attempt - 1) ))
|
||||
(( delay > max_delay )) && delay="${max_delay}"
|
||||
# jitter between half and full delay so parallel builds spread out
|
||||
pause=$(( delay / 2 + RANDOM % (delay / 2 + 1) ))
|
||||
echo "retry: attempt ${attempt}/${max_attempts} failed (exit ${exit_code}); waiting ${pause}s..." >&2
|
||||
sleep "${pause}"
|
||||
((attempt++))
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
retry_ghcr docker buildx build \
|
||||
--label "org.opencontainers.image.created=${GITHUB_DATE}" \
|
||||
--label "org.opencontainers.image.authors=linuxserver.io" \
|
||||
--label "org.opencontainers.image.url=https://github.com/linuxserver/docker-swag/packages" \
|
||||
--label "org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-swag" \
|
||||
--label "org.opencontainers.image.source=https://github.com/linuxserver/docker-swag" \
|
||||
--label "org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}" \
|
||||
--label "org.opencontainers.image.revision=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.vendor=linuxserver.io" \
|
||||
--label "org.opencontainers.image.licenses=GPL-3.0-only" \
|
||||
--label "org.opencontainers.image.ref.name=${COMMIT_SHA}" \
|
||||
--label "org.opencontainers.image.title=Swag" \
|
||||
--label "org.opencontainers.image.description=SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention." \
|
||||
--no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \
|
||||
--provenance=true --sbom=true --builder=container --load \
|
||||
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION="${VERSION_TAG}" --build-arg BUILD_DATE=${GITHUB_DATE} .
|
||||
'''
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
@@ -747,6 +888,17 @@ pipeline {
|
||||
retry_backoff(5,5) {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
# run a registry.gitlab.com command under what is left of the gitlab time budget
|
||||
gitlab_timeout() {
|
||||
local remaining=$(( GITLAB_DEADLINE - SECONDS ))
|
||||
if (( remaining <= 0 )); then
|
||||
echo "gitlab timeout budget of ${GITLAB_TIMEOUT}s used up, skipping: $*" >&2
|
||||
return 124
|
||||
fi
|
||||
timeout "${remaining}" "$@"
|
||||
}
|
||||
GITLAB_DEADLINE=$(( SECONDS + GITLAB_TIMEOUT ))
|
||||
|
||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
|
||||
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
|
||||
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
|
||||
@@ -755,11 +907,16 @@ pipeline {
|
||||
declare -A pids
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
for i in "${CACHE[@]}"; do
|
||||
docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
if [[ "${i}" == *"registry.gitlab.com"* ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
${TIMEOUT_CMD} docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
|
||||
pids[$!]="$i"
|
||||
done
|
||||
for p in "${!pids[@]}"; do
|
||||
wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]] && exit 1; }
|
||||
wait "$p" || { if [[ "${pids[$p]}" != *"quay.io"* && "${pids[$p]}" != *"registry.gitlab.com"* ]]; then exit 1; fi; }
|
||||
done
|
||||
fi
|
||||
'''
|
||||
@@ -794,6 +951,8 @@ pipeline {
|
||||
LOCAL_CONTAINER=${IMAGE}:${META_TAG}
|
||||
fi
|
||||
touch ${TEMPDIR}/package_versions.txt
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker pull ghcr.io/anchore/syft:${SYFT_IMAGE_TAG}
|
||||
docker run --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||
-v ${TEMPDIR}:/tmp \
|
||||
@@ -885,9 +1044,10 @@ pipeline {
|
||||
CI_DOCKERENV="LSIO_FIRST_PARTY=true"
|
||||
fi
|
||||
fi
|
||||
docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
|
||||
source ${WORKSPACE}/retry_ghcr.sh
|
||||
retry_ghcr docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
|
||||
if [ "${MULTIARCH}" == "true" ]; then
|
||||
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
|
||||
retry_ghcr docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
|
||||
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
|
||||
fi
|
||||
docker run --rm \
|
||||
@@ -932,7 +1092,23 @@ pipeline {
|
||||
retry_backoff(5,5) {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
# run a registry.gitlab.com command under what is left of the gitlab time budget
|
||||
gitlab_timeout() {
|
||||
local remaining=$(( GITLAB_DEADLINE - SECONDS ))
|
||||
if (( remaining <= 0 )); then
|
||||
echo "gitlab timeout budget of ${GITLAB_TIMEOUT}s used up, skipping: $*" >&2
|
||||
return 124
|
||||
fi
|
||||
timeout "${remaining}" "$@"
|
||||
}
|
||||
GITLAB_DEADLINE=$(( SECONDS + GITLAB_TIMEOUT ))
|
||||
|
||||
for PUSHIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
||||
if [[ "${PUSHIMAGE}" == "${GITLABIMAGE}" ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
[[ ${PUSHIMAGE%%/*} =~ \\. ]] && PUSHIMAGEPLUS="${PUSHIMAGE}" || PUSHIMAGEPLUS="docker.io/${PUSHIMAGE}"
|
||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
||||
for i in "${CACHE[@]}"; do
|
||||
@@ -940,10 +1116,10 @@ pipeline {
|
||||
CACHEIMAGE=${i}
|
||||
fi
|
||||
done
|
||||
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" && "${PUSHIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
if [ -n "${SEMVER}" ]; then
|
||||
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" && "${PUSHIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
fi
|
||||
done
|
||||
@@ -964,7 +1140,23 @@ pipeline {
|
||||
retry_backoff(5,5) {
|
||||
sh '''#! /bin/bash
|
||||
set -e
|
||||
# run a registry.gitlab.com command under what is left of the gitlab time budget
|
||||
gitlab_timeout() {
|
||||
local remaining=$(( GITLAB_DEADLINE - SECONDS ))
|
||||
if (( remaining <= 0 )); then
|
||||
echo "gitlab timeout budget of ${GITLAB_TIMEOUT}s used up, skipping: $*" >&2
|
||||
return 124
|
||||
fi
|
||||
timeout "${remaining}" "$@"
|
||||
}
|
||||
GITLAB_DEADLINE=$(( SECONDS + GITLAB_TIMEOUT ))
|
||||
|
||||
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
||||
if [[ "${MANIFESTIMAGE}" == "${GITLABIMAGE}" ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
if [[ "${MANIFESTIMAGE%%/*}" =~ \\. ]]; then
|
||||
MANIFESTIMAGEPLUS="${MANIFESTIMAGE}"
|
||||
else
|
||||
@@ -976,26 +1168,31 @@ pipeline {
|
||||
CACHEIMAGE=${i}
|
||||
fi
|
||||
done
|
||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
if [ -n "${SEMVER}" ]; then
|
||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
fi
|
||||
done
|
||||
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
|
||||
if [[ "${MANIFESTIMAGE}" == "${GITLABIMAGE}" ]]; then
|
||||
TIMEOUT_CMD="gitlab_timeout"
|
||||
else
|
||||
TIMEOUT_CMD=""
|
||||
fi
|
||||
${TIMEOUT_CMD} docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
if [ -n "${SEMVER}" ]; then
|
||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
|
||||
${TIMEOUT_CMD} docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
|
||||
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" && "${MANIFESTIMAGE}" != "${GITLABIMAGE}" ]]; then exit 1; fi; }
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -436,6 +436,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
|
||||
|
||||
## Versions
|
||||
|
||||
* **20.10.26:** - [Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf, authelia-server.conf, authentik-server.conf, tinyauth-server.conf - Update Nginx configuration to replace $http_host with $host$is_request_port$request_port for better compatibility.
|
||||
* **09.09.26:** - Use new X-Tinyauth-Location header in Tinyauth locations and remove duplicate auth module headers.
|
||||
* **19.07.26:** - Rebase to Alpine 3.24 with PHP 8.5.
|
||||
* **10.07.26:** - Add support for Let's Encrypt cert profiles. Run certbot twice daily with a random delay.
|
||||
|
||||
+19
-20
@@ -23,8 +23,8 @@ azure-mgmt-dns 9.0.0 python
|
||||
backports-tarfile 1.2.0 python
|
||||
bash 5.3.9-r1 apk
|
||||
beautifulsoup4 4.15.0 python
|
||||
boto3 1.43.111 python
|
||||
botocore 1.43.111 python
|
||||
boto3 1.43.115 python
|
||||
botocore 1.43.115 python
|
||||
brotli-libs 1.2.0-r1 apk
|
||||
bs4 0.0.2 python
|
||||
busybox 1.37.0-r31 apk
|
||||
@@ -58,7 +58,7 @@ certbot-dns-godaddy 2.8.0 python
|
||||
certbot-dns-google 5.8.0 python
|
||||
certbot-dns-he 1.0.0 python
|
||||
certbot-dns-hetzner 4.0.0 python
|
||||
certbot-dns-hetzner-cloud 1.0.5 python
|
||||
certbot-dns-hetzner-cloud 1.1.0 python
|
||||
certbot-dns-infomaniak 0.3.3 python
|
||||
certbot-dns-inwx 3.0.3 python
|
||||
certbot-dns-ionos 2024.11.9 python
|
||||
@@ -67,7 +67,7 @@ certbot-dns-loopia 1.0.1 python
|
||||
certbot-dns-luadns 5.8.0 python
|
||||
certbot-dns-mijn-host 0.0.10 python
|
||||
certbot-dns-namecheap 1.0.0 python
|
||||
certbot-dns-netcup 2.0.3 python
|
||||
certbot-dns-netcup 2.1.0 python
|
||||
certbot-dns-njalla 2.0.2 python
|
||||
certbot-dns-nsone 5.8.0 python
|
||||
certbot-dns-ovh 5.8.0 python
|
||||
@@ -79,7 +79,7 @@ certbot-dns-standalone 1.2.1 python
|
||||
certbot-dns-transip 0.5.2 python
|
||||
certbot-dns-vultr 1.1.0 python
|
||||
certbot-plugin-gandi 1.5.0 python
|
||||
certifi 2026.7.22 python
|
||||
certifi 2026.10.19 python
|
||||
cffi 2.1.1 python
|
||||
charset-normalizer 3.5.2 python
|
||||
cli UNKNOWN binary
|
||||
@@ -104,7 +104,7 @@ domeneshop 0.4.4 python
|
||||
fail2ban 1.1.0 python
|
||||
fail2ban 1.1.0-r3 apk
|
||||
fail2ban-pyc 1.1.0-r3 apk
|
||||
filelock 4.1.0 python
|
||||
filelock 4.2.4 python
|
||||
findutils 4.10.0-r1 apk
|
||||
fontconfig 2.17.1-r1 apk
|
||||
freetype 2.14.3-r0 apk
|
||||
@@ -123,7 +123,7 @@ gnupg-wks-client 2.4.9-r1 apk
|
||||
gnutls 3.8.13-r0 apk
|
||||
google-api-core 2.42.0 python
|
||||
google-api-python-client 2.201.0 python
|
||||
google-auth 2.61.0 python
|
||||
google-auth 2.62.0 python
|
||||
google-auth-httplib2 0.4.4 python
|
||||
googleapis-common-protos 1.75.5 python
|
||||
gpg 2.4.9-r1 apk
|
||||
@@ -157,7 +157,7 @@ jinja2 3.1.6 python
|
||||
jmespath 1.1.0 python
|
||||
josepy 2.2.0 python
|
||||
jq 1.8.2-r0 apk
|
||||
jsonpickle 4.1.3 python
|
||||
jsonpickle 4.1.4 python
|
||||
libapk 3.0.8-r0 apk
|
||||
libassuan 3.0.2-r0 apk
|
||||
libattr 2.5.2-r2 apk
|
||||
@@ -205,13 +205,13 @@ libtasn1 4.21.0-r0 apk
|
||||
libunistring 1.4.2-r0 apk
|
||||
libuuid 2.42.3-r1 apk
|
||||
libwebp 1.6.0-r0 apk
|
||||
libx11 1.8.13-r0 apk
|
||||
libx11 1.8.14-r0 apk
|
||||
libxau 1.0.12-r0 apk
|
||||
libxcb 1.17.0-r2 apk
|
||||
libxdmcp 1.1.5-r1 apk
|
||||
libxext 1.3.7-r0 apk
|
||||
libxml2 2.13.9-r2 apk
|
||||
libxpm 3.5.19-r0 apk
|
||||
libxpm 3.5.20-r0 apk
|
||||
libxslt 1.1.43-r3 apk
|
||||
libxt 1.3.1-r0 apk
|
||||
libxtables 1.8.13-r0 apk
|
||||
@@ -260,8 +260,7 @@ oniguruma 6.9.10-r0 apk
|
||||
openssl 3.5.9-r0 apk
|
||||
opentelemetry-api 1.45.1 python
|
||||
p11-kit 0.26.2-r0 apk
|
||||
packaging 26.0 python
|
||||
packaging 26.3 python
|
||||
packaging 26.3 python (+1 duplicate)
|
||||
parsedatetime 2.6 python
|
||||
pcre2 10.49-r0 apk
|
||||
perl 5.42.2-r1 apk
|
||||
@@ -326,14 +325,14 @@ pyasn1 0.6.4 python
|
||||
pyasn1-modules 0.4.2 python
|
||||
pyc 3.14.8-r0 apk
|
||||
pycparser 3.11 python
|
||||
pydantic 2.14.0 python
|
||||
pydantic-core 2.50.0 python
|
||||
pydantic 2.14.1 python
|
||||
pydantic-core 2.50.1 python
|
||||
pyjwt 2.15.1 python
|
||||
pynamecheap 0.0.3 python
|
||||
pyopenssl 26.4.0 python
|
||||
pyotp 2.10.0 python
|
||||
pyparsing 3.3.3 python
|
||||
pyrfc3339 2.1.0 python
|
||||
pyrfc3339 2.1.1 python
|
||||
python-dateutil 2.9.0.post0 python
|
||||
python-digitalocean 1.17.0 python
|
||||
python-transip 0.6.0 python
|
||||
@@ -346,14 +345,14 @@ requests 2.34.2 python
|
||||
requests-file 3.0.1 python
|
||||
requests-mock 1.12.1 python
|
||||
requests-unixsocket 0.4.1 python
|
||||
s3transfer 0.19.2 python
|
||||
s3transfer 0.19.3 python
|
||||
scanelf 1.3.9-r1 apk
|
||||
setuptools 84.0.0 python
|
||||
setuptools 84.2.0 python
|
||||
shadow 4.18.0-r1 apk
|
||||
six 1.17.0 python
|
||||
skalibs-libs 2.15.0.0-r0 apk
|
||||
sniffio 1.3.1 python
|
||||
soupsieve 2.10 python
|
||||
soupsieve 3.0.3 python
|
||||
sqlite-libs 3.53.4-r0 apk
|
||||
ssl_client 1.37.0-r31 apk
|
||||
tiff 4.7.2-r0 apk
|
||||
@@ -361,7 +360,7 @@ tldextract 5.4.0 python
|
||||
tomli 2.4.0 python
|
||||
typing-extensions 4.16.0 python
|
||||
typing-inspection 0.4.4 python
|
||||
tzdata 2026d-r0 apk
|
||||
tzdata 2026e-r0 apk
|
||||
unixodbc 2.3.14-r1 apk
|
||||
uritemplate 4.2.0 python
|
||||
urllib3 2.8.0 python
|
||||
@@ -372,5 +371,5 @@ whois 5.6.6-r0 apk
|
||||
xz-libs 5.8.4-r0 apk
|
||||
zipp 3.23.0 python
|
||||
zlib 1.3.2-r1 apk
|
||||
zope-interface 8.6 python
|
||||
zope-interface 8.7 python
|
||||
zstd-libs 1.5.7-r2 apk
|
||||
@@ -220,6 +220,7 @@ init_diagram: |
|
||||
"swag:latest" <- Base Images
|
||||
# changelog
|
||||
changelogs:
|
||||
- {date: "20.10.26:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf, authelia-server.conf, authentik-server.conf, tinyauth-server.conf - Update Nginx configuration to replace $http_host with $host$is_request_port$request_port for better compatibility."}
|
||||
- {date: "09.09.26:", desc: "Use new X-Tinyauth-Location header in Tinyauth locations and remove duplicate auth module headers."}
|
||||
- {date: "19.07.26:", desc: "Rebase to Alpine 3.24 with PHP 8.5."}
|
||||
- {date: "10.07.26:", desc: "Add support for Let's Encrypt cert profiles. Run certbot twice daily with a random delay."}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Version 2025/03/25 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-server.conf.sample
|
||||
## Version 2026/10/20 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-server.conf.sample
|
||||
# Make sure that your authelia container is in the same user defined bridge network and is named authelia
|
||||
# Rename /config/nginx/proxy-confs/authelia.subdomain.conf.sample to /config/nginx/proxy-confs/authelia.subdomain.conf
|
||||
|
||||
@@ -28,7 +28,7 @@ location @authelia_proxy_signin {
|
||||
add_header Set-Cookie $set_cookie;
|
||||
|
||||
## Set the $target_url variable based on the original request
|
||||
set_escape_uri $target_url $scheme://$http_host$request_uri;
|
||||
set_escape_uri $target_url $scheme://$host$is_request_port$request_port$request_uri;
|
||||
|
||||
## Translate the Location response header from the auth subrequest into a variable
|
||||
auth_request_set $signin_url $upstream_http_location;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Version 2025/03/25 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authentik-server.conf.sample
|
||||
## Version 2026/10/20 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authentik-server.conf.sample
|
||||
# Make sure that your authentik container is in the same user defined bridge network and is named authentik-server
|
||||
# Rename /config/nginx/proxy-confs/authentik.subdomain.conf.sample to /config/nginx/proxy-confs/authentik.subdomain.conf
|
||||
|
||||
@@ -38,10 +38,10 @@ location @goauthentik_proxy_signin {
|
||||
add_header Set-Cookie $set_cookie;
|
||||
|
||||
## Set the $target_url variable based on the original request
|
||||
set_escape_uri $target_url $scheme://$http_host$request_uri;
|
||||
set_escape_uri $target_url $scheme://$host$is_request_port$request_port$request_uri;
|
||||
|
||||
## Set the $signin_url variable
|
||||
set $signin_url https://$http_host/outpost.goauthentik.io/start?rd=$target_url;
|
||||
set $signin_url https://$host$is_request_port$request_port/outpost.goauthentik.io/start?rd=$target_url;
|
||||
|
||||
## Redirect to login
|
||||
return 302 $signin_url;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Version 2023/02/09 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/proxy.conf.sample
|
||||
## Version 2026/10/20 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/proxy.conf.sample
|
||||
|
||||
# Timeout if the real server is dead
|
||||
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
|
||||
@@ -33,5 +33,5 @@ proxy_set_header X-Forwarded-Server $host;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
proxy_set_header X-Forwarded-Uri $request_uri;
|
||||
proxy_set_header X-Original-Method $request_method;
|
||||
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
|
||||
proxy_set_header X-Original-URL $scheme://$host$is_request_port$request_port$request_uri;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
@@ -1,4 +1,4 @@
|
||||
## Version 2026/09/08 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/tinyauth-server.conf.sample
|
||||
## Version 2026/10/20 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/tinyauth-server.conf.sample
|
||||
# Make sure that your tinyauth container is in the same user defined bridge network and is named tinyauth
|
||||
# Rename /config/nginx/proxy-confs/tinyauth.subdomain.conf.sample to /config/nginx/proxy-confs/tinyauth.subdomain.conf
|
||||
|
||||
@@ -15,7 +15,7 @@ location /tinyauth {
|
||||
proxy_set_header Content-Length "";
|
||||
|
||||
# Headers needed for authentication
|
||||
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
|
||||
proxy_set_header X-Original-URL $scheme://$host$is_request_port$request_port$request_uri;
|
||||
proxy_set_header X-Original-Method $request_method;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
|
||||
Reference in new issue
Block a user