Compare commits

..

2 Commits

Author SHA1 Message Date
aptalca
732b6d1bf1 pin cryptography 2024-09-10 13:06:02 -04:00
aptalca
0c3bc63349 overwrite renewal hook, add notice about it, increase verbosity 2024-09-10 12:25:06 -04:00
49 changed files with 781 additions and 1030 deletions

View File

@@ -105,10 +105,10 @@ docker build \
-t linuxserver/swag:latest . -t linuxserver/swag:latest .
``` ```
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```bash ```bash
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`. Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.

View File

@@ -11,17 +11,15 @@ jobs:
- name: External Trigger - name: External Trigger
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
env:
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
run: | run: |
printf "# External trigger for docker-swag\n\n" >> $GITHUB_STEP_SUMMARY printf "# External trigger for docker-swag\n\n" >> $GITHUB_STEP_SUMMARY
if grep -q "^swag_master" <<< "${SKIP_EXTERNAL_TRIGGER}"; then if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_SWAG_MASTER }}" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`swag_master\`; skipping trigger." >> $GITHUB_STEP_SUMMARY echo "> Github secret \`PAUSE_EXTERNAL_TRIGGER_SWAG_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
fi fi
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> External trigger running off of master branch. To disable this trigger, add \`swag_master\` into the Github organizational variable \`SKIP_EXTERNAL_TRIGGER\`." >> $GITHUB_STEP_SUMMARY echo "> External trigger running off of master branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_SWAG_MASTER\`" >> $GITHUB_STEP_SUMMARY
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY
EXT_RELEASE=$(curl -sL "https://pypi.python.org/pypi/certbot/json" |jq -r '. | .info.version') EXT_RELEASE=$(curl -sL "https://pypi.python.org/pypi/certbot/json" |jq -r '. | .info.version')
echo "Type is \`pip_version\`" >> $GITHUB_STEP_SUMMARY echo "Type is \`pip_version\`" >> $GITHUB_STEP_SUMMARY
@@ -43,35 +41,16 @@ jobs:
token=$(curl -sX GET \ token=$(curl -sX GET \
"https://ghcr.io/token?scope=repository%3Alinuxserver%2Fswag%3Apull" \ "https://ghcr.io/token?scope=repository%3Alinuxserver%2Fswag%3Apull" \
| jq -r '.token') | jq -r '.token')
multidigest=$(curl -s \ multidigest=$(curl -s \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Accept: application/vnd.oci.image.index.v1+json" \
--header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${tag}")
if jq -e '.layers // empty' <<< "${multidigest}" >/dev/null 2>&1; then
# If there's a layer element it's a single-arch manifest so just get that digest
digest=$(jq -r '.config.digest' <<< "${multidigest}")
else
# Otherwise it's multi-arch or has manifest annotations
if jq -e '.manifests[]?.annotations // empty' <<< "${multidigest}" >/dev/null 2>&1; then
# Check for manifest annotations and delete if found
multidigest=$(jq 'del(.manifests[] | select(.annotations))' <<< "${multidigest}")
fi
if [[ $(jq '.manifests | length' <<< "${multidigest}") -gt 1 ]]; then
# If there's still more than one digest, it's multi-arch
multidigest=$(jq -r ".manifests[] | select(.platform.architecture == \"amd64\").digest?" <<< "${multidigest}")
else
# Otherwise it's single arch
multidigest=$(jq -r ".manifests[].digest?" <<< "${multidigest}")
fi
if digest=$(curl -s \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Accept: application/vnd.oci.image.manifest.v1+json" \
--header "Authorization: Bearer ${token}" \ --header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${multidigest}"); then "https://ghcr.io/v2/${image}/manifests/${tag}" \
digest=$(jq -r '.config.digest' <<< "${digest}"); | jq -r 'first(.manifests[].digest)')
fi digest=$(curl -s \
fi --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/manifests/${multidigest}" \
| jq -r '.config.digest')
image_info=$(curl -sL \ image_info=$(curl -sL \
--header "Authorization: Bearer ${token}" \ --header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/${image}/blobs/${digest}") "https://ghcr.io/v2/${image}/blobs/${digest}")
@@ -99,38 +78,26 @@ jobs:
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
else else
if [[ "${artifacts_found}" == "false" ]]; then printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
echo "> New version detected, but not all artifacts are published yet; skipping trigger" >> $GITHUB_STEP_SUMMARY response=$(curl -iX POST \
FAILURE_REASON="New version ${EXT_RELEASE} for swag tag latest is detected, however not all artifacts are uploaded to upstream release yet. Will try again later." https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/buildWithParameters?PACKAGE_CHECK=false \
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903, --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}], echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
else sleep 10
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY buildurl="${buildurl%$'\r'}"
if [[ "${artifacts_found}" == "true" ]]; then echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
fi curl -iX POST \
response=$(curl -iX POST \ "${buildurl}submitDescription" \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/buildWithParameters?PACKAGE_CHECK=false \ --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") --data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY --data-urlencode "Submit=Submit"
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY echo "**** Notifying Discord ****"
sleep 10 TRIGGER_REASON="A version change was detected for swag tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}"
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url') curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
buildurl="${buildurl%$'\r'}" "description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"
echo "**** Notifying Discord ****"
TRIGGER_REASON="A version change was detected for swag tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi
fi fi

42
.github/workflows/package_trigger.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Package Trigger Main
on:
workflow_dispatch:
jobs:
package-trigger-master:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- name: Package Trigger
if: github.ref == 'refs/heads/master'
run: |
printf "# Package trigger for docker-swag\n\n" >> $GITHUB_STEP_SUMMARY
if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_SWAG_MASTER }}" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github secret \`PAUSE_PACKAGE_TRIGGER_SWAG_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> There already seems to be an active build on Jenkins; skipping package trigger" >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> Package trigger running off of master branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_SWAG_MASTER\`" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"

View File

@@ -14,8 +14,6 @@ jobs:
fetch-depth: '0' fetch-depth: '0'
- name: Package Trigger Scheduler - name: Package Trigger Scheduler
env:
SKIP_PACKAGE_TRIGGER: ${{ vars.SKIP_PACKAGE_TRIGGER }}
run: | run: |
printf "# Package trigger scheduler for docker-swag\n\n" >> $GITHUB_STEP_SUMMARY printf "# Package trigger scheduler for docker-swag\n\n" >> $GITHUB_STEP_SUMMARY
printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY
@@ -26,75 +24,27 @@ jobs:
continue continue
fi fi
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
JENKINS_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-swag/${br}/jenkins-vars.yml) ls_branch=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-swag/${br}/jenkins-vars.yml | yq -r '.ls_branch')
if ! curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-swag/${br}/Jenkinsfile >/dev/null 2>&1; then if [ "${br}" == "${ls_branch}" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> No Jenkinsfile found. Branch is either deprecated or is an early dev branch." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [[ "${br}" == $(yq -r '.ls_branch' <<< "${JENKINS_VARS}") ]]; then
echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY
README_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-swag/${br}/readme-vars.yml) if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-swag/${br}/.github/workflows/package_trigger.yml > /dev/null 2>&1; then
if [[ $(yq -r '.project_deprecation_status' <<< "${README_VARS}") == "true" ]]; then echo "Triggering package trigger workflow for branch ${br}" >> $GITHUB_STEP_SUMMARY
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Branch appears to be deprecated; skipping trigger." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [[ $(yq -r '.skip_package_check' <<< "${JENKINS_VARS}") == "true" ]]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Skipping branch ${br} due to \`skip_package_check\` being set in \`jenkins-vars.yml\`." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif grep -q "^swag_${br}" <<< "${SKIP_PACKAGE_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_PACKAGE_TRIGGER\` contains \`swag_${br}\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/${br}/lastBuild/api/json | jq -r '.building' 2>/dev/null) == "true" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> There already seems to be an active build on Jenkins; skipping package trigger for ${br}" >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
else
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> Triggering package trigger for branch ${br}" >> $GITHUB_STEP_SUMMARY
printf "> To disable, add \`swag_%s\` into the Github organizational variable \`SKIP_PACKAGE_TRIGGER\`.\n\n" "${br}" >> $GITHUB_STEP_SUMMARY
triggered_branches="${triggered_branches}${br} " triggered_branches="${triggered_branches}${br} "
response=$(curl -iX POST \ curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/${br}/buildWithParameters?PACKAGE_CHECK=true \ -H "Authorization: token ${{ secrets.CR_PAT }}" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") -H "Accept: application/vnd.github.v3+json" \
if [[ -z "${response}" ]]; then -d "{\"ref\":\"refs/heads/${br}\"}" \
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY https://api.github.com/repos/linuxserver/docker-swag/actions/workflows/package_trigger.yml/dispatches
echo "> Jenkins build could not be triggered. Skipping branch." sleep 30
continue else
fi echo "Skipping branch ${br} due to no package trigger workflow present." >> $GITHUB_STEP_SUMMARY
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
if ! curl -ifX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Unable to change the Jenkins job description."
fi
sleep 20
fi fi
else else
echo "Skipping branch ${br} due to being detected as dev branch." >> $GITHUB_STEP_SUMMARY echo "Skipping branch ${br} due to being detected as dev branch." >> $GITHUB_STEP_SUMMARY
fi fi
done done
if [[ -n "${triggered_branches}" ]] || [[ -n "${skipped_branches}" ]]; then echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
if [[ -n "${triggered_branches}" ]]; then echo "**** Notifying Discord ****"
NOTIFY_BRANCHES="**Triggered:** ${triggered_branches} \n" curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
NOTIFY_BUILD_URL="**Build URL:** https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-swag/activity/ \n" "description": "**Package Check Build(s) Triggered for swag** \n**Branch(es):** '"${triggered_branches}"' \n**Build URL:** '"https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-swag/activity/"' \n"}],
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****" "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi
if [[ -n "${skipped_branches}" ]]; then
NOTIFY_BRANCHES="${NOTIFY_BRANCHES}**Skipped:** ${skipped_branches} \n"
fi
echo "**** Notifying Discord ****"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Package Check Build(s) for swag** \n'"${NOTIFY_BRANCHES}"''"${NOTIFY_BUILD_URL}"'"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.21 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.20
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -10,10 +10,8 @@ LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DA
LABEL maintainer="nemchik" LABEL maintainer="nemchik"
# environment settings # environment settings
ENV DHLEVEL=2048 \ ENV DHLEVEL=2048 ONLY_SUBDOMAINS=false AWS_CONFIG_FILE=/config/dns-conf/route53.ini
ONLY_SUBDOMAINS=false \ ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2
AWS_CONFIG_FILE=/config/dns-conf/route53.ini \
S6_BEHAVIOUR_IF_STAGE2_FAILS=2
RUN \ RUN \
echo "**** install build packages ****" && \ echo "**** install build packages ****" && \
@@ -88,7 +86,7 @@ RUN \
pip install -U --no-cache-dir \ pip install -U --no-cache-dir \
pip \ pip \
wheel && \ wheel && \
pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/alpine-3.21/ \ pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/alpine-3.20/ \
certbot==${CERTBOT_VERSION} \ certbot==${CERTBOT_VERSION} \
certbot-dns-acmedns \ certbot-dns-acmedns \
certbot-dns-aliyun \ certbot-dns-aliyun \
@@ -133,7 +131,7 @@ RUN \
certbot-dns-transip \ certbot-dns-transip \
certbot-dns-vultr \ certbot-dns-vultr \
certbot-plugin-gandi \ certbot-plugin-gandi \
cryptography \ cryptography==42.0.7 \
future \ future \
requests && \ requests && \
echo "**** enable OCSP stapling from base ****" && \ echo "**** enable OCSP stapling from base ****" && \
@@ -150,9 +148,9 @@ RUN \
rm -f /etc/nginx/conf.d/stream.conf && \ rm -f /etc/nginx/conf.d/stream.conf && \
echo "**** correct ip6tables legacy issue ****" && \ echo "**** correct ip6tables legacy issue ****" && \
rm \ rm \
/usr/sbin/ip6tables && \ /sbin/ip6tables && \
ln -s \ ln -s \
/usr/sbin/ip6tables-nft /usr/sbin/ip6tables && \ /sbin/ip6tables-nft /sbin/ip6tables && \
echo "**** remove unnecessary fail2ban filters ****" && \ echo "**** remove unnecessary fail2ban filters ****" && \
rm \ rm \
/etc/fail2ban/jail.d/alpine-ssh.conf && \ /etc/fail2ban/jail.d/alpine-ssh.conf && \

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.21 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.20
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -10,10 +10,8 @@ LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DA
LABEL maintainer="nemchik" LABEL maintainer="nemchik"
# environment settings # environment settings
ENV DHLEVEL=2048 \ ENV DHLEVEL=2048 ONLY_SUBDOMAINS=false AWS_CONFIG_FILE=/config/dns-conf/route53.ini
ONLY_SUBDOMAINS=false \ ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2
AWS_CONFIG_FILE=/config/dns-conf/route53.ini \
S6_BEHAVIOUR_IF_STAGE2_FAILS=2
RUN \ RUN \
echo "**** install build packages ****" && \ echo "**** install build packages ****" && \
@@ -88,7 +86,7 @@ RUN \
pip install -U --no-cache-dir \ pip install -U --no-cache-dir \
pip \ pip \
wheel && \ wheel && \
pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/alpine-3.21/ \ pip install -U --no-cache-dir --find-links https://wheel-index.linuxserver.io/alpine-3.20/ \
certbot==${CERTBOT_VERSION} \ certbot==${CERTBOT_VERSION} \
certbot-dns-acmedns \ certbot-dns-acmedns \
certbot-dns-aliyun \ certbot-dns-aliyun \
@@ -133,7 +131,7 @@ RUN \
certbot-dns-transip \ certbot-dns-transip \
certbot-dns-vultr \ certbot-dns-vultr \
certbot-plugin-gandi \ certbot-plugin-gandi \
cryptography \ cryptography==42.0.7 \
future \ future \
requests && \ requests && \
echo "**** enable OCSP stapling from base ****" && \ echo "**** enable OCSP stapling from base ****" && \
@@ -150,9 +148,9 @@ RUN \
rm -f /etc/nginx/conf.d/stream.conf && \ rm -f /etc/nginx/conf.d/stream.conf && \
echo "**** correct ip6tables legacy issue ****" && \ echo "**** correct ip6tables legacy issue ****" && \
rm \ rm \
/usr/sbin/ip6tables && \ /sbin/ip6tables && \
ln -s \ ln -s \
/usr/sbin/ip6tables-nft /usr/sbin/ip6tables && \ /sbin/ip6tables-nft /sbin/ip6tables && \
echo "**** remove unnecessary fail2ban filters ****" && \ echo "**** remove unnecessary fail2ban filters ****" && \
rm \ rm \
/etc/fail2ban/jail.d/alpine-ssh.conf && \ /etc/fail2ban/jail.d/alpine-ssh.conf && \

340
Jenkinsfile vendored
View File

@@ -8,7 +8,7 @@ pipeline {
} }
// Input to determine if this is a package check // Input to determine if this is a package check
parameters { parameters {
string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK') string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK')
} }
// Configuration for the variables used for this specific repo // Configuration for the variables used for this specific repo
environment { environment {
@@ -29,12 +29,12 @@ pipeline {
PR_DOCKERHUB_IMAGE = 'lspipepr/swag' PR_DOCKERHUB_IMAGE = 'lspipepr/swag'
DIST_IMAGE = 'alpine' DIST_IMAGE = 'alpine'
MULTIARCH='true' MULTIARCH='true'
CI='false' CI='true'
CI_WEB='false' CI_WEB='false'
CI_PORT='80' CI_PORT='80'
CI_SSL='false' CI_SSL='false'
CI_DELAY='30' CI_DELAY='30'
CI_DOCKERENV='' CI_DOCKERENV='TEST_RUN=1'
CI_AUTH='' CI_AUTH=''
CI_WEBPATH='' CI_WEBPATH=''
} }
@@ -82,7 +82,7 @@ pipeline {
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/' env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
env.PULL_REQUEST = env.CHANGE_ID env.PULL_REQUEST = env.CHANGE_ID
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./root/donate.txt' env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml ./root/donate.txt'
} }
sh '''#! /bin/bash sh '''#! /bin/bash
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" ''' echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
@@ -191,7 +191,6 @@ pipeline {
env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
} }
} }
} }
@@ -216,7 +215,6 @@ pipeline {
env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
} }
} }
} }
@@ -241,7 +239,6 @@ pipeline {
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/'
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
} }
} }
} }
@@ -314,7 +311,7 @@ pipeline {
echo "Jenkinsfile is up to date." echo "Jenkinsfile is up to date."
fi fi
echo "Starting Stage 2 - Delete old templates" echo "Starting Stage 2 - Delete old templates"
OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml .github/workflows/package_trigger.yml" OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml"
for i in ${OLD_TEMPLATES}; do for i in ${OLD_TEMPLATES}; do
if [[ -f "${i}" ]]; then if [[ -f "${i}" ]]; then
TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}" TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}"
@@ -338,35 +335,6 @@ pipeline {
else else
echo "No templates to delete" echo "No templates to delete"
fi fi
echo "Starting Stage 2.5 - Update init diagram"
if ! grep -q 'init_diagram:' readme-vars.yml; then
echo "Adding the key 'init_diagram' to readme-vars.yml"
sed -i '\\|^#.*changelog.*$|d' readme-vars.yml
sed -i 's|^changelogs:|# init diagram\\ninit_diagram:\\n\\n# changelog\\nchangelogs:|' readme-vars.yml
fi
mkdir -p ${TEMPDIR}/d2
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
if [[ $(md5sum readme-vars.yml | cut -c1-8) != $(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/readme-vars.yml | cut -c1-8) ]]; then
echo "'init_diagram' has been updated. Updating repo and exiting build, new one will trigger based on commit."
mkdir -p ${TEMPDIR}/repo
git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO}
cd ${TEMPDIR}/repo/${LS_REPO}
git checkout -f master
cp ${WORKSPACE}/readme-vars.yml ${TEMPDIR}/repo/${LS_REPO}/readme-vars.yml
git add readme-vars.yml
git commit -m 'Bot Updating Templated Files'
git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "Updating templates and exiting build, new one will trigger based on commit"
rm -Rf ${TEMPDIR}
exit 0
else
echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "Init diagram is unchanged"
fi
echo "Starting Stage 3 - Update templates" echo "Starting Stage 3 - Update templates"
CURRENTHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8) CURRENTHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8)
cd ${TEMPDIR}/docker-${CONTAINER_NAME} cd ${TEMPDIR}/docker-${CONTAINER_NAME}
@@ -575,42 +543,8 @@ pipeline {
--label \"org.opencontainers.image.title=Swag\" \ --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.\" \ --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 \ --no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
--provenance=true --sbom=true --builder=container --load \ --provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --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"
for i in "${CACHE[@]}"; do
docker tag ${IMAGE}:${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
done
'''
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot',
usernameVariable: 'QUAYUSER',
passwordVariable: 'QUAYPASS'
]
]) {
retry_backoff(5,5) {
sh '''#! /bin/bash
set -e
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
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
done
for p in $(jobs -p); do
wait "$p" || { echo "job $p failed" >&2; exit 1; }
done
fi
'''
}
}
} }
} }
// Build MultiArch Docker containers for push to LS Repo // Build MultiArch Docker containers for push to LS Repo
@@ -641,42 +575,8 @@ pipeline {
--label \"org.opencontainers.image.title=Swag\" \ --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.\" \ --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 \ --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
--provenance=true --sbom=true --builder=container --load \ --provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --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"
for i in "${CACHE[@]}"; do
docker tag ${IMAGE}:amd64-${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
done
'''
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot',
usernameVariable: 'QUAYUSER',
passwordVariable: 'QUAYPASS'
]
]) {
retry_backoff(5,5) {
sh '''#! /bin/bash
set -e
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
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
done
for p in $(jobs -p); do
wait "$p" || { echo "job $p failed" >&2; exit 1; }
done
fi
'''
}
}
} }
} }
stage('Build ARM64') { stage('Build ARM64') {
@@ -685,6 +585,10 @@ pipeline {
} }
steps { steps {
echo "Running on node: ${NODE_NAME}" echo "Running on node: ${NODE_NAME}"
echo 'Logging into Github'
sh '''#! /bin/bash
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
'''
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64" sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
sh "docker buildx build \ sh "docker buildx build \
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \ --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
@@ -700,49 +604,18 @@ pipeline {
--label \"org.opencontainers.image.title=Swag\" \ --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.\" \ --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 \ --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \
--provenance=true --sbom=true --builder=container --load \ --provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
sh '''#! /bin/bash sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
set -e retry_backoff(5,5) {
IFS=',' read -ra CACHE <<< "$BUILDCACHE" sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
for i in "${CACHE[@]}"; do
docker tag ${IMAGE}:arm64v8-${META_TAG} ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
done
'''
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot',
usernameVariable: 'QUAYUSER',
passwordVariable: 'QUAYPASS'
]
]) {
retry_backoff(5,5) {
sh '''#! /bin/bash
set -e
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
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do
docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
done
for p in $(jobs -p); do
wait "$p" || { echo "job $p failed" >&2; exit 1; }
done
fi
'''
}
} }
sh '''#! /bin/bash sh '''#! /bin/bash
containers=$(docker ps -aq) containers=$(docker ps -aq)
if [[ -n "${containers}" ]]; then if [[ -n "${containers}" ]]; then
docker stop ${containers} docker stop ${containers}
fi fi
docker system prune -af --volumes || : docker system prune -af --volumes || : '''
'''
} }
} }
} }
@@ -846,14 +719,6 @@ pipeline {
} }
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
if grep -q 'docker-baseimage' <<< "${LS_REPO}"; then
echo "Detected baseimage, setting LSIO_FIRST_PARTY=true"
if [ -n "${CI_DOCKERENV}" ]; then
CI_DOCKERENV="LSIO_FIRST_PARTY=true|${CI_DOCKERENV}"
else
CI_DOCKERENV="LSIO_FIRST_PARTY=true"
fi
fi
docker pull ghcr.io/linuxserver/ci:latest docker pull ghcr.io/linuxserver/ci:latest
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ]; then
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
@@ -866,7 +731,6 @@ pipeline {
-e DOCKER_LOGS_TIMEOUT=\"${CI_DELAY}\" \ -e DOCKER_LOGS_TIMEOUT=\"${CI_DELAY}\" \
-e TAGS=\"${CI_TAGS}\" \ -e TAGS=\"${CI_TAGS}\" \
-e META_TAG=\"${META_TAG}\" \ -e META_TAG=\"${META_TAG}\" \
-e RELEASE_TAG=\"latest\" \
-e PORT=\"${CI_PORT}\" \ -e PORT=\"${CI_PORT}\" \
-e SSL=\"${CI_SSL}\" \ -e SSL=\"${CI_SSL}\" \
-e BASE=\"${DIST_IMAGE}\" \ -e BASE=\"${DIST_IMAGE}\" \
@@ -876,7 +740,6 @@ pipeline {
-e WEB_SCREENSHOT=\"${CI_WEB}\" \ -e WEB_SCREENSHOT=\"${CI_WEB}\" \
-e WEB_AUTH=\"${CI_AUTH}\" \ -e WEB_AUTH=\"${CI_AUTH}\" \
-e WEB_PATH=\"${CI_WEBPATH}\" \ -e WEB_PATH=\"${CI_WEBPATH}\" \
-e NODE_NAME=\"${NODE_NAME}\" \
-t ghcr.io/linuxserver/ci:latest \ -t ghcr.io/linuxserver/ci:latest \
python3 test_build.py''' python3 test_build.py'''
} }
@@ -892,23 +755,37 @@ pipeline {
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
steps { steps {
retry_backoff(5,5) { withCredentials([
sh '''#! /bin/bash [
set -e $class: 'UsernamePasswordMultiBinding',
for PUSHIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do credentialsId: 'Quay.io-Robot',
[[ ${PUSHIMAGE%%/*} =~ \\. ]] && PUSHIMAGEPLUS="${PUSHIMAGE}" || PUSHIMAGEPLUS="docker.io/${PUSHIMAGE}" usernameVariable: 'QUAYUSER',
IFS=',' read -ra CACHE <<< "$BUILDCACHE" passwordVariable: 'QUAYPASS'
for i in "${CACHE[@]}"; do ]
if [[ "${PUSHIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then ]) {
CACHEIMAGE=${i} retry_backoff(5,5) {
fi sh '''#! /bin/bash
set -e
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
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG}
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:latest
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
fi
docker push ${PUSHIMAGE}:latest
docker push ${PUSHIMAGE}:${META_TAG}
docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker push ${PUSHIMAGE}:${SEMVER}
fi
done 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} '''
if [ -n "${SEMVER}" ]; then }
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
fi
done
'''
} }
} }
} }
@@ -919,34 +796,57 @@ pipeline {
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
steps { steps {
retry_backoff(5,5) { withCredentials([
sh '''#! /bin/bash [
set -e $class: 'UsernamePasswordMultiBinding',
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do credentialsId: 'Quay.io-Robot',
[[ ${MANIFESTIMAGE%%/*} =~ \\. ]] && MANIFESTIMAGEPLUS="${MANIFESTIMAGE}" || MANIFESTIMAGEPLUS="docker.io/${MANIFESTIMAGE}" usernameVariable: 'QUAYUSER',
IFS=',' read -ra CACHE <<< "$BUILDCACHE" passwordVariable: 'QUAYPASS'
for i in "${CACHE[@]}"; do ]
if [[ "${MANIFESTIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then ]) {
CACHEIMAGE=${i} retry_backoff(5,5) {
fi sh '''#! /bin/bash
set -e
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
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [ "${CI}" == "false" ]; then
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
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
docker tag ${IMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG}
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-latest
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-latest
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker push ${MANIFESTIMAGE}:amd64-latest
docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker push ${MANIFESTIMAGE}:arm64v8-latest
docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
done 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} for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
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} docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
if [ -n "${SEMVER}" ]; then docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} if [ -n "${SEMVER}" ]; then
fi docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
done fi
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do done
docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest '''
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} }
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
done
'''
} }
} }
} }
@@ -974,7 +874,7 @@ pipeline {
echo '{"tag_name":"'${META_TAG}'",\ echo '{"tag_name":"'${META_TAG}'",\
"target_commitish": "master",\ "target_commitish": "master",\
"name": "'${META_TAG}'",\ "name": "'${META_TAG}'",\
"body": "**CI Report:**\\n\\n'${CI_URL:-N/A}'\\n\\n**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**PIP Changes:**\\n\\n' > start
printf '","draft": false,"prerelease": false}' >> releasebody.json printf '","draft": false,"prerelease": false}' >> releasebody.json
paste -d'\\0' start releasebody.json > releasebody.json.done paste -d'\\0' start releasebody.json > releasebody.json.done
curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
@@ -1107,45 +1007,17 @@ EOF
git config --global --unset commit.gpgsign git config --global --unset commit.gpgsign
''' '''
script{ script{
env.JOB_DATE = sh(
script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''',
returnStdout: true).trim()
if (env.EXIT_STATUS == "ABORTED"){ if (env.EXIT_STATUS == "ABORTED"){
sh 'echo "build aborted"' sh 'echo "build aborted"'
}else{ }
if (currentBuild.currentResult == "SUCCESS"){ else if (currentBuild.currentResult == "SUCCESS"){
if (env.GITHUBIMAGE =~ /lspipepr/){ sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"color": 1681177,\
env.JOB_WEBHOOK_STATUS='Success' "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
env.JOB_WEBHOOK_COLOUR=3957028 "username": "Jenkins"}' ${BUILDS_DISCORD} '''
env.JOB_WEBHOOK_FOOTER='PR Build' }
}else if (env.GITHUBIMAGE =~ /lsiodev/){ else {
env.JOB_WEBHOOK_STATUS='Success' sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"color": 16711680,\
env.JOB_WEBHOOK_COLOUR=3957028 "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
env.JOB_WEBHOOK_FOOTER='Dev Build'
}else{
env.JOB_WEBHOOK_STATUS='Success'
env.JOB_WEBHOOK_COLOUR=1681177
env.JOB_WEBHOOK_FOOTER='Live Build'
}
}else{
if (env.GITHUBIMAGE =~ /lspipepr/){
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=12669523
env.JOB_WEBHOOK_FOOTER='PR Build'
}else if (env.GITHUBIMAGE =~ /lsiodev/){
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=12669523
env.JOB_WEBHOOK_FOOTER='Dev Build'
}else{
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=16711680
env.JOB_WEBHOOK_FOOTER='Live Build'
}
}
sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"'color'": '${JOB_WEBHOOK_COLOUR}',\
"footer": {"text" : "'"${JOB_WEBHOOK_FOOTER}"'"},\
"timestamp": "'${JOB_DATE}'",\
"description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** '${JOB_WEBHOOK_STATUS}'\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
"username": "Jenkins"}' ${BUILDS_DISCORD} ''' "username": "Jenkins"}' ${BUILDS_DISCORD} '''
} }
} }

View File

@@ -37,6 +37,7 @@ Find us at:
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/swag.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/swag) [![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/swag.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/swag)
[![Docker Stars](https://img.shields.io/docker/stars/linuxserver/swag.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/swag) [![Docker Stars](https://img.shields.io/docker/stars/linuxserver/swag.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/swag)
[![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-swag%2Fjob%2Fmaster%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/) [![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-swag%2Fjob%2Fmaster%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/)
[![LSIO CI](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=CI&query=CI&url=https%3A%2F%2Fci-tests.linuxserver.io%2Flinuxserver%2Fswag%2Flatest%2Fci-status.yml)](https://ci-tests.linuxserver.io/linuxserver/swag/latest/index.html)
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. 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.
@@ -70,7 +71,7 @@ The architectures supported by this image are:
1. Certs that only cover your main subdomain (ie. `yoursubdomain.duckdns.org`, leave the `SUBDOMAINS` variable empty) 1. Certs that only cover your main subdomain (ie. `yoursubdomain.duckdns.org`, leave the `SUBDOMAINS` variable empty)
2. Certs that cover sub-subdomains of your main subdomain (ie. `*.yoursubdomain.duckdns.org`, set the `SUBDOMAINS` variable to `wildcard`) 2. Certs that cover sub-subdomains of your main subdomain (ie. `*.yoursubdomain.duckdns.org`, set the `SUBDOMAINS` variable to `wildcard`)
* `--cap-add=NET_ADMIN` is required for fail2ban to modify iptables * `--cap-add=NET_ADMIN` is required for fail2ban to modify iptables
* After setup, navigate to `https://example.com` to access the default homepage (http access through port 80 is disabled by default, you can enable it by editing the default site config at `/config/nginx/site-confs/default.conf`). * After setup, navigate to `https://yourdomain.url` to access the default homepage (http access through port 80 is disabled by default, you can enable it by editing the default site config at `/config/nginx/site-confs/default.conf`).
* Certs are checked nightly and if expiration is within 30 days, renewal is attempted. If your cert is about to expire in less than 30 days, check the logs under `/config/log/letsencrypt` to see why the renewals have been failing. It is recommended to input your e-mail in docker parameters so you receive expiration notices from Let's Encrypt in those circumstances. * Certs are checked nightly and if expiration is within 30 days, renewal is attempted. If your cert is about to expire in less than 30 days, check the logs under `/config/log/letsencrypt` to see why the renewals have been failing. It is recommended to input your e-mail in docker parameters so you receive expiration notices from Let's Encrypt in those circumstances.
### Certbot Plugins ### Certbot Plugins
@@ -149,22 +150,10 @@ This will *ask* Google et al not to index and list your site. Be careful with th
Please follow the instructions [on this blog post](https://www.linuxserver.io/blog/2020-08-21-introducing-swag#migrate). Please follow the instructions [on this blog post](https://www.linuxserver.io/blog/2020-08-21-introducing-swag#migrate).
## Read-Only Operation
This image can be run with a read-only container filesystem. For details please [read the docs](https://docs.linuxserver.io/misc/read-only/).
### Caveats
* `/tmp` must be mounted to tmpfs
* fail2ban will not be available
## Usage ## Usage
To help you get started creating a container from this image you can either use docker-compose or the docker cli. To help you get started creating a container from this image you can either use docker-compose or the docker cli.
>[!NOTE]
>Unless a parameter is flaged as 'optional', it is *mandatory* and a value must be provided.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
```yaml ```yaml
@@ -179,7 +168,7 @@ services:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
- TZ=Etc/UTC - TZ=Etc/UTC
- URL=example.com - URL=yourdomain.url
- VALIDATION=http - VALIDATION=http
- SUBDOMAINS=www, #optional - SUBDOMAINS=www, #optional
- CERTPROVIDER= #optional - CERTPROVIDER= #optional
@@ -189,7 +178,6 @@ services:
- ONLY_SUBDOMAINS=false #optional - ONLY_SUBDOMAINS=false #optional
- EXTRA_DOMAINS= #optional - EXTRA_DOMAINS= #optional
- STAGING=false #optional - STAGING=false #optional
- DISABLE_F2B= #optional
volumes: volumes:
- /path/to/swag/config:/config - /path/to/swag/config:/config
ports: ports:
@@ -207,7 +195,7 @@ docker run -d \
-e PUID=1000 \ -e PUID=1000 \
-e PGID=1000 \ -e PGID=1000 \
-e TZ=Etc/UTC \ -e TZ=Etc/UTC \
-e URL=example.com \ -e URL=yourdomain.url \
-e VALIDATION=http \ -e VALIDATION=http \
-e SUBDOMAINS=www, `#optional` \ -e SUBDOMAINS=www, `#optional` \
-e CERTPROVIDER= `#optional` \ -e CERTPROVIDER= `#optional` \
@@ -217,7 +205,6 @@ docker run -d \
-e ONLY_SUBDOMAINS=false `#optional` \ -e ONLY_SUBDOMAINS=false `#optional` \
-e EXTRA_DOMAINS= `#optional` \ -e EXTRA_DOMAINS= `#optional` \
-e STAGING=false `#optional` \ -e STAGING=false `#optional` \
-e DISABLE_F2B= `#optional` \
-p 443:443 \ -p 443:443 \
-p 80:80 `#optional` \ -p 80:80 `#optional` \
-v /path/to/swag/config:/config \ -v /path/to/swag/config:/config \
@@ -231,25 +218,22 @@ Containers are configured using parameters passed at runtime (such as those abov
| Parameter | Function | | Parameter | Function |
| :----: | --- | | :----: | --- |
| `-p 443:443` | HTTPS port | | `-p 443` | Https port |
| `-p 80` | HTTP port (required for HTTP validation and HTTP -> HTTPS redirect) | | `-p 80` | Http port (required for http validation and http -> https redirect) |
| `-e PUID=1000` | for UserID - see below for explanation | | `-e PUID=1000` | for UserID - see below for explanation |
| `-e PGID=1000` | for GroupID - see below for explanation | | `-e PGID=1000` | for GroupID - see below for explanation |
| `-e TZ=Etc/UTC` | specify a timezone to use, see this [list](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). | | `-e TZ=Etc/UTC` | specify a timezone to use, see this [list](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). |
| `-e URL=example.com` | Top url you have control over (e.g. `example.com` if you own it, or `customsubdomain.example.com` if dynamic dns). | | `-e URL=yourdomain.url` | Top url you have control over (`customdomain.com` if you own it, or `customsubdomain.ddnsprovider.com` if dynamic dns). |
| `-e VALIDATION=http` | Certbot validation method to use, options are `http` or `dns` (`dns` method also requires `DNSPLUGIN` variable set). | | `-e VALIDATION=http` | Certbot validation method to use, options are `http` or `dns` (`dns` method also requires `DNSPLUGIN` variable set). |
| `-e SUBDOMAINS=www,` | Subdomains you'd like the cert to cover (comma separated, no spaces) ie. `www,ftp,cloud`. For a wildcard cert, set this *exactly* to `wildcard` (wildcard cert is available via `dns` validation only) | | `-e SUBDOMAINS=www,` | Subdomains you'd like the cert to cover (comma separated, no spaces) ie. `www,ftp,cloud`. For a wildcard cert, set this *exactly* to `wildcard` (wildcard cert is available via `dns` validation only) |
| `-e CERTPROVIDER=` | Optionally define the cert provider. Set to `zerossl` for ZeroSSL certs (requires existing [ZeroSSL account](https://app.zerossl.com/signup) and the e-mail address entered in `EMAIL` env var). Otherwise defaults to Let's Encrypt. | | `-e CERTPROVIDER=` | Optionally define the cert provider. Set to `zerossl` for ZeroSSL certs (requires existing [ZeroSSL account](https://app.zerossl.com/signup) and the e-mail address entered in `EMAIL` env var). Otherwise defaults to Let's Encrypt. |
| `-e DNSPLUGIN=cloudflare` | Required if `VALIDATION` is set to `dns`. Options are `acmedns`, `aliyun`, `azure`, `bunny`, `cloudflare`, `cpanel`, `desec`, `digitalocean`, `directadmin`, `dnsimple`, `dnsmadeeasy`, `dnspod`, `do`, `domeneshop`, `dreamhost`, `duckdns`, `dynu`, `freedns`, `gandi`, `gehirn`, `glesys`, `godaddy`, `google`, `he`, `hetzner`, `infomaniak`, `inwx`, `ionos`, `linode`, `loopia`, `luadns`, `namecheap`, `netcup`, `njalla`, `nsone`, `ovh`, `porkbun`, `rfc2136`, `route53`, `sakuracloud`, `standalone`, `transip`, and `vultr`. Also need to enter the credentials into the corresponding ini (or json for some plugins) file under `/config/dns-conf`. | | `-e DNSPLUGIN=cloudflare` | Required if `VALIDATION` is set to `dns`. Options are `acmedns`, `aliyun`, `azure`, `bunny`, `cloudflare`, `cpanel`, `desec`, `digitalocean`, `directadmin`, `dnsimple`, `dnsmadeeasy`, `dnspod`, `do`, `domeneshop`, `dreamhost`, `duckdns`, `dynudns`, `freedns`, `gandi`, `gehirn`, `glesys`, `godaddy`, `google`, `he`, `hetzner`, `infomaniak`, `inwx`, `ionos`, `linode`, `loopia`, `luadns`, `namecheap`, `netcup`, `njalla`, `nsone`, `ovh`, `porkbun`, `rfc2136`, `route53`, `sakuracloud`, `standalone`, `transip`, and `vultr`. Also need to enter the credentials into the corresponding ini (or json for some plugins) file under `/config/dns-conf`. |
| `-e PROPAGATION=` | Optionally override (in seconds) the default propagation time for the dns plugins. | | `-e PROPAGATION=` | Optionally override (in seconds) the default propagation time for the dns plugins. |
| `-e EMAIL=` | Optional e-mail address used for cert expiration notifications (Required for ZeroSSL). | | `-e EMAIL=` | Optional e-mail address used for cert expiration notifications (Required for ZeroSSL). |
| `-e ONLY_SUBDOMAINS=false` | If you wish to get certs only for certain subdomains, but not the main domain (main domain may be hosted on another machine and cannot be validated), set this to `true` | | `-e ONLY_SUBDOMAINS=false` | If you wish to get certs only for certain subdomains, but not the main domain (main domain may be hosted on another machine and cannot be validated), set this to `true` |
| `-e EXTRA_DOMAINS=` | Additional fully qualified domain names (comma separated, no spaces) ie. `example.net,subdomain.example.net,*.example.org` | | `-e EXTRA_DOMAINS=` | Additional fully qualified domain names (comma separated, no spaces) ie. `extradomain.com,subdomain.anotherdomain.org,*.anotherdomain.org` |
| `-e STAGING=false` | Set to `true` to retrieve certs in staging mode. Rate limits will be much higher, but the resulting cert will not pass the browser's security test. Only to be used for testing purposes. | | `-e STAGING=false` | Set to `true` to retrieve certs in staging mode. Rate limits will be much higher, but the resulting cert will not pass the browser's security test. Only to be used for testing purposes. |
| `-e DISABLE_F2B=` | Set to `true` to disable the Fail2ban service in the container, if you're already running it elsewhere or using a different IPS. |
| `-v /config` | Persistent config files | | `-v /config` | Persistent config files |
| `--read-only=true` | Run container with a read-only filesystem. Please [read the docs](https://docs.linuxserver.io/misc/read-only/). |
| `--cap-add=NET_ADMIN` | Required for fail2Ban to be able to modify iptables rules. |
### Portainer notice ### Portainer notice
@@ -391,8 +375,7 @@ Below are the instructions for updating containers:
### Image Update Notifications - Diun (Docker Image Update Notifier) ### Image Update Notifications - Diun (Docker Image Update Notifier)
>[!TIP] **tip**: We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
>We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
## Building locally ## Building locally
@@ -407,18 +390,16 @@ docker build \
-t lscr.io/linuxserver/swag:latest . -t lscr.io/linuxserver/swag:latest .
``` ```
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```bash ```bash
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`. Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
## Versions ## Versions
* **17.12.24:** - Rebase to Alpine 3.21.
* **21.10.24:** - Fix naming issue with Dynu plugin. If you are using Dynu, please make sure your credentials are set in /config/dns-conf/dynu.ini and your DNSPLUGIN variable is set to dynu (not dynudns).
* **30.08.24:** - Fix zerossl cert revocation. * **30.08.24:** - Fix zerossl cert revocation.
* **24.07.14:** - Rebase to Alpine 3.20. Remove deprecated Google Domains certbot plugin. Existing users should update their nginx confs to avoid http2 deprecation warnings. * **24.07.14:** - Rebase to Alpine 3.20. Remove deprecated Google Domains certbot plugin. Existing users should update their nginx confs to avoid http2 deprecation warnings.
* **01.07.24:** - Fall back to iptables-legacy if iptables doesn't work. * **01.07.24:** - Fall back to iptables-legacy if iptables doesn't work.

View File

@@ -17,12 +17,12 @@ repo_vars:
- PR_DOCKERHUB_IMAGE = 'lspipepr/swag' - PR_DOCKERHUB_IMAGE = 'lspipepr/swag'
- DIST_IMAGE = 'alpine' - DIST_IMAGE = 'alpine'
- MULTIARCH='true' - MULTIARCH='true'
- CI='false' - CI='true'
- CI_WEB='false' - CI_WEB='false'
- CI_PORT='80' - CI_PORT='80'
- CI_SSL='false' - CI_SSL='false'
- CI_DELAY='30' - CI_DELAY='30'
- CI_DOCKERENV='' - CI_DOCKERENV='TEST_RUN=1'
- CI_AUTH='' - CI_AUTH=''
- CI_WEBPATH='' - CI_WEBPATH=''
sponsor_links: sponsor_links:

View File

@@ -1,363 +1,362 @@
NAME VERSION TYPE NAME VERSION TYPE
Simple Launcher 1.1.0.14 dotnet (+5 duplicates) Simple Launcher 1.1.0.14 dotnet (+5 duplicates)
acl-libs 2.3.2-r1 apk acme 2.11.0 python
acme 3.0.1 python alpine-baselayout 3.6.5-r0 apk
alpine-baselayout 3.6.8-r1 apk alpine-baselayout-data 3.6.5-r0 apk
alpine-baselayout-data 3.6.8-r1 apk alpine-keys 2.4-r1 apk
alpine-keys 2.5-r0 apk alpine-release 3.20.2-r0 apk
alpine-release 3.21.0-r0 apk aom-libs 3.9.1-r0 apk
aom-libs 3.11.0-r0 apk apache2-utils 2.4.62-r0 apk
apache2-utils 2.4.62-r0 apk apk-tools 2.14.4-r0 apk
apk-tools 2.14.6-r2 apk apr 1.7.5-r0 apk
apr 1.7.5-r0 apk apr-util 1.6.3-r1 apk
apr-util 1.6.3-r1 apk argon2-libs 20190702-r5 apk
argon2-libs 20190702-r5 apk attrs 24.2.0 python
attrs 24.3.0 python autocommand 2.2.2 python
autocommand 2.2.2 python azure-common 1.1.28 python
azure-common 1.1.28 python azure-core 1.30.2 python
azure-core 1.32.0 python azure-identity 1.17.1 python
azure-identity 1.19.0 python azure-mgmt-core 1.4.0 python
azure-mgmt-core 1.5.0 python azure-mgmt-dns 8.1.0 python
azure-mgmt-dns 8.2.0 python backports-tarfile 1.2.0 python
backports-tarfile 1.2.0 python bash 5.2.26-r0 apk
bash 5.2.37-r0 apk beautifulsoup4 4.12.3 python
beautifulsoup4 4.12.3 python boto3 1.35.14 python
boto3 1.35.92 python botocore 1.35.14 python
botocore 1.35.92 python brotli-libs 1.1.0-r2 apk
brotli-libs 1.1.0-r2 apk bs4 0.0.2 python
bs4 0.0.2 python busybox 1.36.1-r29 apk
busybox 1.37.0-r9 apk busybox-binsh 1.36.1-r29 apk
busybox-binsh 1.37.0-r9 apk c-ares 1.28.1-r0 apk
c-ares 1.34.3-r0 apk c-client 2007f-r15 apk
c-client 2007f-r15 apk ca-certificates 20240705-r0 apk
ca-certificates 20241121-r0 apk ca-certificates-bundle 20240705-r0 apk
ca-certificates-bundle 20241121-r0 apk cachetools 5.5.0 python
cachetools 5.5.0 python catatonit 0.2.0-r0 apk
catatonit 0.2.0-r0 apk certbot 2.11.0 python
certbot 3.0.1 python certbot-dns-acmedns 0.1.0 python
certbot-dns-acmedns 0.1.0 python certbot-dns-aliyun 2.0.0 python
certbot-dns-aliyun 2.0.0 python certbot-dns-azure 2.5.0 python
certbot-dns-azure 2.6.1 python certbot-dns-bunny 0.0.9 python
certbot-dns-bunny 3.0.0 python certbot-dns-cloudflare 2.11.0 python
certbot-dns-cloudflare 3.0.1 python certbot-dns-cpanel 0.4.0 python
certbot-dns-cpanel 0.4.0 python certbot-dns-desec 1.2.1 python
certbot-dns-desec 1.2.1 python certbot-dns-digitalocean 2.11.0 python
certbot-dns-digitalocean 3.0.1 python certbot-dns-directadmin 1.0.4 python
certbot-dns-directadmin 1.0.13 python certbot-dns-dnsimple 2.11.0 python
certbot-dns-dnsimple 3.0.1 python certbot-dns-dnsmadeeasy 2.11.0 python
certbot-dns-dnsmadeeasy 3.0.1 python certbot-dns-dnspod 0.1.0 python
certbot-dns-dnspod 0.1.0 python certbot-dns-do 0.31.0 python
certbot-dns-do 0.31.0 python certbot-dns-domeneshop 0.2.9 python
certbot-dns-domeneshop 0.2.9 python certbot-dns-dreamhost 1.0 python
certbot-dns-dreamhost 1.0 python certbot-dns-duckdns 1.3 python
certbot-dns-duckdns 1.5 python certbot-dns-dynudns 0.0.6 python
certbot-dns-dynudns 0.0.6 python certbot-dns-freedns 0.2.0 python
certbot-dns-freedns 0.2.0 python certbot-dns-gehirn 2.11.0 python
certbot-dns-gehirn 3.0.1 python certbot-dns-glesys 2.1.0 python
certbot-dns-glesys 2.1.0 python certbot-dns-godaddy 2.8.0 python
certbot-dns-godaddy 2.8.0 python certbot-dns-google 2.11.0 python
certbot-dns-google 3.0.1 python certbot-dns-he 1.0.0 python
certbot-dns-he 1.0.0 python certbot-dns-hetzner 2.0.1 python
certbot-dns-hetzner 2.0.1 python certbot-dns-infomaniak 0.2.2 python
certbot-dns-infomaniak 0.2.3 python certbot-dns-inwx 2.2.0 python
certbot-dns-inwx 3.0.1 python certbot-dns-ionos 2024.1.8 python
certbot-dns-ionos 2024.11.9 python certbot-dns-linode 2.11.0 python
certbot-dns-linode 3.0.1 python certbot-dns-loopia 1.0.1 python
certbot-dns-loopia 1.0.1 python certbot-dns-luadns 2.11.0 python
certbot-dns-luadns 3.0.1 python certbot-dns-namecheap 1.0.0 python
certbot-dns-namecheap 1.0.0 python certbot-dns-netcup 1.4.3 python
certbot-dns-netcup 1.4.4 python certbot-dns-njalla 1.0.0 python
certbot-dns-njalla 2.0.2 python certbot-dns-nsone 2.11.0 python
certbot-dns-nsone 3.0.1 python certbot-dns-ovh 2.11.0 python
certbot-dns-ovh 3.0.1 python certbot-dns-porkbun 0.8 python
certbot-dns-porkbun 0.9.1 python certbot-dns-rfc2136 2.11.0 python
certbot-dns-rfc2136 3.0.1 python certbot-dns-route53 2.11.0 python
certbot-dns-route53 3.0.1 python certbot-dns-sakuracloud 2.11.0 python
certbot-dns-sakuracloud 3.0.1 python certbot-dns-standalone 1.1 python
certbot-dns-standalone 1.1 python certbot-dns-transip 0.5.2 python
certbot-dns-transip 0.5.2 python certbot-dns-vultr 1.1.0 python
certbot-dns-vultr 1.1.0 python certbot-plugin-gandi 1.5.0 python
certbot-plugin-gandi 1.5.0 python certifi 2024.8.30 python
certifi 2024.12.14 python cffi 1.17.1 python
cffi 1.17.1 python charset-normalizer 3.3.2 python
charset-normalizer 3.4.1 python cloudflare 2.19.4 python
cloudflare 2.19.4 python composer 2.7.9 binary
composer 2.8.4 binary configargparse 1.7 python
configargparse 1.7 python configobj 5.0.8 python
configobj 5.0.9 python coreutils 9.5-r1 apk
coreutils 9.5-r1 apk coreutils-env 9.5-r1 apk
coreutils-env 9.5-r1 apk coreutils-fmt 9.5-r1 apk
coreutils-fmt 9.5-r1 apk coreutils-sha512sum 9.5-r1 apk
coreutils-sha512sum 9.5-r1 apk cryptography 43.0.1 python
cryptography 44.0.0 python curl 8.9.1-r1 apk
curl 8.11.1-r0 apk distro 1.9.0 python
distro 1.9.0 python dns-lexicon 3.18.0 python
dns-lexicon 3.20.1 python dnslib 0.9.25 python
dnslib 0.9.25 python dnspython 2.6.1 python
dnspython 2.7.0 python domeneshop 0.4.4 python
domeneshop 0.4.4 python fail2ban 1.1.0 python
fail2ban 1.1.0 python fail2ban 1.1.0-r0 apk
fail2ban 1.1.0-r2 apk fail2ban-pyc 1.1.0-r0 apk
fail2ban-pyc 1.1.0-r2 apk filelock 3.15.4 python
filelock 3.16.1 python findutils 4.9.0-r5 apk
findutils 4.10.0-r0 apk fontconfig 2.15.0-r1 apk
fontconfig 2.15.0-r1 apk freetype 2.13.2-r0 apk
freetype 2.13.3-r0 apk future 1.0.0 python
future 1.0.0 python gdbm 1.23-r1 apk
gdbm 1.24-r0 apk git 2.45.2-r0 apk
git 2.47.1-r0 apk git-init-template 2.45.2-r0 apk
git-init-template 2.47.1-r0 apk git-perl 2.45.2-r0 apk
git-perl 2.47.1-r0 apk gmp 6.3.0-r1 apk
gmp 6.3.0-r2 apk gnupg 2.4.5-r0 apk
gnupg 2.4.7-r0 apk gnupg-dirmngr 2.4.5-r0 apk
gnupg-dirmngr 2.4.7-r0 apk gnupg-gpgconf 2.4.5-r0 apk
gnupg-gpgconf 2.4.7-r0 apk gnupg-keyboxd 2.4.5-r0 apk
gnupg-keyboxd 2.4.7-r0 apk gnupg-utils 2.4.5-r0 apk
gnupg-utils 2.4.7-r0 apk gnupg-wks-client 2.4.5-r0 apk
gnupg-wks-client 2.4.7-r0 apk gnutls 3.8.5-r0 apk
gnutls 3.8.8-r0 apk google-api-core 2.19.2 python
google-api-core 2.24.0 python google-api-python-client 2.144.0 python
google-api-python-client 2.157.0 python google-auth 2.34.0 python
google-auth 2.37.0 python google-auth-httplib2 0.2.0 python
google-auth-httplib2 0.2.0 python googleapis-common-protos 1.65.0 python
googleapis-common-protos 1.66.0 python gpg 2.4.5-r0 apk
gpg 2.4.7-r0 apk gpg-agent 2.4.5-r0 apk
gpg-agent 2.4.7-r0 apk gpg-wks-server 2.4.5-r0 apk
gpg-wks-server 2.4.7-r0 apk gpgsm 2.4.5-r0 apk
gpgsm 2.4.7-r0 apk gpgv 2.4.5-r0 apk
gpgv 2.4.7-r0 apk httplib2 0.22.0 python
httplib2 0.22.0 python icu-data-en 74.2-r0 apk
icu-data-en 74.2-r0 apk icu-libs 74.2-r0 apk
icu-libs 74.2-r0 apk idna 3.8 python
idna 3.10 python importlib-metadata 8.0.0 python
importlib-metadata 8.0.0 python importlib-resources 6.4.0 python
inflect 7.3.1 python inflect 7.3.1 python
inwx-domrobot 3.2.0 python iptables 1.8.10-r3 apk
iptables 1.8.10-r5 apk iptables-legacy 1.8.10-r3 apk
iptables-legacy 1.8.10-r5 apk isodate 0.6.1 python
isodate 0.7.2 python jaraco-context 5.3.0 python
jaraco-collections 5.1.0 python jaraco-functools 4.0.1 python
jaraco-context 5.3.0 python jaraco-text 3.12.1 python
jaraco-functools 4.0.1 python jmespath 1.0.1 python
jaraco-text 3.12.1 python josepy 1.14.0 python
jmespath 1.0.1 python jq 1.7.1-r0 apk
josepy 1.14.0 python jsonlines 4.0.0 python
jq 1.7.1-r0 apk jsonpickle 3.3.0 python
jsonlines 4.0.0 python libacl 2.3.2-r0 apk
jsonpickle 4.0.1 python libassuan 2.5.7-r0 apk
libassuan 2.5.7-r0 apk libattr 2.5.2-r0 apk
libattr 2.5.2-r2 apk libavif 1.0.4-r0 apk
libavif 1.0.4-r0 apk libbsd 0.12.2-r0 apk
libbsd 0.12.2-r0 apk libbz2 1.0.8-r6 apk
libbz2 1.0.8-r6 apk libcrypto3 3.3.2-r0 apk
libcrypto3 3.3.2-r4 apk libcurl 8.9.1-r1 apk
libcurl 8.11.1-r0 apk libdav1d 1.4.2-r0 apk
libdav1d 1.5.0-r0 apk libedit 20240517.3.1-r0 apk
libedit 20240808.3.1-r0 apk libevent 2.1.12-r7 apk
libevent 2.1.12-r7 apk libexpat 2.6.3-r0 apk
libexpat 2.6.4-r0 apk libffi 3.4.6-r0 apk
libffi 3.4.6-r0 apk libgcc 13.2.1_git20240309-r0 apk
libgcc 14.2.0-r4 apk libgcrypt 1.10.3-r0 apk
libgcrypt 1.10.3-r1 apk libgd 2.3.3-r9 apk
libgd 2.3.3-r9 apk libgpg-error 1.49-r0 apk
libgpg-error 1.51-r0 apk libice 1.1.1-r6 apk
libice 1.1.1-r6 apk libidn2 2.3.7-r0 apk
libidn2 2.3.7-r0 apk libintl 0.22.5-r0 apk
libintl 0.22.5-r0 apk libip4tc 1.8.10-r3 apk
libip4tc 1.8.10-r5 apk libip6tc 1.8.10-r3 apk
libip6tc 1.8.10-r5 apk libjpeg-turbo 3.0.3-r0 apk
libjpeg-turbo 3.0.4-r0 apk libksba 1.6.6-r0 apk
libksba 1.6.7-r0 apk libldap 2.6.7-r0 apk
libldap 2.6.8-r0 apk libmaxminddb-libs 1.9.1-r0 apk
libmaxminddb-libs 1.9.1-r0 apk libmcrypt 2.5.8-r10 apk
libmcrypt 2.5.8-r10 apk libmd 1.1.0-r0 apk
libmd 1.1.0-r0 apk libmemcached-libs 1.1.4-r1 apk
libmemcached-libs 1.1.4-r1 apk libmnl 1.0.5-r2 apk
libmnl 1.0.5-r2 apk libncursesw 6.4_p20240420-r0 apk
libncursesw 6.5_p20241006-r3 apk libnftnl 1.2.6-r0 apk
libnftnl 1.2.8-r0 apk libpanelw 6.4_p20240420-r0 apk
libpanelw 6.5_p20241006-r3 apk libpng 1.6.43-r0 apk
libpng 1.6.44-r0 apk libpq 16.3-r0 apk
libpq 17.2-r0 apk libproc2 4.0.4-r0 apk
libproc2 4.0.4-r2 apk libpsl 0.21.5-r1 apk
libpsl 0.21.5-r3 apk libsasl 2.1.28-r6 apk
libsasl 2.1.28-r8 apk libseccomp 2.5.5-r1 apk
libseccomp 2.5.5-r1 apk libsharpyuv 1.3.2-r0 apk
libsharpyuv 1.4.0-r0 apk libsm 1.2.4-r4 apk
libsm 1.2.4-r4 apk libsodium 1.0.19-r0 apk
libsodium 1.0.20-r0 apk libssl3 3.3.2-r0 apk
libssl3 3.3.2-r4 apk libstdc++ 13.2.1_git20240309-r0 apk
libstdc++ 14.2.0-r4 apk libtasn1 4.19.0-r2 apk
libtasn1 4.19.0-r2 apk libunistring 1.2-r0 apk
libunistring 1.2-r0 apk libuuid 2.40.1-r1 apk
libuuid 2.40.2-r4 apk libwebp 1.3.2-r0 apk
libwebp 1.4.0-r0 apk libx11 1.8.9-r1 apk
libx11 1.8.10-r0 apk libxau 1.0.11-r4 apk
libxau 1.0.11-r4 apk libxcb 1.16.1-r0 apk
libxcb 1.16.1-r0 apk libxdmcp 1.1.5-r1 apk
libxdmcp 1.1.5-r1 apk libxext 1.3.6-r2 apk
libxext 1.3.6-r2 apk libxml2 2.12.7-r0 apk
libxml2 2.13.4-r3 apk libxpm 3.5.17-r0 apk
libxpm 3.5.17-r0 apk libxslt 1.1.39-r1 apk
libxslt 1.1.42-r1 apk libxt 1.3.0-r5 apk
libxt 1.3.1-r0 apk libxtables 1.8.10-r3 apk
libxtables 1.8.10-r5 apk libzip 1.10.1-r0 apk
libzip 1.11.2-r0 apk linux-pam 1.6.0-r0 apk
linux-pam 1.6.1-r1 apk logrotate 3.21.0-r1 apk
logrotate 3.21.0-r1 apk loopialib 0.2.0 python
loopialib 0.2.0 python lxml 5.3.0 python
lxml 5.3.0 python lz4-libs 1.9.4-r5 apk
lz4-libs 1.10.0-r0 apk memcached 1.6.27-r0 apk
memcached 1.6.32-r0 apk mock 5.1.0 python
mock 5.1.0 python more-itertools 10.3.0 python
more-itertools 10.3.0 python mpdecimal 4.0.0-r0 apk
mpdecimal 4.0.0-r0 apk msal 1.31.0 python
msal 1.31.1 python msal-extensions 1.2.0 python
msal-extensions 1.2.0 python musl 1.2.5-r0 apk
musl 1.2.5-r8 apk musl-utils 1.2.5-r0 apk
musl-utils 1.2.5-r8 apk my-test-package 1.0 python
my-test-package 1.0 python nano 8.0-r0 apk
nano 8.2-r0 apk ncurses-terminfo-base 6.4_p20240420-r0 apk
ncurses-terminfo-base 6.5_p20241006-r3 apk netcat-openbsd 1.226-r0 apk
netcat-openbsd 1.226.1.1-r0 apk nettle 3.9.1-r0 apk
nettle 3.10-r1 apk nghttp2-libs 1.62.1-r0 apk
nghttp2-libs 1.64.0-r0 apk nginx 1.26.2-r0 apk
nginx 1.26.2-r4 apk nginx-mod-devel-kit 1.26.2-r0 apk
nginx-mod-devel-kit 1.26.2-r4 apk nginx-mod-http-brotli 1.26.2-r0 apk
nginx-mod-http-brotli 1.26.2-r4 apk nginx-mod-http-dav-ext 1.26.2-r0 apk
nginx-mod-http-dav-ext 1.26.2-r4 apk nginx-mod-http-echo 1.26.2-r0 apk
nginx-mod-http-echo 1.26.2-r4 apk nginx-mod-http-fancyindex 1.26.2-r0 apk
nginx-mod-http-fancyindex 1.26.2-r4 apk nginx-mod-http-geoip2 1.26.2-r0 apk
nginx-mod-http-geoip2 1.26.2-r4 apk nginx-mod-http-headers-more 1.26.2-r0 apk
nginx-mod-http-headers-more 1.26.2-r4 apk nginx-mod-http-image-filter 1.26.2-r0 apk
nginx-mod-http-image-filter 1.26.2-r4 apk nginx-mod-http-perl 1.26.2-r0 apk
nginx-mod-http-perl 1.26.2-r4 apk nginx-mod-http-redis2 1.26.2-r0 apk
nginx-mod-http-redis2 1.26.2-r4 apk nginx-mod-http-set-misc 1.26.2-r0 apk
nginx-mod-http-set-misc 1.26.2-r4 apk nginx-mod-http-upload-progress 1.26.2-r0 apk
nginx-mod-http-upload-progress 1.26.2-r4 apk nginx-mod-http-xslt-filter 1.26.2-r0 apk
nginx-mod-http-xslt-filter 1.26.2-r4 apk nginx-mod-mail 1.26.2-r0 apk
nginx-mod-mail 1.26.2-r4 apk nginx-mod-rtmp 1.26.2-r0 apk
nginx-mod-rtmp 1.26.2-r4 apk nginx-mod-stream 1.26.2-r0 apk
nginx-mod-stream 1.26.2-r4 apk nginx-mod-stream-geoip2 1.26.2-r0 apk
nginx-mod-stream-geoip2 1.26.2-r4 apk nginx-vim 1.26.2-r0 apk
nginx-vim 1.26.2-r4 apk npth 1.6-r4 apk
npth 1.6-r4 apk oniguruma 6.9.9-r0 apk
oniguruma 6.9.9-r0 apk openssl 3.3.2-r0 apk
openssl 3.3.2-r4 apk p11-kit 0.25.3-r0 apk
p11-kit 0.25.5-r2 apk packaging 24.1 python
packaging 24.2 python parsedatetime 2.6 python
parsedatetime 2.6 python pcre 8.45-r3 apk
pcre 8.45-r3 apk pcre2 10.43-r0 apk
pcre2 10.43-r0 apk perl 5.38.2-r0 apk
perl 5.40.0-r3 apk perl-error 0.17029-r2 apk
perl-error 0.17029-r2 apk perl-git 2.45.2-r0 apk
perl-git 2.47.1-r0 apk php83 8.3.10-r0 apk
php83 8.3.15-r0 apk php83-bcmath 8.3.10-r0 apk
php83-bcmath 8.3.15-r0 apk php83-bz2 8.3.10-r0 apk
php83-bz2 8.3.15-r0 apk php83-common 8.3.10-r0 apk
php83-common 8.3.15-r0 apk php83-ctype 8.3.10-r0 apk
php83-ctype 8.3.15-r0 apk php83-curl 8.3.10-r0 apk
php83-curl 8.3.15-r0 apk php83-dom 8.3.10-r0 apk
php83-dom 8.3.15-r0 apk php83-exif 8.3.10-r0 apk
php83-exif 8.3.15-r0 apk php83-fileinfo 8.3.10-r0 apk
php83-fileinfo 8.3.15-r0 apk php83-fpm 8.3.10-r0 apk
php83-fpm 8.3.15-r0 apk php83-ftp 8.3.10-r0 apk
php83-ftp 8.3.15-r0 apk php83-gd 8.3.10-r0 apk
php83-gd 8.3.15-r0 apk php83-gmp 8.3.10-r0 apk
php83-gmp 8.3.15-r0 apk php83-iconv 8.3.10-r0 apk
php83-iconv 8.3.15-r0 apk php83-imap 8.3.10-r0 apk
php83-imap 8.3.15-r0 apk php83-intl 8.3.10-r0 apk
php83-intl 8.3.15-r0 apk php83-ldap 8.3.10-r0 apk
php83-ldap 8.3.15-r0 apk php83-mbstring 8.3.10-r0 apk
php83-mbstring 8.3.15-r0 apk php83-mysqli 8.3.10-r0 apk
php83-mysqli 8.3.15-r0 apk php83-mysqlnd 8.3.10-r0 apk
php83-mysqlnd 8.3.15-r0 apk php83-opcache 8.3.10-r0 apk
php83-opcache 8.3.15-r0 apk php83-openssl 8.3.10-r0 apk
php83-openssl 8.3.15-r0 apk php83-pdo 8.3.10-r0 apk
php83-pdo 8.3.15-r0 apk php83-pdo_mysql 8.3.10-r0 apk
php83-pdo_mysql 8.3.15-r0 apk php83-pdo_odbc 8.3.10-r0 apk
php83-pdo_odbc 8.3.15-r0 apk php83-pdo_pgsql 8.3.10-r0 apk
php83-pdo_pgsql 8.3.15-r0 apk php83-pdo_sqlite 8.3.10-r0 apk
php83-pdo_sqlite 8.3.15-r0 apk php83-pear 8.3.10-r0 apk
php83-pear 8.3.15-r0 apk php83-pecl-apcu 5.1.23-r0 apk
php83-pecl-apcu 5.1.24-r0 apk php83-pecl-igbinary 3.2.15-r0 apk
php83-pecl-igbinary 3.2.16-r0 apk php83-pecl-mcrypt 1.0.7-r0 apk
php83-pecl-mcrypt 1.0.7-r0 apk php83-pecl-memcached 3.2.0-r0 apk
php83-pecl-memcached 3.3.0-r0 apk php83-pecl-msgpack 2.2.0-r2 apk
php83-pecl-msgpack 3.0.0-r0 apk php83-pecl-redis 6.0.2-r0 apk
php83-pecl-redis 6.1.0-r0 apk php83-pgsql 8.3.10-r0 apk
php83-pgsql 8.3.15-r0 apk php83-phar 8.3.10-r0 apk
php83-phar 8.3.15-r0 apk php83-posix 8.3.10-r0 apk
php83-posix 8.3.15-r0 apk php83-session 8.3.10-r0 apk
php83-session 8.3.15-r0 apk php83-simplexml 8.3.10-r0 apk
php83-simplexml 8.3.15-r0 apk php83-soap 8.3.10-r0 apk
php83-soap 8.3.15-r0 apk php83-sockets 8.3.10-r0 apk
php83-sockets 8.3.15-r0 apk php83-sodium 8.3.10-r0 apk
php83-sodium 8.3.15-r0 apk php83-sqlite3 8.3.10-r0 apk
php83-sqlite3 8.3.15-r0 apk php83-tokenizer 8.3.10-r0 apk
php83-tokenizer 8.3.15-r0 apk php83-xml 8.3.10-r0 apk
php83-xml 8.3.15-r0 apk php83-xmlreader 8.3.10-r0 apk
php83-xmlreader 8.3.15-r0 apk php83-xmlwriter 8.3.10-r0 apk
php83-xmlwriter 8.3.15-r0 apk php83-xsl 8.3.10-r0 apk
php83-xsl 8.3.15-r0 apk php83-zip 8.3.10-r0 apk
php83-zip 8.3.15-r0 apk pinentry 1.3.0-r0 apk
pinentry 1.3.1-r0 apk pip 24.2 python
pip 24.3.1 python pkb-client 1.2 python
pkb-client 2.0.0 python platformdirs 4.2.2 python
platformdirs 4.2.2 python popt 1.19-r3 apk
popt 1.19-r4 apk portalocker 2.10.1 python
portalocker 2.10.1 python procps-ng 4.0.4-r0 apk
procps-ng 4.0.4-r2 apk proto-plus 1.24.0 python
proto-plus 1.25.0 python protobuf 5.28.0 python
protobuf 5.29.2 python pyacmedns 0.4 python
pyacmedns 0.4 python pyasn1 0.6.0 python
pyasn1 0.6.1 python pyasn1-modules 0.4.0 python
pyasn1-modules 0.4.1 python pyc 3.12.3-r2 apk
pyc 3.12.8-r1 apk pycparser 2.22 python
pycparser 2.22 python pyjwt 2.9.0 python
pyjwt 2.10.1 python pynamecheap 0.0.3 python
pynamecheap 0.0.3 python pyopenssl 24.2.1 python
pyopenssl 24.3.0 python pyotp 2.9.0 python
pyotp 2.9.0 python pyparsing 3.1.4 python
pyparsing 3.2.1 python pyrfc3339 1.1 python
pyrfc3339 2.0.1 python python-dateutil 2.9.0.post0 python
python-dateutil 2.9.0.post0 python python-digitalocean 1.17.0 python
python-digitalocean 1.17.0 python python-transip 0.6.0 python
python-transip 0.6.0 python python3 3.12.3-r2 apk
python3 3.12.8-r1 apk python3-pyc 3.12.3-r2 apk
python3-pyc 3.12.8-r1 apk python3-pycache-pyc0 3.12.3-r2 apk
python3-pycache-pyc0 3.12.8-r1 apk pytz 2024.1 python
pytz 2024.2 python pyyaml 6.0.2 python
pyyaml 6.0.2 python readline 8.2.10-r0 apk
readline 8.2.13-r0 apk requests 2.32.3 python
requests 2.32.3 python requests-file 2.1.0 python
requests-file 2.1.0 python requests-mock 1.12.1 python
requests-mock 1.12.1 python rsa 4.9 python
rsa 4.9 python s3transfer 0.10.2 python
s3transfer 0.10.4 python scanelf 1.3.7-r2 apk
scanelf 1.3.8-r1 apk setuptools 74.1.2 python
setuptools 75.7.0 python shadow 4.15.1-r0 apk
shadow 4.16.0-r1 apk six 1.16.0 python
six 1.17.0 python skalibs 2.14.1.1-r0 apk
skalibs-libs 2.14.3.0-r0 apk soupsieve 2.6 python
soupsieve 2.6 python sqlite-libs 3.45.3-r1 apk
sqlite-libs 3.47.1-r0 apk ssl_client 1.36.1-r29 apk
ssl_client 1.37.0-r9 apk tiff 4.6.0t-r0 apk
tiff 4.7.0-r0 apk tldextract 5.1.2 python
tldextract 5.1.3 python tomli 2.0.1 python
tomli 2.0.1 python typeguard 4.3.0 python
typeguard 4.3.0 python typing-extensions 4.12.2 python (+1 duplicate)
typing-extensions 4.12.2 python (+1 duplicate) tzdata 2024a-r1 apk
tzdata 2024b-r1 apk unixodbc 2.3.12-r0 apk
unixodbc 2.3.12-r0 apk uritemplate 4.1.1 python
uritemplate 4.1.1 python urllib3 2.2.2 python
urllib3 2.3.0 python utmps-libs 0.1.2.2-r1 apk
utmps-libs 0.1.2.3-r2 apk wheel 0.43.0 python
wheel 0.43.0 python wheel 0.44.0 python
wheel 0.45.1 python whois 5.5.23-r0 apk
whois 5.5.23-r0 apk xz-libs 5.6.2-r0 apk
xz-libs 5.6.3-r0 apk zipp 3.19.2 python
zipp 3.19.2 python zlib 1.3.1-r1 apk
zlib 1.3.1-r2 apk zope-interface 7.0.3 python
zope-interface 7.2 python zstd-libs 1.5.6-r0 apk
zstd-libs 1.5.6-r2 apk

View File

@@ -6,45 +6,44 @@ project_url: "https://linuxserver.io"
project_logo: "https://github.com/linuxserver/docker-templates/raw/master/linuxserver.io/img/swag.gif" project_logo: "https://github.com/linuxserver/docker-templates/raw/master/linuxserver.io/img/swag.gif"
project_blurb: "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." project_blurb: "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."
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
# supported architectures # supported architectures
available_architectures: available_architectures:
- {arch: "{{ arch_x86_64 }}", tag: "amd64-latest"} - { arch: "{{ arch_x86_64 }}", tag: "amd64-latest"}
- {arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"} - { arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"}
# container parameters # container parameters
common_param_env_vars_enabled: true common_param_env_vars_enabled: true
param_container_name: "{{ project_name }}" param_container_name: "{{ project_name }}"
param_usage_include_env: true param_usage_include_env: true
param_env_vars: param_env_vars:
- {env_var: "URL", env_value: "example.com", desc: "Top url you have control over (e.g. `example.com` if you own it, or `customsubdomain.example.com` if dynamic dns)."} - { env_var: "URL", env_value: "yourdomain.url", desc: "Top url you have control over (`customdomain.com` if you own it, or `customsubdomain.ddnsprovider.com` if dynamic dns)." }
- {env_var: "VALIDATION", env_value: "http", desc: "Certbot validation method to use, options are `http` or `dns` (`dns` method also requires `DNSPLUGIN` variable set).", env_options: ["http", "dns"]} - { env_var: "VALIDATION", env_value: "http", desc: "Certbot validation method to use, options are `http` or `dns` (`dns` method also requires `DNSPLUGIN` variable set).", env_options: ["http", "dns"] }
param_usage_include_vols: true param_usage_include_vols: true
param_volumes: param_volumes:
- {vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/config", desc: "Persistent config files"} - { vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/config", desc: "Persistent config files" }
param_usage_include_ports: true param_usage_include_ports: true
param_ports: param_ports:
- {external_port: "443", internal_port: "443", port_desc: "HTTPS port"} - { external_port: "443", internal_port: "443", port_desc: "Https port" }
cap_add_param: true cap_add_param: true
cap_add_param_vars: cap_add_param_vars:
- {cap_add_var: "NET_ADMIN", desc: "Required for fail2Ban to be able to modify iptables rules."} - { cap_add_var: "NET_ADMIN" }
# optional container parameters # optional container parameters
opt_param_usage_include_env: true opt_param_usage_include_env: true
opt_param_env_vars: opt_param_env_vars:
- {env_var: "SUBDOMAINS", env_value: "www,", desc: "Subdomains you'd like the cert to cover (comma separated, no spaces) ie. `www,ftp,cloud`. For a wildcard cert, set this *exactly* to `wildcard` (wildcard cert is available via `dns` validation only)"} - { env_var: "SUBDOMAINS", env_value: "www,", desc: "Subdomains you'd like the cert to cover (comma separated, no spaces) ie. `www,ftp,cloud`. For a wildcard cert, set this *exactly* to `wildcard` (wildcard cert is available via `dns` validation only)" }
- {env_var: "CERTPROVIDER", env_value: "", desc: "Optionally define the cert provider. Set to `zerossl` for ZeroSSL certs (requires existing [ZeroSSL account](https://app.zerossl.com/signup) and the e-mail address entered in `EMAIL` env var). Otherwise defaults to Let's Encrypt."} - { env_var: "CERTPROVIDER", env_value: "", desc: "Optionally define the cert provider. Set to `zerossl` for ZeroSSL certs (requires existing [ZeroSSL account](https://app.zerossl.com/signup) and the e-mail address entered in `EMAIL` env var). Otherwise defaults to Let's Encrypt." }
- {env_var: "DNSPLUGIN", env_value: "cloudflare", desc: "Required if `VALIDATION` is set to `dns`. Options are `acmedns`, `aliyun`, `azure`, `bunny`, `cloudflare`, `cpanel`, `desec`, `digitalocean`, `directadmin`, `dnsimple`, `dnsmadeeasy`, `dnspod`, `do`, `domeneshop`, `dreamhost`, `duckdns`, `dynu`, `freedns`, `gandi`, `gehirn`, `glesys`, `godaddy`, `google`, `he`, `hetzner`, `infomaniak`, `inwx`, `ionos`, `linode`, `loopia`, `luadns`, `namecheap`, `netcup`, `njalla`, `nsone`, `ovh`, `porkbun`, `rfc2136`, `route53`, `sakuracloud`, `standalone`, `transip`, and `vultr`. Also need to enter the credentials into the corresponding ini (or json for some plugins) file under `/config/dns-conf`."} - { env_var: "DNSPLUGIN", env_value: "cloudflare", desc: "Required if `VALIDATION` is set to `dns`. Options are `acmedns`, `aliyun`, `azure`, `bunny`, `cloudflare`, `cpanel`, `desec`, `digitalocean`, `directadmin`, `dnsimple`, `dnsmadeeasy`, `dnspod`, `do`, `domeneshop`, `dreamhost`, `duckdns`, `dynudns`, `freedns`, `gandi`, `gehirn`, `glesys`, `godaddy`, `google`, `he`, `hetzner`, `infomaniak`, `inwx`, `ionos`, `linode`, `loopia`, `luadns`, `namecheap`, `netcup`, `njalla`, `nsone`, `ovh`, `porkbun`, `rfc2136`, `route53`, `sakuracloud`, `standalone`, `transip`, and `vultr`. Also need to enter the credentials into the corresponding ini (or json for some plugins) file under `/config/dns-conf`." }
- {env_var: "PROPAGATION", env_value: "", desc: "Optionally override (in seconds) the default propagation time for the dns plugins."} - { env_var: "PROPAGATION", env_value: "", desc: "Optionally override (in seconds) the default propagation time for the dns plugins." }
- {env_var: "EMAIL", env_value: "", desc: "Optional e-mail address used for cert expiration notifications (Required for ZeroSSL)."} - { env_var: "EMAIL", env_value: "", desc: "Optional e-mail address used for cert expiration notifications (Required for ZeroSSL)." }
- {env_var: "ONLY_SUBDOMAINS", env_value: "false", desc: "If you wish to get certs only for certain subdomains, but not the main domain (main domain may be hosted on another machine and cannot be validated), set this to `true`"} - { env_var: "ONLY_SUBDOMAINS", env_value: "false", desc: "If you wish to get certs only for certain subdomains, but not the main domain (main domain may be hosted on another machine and cannot be validated), set this to `true`" }
- {env_var: "EXTRA_DOMAINS", env_value: "", desc: "Additional fully qualified domain names (comma separated, no spaces) ie. `example.net,subdomain.example.net,*.example.org`"} - { env_var: "EXTRA_DOMAINS", env_value: "", desc: "Additional fully qualified domain names (comma separated, no spaces) ie. `extradomain.com,subdomain.anotherdomain.org,*.anotherdomain.org`" }
- {env_var: "STAGING", env_value: "false", desc: "Set to `true` to retrieve certs in staging mode. Rate limits will be much higher, but the resulting cert will not pass the browser's security test. Only to be used for testing purposes."} - { env_var: "STAGING", env_value: "false", desc: "Set to `true` to retrieve certs in staging mode. Rate limits will be much higher, but the resulting cert will not pass the browser's security test. Only to be used for testing purposes." }
- {env_var: "DISABLE_F2B", env_value: "", desc: "Set to `true` to disable the Fail2ban service in the container, if you're already running it elsewhere or using a different IPS."}
opt_param_usage_include_ports: true opt_param_usage_include_ports: true
opt_param_ports: opt_param_ports:
- {external_port: "80", internal_port: "80", port_desc: "HTTP port (required for HTTP validation and HTTP -> HTTPS redirect)"} - { external_port: "80", internal_port: "80", port_desc: "Http port (required for http validation and http -> https redirect)" }
readonly_supported: true
readonly_message: |
* `/tmp` must be mounted to tmpfs
* fail2ban will not be available
# application setup block # application setup block
app_setup_block_enabled: true app_setup_block_enabled: true
app_setup_block: | app_setup_block: |
@@ -60,7 +59,7 @@ app_setup_block: |
1. Certs that only cover your main subdomain (ie. `yoursubdomain.duckdns.org`, leave the `SUBDOMAINS` variable empty) 1. Certs that only cover your main subdomain (ie. `yoursubdomain.duckdns.org`, leave the `SUBDOMAINS` variable empty)
2. Certs that cover sub-subdomains of your main subdomain (ie. `*.yoursubdomain.duckdns.org`, set the `SUBDOMAINS` variable to `wildcard`) 2. Certs that cover sub-subdomains of your main subdomain (ie. `*.yoursubdomain.duckdns.org`, set the `SUBDOMAINS` variable to `wildcard`)
* `--cap-add=NET_ADMIN` is required for fail2ban to modify iptables * `--cap-add=NET_ADMIN` is required for fail2ban to modify iptables
* After setup, navigate to `https://example.com` to access the default homepage (http access through port 80 is disabled by default, you can enable it by editing the default site config at `/config/nginx/site-confs/default.conf`). * After setup, navigate to `https://yourdomain.url` to access the default homepage (http access through port 80 is disabled by default, you can enable it by editing the default site config at `/config/nginx/site-confs/default.conf`).
* Certs are checked nightly and if expiration is within 30 days, renewal is attempted. If your cert is about to expire in less than 30 days, check the logs under `/config/log/letsencrypt` to see why the renewals have been failing. It is recommended to input your e-mail in docker parameters so you receive expiration notices from Let's Encrypt in those circumstances. * Certs are checked nightly and if expiration is within 30 days, renewal is attempted. If your cert is about to expire in less than 30 days, check the logs under `/config/log/letsencrypt` to see why the renewals have been failing. It is recommended to input your e-mail in docker parameters so you receive expiration notices from Let's Encrypt in those circumstances.
### Certbot Plugins ### Certbot Plugins
@@ -138,154 +137,93 @@ app_setup_block: |
### Migration from the old `linuxserver/letsencrypt` image ### Migration from the old `linuxserver/letsencrypt` image
Please follow the instructions [on this blog post](https://www.linuxserver.io/blog/2020-08-21-introducing-swag#migrate). Please follow the instructions [on this blog post](https://www.linuxserver.io/blog/2020-08-21-introducing-swag#migrate).
# init diagram
init_diagram: |
"swag:latest": {
docker-mods
base {
fix-attr +\nlegacy cont-init
}
docker-mods -> base
legacy-services
custom services
init-services -> legacy-services
init-services -> custom services
custom services -> legacy-services
legacy-services -> ci-service-check
init-migrations -> init-adduser
init-swag-config -> init-certbot-config
init-nginx-end -> init-config
init-os-end -> init-config
init-config -> init-config-end
init-crontab-config -> init-config-end
init-outdated-config -> init-config-end
init-config -> init-crontab-config
init-mods-end -> init-custom-files
base -> init-envfile
init-swag-samples -> init-fail2ban-config
init-os-end -> init-folders
init-php -> init-keygen
base -> init-migrations
init-config-end -> init-mods
init-mods-package-install -> init-mods-end
init-mods -> init-mods-package-install
init-samples -> init-nginx
init-version-checks -> init-nginx-end
init-adduser -> init-os-end
init-envfile -> init-os-end
init-renew -> init-outdated-config
init-keygen -> init-permissions
init-certbot-config -> init-permissions-config
init-nginx -> init-php
init-permissions-config -> init-renew
init-config -> init-require-url
init-folders -> init-samples
init-custom-files -> init-services
init-fail2ban-config -> init-swag-config
init-require-url -> init-swag-folders
init-swag-folders -> init-swag-samples
init-permissions -> init-version-checks
init-services -> svc-cron
svc-cron -> legacy-services
init-services -> svc-fail2ban
svc-fail2ban -> legacy-services
init-services -> svc-nginx
svc-nginx -> legacy-services
init-services -> svc-php-fpm
svc-php-fpm -> legacy-services
}
Base Images: {
"baseimage-alpine-nginx:3.21" <- "baseimage-alpine:3.21"
}
"swag:latest" <- Base Images
# changelog # changelog
changelogs: changelogs:
- {date: "17.12.24:", desc: "Rebase to Alpine 3.21."} - { date: "30.08.24:", desc: "Fix zerossl cert revocation." }
- {date: "21.10.24:", desc: "Fix naming issue with Dynu plugin. If you are using Dynu, please make sure your credentials are set in /config/dns-conf/dynu.ini and your DNSPLUGIN variable is set to dynu (not dynudns)."} - { date: "24.07.14:", desc: "Rebase to Alpine 3.20. Remove deprecated Google Domains certbot plugin. Existing users should update their nginx confs to avoid http2 deprecation warnings."}
- {date: "30.08.24:", desc: "Fix zerossl cert revocation."} - { date: "01.07.24:", desc: "Fall back to iptables-legacy if iptables doesn't work." }
- {date: "24.07.14:", desc: "Rebase to Alpine 3.20. Remove deprecated Google Domains certbot plugin. Existing users should update their nginx confs to avoid http2 deprecation warnings."} - { date: "23.03.24:", desc: "Fix perms on the generated `priv-fullchain-bundle.pem`." }
- {date: "01.07.24:", desc: "Fall back to iptables-legacy if iptables doesn't work."} - { date: "14.03.24:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-location.conf, authelia-server.conf - Update Authelia conf samples with support for 4.38." }
- {date: "23.03.24:", desc: "Fix perms on the generated `priv-fullchain-bundle.pem`."} - { date: "11.03.24:", desc: "Restore support for DynuDNS using `certbot-dns-dynudns`." }
- {date: "14.03.24:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-location.conf, authelia-server.conf - Update Authelia conf samples with support for 4.38."} - { date: "06.03.24:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) site-confs/default.conf - Cleanup default site conf." }
- {date: "11.03.24:", desc: "Restore support for DynuDNS using `certbot-dns-dynudns`."} - { date: "04.03.24:", desc: "Remove `stream.conf` inside the container to allow users to include their own block in `nginx.conf`." }
- {date: "06.03.24:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) site-confs/default.conf - Cleanup default site conf."} - { date: "23.01.24:", desc: "Rebase to Alpine 3.19 with php 8.3, add root periodic crontabs for logrotate." }
- {date: "04.03.24:", desc: "Remove `stream.conf` inside the container to allow users to include their own block in `nginx.conf`."} - { date: "01.01.24:", desc: "Add GleSYS DNS plugin." }
- {date: "23.01.24:", desc: "Rebase to Alpine 3.19 with php 8.3, add root periodic crontabs for logrotate."} - { date: "11.12.23:", desc: "Deprecate certbot-dns-dynu to resolve dependency conflicts with other plugins." }
- {date: "01.01.24:", desc: "Add GleSYS DNS plugin."} - { date: "30.11.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) site-confs/default.conf - Fix index.php being downloaded on 404." }
- {date: "11.12.23:", desc: "Deprecate certbot-dns-dynu to resolve dependency conflicts with other plugins."} - { date: "23.11.23:", desc: "Run certbot as root to allow fix http validation." }
- {date: "30.11.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) site-confs/default.conf - Fix index.php being downloaded on 404."} - { date: "01.10.23:", desc: "Fix \"unrecognized arguments\" issue in DirectAdmin DNS plugin." }
- {date: "23.11.23:", desc: "Run certbot as root to allow fix http validation."} - { date: "28.08.23:", desc: "Add Namecheap DNS plugin." }
- {date: "01.10.23:", desc: "Fix \"unrecognized arguments\" issue in DirectAdmin DNS plugin."} - { date: "12.08.23:", desc: "Add FreeDNS plugin. Detect certbot DNS authenticators using CLI." }
- {date: "28.08.23:", desc: "Add Namecheap DNS plugin."} - { date: "07.08.23:", desc: "Add Bunny DNS Configuration." }
- {date: "12.08.23:", desc: "Add FreeDNS plugin. Detect certbot DNS authenticators using CLI."} - { date: "27.07.23:", desc: "Added support for dreamhost validation." }
- {date: "07.08.23:", desc: "Add Bunny DNS Configuration."} - { date: "25.05.23:", desc: "Rebase to Alpine 3.18, deprecate armhf." }
- {date: "27.07.23:", desc: "Added support for dreamhost validation."} - { date: "27.04.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-location.conf, authelia-server.conf, authentik-location.conf, authentik-server.conf - Simplify auth configs and fix Set-Cookie header bug." }
- {date: "25.05.23:", desc: "Rebase to Alpine 3.18, deprecate armhf."} - { date: "13.04.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, authelia-location.conf, authentik-location.conf, and site-confs/default.conf - Move ssl.conf include to default.conf. Remove Authorization headers in authelia. Sort proxy_set_header in authelia and authentik." }
- {date: "27.04.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-location.conf, authelia-server.conf, authentik-location.conf, authentik-server.conf - Simplify auth configs and fix Set-Cookie header bug."} - { date: "25.03.23:", desc: "Fix renewal post hook." }
- {date: "13.04.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, authelia-location.conf, authentik-location.conf, and site-confs/default.conf - Move ssl.conf include to default.conf. Remove Authorization headers in authelia. Sort proxy_set_header in authelia and authentik."} - { date: "10.03.23:", desc: "Cleanup unused csr and keys folders. See [certbot 2.3.0 release notes](https://github.com/certbot/certbot/releases/tag/v2.3.0)." }
- {date: "25.03.23:", desc: "Fix renewal post hook."} - { date: "09.03.23:", desc: "Add Google Domains DNS support, `google-domains`." }
- {date: "10.03.23:", desc: "Cleanup unused csr and keys folders. See [certbot 2.3.0 release notes](https://github.com/certbot/certbot/releases/tag/v2.3.0)."} - { date: "02.03.23:", desc: "Set permissions on crontabs during init." }
- {date: "09.03.23:", desc: "Add Google Domains DNS support, `google-domains`."} - { date: "09.02.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf, authelia-location.conf and authelia-server.conf - Add Authentik configs, update Authelia configs." }
- {date: "02.03.23:", desc: "Set permissions on crontabs during init."} - { date: "06.02.23:", desc: "Add porkbun support back in." }
- {date: "09.02.23:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf, authelia-location.conf and authelia-server.conf - Add Authentik configs, update Authelia configs."} - { date: "21.01.23:", desc: "Unpin certbot version (allow certbot 2.x). !!BREAKING CHANGE!! We are temporarily removing the certbot porkbun plugin until a new version is released that is compatible with certbot 2.x." }
- {date: "06.02.23:", desc: "Add porkbun support back in."} - { date: "20.01.23:", desc: "Rebase to alpine 3.17 with php8.1." }
- {date: "21.01.23:", desc: "Unpin certbot version (allow certbot 2.x). !!BREAKING CHANGE!! We are temporarily removing the certbot porkbun plugin until a new version is released that is compatible with certbot 2.x."} - { date: "16.01.23:", desc: "Remove nchan module because it keeps causing crashes." }
- {date: "20.01.23:", desc: "Rebase to alpine 3.17 with php8.1."} - { date: "08.12.22:", desc: "Revamp certbot init."}
- {date: "16.01.23:", desc: "Remove nchan module because it keeps causing crashes."} - { date: "03.12.22:", desc: "Remove defunct cloudxns plugin."}
- {date: "08.12.22:", desc: "Revamp certbot init."} - { date: "22.11.22:", desc: "Pin acme to the same version as certbot."}
- {date: "03.12.22:", desc: "Remove defunct cloudxns plugin."} - { date: "22.11.22:", desc: "Pin certbot to 1.32.0 until plugin compatibility improves."}
- {date: "22.11.22:", desc: "Pin acme to the same version as certbot."} - { date: "05.11.22:", desc: "Update acmedns plugin handling."}
- {date: "22.11.22:", desc: "Pin certbot to 1.32.0 until plugin compatibility improves."} - { date: "06.10.22:", desc: "Switch to certbot-dns-duckdns. Update cpanel and gandi dns plugin handling. Minor adjustments to init logic." }
- {date: "05.11.22:", desc: "Update acmedns plugin handling."} - { date: "05.10.22:", desc: "Use certbot file hooks instead of command line hooks" }
- {date: "06.10.22:", desc: "Switch to certbot-dns-duckdns. Update cpanel and gandi dns plugin handling. Minor adjustments to init logic."} - { date: "04.10.22:", desc: "Add godaddy and porkbun dns plugins." }
- {date: "05.10.22:", desc: "Use certbot file hooks instead of command line hooks"} - { date: "03.10.22:", desc: "Add default_server back to default site conf's https listen." }
- {date: "04.10.22:", desc: "Add godaddy and porkbun dns plugins."} - { date: "22.09.22:", desc: "Added support for DO DNS validation." }
- {date: "03.10.22:", desc: "Add default_server back to default site conf's https listen."} - { date: "22.09.22:", desc: "Added certbot-dns-acmedns for DNS01 validation." }
- {date: "22.09.22:", desc: "Added support for DO DNS validation."} - { date: "20.08.22:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf - Rebasing to alpine 3.15 with php8. Restructure nginx configs ([see changes announcement](https://info.linuxserver.io/issues/2022-08-20-nginx-base))." }
- {date: "22.09.22:", desc: "Added certbot-dns-acmedns for DNS01 validation."} - { date: "10.08.22:", desc: "Added support for Dynu DNS validation." }
- {date: "20.08.22:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf - Rebasing to alpine 3.15 with php8. Restructure nginx configs ([see changes announcement](https://info.linuxserver.io/issues/2022-08-20-nginx-base))."} - { date: "18.05.22:", desc: "Added support for Azure DNS validation." }
- {date: "10.08.22:", desc: "Added support for Dynu DNS validation."} - { date: "09.04.22:", desc: "Added certbot-dns-loopia for DNS01 validation." }
- {date: "18.05.22:", desc: "Added support for Azure DNS validation."} - { date: "05.04.22:", desc: "Added support for standalone DNS validation." }
- {date: "09.04.22:", desc: "Added certbot-dns-loopia for DNS01 validation."} - { date: "28.03.22:", desc: "created a logfile for fail2ban nginx-unauthorized in /etc/cont-init.d/50-config" }
- {date: "05.04.22:", desc: "Added support for standalone DNS validation."} - { date: "09.01.22:", desc: "Added a fail2ban jail for nginx unauthorized" }
- {date: "28.03.22:", desc: "created a logfile for fail2ban nginx-unauthorized in /etc/cont-init.d/50-config"} - { date: "21.12.21:", desc: "Fixed issue with iptables not working as expected" }
- {date: "09.01.22:", desc: "Added a fail2ban jail for nginx unauthorized"} - { date: "30.11.21:", desc: "Move maxmind to a [new mod](https://github.com/linuxserver/docker-mods/tree/swag-maxmind)" }
- {date: "21.12.21:", desc: "Fixed issue with iptables not working as expected"} - { date: "22.11.21:", desc: "Added support for Infomaniak DNS for certificate generation." }
- {date: "30.11.21:", desc: "Move maxmind to a [new mod](https://github.com/linuxserver/docker-mods/tree/swag-maxmind)"} - { date: "20.11.21:", desc: "Added support for dnspod validation." }
- {date: "22.11.21:", desc: "Added support for Infomaniak DNS for certificate generation."} - { date: "15.11.21:", desc: "Added support for deSEC DNS for wildcard certificate generation." }
- {date: "20.11.21:", desc: "Added support for dnspod validation."} - { date: "26.10.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf - Mitigate <https://httpoxy.org/> vulnerabilities. Ref: <https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx#Defeating-the-Attack-using-NGINX-and-NGINX-Plus>" }
- {date: "15.11.21:", desc: "Added support for deSEC DNS for wildcard certificate generation."} - { date: "23.10.21:", desc: "Fix Hurricane Electric (HE) DNS validation." }
- {date: "26.10.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) proxy.conf - Mitigate <https://httpoxy.org/> vulnerabilities. Ref: <https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx#Defeating-the-Attack-using-NGINX-and-NGINX-Plus>"} - { date: "12.10.21:", desc: "Fix deprecated LE root cert check to fix failures when using `STAGING=true`, and failures in revoking." }
- {date: "23.10.21:", desc: "Fix Hurricane Electric (HE) DNS validation."} - { date: "06.10.21:", desc: "Added support for Hurricane Electric (HE) DNS validation. Added lxml build deps." }
- {date: "12.10.21:", desc: "Fix deprecated LE root cert check to fix failures when using `STAGING=true`, and failures in revoking."} - { date: "01.10.21:", desc: "Check if the cert uses the old LE root cert, revoke and regenerate if necessary. [Here's more info](https://twitter.com/letsencrypt/status/1443621997288767491) on LE root cert expiration" }
- {date: "06.10.21:", desc: "Added support for Hurricane Electric (HE) DNS validation. Added lxml build deps."} - { date: "19.09.21:", desc: "Add an optional header to opt out of Google FLoC in `ssl.conf`." }
- {date: "01.10.21:", desc: "Check if the cert uses the old LE root cert, revoke and regenerate if necessary. [Here's more info](https://twitter.com/letsencrypt/status/1443621997288767491) on LE root cert expiration"} - { date: "17.09.21:", desc: "Mark `SUBDOMAINS` var as optional." }
- {date: "19.09.21:", desc: "Add an optional header to opt out of Google FLoC in `ssl.conf`."} - { date: "01.08.21:", desc: "Add support for ionos dns validation." }
- {date: "17.09.21:", desc: "Mark `SUBDOMAINS` var as optional."} - { date: "15.07.21:", desc: "Fix libmaxminddb issue due to upstream change." }
- {date: "01.08.21:", desc: "Add support for ionos dns validation."} - { date: "07.07.21:", desc: "Rebase to alpine 3.14." }
- {date: "15.07.21:", desc: "Fix libmaxminddb issue due to upstream change."} - { date: "24.06.21:", desc: "Update default nginx conf folder." }
- {date: "07.07.21:", desc: "Rebase to alpine 3.14."} - { date: "28.05.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-server.conf - Use `resolver.conf` and patch for `CVE-2021-32637`." }
- {date: "24.06.21:", desc: "Update default nginx conf folder."} - { date: "20.05.21:", desc: "Modify resolver.conf generation to detect and ignore ipv6." }
- {date: "28.05.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-server.conf - Use `resolver.conf` and patch for `CVE-2021-32637`."} - { date: "14.05.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, ssl.conf, proxy.conf, and the default site-conf - Rework nginx.conf to be inline with alpine upstream and relocate lines from other files. Use linuxserver.io wheel index for pip packages. Switch to using [ffdhe4096](https://ssl-config.mozilla.org/ffdhe4096.txt) for `dhparams.pem` per [RFC7919](https://datatracker.ietf.org/doc/html/rfc7919). Added `worker_processes.conf`, which sets the number of nginx workers, and `resolver.conf`, which sets the dns resolver. Both conf files are auto-generated only on first start and can be user modified later." }
- {date: "20.05.21:", desc: "Modify resolver.conf generation to detect and ignore ipv6."} - { date: "21.04.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-server.conf and authelia-location.conf - Add remote name/email headers and pass http method." }
- {date: "14.05.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, ssl.conf, proxy.conf, and the default site-conf - Rework nginx.conf to be inline with alpine upstream and relocate lines from other files. Use linuxserver.io wheel index for pip packages. Switch to using [ffdhe4096](https://ssl-config.mozilla.org/ffdhe4096.txt) for `dhparams.pem` per [RFC7919](https://datatracker.ietf.org/doc/html/rfc7919). Added `worker_processes.conf`, which sets the number of nginx workers, and `resolver.conf`, which sets the dns resolver. Both conf files are auto-generated only on first start and can be user modified later."} - { date: "12.04.21:", desc: "Add php7-gmp and php7-pecl-mailparse." }
- {date: "21.04.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) authelia-server.conf and authelia-location.conf - Add remote name/email headers and pass http method."} - { date: "12.04.21:", desc: "Add support for vultr dns validation." }
- {date: "12.04.21:", desc: "Add php7-gmp and php7-pecl-mailparse."} - { date: "14.03.21:", desc: "Add support for directadmin dns validation." }
- {date: "12.04.21:", desc: "Add support for vultr dns validation."} - { date: "12.02.21:", desc: "Clean up rust/cargo cache, which ballooned the image size in the last couple of builds." }
- {date: "14.03.21:", desc: "Add support for directadmin dns validation."} - { date: "10.02.21:", desc: "Fix aliyun, domeneshop, inwx and transip dns confs for existing users." }
- {date: "12.02.21:", desc: "Clean up rust/cargo cache, which ballooned the image size in the last couple of builds."} - { date: "09.02.21:", desc: "Rebasing to alpine 3.13. Add nginx mods brotli and dav-ext. Remove nginx mods lua and lua-upstream (due to regression over the last couple of years)." }
- {date: "10.02.21:", desc: "Fix aliyun, domeneshop, inwx and transip dns confs for existing users."} - { date: "26.01.21:", desc: "Add support for hetzner dns validation." }
- {date: "09.02.21:", desc: "Rebasing to alpine 3.13. Add nginx mods brotli and dav-ext. Remove nginx mods lua and lua-upstream (due to regression over the last couple of years)."} - { date: "20.01.21:", desc: "Add check for ZeroSSL EAB retrieval." }
- {date: "26.01.21:", desc: "Add support for hetzner dns validation."} - { date: "08.01.21:", desc: "Add support for getting certs from [ZeroSSL](https://zerossl.com/) via optional `CERTPROVIDER` env var. Update aliyun, domeneshop, inwx and transip dns plugins with the new plugin names. Hide `donoteditthisfile.conf` because users were editing it despite its name. Suppress harmless error when no proxy confs are enabled." }
- {date: "20.01.21:", desc: "Add check for ZeroSSL EAB retrieval."} - { date: "03.01.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) /config/nginx/site-confs/default.conf - Add helper pages to aid troubleshooting" }
- {date: "08.01.21:", desc: "Add support for getting certs from [ZeroSSL](https://zerossl.com/) via optional `CERTPROVIDER` env var. Update aliyun, domeneshop, inwx and transip dns plugins with the new plugin names. Hide `donoteditthisfile.conf` because users were editing it despite its name. Suppress harmless error when no proxy confs are enabled."} - { date: "10.12.20:", desc: "Add support for njalla dns validation" }
- {date: "03.01.21:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) /config/nginx/site-confs/default.conf - Add helper pages to aid troubleshooting"} - { date: "09.12.20:", desc: "Check for template/conf updates and notify in the log. Add support for gehirn and sakuracloud dns validation." }
- {date: "10.12.20:", desc: "Add support for njalla dns validation"} - { date: "01.11.20:", desc: "Add support for netcup dns validation" }
- {date: "09.12.20:", desc: "Check for template/conf updates and notify in the log. Add support for gehirn and sakuracloud dns validation."} - { date: "29.10.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) ssl.conf - Add frame-ancestors to Content-Security-Policy." }
- {date: "01.11.20:", desc: "Add support for netcup dns validation"} - { date: "04.10.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, proxy.conf, and ssl.conf - Minor cleanups and reordering." }
- {date: "29.10.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) ssl.conf - Add frame-ancestors to Content-Security-Policy."} - { date: "20.09.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf - Added geoip2 configs. Added MAXMINDDB_LICENSE_KEY variable to readme."}
- {date: "04.10.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, proxy.conf, and ssl.conf - Minor cleanups and reordering."} - { date: "08.09.20:", desc: "Add php7-xsl." }
- {date: "20.09.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf - Added geoip2 configs. Added MAXMINDDB_LICENSE_KEY variable to readme."} - { date: "01.09.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, proxy.conf, and various proxy samples - Global websockets across all configs." }
- {date: "08.09.20:", desc: "Add php7-xsl."} - { date: "03.08.20:", desc: "Initial release." }
- {date: "01.09.20:", desc: "[Existing users should update:](https://github.com/linuxserver/docker-swag/blob/master/README.md#updating-configs) nginx.conf, proxy.conf, and various proxy samples - Global websockets across all configs."}
- {date: "03.08.20:", desc: "Initial release."}

View File

@@ -6,4 +6,4 @@ echo
echo "<------------------------------------------------->" echo "<------------------------------------------------->"
echo "cronjob running on $(date)" echo "cronjob running on $(date)"
echo "Running certbot renew" echo "Running certbot renew"
certbot renew --non-interactive --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini certbot renew --non-interactive

View File

@@ -1,7 +1,9 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
# Notice: This file will be overwritten when updated by lsio. Add your custom scripts into a new file in this folder.
cd /config/keys/letsencrypt || exit 1 cd /config/keys/letsencrypt || exit 1
echo "**** Generating pfx and fullchain bundle certs ****"
openssl pkcs12 -export -out privkey.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem -passout pass: openssl pkcs12 -export -out privkey.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem -passout pass:
sleep 1 sleep 1
cat {privkey,fullchain}.pem >priv-fullchain-bundle.pem cat {privkey,fullchain}.pem >priv-fullchain-bundle.pem

View File

@@ -1,15 +1,18 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
# Notice: This file will be overwritten when updated by lsio. Add your custom scripts into a new file in this folder.
# shellcheck source=/dev/null # shellcheck source=/dev/null
. /config/.donoteditthisfile.conf . /config/.donoteditthisfile.conf
if [[ ! "${ORIGVALIDATION}" = "dns" ]] && [[ ! "${ORIGVALIDATION}" = "duckdns" ]]; then if [[ ! "${ORIGVALIDATION}" = "dns" ]] && [[ ! "${ORIGVALIDATION}" = "duckdns" ]]; then
if pgrep -f "s6-supervise svc-nginx" >/dev/null; then if pgrep -f "s6-supervise svc-nginx" >/dev/null; then
echo "**** Starting Nginx ****"
s6-svc -u /run/service/svc-nginx s6-svc -u /run/service/svc-nginx
fi fi
else else
if pgrep -f "nginx:" >/dev/null; then if pgrep -f "nginx:" >/dev/null; then
echo "**** Reloading Nginx to load the new cert ****"
s6-svc -h /run/service/svc-nginx s6-svc -h /run/service/svc-nginx
fi fi
fi fi

View File

@@ -1,11 +1,13 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
# Notice: This file will be overwritten when updated by lsio. Add your custom scripts into a new file in this folder.
# shellcheck source=/dev/null # shellcheck source=/dev/null
. /config/.donoteditthisfile.conf . /config/.donoteditthisfile.conf
if [[ ! "${ORIGVALIDATION}" = "dns" ]] && [[ ! "${ORIGVALIDATION}" = "duckdns" ]]; then if [[ ! "${ORIGVALIDATION}" = "dns" ]] && [[ ! "${ORIGVALIDATION}" = "duckdns" ]]; then
if pgrep -f "nginx:" >/dev/null; then if pgrep -f "nginx:" >/dev/null; then
echo "**** Stopping Nginx in preparation of cert generation/renewal ****"
s6-svc -d /run/service/svc-nginx s6-svc -d /run/service/svc-nginx
fi fi
fi fi

View File

@@ -1,4 +1,4 @@
## Version 2024/12/17 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/site-confs/default.conf.sample ## Version 2024/07/16 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/site-confs/default.conf.sample
# redirect all traffic to https # redirect all traffic to https
server { server {
@@ -80,3 +80,5 @@ server {
# enable subdomain method reverse proxy confs # enable subdomain method reverse proxy confs
include /config/nginx/proxy-confs/*.subdomain.conf; include /config/nginx/proxy-confs/*.subdomain.conf;
# enable proxy cache for auth
proxy_cache_path cache/ keys_zone=auth_cache:10m;

View File

@@ -5,4 +5,4 @@
0 3 * * 6 run-parts /etc/periodic/weekly 0 3 * * 6 run-parts /etc/periodic/weekly
0 5 1 * * run-parts /etc/periodic/monthly 0 5 1 * * run-parts /etc/periodic/monthly
8 2 * * * /app/le-renew.sh >> /config/log/letsencrypt/renewal.log 2>&1 8 2 * * * /app/le-renew.sh >> /config/log/letsencrypt/letsencrypt.log 2>&1

View File

@@ -38,6 +38,12 @@ if [[ "${VALIDATION}" = "dns" ]] && ! echo "${CERTBOT_DNS_AUTHENTICATORS}" | gre
sleep infinity sleep infinity
fi fi
# set owner of certbot's CONFIG_DIR, WORK_DIR, and LOGS_DIR to abc
lsiown -R abc:abc \
/etc/letsencrypt \
/var/lib/letsencrypt \
/var/log/letsencrypt
# set_ini_value logic: # set_ini_value logic:
# - if the name is not found in the file, append the name=value to the end of the file # - if the name is not found in the file, append the name=value to the end of the file
# - if the name is found in the file, replace the value # - if the name is found in the file, replace the value
@@ -61,14 +67,10 @@ cp -n /defaults/dns-conf/* /config/dns-conf/ 2> >(grep -v 'cp: not replacing')
lsiown -R abc:abc /config/dns-conf lsiown -R abc:abc /config/dns-conf
# copy default renewal hooks # copy default renewal hooks
cp -nR /defaults/etc/letsencrypt/renewal-hooks/* /config/etc/letsencrypt/renewal-hooks/ 2> >(grep -v 'cp: not replacing') chmod -R +x /defaults/etc/letsencrypt/renewal-hooks
cp -Rf /defaults/etc/letsencrypt/renewal-hooks/* /config/etc/letsencrypt/renewal-hooks/ 2> >(grep -v 'cp: not replacing')
lsiown -R abc:abc /config/etc/letsencrypt/renewal-hooks lsiown -R abc:abc /config/etc/letsencrypt/renewal-hooks
# replace nginx service location in renewal hooks
find /config/etc/letsencrypt/renewal-hooks/ -type f -exec sed -i 's|/run/service/nginx|/run/service/svc-nginx|g' {} \;
find /config/etc/letsencrypt/renewal-hooks/ -type f -exec sed -i 's|/var/run/s6/services/nginx|/run/service/svc-nginx|g' {} \;
find /config/etc/letsencrypt/renewal-hooks/ -type f -exec sed -i 's|s6-supervise nginx|s6-supervise svc-nginx|g' {} \;
# create original config file if it doesn't exist, move non-hidden legacy file to hidden # create original config file if it doesn't exist, move non-hidden legacy file to hidden
if [[ -f "/config/donoteditthisfile.conf" ]]; then if [[ -f "/config/donoteditthisfile.conf" ]]; then
mv /config/donoteditthisfile.conf /config/.donoteditthisfile.conf mv /config/donoteditthisfile.conf /config/.donoteditthisfile.conf
@@ -162,14 +164,14 @@ fi
rm -rf /config/keys/letsencrypt rm -rf /config/keys/letsencrypt
if [[ "${ONLY_SUBDOMAINS}" = "true" ]] && [[ ! "${SUBDOMAINS}" = "wildcard" ]]; then if [[ "${ONLY_SUBDOMAINS}" = "true" ]] && [[ ! "${SUBDOMAINS}" = "wildcard" ]]; then
DOMAIN="$(echo "${SUBDOMAINS}" | tr ',' ' ' | awk '{print $1}').${URL}" DOMAIN="$(echo "${SUBDOMAINS}" | tr ',' ' ' | awk '{print $1}').${URL}"
ln -s /config/etc/letsencrypt/live/"${DOMAIN}" /config/keys/letsencrypt ln -s ../etc/letsencrypt/live/"${DOMAIN}" /config/keys/letsencrypt
else else
ln -s /config/etc/letsencrypt/live/"${URL}" /config/keys/letsencrypt ln -s ../etc/letsencrypt/live/"${URL}" /config/keys/letsencrypt
fi fi
# cleanup unused csr and keys folders # cleanup unused csr and keys folders
rm -rf /config/etc/letsencrypt/csr rm -rf /etc/letsencrypt/csr
rm -rf /config/etc/letsencrypt/keys rm -rf /etc/letsencrypt/keys
# checking for changes in cert variables, revoking certs if necessary # checking for changes in cert variables, revoking certs if necessary
if [[ ! "${URL}" = "${ORIGURL}" ]] || if [[ ! "${URL}" = "${ORIGURL}" ]] ||
@@ -190,9 +192,9 @@ if [[ ! "${URL}" = "${ORIGURL}" ]] ||
REV_ACMESERVER=("https://acme-v02.api.letsencrypt.org/directory") REV_ACMESERVER=("https://acme-v02.api.letsencrypt.org/directory")
fi fi
if [[ -f /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem ]]; then if [[ -f /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem ]]; then
certbot revoke --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini --non-interactive --cert-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem --key-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/privkey.pem --server "${REV_ACMESERVER[@]}" || true certbot revoke --non-interactive --cert-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem --key-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/privkey.pem --server "${REV_ACMESERVER[@]}" || true
else else
certbot revoke --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini --non-interactive --cert-name "${ORIGDOMAIN}" --server "${REV_ACMESERVER[@]}" || true certbot revoke --non-interactive --cert-name "${ORIGDOMAIN}" --server "${REV_ACMESERVER[@]}" || true
fi fi
rm -rf /config/etc/letsencrypt/{accounts,archive,live,renewal} rm -rf /config/etc/letsencrypt/{accounts,archive,live,renewal}
fi fi
@@ -205,9 +207,9 @@ if [[ -f "/config/keys/letsencrypt/chain.pem" ]] && { [[ "${CERTPROVIDER}" == "l
echo "The cert seems to be using the old LE root cert, which is no longer valid. Deleting and revoking." echo "The cert seems to be using the old LE root cert, which is no longer valid. Deleting and revoking."
REV_ACMESERVER=("https://acme-v02.api.letsencrypt.org/directory") REV_ACMESERVER=("https://acme-v02.api.letsencrypt.org/directory")
if [[ -f /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem ]]; then if [[ -f /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem ]]; then
certbot revoke --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini --non-interactive --cert-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem --server "${REV_ACMESERVER[@]}" || true certbot revoke --non-interactive --cert-path /config/etc/letsencrypt/live/"${ORIGDOMAIN}"/fullchain.pem --server "${REV_ACMESERVER[@]}" || true
else else
certbot revoke --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini --non-interactive --cert-name "${ORIGDOMAIN}" --server "${REV_ACMESERVER[@]}" || true certbot revoke --non-interactive --cert-name "${ORIGDOMAIN}" --server "${REV_ACMESERVER[@]}" || true
fi fi
rm -rf /config/etc/letsencrypt/{accounts,archive,live,renewal} rm -rf /config/etc/letsencrypt/{accounts,archive,live,renewal}
fi fi
@@ -340,7 +342,7 @@ if [[ ! -f "/config/keys/letsencrypt/fullchain.pem" ]]; then
set_ini_value "eab-hmac-key" "${ZEROSSL_EAB_HMAC_KEY}" /config/etc/letsencrypt/cli.ini set_ini_value "eab-hmac-key" "${ZEROSSL_EAB_HMAC_KEY}" /config/etc/letsencrypt/cli.ini
fi fi
echo "Generating new certificate" echo "Generating new certificate"
certbot certonly --config-dir /config/etc/letsencrypt --logs-dir /config/log/letsencrypt --work-dir /tmp/letsencrypt --config /config/etc/letsencrypt/cli.ini --non-interactive --renew-by-default certbot certonly --non-interactive --renew-by-default
if [[ ! -d /config/keys/letsencrypt ]]; then if [[ ! -d /config/keys/letsencrypt ]]; then
if [[ "${VALIDATION}" = "dns" ]]; then if [[ "${VALIDATION}" = "dns" ]]; then
echo "ERROR: Cert does not exist! Please see the validation error above. Make sure you entered correct credentials into the ${DNSCREDENTIALFILE} file." echo "ERROR: Cert does not exist! Please see the validation error above. Make sure you entered correct credentials into the ${DNSCREDENTIALFILE} file."

View File

@@ -1,40 +1,38 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
if [[ -z ${LSIO_READ_ONLY_FS} ]] && [[ -z ${LSIO_NON_ROOT_USER} ]] && [[ "${DISABLE_F2B,,}" != "true" ]]; then if ! iptables -L &> /dev/null; then
if ! iptables -L &> /dev/null; then ln -sf /sbin/xtables-legacy-multi /sbin/iptables
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/iptables ln -sf /sbin/xtables-legacy-multi /sbin/iptables-save
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/iptables-save ln -sf /sbin/xtables-legacy-multi /sbin/iptables-restore
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/iptables-restore ln -sf /sbin/xtables-legacy-multi /sbin/ip6tables
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/ip6tables ln -sf /sbin/xtables-legacy-multi /sbin/ip6tables-save
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/ip6tables-save ln -sf /sbin/xtables-legacy-multi /sbin/ip6tables-restore
ln -sf /usr/sbin/xtables-legacy-multi /usr/sbin/ip6tables-restore fi
fi
# copy/update the fail2ban config defaults to/in /config
# copy/update the fail2ban config defaults to/in /config cp -R /defaults/fail2ban/filter.d /config/fail2ban/
cp -R /defaults/fail2ban/filter.d /config/fail2ban/ cp -R /defaults/fail2ban/action.d /config/fail2ban/
cp -R /defaults/fail2ban/action.d /config/fail2ban/ # if jail.local is missing in /config, copy default
# if jail.local is missing in /config, copy default if [[ ! -f /config/fail2ban/jail.local ]]; then
if [[ ! -f /config/fail2ban/jail.local ]]; then cp /defaults/fail2ban/jail.local /config/fail2ban/jail.local
cp /defaults/fail2ban/jail.local /config/fail2ban/jail.local fi
fi # Replace fail2ban config with user config
# Replace fail2ban config with user config if [[ -d /etc/fail2ban/filter.d ]]; then
if [[ -d /etc/fail2ban/filter.d ]]; then rm -rf /etc/fail2ban/filter.d
rm -rf /etc/fail2ban/filter.d fi
fi if [[ -d /etc/fail2ban/action.d ]]; then
if [[ -d /etc/fail2ban/action.d ]]; then rm -rf /etc/fail2ban/action.d
rm -rf /etc/fail2ban/action.d fi
fi cp -R /config/fail2ban/filter.d /etc/fail2ban/
cp -R /config/fail2ban/filter.d /etc/fail2ban/ cp -R /config/fail2ban/action.d /etc/fail2ban/
cp -R /config/fail2ban/action.d /etc/fail2ban/ cp /defaults/fail2ban/fail2ban.local /etc/fail2ban/
cp /defaults/fail2ban/fail2ban.local /etc/fail2ban/ cp /config/fail2ban/jail.local /etc/fail2ban/jail.local
cp /config/fail2ban/jail.local /etc/fail2ban/jail.local
# logfiles needed by fail2ban
# logfiles needed by fail2ban if [[ ! -f /config/log/nginx/error.log ]]; then
if [[ ! -f /config/log/nginx/error.log ]]; then touch /config/log/nginx/error.log
touch /config/log/nginx/error.log fi
fi if [[ ! -f /config/log/nginx/access.log ]]; then
if [[ ! -f /config/log/nginx/access.log ]]; then touch /config/log/nginx/access.log
touch /config/log/nginx/access.log
fi
fi fi

View File

@@ -7,6 +7,6 @@ mkdir -p \
/config/etc/letsencrypt/renewal-hooks \ /config/etc/letsencrypt/renewal-hooks \
/config/log/{fail2ban,letsencrypt,nginx} \ /config/log/{fail2ban,letsencrypt,nginx} \
/config/nginx/proxy-confs \ /config/nginx/proxy-confs \
/run/fail2ban \ /run/fail2ban
/tmp/letsencrypt rm -rf /etc/letsencrypt
ln -s /config/etc/letsencrypt /etc/letsencrypt

View File

@@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/init-folders-config/run

View File

@@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/init-nginx-config/run

View File

@@ -4,7 +4,6 @@
# permissions # permissions
lsiown -R abc:abc \ lsiown -R abc:abc \
/config /config
chmod -R 0644 /etc/logrotate.d
chmod -R +r /config/log chmod -R +r /config/log
chmod +x /app/le-renew.sh
# Workaround for systems with chmod errors
true

View File

@@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/init-samples-config/run

View File

@@ -1 +0,0 @@
/etc/s6-overlay/s6-rc.d/init-swag-config/run

View File

@@ -1 +0,0 @@
/etc/s6-overlay/s6-rc.d/init-swag-folders/run

View File

@@ -1 +0,0 @@
/etc/s6-overlay/s6-rc.d/init-swag-samples/run

View File

@@ -0,0 +1,7 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
# Echo init finish for test runs
if [[ -n "${TEST_RUN}" ]]; then
echo '[services.d] done.'
fi

View File

@@ -0,0 +1 @@
oneshot

View File

@@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/init-test-run/run

View File

@@ -1,9 +1,5 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash # shellcheck shell=bash
if [[ -z ${LSIO_READ_ONLY_FS} ]] && [[ -z ${LSIO_NON_ROOT_USER} ]] && [[ "${DISABLE_F2B,,}" != "true" ]]; then exec \
exec \ fail2ban-client -x -f start
fail2ban-client -x -f start
else
sleep infinity
fi

View File

@@ -1,7 +0,0 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
# Migrate existing confs with old paths from /etc/letsencrypt to /config/etc/letsencrypt
if [[ ! -f "/config/etc/letsencrypt/02-swag-old-certbot-paths" ]] && ls /config/etc/letsencrypt/renewal/*.conf >/dev/null 2>&1; then
sed -i 's| /etc/letsencrypt| /config/etc/letsencrypt|' /config/etc/letsencrypt/renewal/*.conf && touch /config/etc/letsencrypt/02-swag-old-certbot-paths
fi