mirror of
https://github.com/linuxserver/docker-swag.git
synced 2026-02-23 13:10:31 +09:00
Compare commits
73 Commits
3.2.0-ls36
...
env-templa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c28cb7a40 | ||
|
|
5942cc2253 | ||
|
|
fb4ba0deb0 | ||
|
|
7d8332e624 | ||
|
|
d9dbcd0756 | ||
|
|
8381b03a05 | ||
|
|
a1efcf3cd4 | ||
|
|
834de14952 | ||
|
|
8353859972 | ||
|
|
ca399a7fa2 | ||
|
|
1905b3c920 | ||
|
|
c9efb531b0 | ||
|
|
26d05580ef | ||
|
|
a2a7292e39 | ||
|
|
5316c58910 | ||
|
|
fa860e1349 | ||
|
|
72f60b132b | ||
|
|
24cf84fd61 | ||
|
|
d4ceeb2f67 | ||
|
|
1282274a1a | ||
|
|
b05df6cf2a | ||
|
|
b96738cdf2 | ||
|
|
2d6a54a526 | ||
|
|
bb78c0f50e | ||
|
|
56ff1d5e19 | ||
|
|
7f9835b43f | ||
|
|
f3ac0dd394 | ||
|
|
0168126729 | ||
|
|
0e55f7b67e | ||
|
|
b52e35e494 | ||
|
|
ef2a5f2077 | ||
|
|
0c910b9a7b | ||
|
|
9ab0f727d0 | ||
|
|
adcdf5d748 | ||
|
|
7a38630c0b | ||
|
|
6b6e7b74b5 | ||
|
|
3b6d0484b9 | ||
|
|
0d952bcee1 | ||
|
|
35deb8f654 | ||
|
|
2ec9bacf0c | ||
|
|
bcbad63147 | ||
|
|
962c2322eb | ||
|
|
dd8fd8ad05 | ||
|
|
b818ae1f58 | ||
|
|
43466fe490 | ||
|
|
3781360d72 | ||
|
|
a01e4aca17 | ||
|
|
b87c9d2886 | ||
|
|
08aa9cc07b | ||
|
|
23e05f1f7a | ||
|
|
f80d14bf8c | ||
|
|
7e7e22753c | ||
|
|
9f76c031fe | ||
|
|
2b2ccf9e9a | ||
|
|
54ed99d81a | ||
|
|
a3f72898ff | ||
|
|
8b8d33a81a | ||
|
|
82ba5dd791 | ||
|
|
e7c815c27f | ||
|
|
563ae7e9c5 | ||
|
|
8caf2a1841 | ||
|
|
15a3bc9d2c | ||
|
|
1567416bfb | ||
|
|
f909c85857 | ||
|
|
2992a09e32 | ||
|
|
5a8b8010ee | ||
|
|
586eaa3b4c | ||
|
|
2528e2f027 | ||
|
|
4632ecb91a | ||
|
|
615ccbc589 | ||
|
|
199d0a6707 | ||
|
|
f8171d73ce | ||
|
|
503578a870 |
0
.editorconfig
Executable file → Normal file
0
.editorconfig
Executable file → Normal file
0
.github/FUNDING.yml
vendored
Executable file → Normal file
0
.github/FUNDING.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/config.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/config.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/issue.bug.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/issue.bug.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/issue.feature.yml
vendored
Executable file → Normal file
0
.github/ISSUE_TEMPLATE/issue.feature.yml
vendored
Executable file → Normal file
3
.github/workflows/call_issue_pr_tracker.yml
vendored
Executable file → Normal file
3
.github/workflows/call_issue_pr_tracker.yml
vendored
Executable file → Normal file
@@ -8,6 +8,9 @@ on:
|
||||
pull_request_review:
|
||||
types: [submitted,edited,dismissed]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
manage-project:
|
||||
permissions:
|
||||
|
||||
3
.github/workflows/call_issues_cron.yml
vendored
Executable file → Normal file
3
.github/workflows/call_issues_cron.yml
vendored
Executable file → Normal file
@@ -4,6 +4,9 @@ on:
|
||||
- cron: '35 15 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
permissions:
|
||||
|
||||
15
.github/workflows/external_trigger.yml
vendored
15
.github/workflows/external_trigger.yml
vendored
@@ -3,6 +3,9 @@ name: External Trigger Main
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
external-trigger-master:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -43,8 +46,8 @@ jobs:
|
||||
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
||||
exit 1
|
||||
fi
|
||||
EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
|
||||
echo "External version: \`${EXT_RELEASE}\`" >> $GITHUB_STEP_SUMMARY
|
||||
EXT_RELEASE_SANITIZED=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
|
||||
echo "Sanitized external version: \`${EXT_RELEASE_SANITIZED}\`" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
|
||||
image="linuxserver/swag"
|
||||
tag="latest"
|
||||
@@ -100,8 +103,8 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
|
||||
if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then
|
||||
echo "Version \`${EXT_RELEASE}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY
|
||||
if [ "${EXT_RELEASE_SANITIZED}" == "${IMAGE_VERSION}" ]; then
|
||||
echo "Sanitized version \`${EXT_RELEASE_SANITIZED}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY
|
||||
exit 0
|
||||
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-swag/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
|
||||
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
|
||||
@@ -116,7 +119,7 @@ jobs:
|
||||
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
||||
else
|
||||
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
|
||||
echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
|
||||
echo "New sanitized version \`${EXT_RELEASE_SANITIZED}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
|
||||
if [[ "${artifacts_found}" == "true" ]]; then
|
||||
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
@@ -136,7 +139,7 @@ jobs:
|
||||
--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}"
|
||||
TRIGGER_REASON="A version change was detected for swag tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE_SANITIZED}"
|
||||
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 }}
|
||||
|
||||
@@ -5,6 +5,9 @@ on:
|
||||
- cron: '2 * * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
external-trigger-scheduler:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
6
.github/workflows/greetings.yml
vendored
6
.github/workflows/greetings.yml
vendored
@@ -2,8 +2,14 @@ name: Greetings
|
||||
|
||||
on: [pull_request_target, issues]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
greeting:
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/first-interaction@v1
|
||||
|
||||
@@ -5,6 +5,9 @@ on:
|
||||
- cron: '1 3 * * 6'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
package-trigger-scheduler:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
0
.github/workflows/permissions.yml
vendored
Executable file → Normal file
0
.github/workflows/permissions.yml
vendored
Executable file → Normal file
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
.idea
|
||||
.jenkins-external
|
||||
|
||||
67
Dockerfile
67
Dockerfile
@@ -1,6 +1,6 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.21
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.22
|
||||
|
||||
# set version label
|
||||
ARG BUILD_DATE
|
||||
@@ -49,37 +49,38 @@ RUN \
|
||||
nginx-mod-stream \
|
||||
nginx-mod-stream-geoip2 \
|
||||
nginx-vim \
|
||||
php83-bcmath \
|
||||
php83-bz2 \
|
||||
php83-dom \
|
||||
php83-exif \
|
||||
php83-ftp \
|
||||
php83-gd \
|
||||
php83-gmp \
|
||||
php83-imap \
|
||||
php83-intl \
|
||||
php83-ldap \
|
||||
php83-mysqli \
|
||||
php83-mysqlnd \
|
||||
php83-opcache \
|
||||
php83-pdo_mysql \
|
||||
php83-pdo_odbc \
|
||||
php83-pdo_pgsql \
|
||||
php83-pdo_sqlite \
|
||||
php83-pear \
|
||||
php83-pecl-apcu \
|
||||
php83-pecl-mcrypt \
|
||||
php83-pecl-memcached \
|
||||
php83-pecl-redis \
|
||||
php83-pgsql \
|
||||
php83-posix \
|
||||
php83-soap \
|
||||
php83-sockets \
|
||||
php83-sodium \
|
||||
php83-sqlite3 \
|
||||
php83-tokenizer \
|
||||
php83-xmlreader \
|
||||
php83-xsl \
|
||||
php84-bcmath \
|
||||
php84-bz2 \
|
||||
php84-dom \
|
||||
php84-exif \
|
||||
php84-ftp \
|
||||
php84-gd \
|
||||
php84-gmp \
|
||||
php84-imap \
|
||||
php84-intl \
|
||||
php84-ldap \
|
||||
php84-mysqli \
|
||||
php84-mysqlnd \
|
||||
php84-opcache \
|
||||
php84-pdo_mysql \
|
||||
php84-pdo_odbc \
|
||||
php84-pdo_pgsql \
|
||||
php84-pdo_sqlite \
|
||||
php84-pear \
|
||||
php84-pecl-apcu \
|
||||
php84-pecl-memcached \
|
||||
php84-pecl-redis \
|
||||
php84-pgsql \
|
||||
php84-posix \
|
||||
php84-soap \
|
||||
php84-sockets \
|
||||
php84-sodium \
|
||||
php84-sqlite3 \
|
||||
php84-tokenizer \
|
||||
php84-xmlreader \
|
||||
php84-xsl \
|
||||
python3 \
|
||||
py3-jinja2 \
|
||||
whois && \
|
||||
echo "**** install certbot plugins ****" && \
|
||||
if [ -z ${CERTBOT_VERSION+x} ]; then \
|
||||
@@ -89,7 +90,7 @@ RUN \
|
||||
pip install -U --no-cache-dir \
|
||||
pip \
|
||||
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.22/ \
|
||||
certbot==${CERTBOT_VERSION} \
|
||||
certbot-dns-acmedns \
|
||||
certbot-dns-aliyun \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.21
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.22
|
||||
|
||||
# set version label
|
||||
ARG BUILD_DATE
|
||||
@@ -49,37 +49,38 @@ RUN \
|
||||
nginx-mod-stream \
|
||||
nginx-mod-stream-geoip2 \
|
||||
nginx-vim \
|
||||
php83-bcmath \
|
||||
php83-bz2 \
|
||||
php83-dom \
|
||||
php83-exif \
|
||||
php83-ftp \
|
||||
php83-gd \
|
||||
php83-gmp \
|
||||
php83-imap \
|
||||
php83-intl \
|
||||
php83-ldap \
|
||||
php83-mysqli \
|
||||
php83-mysqlnd \
|
||||
php83-opcache \
|
||||
php83-pdo_mysql \
|
||||
php83-pdo_odbc \
|
||||
php83-pdo_pgsql \
|
||||
php83-pdo_sqlite \
|
||||
php83-pear \
|
||||
php83-pecl-apcu \
|
||||
php83-pecl-mcrypt \
|
||||
php83-pecl-memcached \
|
||||
php83-pecl-redis \
|
||||
php83-pgsql \
|
||||
php83-posix \
|
||||
php83-soap \
|
||||
php83-sockets \
|
||||
php83-sodium \
|
||||
php83-sqlite3 \
|
||||
php83-tokenizer \
|
||||
php83-xmlreader \
|
||||
php83-xsl \
|
||||
php84-bcmath \
|
||||
php84-bz2 \
|
||||
php84-dom \
|
||||
php84-exif \
|
||||
php84-ftp \
|
||||
php84-gd \
|
||||
php84-gmp \
|
||||
php84-imap \
|
||||
php84-intl \
|
||||
php84-ldap \
|
||||
php84-mysqli \
|
||||
php84-mysqlnd \
|
||||
php84-opcache \
|
||||
php84-pdo_mysql \
|
||||
php84-pdo_odbc \
|
||||
php84-pdo_pgsql \
|
||||
php84-pdo_sqlite \
|
||||
php84-pear \
|
||||
php84-pecl-apcu \
|
||||
php84-pecl-memcached \
|
||||
php84-pecl-redis \
|
||||
php84-pgsql \
|
||||
php84-posix \
|
||||
php84-soap \
|
||||
php84-sockets \
|
||||
php84-sodium \
|
||||
php84-sqlite3 \
|
||||
php84-tokenizer \
|
||||
php84-xmlreader \
|
||||
php84-xsl \
|
||||
python3 \
|
||||
py3-jinja2 \
|
||||
whois && \
|
||||
echo "**** install certbot plugins ****" && \
|
||||
if [ -z ${CERTBOT_VERSION+x} ]; then \
|
||||
@@ -89,7 +90,7 @@ RUN \
|
||||
pip install -U --no-cache-dir \
|
||||
pip \
|
||||
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.22/ \
|
||||
certbot==${CERTBOT_VERSION} \
|
||||
certbot-dns-acmedns \
|
||||
certbot-dns-aliyun \
|
||||
|
||||
7
Jenkinsfile
vendored
7
Jenkinsfile
vendored
@@ -95,7 +95,11 @@ pipeline {
|
||||
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
|
||||
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'
|
||||
if ( env.SYFT_IMAGE_TAG == null ) {
|
||||
env.SYFT_IMAGE_TAG = 'latest'
|
||||
}
|
||||
}
|
||||
echo "Using syft image tag ${SYFT_IMAGE_TAG}"
|
||||
sh '''#! /bin/bash
|
||||
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
|
||||
script{
|
||||
@@ -780,7 +784,7 @@ pipeline {
|
||||
docker run --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||
-v ${TEMPDIR}:/tmp \
|
||||
ghcr.io/anchore/syft:latest \
|
||||
ghcr.io/anchore/syft:${SYFT_IMAGE_TAG} \
|
||||
${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt
|
||||
NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 )
|
||||
echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github"
|
||||
@@ -890,6 +894,7 @@ pipeline {
|
||||
-e WEB_AUTH=\"${CI_AUTH}\" \
|
||||
-e WEB_PATH=\"${CI_WEBPATH}\" \
|
||||
-e NODE_NAME=\"${NODE_NAME}\" \
|
||||
-e SYFT_IMAGE_TAG=\"${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
|
||||
-t ghcr.io/linuxserver/ci:latest \
|
||||
python3 test_build.py'''
|
||||
}
|
||||
|
||||
101
README.md
101
README.md
@@ -5,7 +5,6 @@
|
||||
[](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
|
||||
[](https://linuxserver.io/discord "realtime support / chat with the community and the team.")
|
||||
[](https://discourse.linuxserver.io "post on our community forum.")
|
||||
[](https://fleet.linuxserver.io "an online web interface which displays all of our maintained images.")
|
||||
[](https://github.com/linuxserver "view the source for all of our repositories.")
|
||||
[](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget")
|
||||
|
||||
@@ -22,7 +21,6 @@ Find us at:
|
||||
* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more!
|
||||
* [Discord](https://linuxserver.io/discord) - realtime support / chat with the community and the team.
|
||||
* [Discourse](https://discourse.linuxserver.io) - post on our community forum.
|
||||
* [Fleet](https://fleet.linuxserver.io) - an online web interface which displays all of our maintained images.
|
||||
* [GitHub](https://github.com/linuxserver) - view the source for all of our repositories.
|
||||
* [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget
|
||||
|
||||
@@ -54,7 +52,6 @@ The architectures supported by this image are:
|
||||
| :----: | :----: | ---- |
|
||||
| x86-64 | ✅ | amd64-\<version tag\> |
|
||||
| arm64 | ✅ | arm64v8-\<version tag\> |
|
||||
| armhf | ❌ | |
|
||||
|
||||
## Application Setup
|
||||
|
||||
@@ -88,6 +85,88 @@ INSTALL_PIP_PACKAGES=certbot-dns-<plugin>
|
||||
Set the required credentials (usually found in the plugin documentation) in `/config/dns-conf/<plugin>.ini`.
|
||||
It is recommended to attempt obtaining a certificate with `STAGING=true` first to make sure the plugin is working as expected.
|
||||
|
||||
|
||||
### Dynamic Reverse Proxy Configuration via Environment Variables
|
||||
|
||||
SWAG can dynamically generate reverse proxy configuration files directly from environment variables, bypassing the need to manage individual `.conf` files. When any `PROXY_CONFIG_*` variable is detected, this mode is activated, and any existing `.conf` files in `/config/nginx/proxy-confs/` will be removed at startup.
|
||||
|
||||
**Service Definition**
|
||||
|
||||
Each reverse proxy service is defined by an environment variable following the format `PROXY_CONFIG_<SERVICE_NAME>`. The service name will be used as the subdomain (e.g., `SERVICE_NAME.yourdomain.com`), with the special exception of `DEFAULT` (see below). The value of the variable must be a valid JSON object.
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
# Configure the default site (root domain) to proxy to a dashboard service
|
||||
- 'PROXY_CONFIG_DEFAULT={"name": "dashboard", "port": 80, "auth": "authelia", "quic": true}'
|
||||
|
||||
# Simple subdomain service
|
||||
- 'PROXY_CONFIG_HOMARR={"port": 7575, "auth": "authelia"}'
|
||||
|
||||
# Service with a boolean flag for HTTPS backend and QUIC enabled
|
||||
- 'PROXY_CONFIG_HEIMDALL={"port": 443, "https": true, "quic": true}'
|
||||
|
||||
# Complex service with nested objects and lists (incomplete example for syntax)
|
||||
- 'PROXY_CONFIG_PLEX={
|
||||
"port": 32400,
|
||||
"proxy_redirect_off": true,
|
||||
"buffering_off": true,
|
||||
"proxy_set_headers": [
|
||||
{"key": "X-Plex-Client-Identifier", "value": "$$http_x_plex_client_identifier"},
|
||||
{"key": "X-Plex-Device", "value": "$$http_x_plex_device"}
|
||||
],
|
||||
"extra_locations": [
|
||||
{"path": "/library/streams/", "custom_directives": ["proxy_pass_request_headers off"]}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
The available keys in the JSON object correspond to the options in the underlying Nginx template. Common keys include `port`, `https`, `quic`, `auth`, `buffering_off`, `proxy_set_headers`, and `extra_locations`.
|
||||
|
||||
**Configuring the Default Site (Root Domain)**
|
||||
|
||||
To configure the service that responds on your root domain (e.g., `https://yourdomain.com`), use the special service name `DEFAULT`.
|
||||
|
||||
* The environment variable is `PROXY_CONFIG_DEFAULT`.
|
||||
* Unlike subdomain services, the `DEFAULT` configuration **must** include a `"name"` key in its JSON value. This key specifies the name of the container that SWAG should proxy traffic to.
|
||||
* If `PROXY_CONFIG_DEFAULT` is not set, the container will serve the standard SWAG welcome page on the root domain.
|
||||
|
||||
Example:
|
||||
```yaml
|
||||
environment:
|
||||
# This will proxy https://yourdomain.com to the 'dashboard' container on port 80
|
||||
- 'PROXY_CONFIG_DEFAULT={"name": "dashboard", "port": 80, "auth": "none"}'
|
||||
```
|
||||
|
||||
**Authentication Management**
|
||||
|
||||
Authentication can be managed globally or per-service with a clear order of precedence.
|
||||
|
||||
1. **Per-Service Override (Highest Priority):** Add an `auth` key directly inside the service's JSON configuration.
|
||||
* `"auth": "authelia"`: Enables Authelia for this service.
|
||||
* `"auth": "basic"`: Enables Basic Authentication for this service (see below).
|
||||
* `"auth": "none"`: Explicitly disables authentication for this service.
|
||||
|
||||
2. **Global Exclusions:** A comma-separated list of service names to exclude from the global authenticator.
|
||||
* `PROXY_AUTH_EXCLUDE=ntfy,public-dashboard`
|
||||
|
||||
3. **Global Default (Lowest Priority):** A single variable sets the default authentication provider for all services that don't have a per-service override and are not in the exclusion list.
|
||||
* `PROXY_AUTH_PROVIDER=authelia` (can be `ldap`, `authentik`, etc.)
|
||||
|
||||
**Basic Authentication**
|
||||
|
||||
If you set `"auth": "basic"` for any service, you must also provide the credentials using these two environment variables. The container will automatically create the necessary `.htpasswd` file.
|
||||
|
||||
* `PROXY_AUTH_BASIC_USER`: The username for basic authentication.
|
||||
* `PROXY_AUTH_BASIC_PASS`: The password for basic authentication.
|
||||
|
||||
Example:
|
||||
```yaml
|
||||
environment:
|
||||
- 'PROXY_CONFIG_PORTAINER={"port": 9000, "auth": "basic"}'
|
||||
- PROXY_AUTH_BASIC_USER=myadmin
|
||||
- PROXY_AUTH_BASIC_PASS=supersecretpassword
|
||||
```
|
||||
|
||||
### Security and password protection
|
||||
|
||||
* The container detects changes to url and subdomains, revokes existing certs and generates new ones during start.
|
||||
@@ -145,6 +224,16 @@ This will *ask* Google et al not to index and list your site. Be careful with th
|
||||
* Proxy sample files WILL be updated, however your renamed (enabled) proxy files will not.
|
||||
* You can check the new sample and adjust your active config as needed.
|
||||
|
||||
### QUIC support
|
||||
|
||||
This image supports QUIC (also known as HTTP/3) but it must be explicitly enabled in each proxy conf, and the default conf, because if the listener is enabled and you don't expose 443/UDP, it can break connections with some browsers.
|
||||
|
||||
To enable QUIC, expose 443/UDP to your clients, then uncomment both QUIC listeners in all of your active proxy confs, as well as the default conf, and restart the container.
|
||||
|
||||
You should also uncomment the `Alt-Svc` header in your `ssl.conf` so that browsers are aware that you offer QUIC connectivity.
|
||||
|
||||
It is [recommended](https://quic-go.net/docs/quic/optimizations/#udp-buffer-sizes) to increase the UDP send/recieve buffer **on the host** by setting the `net.core.rmem_max` and `net.core.wmem_max` sysctls. Suggested values are 4-16Mb (4194304-16777216 bytes). For persistence between reboots use `/etc/sysctl.d/`.
|
||||
|
||||
### 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).
|
||||
@@ -197,6 +286,7 @@ services:
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80 #optional
|
||||
- 443:443/udp #optional
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
@@ -224,6 +314,7 @@ docker run -d \
|
||||
-e SWAG_AUTORELOAD_WATCHLIST= `#optional` \
|
||||
-p 443:443 \
|
||||
-p 80:80 `#optional` \
|
||||
-p 443:443/udp `#optional` \
|
||||
-v /path/to/swag/config:/config \
|
||||
--restart unless-stopped \
|
||||
lscr.io/linuxserver/swag:latest
|
||||
@@ -237,6 +328,7 @@ Containers are configured using parameters passed at runtime (such as those abov
|
||||
| :----: | --- |
|
||||
| `-p 443:443` | HTTPS port |
|
||||
| `-p 80` | HTTP port (required for HTTP validation and HTTP -> HTTPS redirect) |
|
||||
| `-p 443/udp` | QUIC (HTTP/3) port. Must be enabled in the default and proxy confs. |
|
||||
| `-e PUID=1000` | for UserID - 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). |
|
||||
@@ -423,6 +515,9 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
|
||||
|
||||
## Versions
|
||||
|
||||
* **02.09.25:** - Add ability to define proxy configurations via environment variables.
|
||||
* **18.07.25:** - Rebase to Alpine 3.22 with PHP 8.4. Add QUIC support. Drop PHP bindings for mcrypt as it is no longer maintained.
|
||||
* **05.05.25:** - Disable Certbot's built in log rotation.
|
||||
* **19.01.25:** - Add [Auto Reload](https://github.com/linuxserver/docker-mods/tree/swag-auto-reload) functionality to SWAG.
|
||||
* **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).
|
||||
|
||||
@@ -1,365 +1,372 @@
|
||||
NAME VERSION TYPE
|
||||
Simple Launcher 1.1.0.14 dotnet (+5 duplicates)
|
||||
acl-libs 2.3.2-r1 apk
|
||||
acme 3.2.0 python
|
||||
alpine-baselayout 3.6.8-r1 apk
|
||||
alpine-baselayout-data 3.6.8-r1 apk
|
||||
alpine-keys 2.5-r0 apk
|
||||
alpine-release 3.21.2-r0 apk
|
||||
aom-libs 3.11.0-r0 apk
|
||||
apache2-utils 2.4.62-r0 apk
|
||||
apk-tools 2.14.6-r2 apk
|
||||
apr 1.7.5-r0 apk
|
||||
apr-util 1.6.3-r1 apk
|
||||
argon2-libs 20190702-r5 apk
|
||||
attrs 25.1.0 python
|
||||
autocommand 2.2.2 python
|
||||
azure-common 1.1.28 python
|
||||
azure-core 1.32.0 python
|
||||
azure-identity 1.19.0 python
|
||||
azure-mgmt-core 1.5.0 python
|
||||
azure-mgmt-dns 8.2.0 python
|
||||
backports-tarfile 1.2.0 python
|
||||
bash 5.2.37-r0 apk
|
||||
beautifulsoup4 4.13.3 python
|
||||
boto3 1.36.18 python
|
||||
botocore 1.36.18 python
|
||||
brotli-libs 1.1.0-r2 apk
|
||||
bs4 0.0.2 python
|
||||
busybox 1.37.0-r12 apk
|
||||
busybox-binsh 1.37.0-r12 apk
|
||||
c-ares 1.34.3-r0 apk
|
||||
c-client 2007f-r15 apk
|
||||
ca-certificates 20241121-r1 apk
|
||||
ca-certificates-bundle 20241121-r1 apk
|
||||
cachetools 5.5.1 python
|
||||
catatonit 0.2.0-r0 apk
|
||||
certbot 3.2.0 python
|
||||
certbot-dns-acmedns 0.1.0 python
|
||||
certbot-dns-aliyun 2.0.0 python
|
||||
certbot-dns-azure 2.6.1 python
|
||||
certbot-dns-bunny 3.0.0 python
|
||||
certbot-dns-cloudflare 3.2.0 python
|
||||
certbot-dns-cpanel 0.4.0 python
|
||||
certbot-dns-desec 1.2.1 python
|
||||
certbot-dns-digitalocean 3.2.0 python
|
||||
certbot-dns-directadmin 1.0.13 python
|
||||
certbot-dns-dnsimple 3.2.0 python
|
||||
certbot-dns-dnsmadeeasy 3.2.0 python
|
||||
certbot-dns-dnspod 0.1.0 python
|
||||
certbot-dns-do 0.31.0 python
|
||||
certbot-dns-domeneshop 0.2.9 python
|
||||
certbot-dns-dreamhost 1.0 python
|
||||
certbot-dns-duckdns 1.5 python
|
||||
certbot-dns-dynudns 0.0.6 python
|
||||
certbot-dns-freedns 0.2.0 python
|
||||
certbot-dns-gehirn 3.2.0 python
|
||||
certbot-dns-glesys 2.1.0 python
|
||||
certbot-dns-godaddy 2.8.0 python
|
||||
certbot-dns-google 3.2.0 python
|
||||
certbot-dns-he 1.0.0 python
|
||||
certbot-dns-hetzner 2.0.1 python
|
||||
certbot-dns-infomaniak 0.2.3 python
|
||||
certbot-dns-inwx 3.0.1 python
|
||||
certbot-dns-ionos 2024.11.9 python
|
||||
certbot-dns-linode 3.2.0 python
|
||||
certbot-dns-loopia 1.0.1 python
|
||||
certbot-dns-luadns 3.2.0 python
|
||||
certbot-dns-namecheap 1.0.0 python
|
||||
certbot-dns-netcup 1.4.4 python
|
||||
certbot-dns-njalla 2.0.2 python
|
||||
certbot-dns-nsone 3.2.0 python
|
||||
certbot-dns-ovh 3.2.0 python
|
||||
certbot-dns-porkbun 0.9.1 python
|
||||
certbot-dns-rfc2136 3.2.0 python
|
||||
certbot-dns-route53 3.2.0 python
|
||||
certbot-dns-sakuracloud 3.2.0 python
|
||||
certbot-dns-standalone 1.2.1 python
|
||||
certbot-dns-transip 0.5.2 python
|
||||
certbot-dns-vultr 1.1.0 python
|
||||
certbot-plugin-gandi 1.5.0 python
|
||||
certifi 2025.1.31 python
|
||||
cffi 1.17.1 python
|
||||
charset-normalizer 3.4.1 python
|
||||
cloudflare 2.19.4 python
|
||||
composer 2.8.5 binary
|
||||
configargparse 1.7 python
|
||||
configobj 5.0.9 python
|
||||
coreutils 9.5-r2 apk
|
||||
coreutils-env 9.5-r2 apk
|
||||
coreutils-fmt 9.5-r2 apk
|
||||
coreutils-sha512sum 9.5-r2 apk
|
||||
cryptography 44.0.1 python
|
||||
curl 8.11.1-r0 apk
|
||||
distro 1.9.0 python
|
||||
dns-lexicon 3.20.1 python
|
||||
dnslib 0.9.25 python
|
||||
dnspython 2.7.0 python
|
||||
domeneshop 0.4.4 python
|
||||
fail2ban 1.1.0 python
|
||||
fail2ban 1.1.0-r2 apk
|
||||
fail2ban-pyc 1.1.0-r2 apk
|
||||
filelock 3.17.0 python
|
||||
findutils 4.10.0-r0 apk
|
||||
fontconfig 2.15.0-r1 apk
|
||||
freetype 2.13.3-r0 apk
|
||||
future 1.0.0 python
|
||||
gdbm 1.24-r0 apk
|
||||
git 2.47.2-r0 apk
|
||||
git-init-template 2.47.2-r0 apk
|
||||
git-perl 2.47.2-r0 apk
|
||||
gmp 6.3.0-r2 apk
|
||||
gnupg 2.4.7-r0 apk
|
||||
gnupg-dirmngr 2.4.7-r0 apk
|
||||
gnupg-gpgconf 2.4.7-r0 apk
|
||||
gnupg-keyboxd 2.4.7-r0 apk
|
||||
gnupg-utils 2.4.7-r0 apk
|
||||
gnupg-wks-client 2.4.7-r0 apk
|
||||
gnutls 3.8.8-r0 apk
|
||||
google-api-core 2.24.1 python
|
||||
google-api-python-client 2.160.0 python
|
||||
google-auth 2.38.0 python
|
||||
google-auth-httplib2 0.2.0 python
|
||||
googleapis-common-protos 1.67.0rc1 python
|
||||
gpg 2.4.7-r0 apk
|
||||
gpg-agent 2.4.7-r0 apk
|
||||
gpg-wks-server 2.4.7-r0 apk
|
||||
gpgsm 2.4.7-r0 apk
|
||||
gpgv 2.4.7-r0 apk
|
||||
httplib2 0.22.0 python
|
||||
icu-data-en 74.2-r0 apk
|
||||
icu-libs 74.2-r0 apk
|
||||
idna 3.10 python
|
||||
importlib-metadata 8.0.0 python
|
||||
inflect 7.3.1 python
|
||||
inotify-tools 4.23.9.0-r0 apk
|
||||
inotify-tools-libs 4.23.9.0-r0 apk
|
||||
inwx-domrobot 3.2.0 python
|
||||
iptables 1.8.11-r1 apk
|
||||
iptables-legacy 1.8.11-r1 apk
|
||||
isodate 0.7.2 python
|
||||
jaraco-collections 5.1.0 python
|
||||
jaraco-context 5.3.0 python
|
||||
jaraco-functools 4.0.1 python
|
||||
jaraco-text 3.12.1 python
|
||||
jmespath 1.0.1 python
|
||||
josepy 1.15.0 python
|
||||
jq 1.7.1-r0 apk
|
||||
jsonlines 4.0.0 python
|
||||
jsonpickle 4.0.1 python
|
||||
libassuan 2.5.7-r0 apk
|
||||
libattr 2.5.2-r2 apk
|
||||
libavif 1.0.4-r0 apk
|
||||
libbsd 0.12.2-r0 apk
|
||||
libbz2 1.0.8-r6 apk
|
||||
libcrypto3 3.3.3-r0 apk
|
||||
libcurl 8.11.1-r0 apk
|
||||
libdav1d 1.5.0-r0 apk
|
||||
libedit 20240808.3.1-r0 apk
|
||||
libevent 2.1.12-r7 apk
|
||||
libexpat 2.6.4-r0 apk
|
||||
libffi 3.4.6-r0 apk
|
||||
libgcc 14.2.0-r4 apk
|
||||
libgcrypt 1.10.3-r1 apk
|
||||
libgd 2.3.3-r9 apk
|
||||
libgpg-error 1.51-r0 apk
|
||||
libice 1.1.1-r6 apk
|
||||
libidn2 2.3.7-r0 apk
|
||||
libintl 0.22.5-r0 apk
|
||||
libip4tc 1.8.11-r1 apk
|
||||
libip6tc 1.8.11-r1 apk
|
||||
libjpeg-turbo 3.0.4-r0 apk
|
||||
libksba 1.6.7-r0 apk
|
||||
libldap 2.6.8-r0 apk
|
||||
libmaxminddb-libs 1.9.1-r0 apk
|
||||
libmcrypt 2.5.8-r10 apk
|
||||
libmd 1.1.0-r0 apk
|
||||
libmemcached-libs 1.1.4-r1 apk
|
||||
libmnl 1.0.5-r2 apk
|
||||
libncursesw 6.5_p20241006-r3 apk
|
||||
libnftnl 1.2.8-r0 apk
|
||||
libpanelw 6.5_p20241006-r3 apk
|
||||
libpng 1.6.44-r0 apk
|
||||
libpq 17.2-r0 apk
|
||||
libproc2 4.0.4-r2 apk
|
||||
libpsl 0.21.5-r3 apk
|
||||
libsasl 2.1.28-r8 apk
|
||||
libseccomp 2.5.5-r1 apk
|
||||
libsharpyuv 1.4.0-r0 apk
|
||||
libsm 1.2.4-r4 apk
|
||||
libsodium 1.0.20-r0 apk
|
||||
libssl3 3.3.3-r0 apk
|
||||
libstdc++ 14.2.0-r4 apk
|
||||
libtasn1 4.20.0-r0 apk
|
||||
libunistring 1.2-r0 apk
|
||||
libuuid 2.40.4-r0 apk
|
||||
libwebp 1.4.0-r0 apk
|
||||
libx11 1.8.10-r0 apk
|
||||
libxau 1.0.11-r4 apk
|
||||
libxcb 1.16.1-r0 apk
|
||||
libxdmcp 1.1.5-r1 apk
|
||||
libxext 1.3.6-r2 apk
|
||||
libxml2 2.13.4-r3 apk
|
||||
libxpm 3.5.17-r0 apk
|
||||
libxslt 1.1.42-r1 apk
|
||||
libxt 1.3.1-r0 apk
|
||||
libxtables 1.8.11-r1 apk
|
||||
libzip 1.11.2-r0 apk
|
||||
linux-pam 1.6.1-r1 apk
|
||||
logrotate 3.21.0-r1 apk
|
||||
loopialib 0.2.0 python
|
||||
lxml 5.3.1 python
|
||||
lz4-libs 1.10.0-r0 apk
|
||||
memcached 1.6.32-r0 apk
|
||||
mock 5.1.0 python
|
||||
more-itertools 10.3.0 python
|
||||
mpdecimal 4.0.0-r0 apk
|
||||
msal 1.31.1 python
|
||||
msal-extensions 1.2.0 python
|
||||
musl 1.2.5-r8 apk
|
||||
musl-utils 1.2.5-r8 apk
|
||||
my-test-package 1.0 python
|
||||
nano 8.2-r0 apk
|
||||
ncurses-terminfo-base 6.5_p20241006-r3 apk
|
||||
netcat-openbsd 1.226.1.1-r0 apk
|
||||
nettle 3.10-r1 apk
|
||||
nghttp2-libs 1.64.0-r0 apk
|
||||
nginx 1.26.2-r4 apk
|
||||
nginx-mod-devel-kit 1.26.2-r4 apk
|
||||
nginx-mod-http-brotli 1.26.2-r4 apk
|
||||
nginx-mod-http-dav-ext 1.26.2-r4 apk
|
||||
nginx-mod-http-echo 1.26.2-r4 apk
|
||||
nginx-mod-http-fancyindex 1.26.2-r4 apk
|
||||
nginx-mod-http-geoip2 1.26.2-r4 apk
|
||||
nginx-mod-http-headers-more 1.26.2-r4 apk
|
||||
nginx-mod-http-image-filter 1.26.2-r4 apk
|
||||
nginx-mod-http-perl 1.26.2-r4 apk
|
||||
nginx-mod-http-redis2 1.26.2-r4 apk
|
||||
nginx-mod-http-set-misc 1.26.2-r4 apk
|
||||
nginx-mod-http-upload-progress 1.26.2-r4 apk
|
||||
nginx-mod-http-xslt-filter 1.26.2-r4 apk
|
||||
nginx-mod-mail 1.26.2-r4 apk
|
||||
nginx-mod-rtmp 1.26.2-r4 apk
|
||||
nginx-mod-stream 1.26.2-r4 apk
|
||||
nginx-mod-stream-geoip2 1.26.2-r4 apk
|
||||
nginx-vim 1.26.2-r4 apk
|
||||
npth 1.6-r4 apk
|
||||
oniguruma 6.9.9-r0 apk
|
||||
openssl 3.3.3-r0 apk
|
||||
p11-kit 0.25.5-r2 apk
|
||||
packaging 24.2 python
|
||||
parsedatetime 2.6 python
|
||||
pcre 8.45-r3 apk
|
||||
pcre2 10.43-r0 apk
|
||||
perl 5.40.1-r0 apk
|
||||
perl-error 0.17029-r2 apk
|
||||
perl-git 2.47.2-r0 apk
|
||||
php83 8.3.16-r0 apk
|
||||
php83-bcmath 8.3.16-r0 apk
|
||||
php83-bz2 8.3.16-r0 apk
|
||||
php83-common 8.3.16-r0 apk
|
||||
php83-ctype 8.3.16-r0 apk
|
||||
php83-curl 8.3.16-r0 apk
|
||||
php83-dom 8.3.16-r0 apk
|
||||
php83-exif 8.3.16-r0 apk
|
||||
php83-fileinfo 8.3.16-r0 apk
|
||||
php83-fpm 8.3.16-r0 apk
|
||||
php83-ftp 8.3.16-r0 apk
|
||||
php83-gd 8.3.16-r0 apk
|
||||
php83-gmp 8.3.16-r0 apk
|
||||
php83-iconv 8.3.16-r0 apk
|
||||
php83-imap 8.3.16-r0 apk
|
||||
php83-intl 8.3.16-r0 apk
|
||||
php83-ldap 8.3.16-r0 apk
|
||||
php83-mbstring 8.3.16-r0 apk
|
||||
php83-mysqli 8.3.16-r0 apk
|
||||
php83-mysqlnd 8.3.16-r0 apk
|
||||
php83-opcache 8.3.16-r0 apk
|
||||
php83-openssl 8.3.16-r0 apk
|
||||
php83-pdo 8.3.16-r0 apk
|
||||
php83-pdo_mysql 8.3.16-r0 apk
|
||||
php83-pdo_odbc 8.3.16-r0 apk
|
||||
php83-pdo_pgsql 8.3.16-r0 apk
|
||||
php83-pdo_sqlite 8.3.16-r0 apk
|
||||
php83-pear 8.3.16-r0 apk
|
||||
php83-pecl-apcu 5.1.24-r0 apk
|
||||
php83-pecl-igbinary 3.2.16-r0 apk
|
||||
php83-pecl-mcrypt 1.0.7-r0 apk
|
||||
php83-pecl-memcached 3.3.0-r0 apk
|
||||
php83-pecl-msgpack 3.0.0-r0 apk
|
||||
php83-pecl-redis 6.1.0-r0 apk
|
||||
php83-pgsql 8.3.16-r0 apk
|
||||
php83-phar 8.3.16-r0 apk
|
||||
php83-posix 8.3.16-r0 apk
|
||||
php83-session 8.3.16-r0 apk
|
||||
php83-simplexml 8.3.16-r0 apk
|
||||
php83-soap 8.3.16-r0 apk
|
||||
php83-sockets 8.3.16-r0 apk
|
||||
php83-sodium 8.3.16-r0 apk
|
||||
php83-sqlite3 8.3.16-r0 apk
|
||||
php83-tokenizer 8.3.16-r0 apk
|
||||
php83-xml 8.3.16-r0 apk
|
||||
php83-xmlreader 8.3.16-r0 apk
|
||||
php83-xmlwriter 8.3.16-r0 apk
|
||||
php83-xsl 8.3.16-r0 apk
|
||||
php83-zip 8.3.16-r0 apk
|
||||
pinentry 1.3.1-r0 apk
|
||||
pip 25.0.1 python
|
||||
pkb-client 2.0.0 python
|
||||
platformdirs 4.2.2 python
|
||||
popt 1.19-r4 apk
|
||||
portalocker 2.10.1 python
|
||||
procps-ng 4.0.4-r2 apk
|
||||
proto-plus 1.26.0 python
|
||||
protobuf 5.29.3 python
|
||||
pyacmedns 0.4 python
|
||||
pyasn1 0.6.1 python
|
||||
pyasn1-modules 0.4.1 python
|
||||
pyc 3.12.9-r0 apk
|
||||
pycparser 2.22 python
|
||||
pyjwt 2.10.1 python
|
||||
pynamecheap 0.0.3 python
|
||||
pyopenssl 25.0.0 python
|
||||
pyotp 2.9.0 python
|
||||
pyparsing 3.2.1 python
|
||||
pyrfc3339 2.0.1 python
|
||||
python-dateutil 2.9.0.post0 python
|
||||
python-digitalocean 1.17.0 python
|
||||
python-transip 0.6.0 python
|
||||
python3 3.12.9-r0 apk
|
||||
python3-pyc 3.12.9-r0 apk
|
||||
python3-pycache-pyc0 3.12.9-r0 apk
|
||||
pytz 2025.1 python
|
||||
pyyaml 6.0.2 python
|
||||
readline 8.2.13-r0 apk
|
||||
requests 2.32.3 python
|
||||
requests-file 2.1.0 python
|
||||
requests-mock 1.12.1 python
|
||||
rsa 4.9 python
|
||||
s3transfer 0.11.2 python
|
||||
scanelf 1.3.8-r1 apk
|
||||
setuptools 75.8.0 python
|
||||
shadow 4.16.0-r1 apk
|
||||
six 1.17.0 python
|
||||
skalibs-libs 2.14.3.0-r0 apk
|
||||
soupsieve 2.6 python
|
||||
sqlite-libs 3.48.0-r0 apk
|
||||
ssl_client 1.37.0-r12 apk
|
||||
tiff 4.7.0-r0 apk
|
||||
tldextract 5.1.3 python
|
||||
tomli 2.0.1 python
|
||||
typeguard 4.3.0 python
|
||||
typing-extensions 4.12.2 python (+1 duplicate)
|
||||
tzdata 2024b-r1 apk
|
||||
unixodbc 2.3.12-r0 apk
|
||||
uritemplate 4.1.1 python
|
||||
urllib3 2.3.0 python
|
||||
utmps-libs 0.1.2.3-r2 apk
|
||||
wheel 0.43.0 python
|
||||
wheel 0.45.1 python
|
||||
whois 5.5.23-r0 apk
|
||||
xz-libs 5.6.3-r0 apk
|
||||
zipp 3.19.2 python
|
||||
zlib 1.3.1-r2 apk
|
||||
zope-interface 7.2 python
|
||||
zstd-libs 1.5.6-r2 apk
|
||||
NAME VERSION TYPE
|
||||
Simple Launcher 1.1.0.14 binary (+5 duplicates)
|
||||
acl-libs 2.3.2-r1 apk
|
||||
acme 4.2.0 python
|
||||
alpine-baselayout 3.7.0-r0 apk
|
||||
alpine-baselayout-data 3.7.0-r0 apk
|
||||
alpine-keys 2.5-r0 apk
|
||||
alpine-release 3.22.1-r0 apk
|
||||
aom-libs 3.12.1-r0 apk
|
||||
apache2-utils 2.4.65-r0 apk
|
||||
apk-tools 2.14.9-r2 apk
|
||||
apr 1.7.5-r0 apk
|
||||
apr-util 1.6.3-r1 apk
|
||||
argon2-libs 20190702-r5 apk
|
||||
attrs 25.3.0 python
|
||||
autocommand 2.2.2 python
|
||||
azure-common 1.1.28 python
|
||||
azure-core 1.35.0 python
|
||||
azure-identity 1.24.0 python
|
||||
azure-mgmt-core 1.6.0 python
|
||||
azure-mgmt-dns 9.0.0 python
|
||||
backports-tarfile 1.2.0 python
|
||||
bash 5.2.37-r0 apk
|
||||
beautifulsoup4 4.13.5 python
|
||||
boto3 1.40.21 python
|
||||
botocore 1.40.21 python
|
||||
brotli-libs 1.1.0-r2 apk
|
||||
bs4 0.0.2 python
|
||||
busybox 1.37.0-r19 apk
|
||||
busybox-binsh 1.37.0-r19 apk
|
||||
c-ares 1.34.5-r0 apk
|
||||
c-client 2007f-r15 apk
|
||||
ca-certificates 20250619-r0 apk
|
||||
ca-certificates-bundle 20250619-r0 apk
|
||||
cachetools 5.5.2 python
|
||||
catatonit 0.2.1-r0 apk
|
||||
certbot 4.2.0 python
|
||||
certbot-dns-acmedns 0.1.0 python
|
||||
certbot-dns-aliyun 2.0.0 python
|
||||
certbot-dns-azure 1.5.0 python
|
||||
certbot-dns-bunny 3.0.0 python
|
||||
certbot-dns-cloudflare 4.2.0 python
|
||||
certbot-dns-cpanel 0.4.0 python
|
||||
certbot-dns-desec 1.2.1 python
|
||||
certbot-dns-digitalocean 4.2.0 python
|
||||
certbot-dns-directadmin 1.0.15 python
|
||||
certbot-dns-dnsimple 4.2.0 python
|
||||
certbot-dns-dnsmadeeasy 4.2.0 python
|
||||
certbot-dns-dnspod 0.1.0 python
|
||||
certbot-dns-do 0.31.0 python
|
||||
certbot-dns-domeneshop 0.2.9 python
|
||||
certbot-dns-dreamhost 1.0 python
|
||||
certbot-dns-duckdns 1.6 python
|
||||
certbot-dns-dynudns 0.0.6 python
|
||||
certbot-dns-freedns 0.2.0 python
|
||||
certbot-dns-gehirn 4.2.0 python
|
||||
certbot-dns-glesys 2.1.0 python
|
||||
certbot-dns-godaddy 2.8.0 python
|
||||
certbot-dns-google 4.2.0 python
|
||||
certbot-dns-he 1.0.0 python
|
||||
certbot-dns-hetzner 2.0.1 python
|
||||
certbot-dns-infomaniak 0.2.3 python
|
||||
certbot-dns-inwx 3.0.3 python
|
||||
certbot-dns-ionos 2024.11.9 python
|
||||
certbot-dns-linode 4.2.0 python
|
||||
certbot-dns-loopia 1.0.1 python
|
||||
certbot-dns-luadns 4.2.0 python
|
||||
certbot-dns-namecheap 1.0.0 python
|
||||
certbot-dns-netcup 1.4.4 python
|
||||
certbot-dns-njalla 2.0.2 python
|
||||
certbot-dns-nsone 4.2.0 python
|
||||
certbot-dns-ovh 4.2.0 python
|
||||
certbot-dns-porkbun 0.10.1 python
|
||||
certbot-dns-rfc2136 4.2.0 python
|
||||
certbot-dns-route53 4.2.0 python
|
||||
certbot-dns-sakuracloud 4.2.0 python
|
||||
certbot-dns-standalone 1.2.1 python
|
||||
certbot-dns-transip 0.5.2 python
|
||||
certbot-dns-vultr 1.1.0 python
|
||||
certbot-plugin-gandi 1.5.0 python
|
||||
certifi 2025.8.3 python
|
||||
cffi 1.17.1 python
|
||||
charset-normalizer 3.4.3 python
|
||||
cli UNKNOWN binary
|
||||
cli-32 UNKNOWN binary
|
||||
cli-64 UNKNOWN binary
|
||||
cli-arm64 UNKNOWN binary
|
||||
cloudflare 2.19.4 python
|
||||
composer 2.8.11 binary
|
||||
configargparse 1.7.1 python
|
||||
configobj 5.0.9 python
|
||||
coreutils 9.7-r1 apk
|
||||
coreutils-env 9.7-r1 apk
|
||||
coreutils-fmt 9.7-r1 apk
|
||||
coreutils-sha512sum 9.7-r1 apk
|
||||
cryptography 45.0.6 python
|
||||
curl 8.14.1-r1 apk
|
||||
distro 1.9.0 python
|
||||
dns-lexicon 3.21.1 python
|
||||
dnslib 0.9.26 python
|
||||
dnspython 2.7.0 python
|
||||
domeneshop 0.4.4 python
|
||||
fail2ban 1.1.0 python
|
||||
fail2ban 1.1.0-r3 apk
|
||||
fail2ban-pyc 1.1.0-r3 apk
|
||||
filelock 3.19.1 python
|
||||
findutils 4.10.0-r0 apk
|
||||
fontconfig 2.15.0-r3 apk
|
||||
freetype 2.13.3-r0 apk
|
||||
future 1.0.0 python
|
||||
gdbm 1.24-r0 apk
|
||||
git 2.49.1-r0 apk
|
||||
git-init-template 2.49.1-r0 apk
|
||||
git-perl 2.49.1-r0 apk
|
||||
gmp 6.3.0-r3 apk
|
||||
gnupg 2.4.7-r0 apk
|
||||
gnupg-dirmngr 2.4.7-r0 apk
|
||||
gnupg-gpgconf 2.4.7-r0 apk
|
||||
gnupg-keyboxd 2.4.7-r0 apk
|
||||
gnupg-utils 2.4.7-r0 apk
|
||||
gnupg-wks-client 2.4.7-r0 apk
|
||||
gnutls 3.8.8-r0 apk
|
||||
google-api-core 2.25.1 python
|
||||
google-api-python-client 2.179.0 python
|
||||
google-auth 2.40.3 python
|
||||
google-auth-httplib2 0.2.0 python
|
||||
googleapis-common-protos 1.70.0 python
|
||||
gpg 2.4.7-r0 apk
|
||||
gpg-agent 2.4.7-r0 apk
|
||||
gpg-wks-server 2.4.7-r0 apk
|
||||
gpgsm 2.4.7-r0 apk
|
||||
gpgv 2.4.7-r0 apk
|
||||
gui UNKNOWN binary
|
||||
gui-32 UNKNOWN binary
|
||||
gui-64 UNKNOWN binary
|
||||
gui-arm64 UNKNOWN binary
|
||||
httplib2 0.30.0 python
|
||||
icu-data-en 76.1-r1 apk
|
||||
icu-libs 76.1-r1 apk
|
||||
idna 3.10 python
|
||||
importlib-metadata 8.0.0 python
|
||||
inflect 7.3.1 python
|
||||
inotify-tools 4.23.9.0-r0 apk
|
||||
inotify-tools-libs 4.23.9.0-r0 apk
|
||||
inwx-domrobot 3.2.0 python
|
||||
iptables 1.8.11-r1 apk
|
||||
iptables-legacy 1.8.11-r1 apk
|
||||
isodate 0.7.2 python
|
||||
jaraco-collections 5.1.0 python
|
||||
jaraco-context 5.3.0 python
|
||||
jaraco-functools 4.0.1 python
|
||||
jaraco-text 3.12.1 python
|
||||
jinja2 3.1.6 python
|
||||
jmespath 1.0.1 python
|
||||
josepy 2.1.0 python
|
||||
jq 1.8.0-r0 apk
|
||||
jsonlines 4.0.0 python
|
||||
jsonpickle 4.1.1 python
|
||||
libapk2 2.14.9-r2 apk
|
||||
libassuan 2.5.7-r0 apk
|
||||
libattr 2.5.2-r2 apk
|
||||
libavif 1.3.0-r0 apk
|
||||
libbsd 0.12.2-r0 apk
|
||||
libbz2 1.0.8-r6 apk
|
||||
libcrypto3 3.5.2-r0 apk
|
||||
libcurl 8.14.1-r1 apk
|
||||
libdav1d 1.5.1-r0 apk
|
||||
libedit 20250104.3.1-r1 apk
|
||||
libevent 2.1.12-r8 apk
|
||||
libexpat 2.7.1-r0 apk
|
||||
libffi 3.4.8-r0 apk
|
||||
libgcc 14.2.0-r6 apk
|
||||
libgcrypt 1.10.3-r1 apk
|
||||
libgd 2.3.3-r10 apk
|
||||
libgpg-error 1.55-r0 apk
|
||||
libice 1.1.2-r0 apk
|
||||
libidn2 2.3.7-r0 apk
|
||||
libintl 0.24.1-r0 apk
|
||||
libip4tc 1.8.11-r1 apk
|
||||
libip6tc 1.8.11-r1 apk
|
||||
libjpeg-turbo 3.1.0-r0 apk
|
||||
libksba 1.6.7-r0 apk
|
||||
libldap 2.6.8-r0 apk
|
||||
libmaxminddb-libs 1.9.1-r0 apk
|
||||
libmd 1.1.0-r0 apk
|
||||
libmemcached-libs 1.1.4-r1 apk
|
||||
libmnl 1.0.5-r2 apk
|
||||
libncursesw 6.5_p20250503-r0 apk
|
||||
libnftnl 1.2.9-r0 apk
|
||||
libpanelw 6.5_p20250503-r0 apk
|
||||
libpng 1.6.47-r0 apk
|
||||
libpq 17.6-r0 apk
|
||||
libproc2 4.0.4-r3 apk
|
||||
libpsl 0.21.5-r3 apk
|
||||
libsasl 2.1.28-r8 apk
|
||||
libseccomp 2.6.0-r0 apk
|
||||
libsharpyuv 1.5.0-r0 apk
|
||||
libsm 1.2.5-r0 apk
|
||||
libsodium 1.0.20-r0 apk
|
||||
libssl3 3.5.2-r0 apk
|
||||
libstdc++ 14.2.0-r6 apk
|
||||
libtasn1 4.20.0-r0 apk
|
||||
libunistring 1.3-r0 apk
|
||||
libuuid 2.41-r9 apk
|
||||
libwebp 1.5.0-r0 apk
|
||||
libx11 1.8.11-r0 apk
|
||||
libxau 1.0.12-r0 apk
|
||||
libxcb 1.17.0-r0 apk
|
||||
libxdmcp 1.1.5-r1 apk
|
||||
libxext 1.3.6-r2 apk
|
||||
libxml2 2.13.8-r0 apk
|
||||
libxpm 3.5.17-r0 apk
|
||||
libxslt 1.1.43-r3 apk
|
||||
libxt 1.3.1-r0 apk
|
||||
libxtables 1.8.11-r1 apk
|
||||
libyuv 0.0.1887.20251502-r1 apk
|
||||
libzip 1.11.4-r0 apk
|
||||
linux-pam 1.7.0-r4 apk
|
||||
logrotate 3.21.0-r1 apk
|
||||
loopialib 0.2.0 python
|
||||
lxml 6.0.1 python
|
||||
lz4-libs 1.10.0-r0 apk
|
||||
markupsafe 3.0.2 python
|
||||
memcached 1.6.32-r0 apk
|
||||
mock 5.2.0 python
|
||||
more-itertools 10.3.0 python
|
||||
mpdecimal 4.0.1-r0 apk
|
||||
msal 1.33.0 python
|
||||
msal-extensions 1.3.1 python
|
||||
musl 1.2.5-r10 apk
|
||||
musl-utils 1.2.5-r10 apk
|
||||
my-test-package 1.0 python
|
||||
nano 8.4-r0 apk
|
||||
ncurses-terminfo-base 6.5_p20250503-r0 apk
|
||||
netcat-openbsd 1.229.1-r0 apk
|
||||
nettle 3.10.1-r0 apk
|
||||
nghttp2-libs 1.65.0-r0 apk
|
||||
nginx 1.28.0-r3 apk
|
||||
nginx-mod-devel-kit 1.28.0-r3 apk
|
||||
nginx-mod-http-brotli 1.28.0-r3 apk
|
||||
nginx-mod-http-dav-ext 1.28.0-r3 apk
|
||||
nginx-mod-http-echo 1.28.0-r3 apk
|
||||
nginx-mod-http-fancyindex 1.28.0-r3 apk
|
||||
nginx-mod-http-geoip2 1.28.0-r3 apk
|
||||
nginx-mod-http-headers-more 1.28.0-r3 apk
|
||||
nginx-mod-http-image-filter 1.28.0-r3 apk
|
||||
nginx-mod-http-perl 1.28.0-r3 apk
|
||||
nginx-mod-http-redis2 1.28.0-r3 apk
|
||||
nginx-mod-http-set-misc 1.28.0-r3 apk
|
||||
nginx-mod-http-upload-progress 1.28.0-r3 apk
|
||||
nginx-mod-http-xslt-filter 1.28.0-r3 apk
|
||||
nginx-mod-mail 1.28.0-r3 apk
|
||||
nginx-mod-rtmp 1.28.0-r3 apk
|
||||
nginx-mod-stream 1.28.0-r3 apk
|
||||
nginx-mod-stream-geoip2 1.28.0-r3 apk
|
||||
nginx-vim 1.28.0-r3 apk
|
||||
npth 1.8-r0 apk
|
||||
oniguruma 6.9.10-r0 apk
|
||||
openssl 3.5.2-r0 apk
|
||||
p11-kit 0.25.5-r2 apk
|
||||
packaging 24.2 python
|
||||
parsedatetime 2.6 python
|
||||
pcre2 10.43-r1 apk
|
||||
perl 5.40.3-r0 apk
|
||||
perl-error 0.17030-r0 apk
|
||||
perl-git 2.49.1-r0 apk
|
||||
php84 8.4.11-r0 apk
|
||||
php84-bcmath 8.4.11-r0 apk
|
||||
php84-bz2 8.4.11-r0 apk
|
||||
php84-common 8.4.11-r0 apk
|
||||
php84-ctype 8.4.11-r0 apk
|
||||
php84-curl 8.4.11-r0 apk
|
||||
php84-dom 8.4.11-r0 apk
|
||||
php84-exif 8.4.11-r0 apk
|
||||
php84-fileinfo 8.4.11-r0 apk
|
||||
php84-fpm 8.4.11-r0 apk
|
||||
php84-ftp 8.4.11-r0 apk
|
||||
php84-gd 8.4.11-r0 apk
|
||||
php84-gmp 8.4.11-r0 apk
|
||||
php84-iconv 8.4.11-r0 apk
|
||||
php84-intl 8.4.11-r0 apk
|
||||
php84-ldap 8.4.11-r0 apk
|
||||
php84-mbstring 8.4.11-r0 apk
|
||||
php84-mysqli 8.4.11-r0 apk
|
||||
php84-mysqlnd 8.4.11-r0 apk
|
||||
php84-opcache 8.4.11-r0 apk
|
||||
php84-openssl 8.4.11-r0 apk
|
||||
php84-pdo 8.4.11-r0 apk
|
||||
php84-pdo_mysql 8.4.11-r0 apk
|
||||
php84-pdo_odbc 8.4.11-r0 apk
|
||||
php84-pdo_pgsql 8.4.11-r0 apk
|
||||
php84-pdo_sqlite 8.4.11-r0 apk
|
||||
php84-pear 8.4.11-r0 apk
|
||||
php84-pecl-apcu 5.1.27-r0 apk
|
||||
php84-pecl-igbinary 3.2.16-r1 apk
|
||||
php84-pecl-imap 1.0.3-r0 apk
|
||||
php84-pecl-memcached 3.3.0-r0 apk
|
||||
php84-pecl-msgpack 3.0.0-r0 apk
|
||||
php84-pecl-redis 6.2.0-r0 apk
|
||||
php84-pgsql 8.4.11-r0 apk
|
||||
php84-phar 8.4.11-r0 apk
|
||||
php84-posix 8.4.11-r0 apk
|
||||
php84-session 8.4.11-r0 apk
|
||||
php84-simplexml 8.4.11-r0 apk
|
||||
php84-soap 8.4.11-r0 apk
|
||||
php84-sockets 8.4.11-r0 apk
|
||||
php84-sodium 8.4.11-r0 apk
|
||||
php84-sqlite3 8.4.11-r0 apk
|
||||
php84-tokenizer 8.4.11-r0 apk
|
||||
php84-xml 8.4.11-r0 apk
|
||||
php84-xmlreader 8.4.11-r0 apk
|
||||
php84-xmlwriter 8.4.11-r0 apk
|
||||
php84-xsl 8.4.11-r0 apk
|
||||
php84-zip 8.4.11-r0 apk
|
||||
pinentry 1.3.1-r0 apk
|
||||
pip 25.2 python
|
||||
pkb-client 2.2.0 python
|
||||
platformdirs 4.2.2 python
|
||||
popt 1.19-r4 apk
|
||||
procps-ng 4.0.4-r3 apk
|
||||
proto-plus 1.26.1 python
|
||||
protobuf 6.32.0 python
|
||||
pyacmedns 0.4 python
|
||||
pyasn1 0.6.1 python
|
||||
pyasn1-modules 0.4.2 python
|
||||
pyc 3.12.11-r0 apk
|
||||
pycparser 2.22 python
|
||||
pyjwt 2.10.1 python
|
||||
pynamecheap 0.0.3 python
|
||||
pyopenssl 25.1.0 python
|
||||
pyotp 2.9.0 python
|
||||
pyparsing 3.2.3 python
|
||||
pyrfc3339 2.1.0 python
|
||||
python-dateutil 2.9.0.post0 python
|
||||
python-digitalocean 1.17.0 python
|
||||
python-transip 0.6.0 python
|
||||
python3 3.12.11-r0 apk
|
||||
python3-pyc 3.12.11-r0 apk
|
||||
python3-pycache-pyc0 3.12.11-r0 apk
|
||||
pyyaml 6.0.2 python
|
||||
readline 8.2.13-r1 apk
|
||||
requests 2.32.5 python
|
||||
requests-file 2.1.0 python
|
||||
requests-mock 1.12.1 python
|
||||
rsa 4.9.1 python
|
||||
s3transfer 0.13.1 python
|
||||
scanelf 1.3.8-r1 apk
|
||||
setuptools 80.9.0 python
|
||||
shadow 4.17.3-r0 apk
|
||||
six 1.17.0 python
|
||||
skalibs-libs 2.14.4.0-r0 apk
|
||||
soupsieve 2.8 python
|
||||
sqlite-libs 3.49.2-r1 apk
|
||||
ssl_client 1.37.0-r19 apk
|
||||
tiff 4.7.0-r0 apk
|
||||
tldextract 5.3.0 python
|
||||
tomli 2.0.1 python
|
||||
typeguard 4.3.0 python
|
||||
typing-extensions 4.12.2 python
|
||||
typing-extensions 4.15.0 python
|
||||
tzdata 2025b-r0 apk
|
||||
unixodbc 2.3.12-r0 apk
|
||||
uritemplate 4.2.0 python
|
||||
urllib3 2.5.0 python
|
||||
utmps-libs 0.1.3.1-r0 apk
|
||||
wheel 0.45.1 python (+1 duplicate)
|
||||
whois 5.6.3-r0 apk
|
||||
xz-libs 5.8.1-r0 apk
|
||||
zipp 3.19.2 python
|
||||
zlib 1.3.1-r2 apk
|
||||
zope-interface 7.2 python
|
||||
zstd-libs 1.5.7-r0 apk
|
||||
|
||||
100
readme-vars.yml
100
readme-vars.yml
@@ -44,6 +44,7 @@ opt_param_env_vars:
|
||||
opt_param_usage_include_ports: true
|
||||
opt_param_ports:
|
||||
- {external_port: "80", internal_port: "80", port_desc: "HTTP port (required for HTTP validation and HTTP -> HTTPS redirect)"}
|
||||
- {external_port: "443", internal_port: "443/udp", port_desc: "QUIC (HTTP/3) port. Must be enabled in the default and proxy confs."}
|
||||
readonly_supported: true
|
||||
readonly_message: |
|
||||
* `/tmp` must be mounted to tmpfs
|
||||
@@ -81,6 +82,88 @@ app_setup_block: |
|
||||
Set the required credentials (usually found in the plugin documentation) in `/config/dns-conf/<plugin>.ini`.
|
||||
It is recommended to attempt obtaining a certificate with `STAGING=true` first to make sure the plugin is working as expected.
|
||||
|
||||
|
||||
### Dynamic Reverse Proxy Configuration via Environment Variables
|
||||
|
||||
SWAG can dynamically generate reverse proxy configuration files directly from environment variables, bypassing the need to manage individual `.conf` files. When any `PROXY_CONFIG_*` variable is detected, this mode is activated, and any existing `.conf` files in `/config/nginx/proxy-confs/` will be removed at startup.
|
||||
|
||||
**Service Definition**
|
||||
|
||||
Each reverse proxy service is defined by an environment variable following the format `PROXY_CONFIG_<SERVICE_NAME>`. The service name will be used as the subdomain (e.g., `SERVICE_NAME.yourdomain.com`), with the special exception of `DEFAULT` (see below). The value of the variable must be a valid JSON object.
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
# Configure the default site (root domain) to proxy to a dashboard service
|
||||
- 'PROXY_CONFIG_DEFAULT={"name": "dashboard", "port": 80, "auth": "authelia", "quic": true}'
|
||||
|
||||
# Simple subdomain service
|
||||
- 'PROXY_CONFIG_HOMARR={"port": 7575, "auth": "authelia"}'
|
||||
|
||||
# Service with a boolean flag for HTTPS backend and QUIC enabled
|
||||
- 'PROXY_CONFIG_HEIMDALL={"port": 443, "https": true, "quic": true}'
|
||||
|
||||
# Complex service with nested objects and lists (incomplete example for syntax)
|
||||
- 'PROXY_CONFIG_PLEX={
|
||||
"port": 32400,
|
||||
"proxy_redirect_off": true,
|
||||
"buffering_off": true,
|
||||
"proxy_set_headers": [
|
||||
{"key": "X-Plex-Client-Identifier", "value": "$$http_x_plex_client_identifier"},
|
||||
{"key": "X-Plex-Device", "value": "$$http_x_plex_device"}
|
||||
],
|
||||
"extra_locations": [
|
||||
{"path": "/library/streams/", "custom_directives": ["proxy_pass_request_headers off"]}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
The available keys in the JSON object correspond to the options in the underlying Nginx template. Common keys include `port`, `https`, `quic`, `auth`, `buffering_off`, `proxy_set_headers`, and `extra_locations`.
|
||||
|
||||
**Configuring the Default Site (Root Domain)**
|
||||
|
||||
To configure the service that responds on your root domain (e.g., `https://yourdomain.com`), use the special service name `DEFAULT`.
|
||||
|
||||
* The environment variable is `PROXY_CONFIG_DEFAULT`.
|
||||
* Unlike subdomain services, the `DEFAULT` configuration **must** include a `"name"` key in its JSON value. This key specifies the name of the container that SWAG should proxy traffic to.
|
||||
* If `PROXY_CONFIG_DEFAULT` is not set, the container will serve the standard SWAG welcome page on the root domain.
|
||||
|
||||
Example:
|
||||
```yaml
|
||||
environment:
|
||||
# This will proxy https://yourdomain.com to the 'dashboard' container on port 80
|
||||
- 'PROXY_CONFIG_DEFAULT={"name": "dashboard", "port": 80, "auth": "none"}'
|
||||
```
|
||||
|
||||
**Authentication Management**
|
||||
|
||||
Authentication can be managed globally or per-service with a clear order of precedence.
|
||||
|
||||
1. **Per-Service Override (Highest Priority):** Add an `auth` key directly inside the service's JSON configuration.
|
||||
* `"auth": "authelia"`: Enables Authelia for this service.
|
||||
* `"auth": "basic"`: Enables Basic Authentication for this service (see below).
|
||||
* `"auth": "none"`: Explicitly disables authentication for this service.
|
||||
|
||||
2. **Global Exclusions:** A comma-separated list of service names to exclude from the global authenticator.
|
||||
* `PROXY_AUTH_EXCLUDE=ntfy,public-dashboard`
|
||||
|
||||
3. **Global Default (Lowest Priority):** A single variable sets the default authentication provider for all services that don't have a per-service override and are not in the exclusion list.
|
||||
* `PROXY_AUTH_PROVIDER=authelia` (can be `ldap`, `authentik`, etc.)
|
||||
|
||||
**Basic Authentication**
|
||||
|
||||
If you set `"auth": "basic"` for any service, you must also provide the credentials using these two environment variables. The container will automatically create the necessary `.htpasswd` file.
|
||||
|
||||
* `PROXY_AUTH_BASIC_USER`: The username for basic authentication.
|
||||
* `PROXY_AUTH_BASIC_PASS`: The password for basic authentication.
|
||||
|
||||
Example:
|
||||
```yaml
|
||||
environment:
|
||||
- 'PROXY_CONFIG_PORTAINER={"port": 9000, "auth": "basic"}'
|
||||
- PROXY_AUTH_BASIC_USER=myadmin
|
||||
- PROXY_AUTH_BASIC_PASS=supersecretpassword
|
||||
```
|
||||
|
||||
### Security and password protection
|
||||
|
||||
* The container detects changes to url and subdomains, revokes existing certs and generates new ones during start.
|
||||
@@ -138,6 +221,16 @@ app_setup_block: |
|
||||
* Proxy sample files WILL be updated, however your renamed (enabled) proxy files will not.
|
||||
* You can check the new sample and adjust your active config as needed.
|
||||
|
||||
### QUIC support
|
||||
|
||||
This image supports QUIC (also known as HTTP/3) but it must be explicitly enabled in each proxy conf, and the default conf, because if the listener is enabled and you don't expose 443/UDP, it can break connections with some browsers.
|
||||
|
||||
To enable QUIC, expose 443/UDP to your clients, then uncomment both QUIC listeners in all of your active proxy confs, as well as the default conf, and restart the container.
|
||||
|
||||
You should also uncomment the `Alt-Svc` header in your `ssl.conf` so that browsers are aware that you offer QUIC connectivity.
|
||||
|
||||
It is [recommended](https://quic-go.net/docs/quic/optimizations/#udp-buffer-sizes) to increase the UDP send/recieve buffer **on the host** by setting the `net.core.rmem_max` and `net.core.wmem_max` sysctls. Suggested values are 4-16Mb (4194304-16777216 bytes). For persistence between reboots use `/etc/sysctl.d/`.
|
||||
|
||||
### 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).
|
||||
@@ -164,6 +257,7 @@ init_diagram: |
|
||||
init-outdated-config -> init-config-end
|
||||
init-config -> init-crontab-config
|
||||
init-mods-end -> init-custom-files
|
||||
init-adduser -> init-device-perms
|
||||
base -> init-envfile
|
||||
init-swag-samples -> init-fail2ban-config
|
||||
init-os-end -> init-folders
|
||||
@@ -175,6 +269,7 @@ init_diagram: |
|
||||
init-samples -> init-nginx
|
||||
init-version-checks -> init-nginx-end
|
||||
init-adduser -> init-os-end
|
||||
init-device-perms -> init-os-end
|
||||
init-envfile -> init-os-end
|
||||
init-renew -> init-outdated-config
|
||||
init-keygen -> init-permissions
|
||||
@@ -200,11 +295,14 @@ init_diagram: |
|
||||
svc-swag-auto-reload -> legacy-services
|
||||
}
|
||||
Base Images: {
|
||||
"baseimage-alpine-nginx:3.21" <- "baseimage-alpine:3.21"
|
||||
"baseimage-alpine-nginx:3.22" <- "baseimage-alpine:3.22"
|
||||
}
|
||||
"swag:latest" <- Base Images
|
||||
# changelog
|
||||
changelogs:
|
||||
- {date: "02.09.25:", desc: "Add ability to define proxy configurations via environment variables."}
|
||||
- {date: "18.07.25:", desc: "Rebase to Alpine 3.22 with PHP 8.4. Add QUIC support. Drop PHP bindings for mcrypt as it is no longer maintained."}
|
||||
- {date: "05.05.25:", desc: "Disable Certbot's built in log rotation."}
|
||||
- {date: "19.01.25:", desc: "Add [Auto Reload](https://github.com/linuxserver/docker-mods/tree/swag-auto-reload) functionality to SWAG."}
|
||||
- {date: "17.12.24:", desc: "Rebase to Alpine 3.21."}
|
||||
- {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)."}
|
||||
|
||||
153
root/app/config-generator/generate_configs.py
Normal file
153
root/app/config-generator/generate_configs.py
Normal file
@@ -0,0 +1,153 @@
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
# --- Configuration ---
|
||||
TEMPLATE_DIR = '/app/config-generator/templates'
|
||||
PROXY_OUTPUT_DIR = '/config/nginx/env-proxy-confs'
|
||||
DEFAULT_CONF_OUTPUT = '/config/nginx/site-confs/default.conf'
|
||||
HTPASSWD_FILE = '/config/nginx/.htpasswd'
|
||||
# ---------------------
|
||||
|
||||
def process_service_config(service_name, service_config_json, global_auth_provider, auth_exclude_list):
|
||||
"""Processes a single service configuration, including auth logic."""
|
||||
service_config = json.loads(service_config_json)
|
||||
|
||||
# The default service doesn't have a subdomain name in the traditional sense
|
||||
if service_name.lower() == 'default':
|
||||
# We still need a target container name, let the user define it or raise an error
|
||||
if 'name' not in service_config:
|
||||
raise ValueError("PROXY_CONFIG_DEFAULT must contain a 'name' key specifying the target container name.")
|
||||
else:
|
||||
service_config['name'] = service_name
|
||||
|
||||
# --- Authentication Logic ---
|
||||
auth_provider = 'none' # Default
|
||||
# 1. Per-service override
|
||||
if 'auth' in service_config:
|
||||
auth_provider = service_config['auth']
|
||||
print(f" - Found per-service auth override: '{auth_provider}'")
|
||||
# 2. Global provider check
|
||||
elif global_auth_provider and service_name not in auth_exclude_list:
|
||||
auth_provider = global_auth_provider
|
||||
print(f" - Applying global auth provider: '{auth_provider}'")
|
||||
# 3. Otherwise, no auth
|
||||
else:
|
||||
if service_name in auth_exclude_list:
|
||||
print(f" - Service is in global exclude list. No auth.")
|
||||
else:
|
||||
print(f" - No auth provider specified.")
|
||||
|
||||
service_config['auth_provider'] = auth_provider
|
||||
return service_config
|
||||
|
||||
def generate_configs():
|
||||
"""
|
||||
Generates Nginx config files from PROXY_CONFIG environment variables and a Jinja2 template.
|
||||
"""
|
||||
print("--- Starting Nginx Config Generation from Environment Variables ---")
|
||||
|
||||
# Ensure output directories exist
|
||||
os.makedirs(PROXY_OUTPUT_DIR, exist_ok=True)
|
||||
os.makedirs(os.path.dirname(DEFAULT_CONF_OUTPUT), exist_ok=True)
|
||||
print(f"Output directories are ready.")
|
||||
|
||||
# Get global auth settings from environment variables
|
||||
global_auth_provider = os.environ.get('PROXY_AUTH_PROVIDER')
|
||||
auth_exclude_list = os.environ.get('PROXY_AUTH_EXCLUDE', '').split(',')
|
||||
auth_exclude_list = [name.strip() for name in auth_exclude_list if name.strip()]
|
||||
|
||||
# Get basic auth credentials
|
||||
basic_auth_user = os.environ.get('PROXY_AUTH_BASIC_USER')
|
||||
basic_auth_pass = os.environ.get('PROXY_AUTH_BASIC_PASS')
|
||||
basic_auth_configured = False
|
||||
|
||||
print(f"Global Auth Provider: {global_auth_provider}")
|
||||
print(f"Auth Exclude List: {auth_exclude_list}")
|
||||
|
||||
# Collect and process service configurations
|
||||
subdomain_services = []
|
||||
default_service = None
|
||||
|
||||
for key, value in os.environ.items():
|
||||
if key.startswith('PROXY_CONFIG_'):
|
||||
service_name = key.replace('PROXY_CONFIG_', '').lower()
|
||||
print(f" Processing service: {service_name}")
|
||||
print(value)
|
||||
try:
|
||||
service_config = process_service_config(service_name, value, global_auth_provider, auth_exclude_list)
|
||||
|
||||
# Handle Basic Auth File Creation
|
||||
if service_config['auth_provider'] == 'basic' and not basic_auth_configured:
|
||||
if basic_auth_user and basic_auth_pass:
|
||||
print(f" - Configuring Basic Auth with user '{basic_auth_user}'.")
|
||||
try:
|
||||
os.makedirs(os.path.dirname(HTPASSWD_FILE), exist_ok=True)
|
||||
command = ['htpasswd', '-bc', HTPASSWD_FILE, basic_auth_user, basic_auth_pass]
|
||||
subprocess.run(command, check=True, capture_output=True, text=True)
|
||||
print(f" - Successfully created '{HTPASSWD_FILE}'.")
|
||||
basic_auth_configured = True
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f" [!!] ERROR: 'htpasswd' command failed: {e.stderr}. Basic auth will not be enabled.")
|
||||
service_config['auth_provider'] = 'none'
|
||||
except FileNotFoundError:
|
||||
print(f" [!!] ERROR: 'htpasswd' command not found. Basic auth will not be enabled.")
|
||||
service_config['auth_provider'] = 'none'
|
||||
else:
|
||||
print(f" [!!] WARNING: 'auth: basic' is set, but PROXY_AUTH_BASIC_USER or PROXY_AUTH_BASIC_PASS is missing. Skipping auth.")
|
||||
service_config['auth_provider'] = 'none'
|
||||
|
||||
if service_name == 'default':
|
||||
default_service = service_config
|
||||
else:
|
||||
subdomain_services.append(service_config)
|
||||
|
||||
except (json.JSONDecodeError, ValueError) as e:
|
||||
print(f" [!!] ERROR: Could not parse or validate config for {service_name}: {e}. Skipping.")
|
||||
except Exception as e:
|
||||
print(f" [!!] ERROR: An unexpected error occurred processing {service_name}: {e}. Skipping.")
|
||||
|
||||
# Set up Jinja2 environment
|
||||
try:
|
||||
env = Environment(loader=FileSystemLoader(TEMPLATE_DIR), trim_blocks=True, lstrip_blocks=True)
|
||||
proxy_template = env.get_template('proxy.conf.j2')
|
||||
default_template = env.get_template('default.conf.j2')
|
||||
print("\nJinja2 templates loaded successfully.")
|
||||
except Exception as e:
|
||||
print(f"ERROR: Failed to load Jinja2 templates from '{TEMPLATE_DIR}': {e}. Exiting.")
|
||||
return
|
||||
|
||||
# Generate default site config if specified
|
||||
if default_service:
|
||||
print("\n--- Generating Default Site Config ---")
|
||||
try:
|
||||
rendered_content = default_template.render(item=default_service)
|
||||
with open(DEFAULT_CONF_OUTPUT, 'w') as f:
|
||||
f.write(rendered_content)
|
||||
print(f" [OK] Generated {os.path.basename(DEFAULT_CONF_OUTPUT)}")
|
||||
except Exception as e:
|
||||
print(f" [!!] ERROR: Failed to render or write default config: {e}")
|
||||
else:
|
||||
print("\n--- PROXY_CONFIG_DEFAULT not set, default site config will not be generated. ---")
|
||||
|
||||
|
||||
# Generate subdomain proxy configs
|
||||
print("\n--- Generating Subdomain Proxy Configs ---")
|
||||
if not subdomain_services:
|
||||
print("No subdomain services found to configure.")
|
||||
for service in subdomain_services:
|
||||
filename = f"{service['name']}.subdomain.conf"
|
||||
output_path = os.path.join(PROXY_OUTPUT_DIR, filename)
|
||||
try:
|
||||
rendered_content = proxy_template.render(item=service)
|
||||
with open(output_path, 'w') as f:
|
||||
f.write(rendered_content)
|
||||
print(f" [OK] Generated {filename}")
|
||||
except Exception as e:
|
||||
print(f" [!!] ERROR: Failed to render or write config for {service['name']}: {e}")
|
||||
|
||||
print("\n--- Generation Complete ---")
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_configs()
|
||||
105
root/app/config-generator/templates/default.conf.j2
Normal file
105
root/app/config-generator/templates/default.conf.j2
Normal file
@@ -0,0 +1,105 @@
|
||||
## Version 2025/08/28
|
||||
# THIS FILE IS AUTO-GENERATED BY THE CONTAINER. DO NOT EDIT.
|
||||
#
|
||||
# This is the default server block, handling requests to the root domain.
|
||||
|
||||
# redirect all traffic to https
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
# main server block
|
||||
server {
|
||||
listen 443 ssl default_server;
|
||||
{% if item.quic %}
|
||||
listen 443 quic reuseport default_server;
|
||||
{% else %}
|
||||
# listen 443 quic reuseport default_server;
|
||||
{% endif %}
|
||||
listen [::]:443 ssl default_server;
|
||||
{% if item.quic %}
|
||||
listen [::]:443 quic reuseport default_server;
|
||||
{% else %}
|
||||
# listen [::]:443 quic reuseport default_server;
|
||||
{% endif %}
|
||||
|
||||
server_name _;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
client_max_body_size {{ item.client_max_body_size | default('0') }};
|
||||
{% if item.proxy_redirect_off %}
|
||||
proxy_redirect off;
|
||||
{% endif %}
|
||||
{% if item.buffering_off %}
|
||||
proxy_buffering off;
|
||||
{% endif %}
|
||||
|
||||
{% if item.auth_provider and item.auth_provider not in ['none', 'basic'] %}
|
||||
# enable for {{ item.auth_provider }}
|
||||
include /config/nginx/{{ item.auth_provider }}-server.conf;
|
||||
{% endif %}
|
||||
|
||||
location / {
|
||||
{% if item.auth_provider == 'basic' %}
|
||||
# enable for basic auth
|
||||
auth_basic "Restricted";
|
||||
auth_basic_user_file /config/nginx/.htpasswd;
|
||||
{% elif item.auth_provider and item.auth_provider != 'none' %}
|
||||
# enable for {{ item.auth_provider }}
|
||||
include /config/nginx/{{ item.auth_provider }}-location.conf;
|
||||
{% else %}
|
||||
# No authentication enabled for this service.
|
||||
{% endif %}
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app {{ item.name }};
|
||||
set $upstream_port {{ item.port }};
|
||||
set $upstream_proto {% if item.https %}https{% else %}http{% endif %};
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
{% if item.proxy_set_headers %}
|
||||
{% for header in item.proxy_set_headers %}
|
||||
proxy_set_header {{ header.key }} {{ header.value }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if item.custom_directives %}
|
||||
{% for directive in item.custom_directives %}
|
||||
{{ directive }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
{% if item.extra_locations %}
|
||||
{% for loc in item.extra_locations %}
|
||||
location {{ loc.path }} {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app {{ loc.app | default(item.name) }};
|
||||
set $upstream_port {{ loc.port | default(item.port) }};
|
||||
set $upstream_proto {% if loc.https %}https{% elif item.https and loc.https is not defined %}https{% else %}http{% endif %};
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port{% if loc.proxy_pass_path %}{{ loc.proxy_pass_path }}{% endif %};
|
||||
{% if loc.proxy_set_headers %}
|
||||
{% for header in loc.proxy_set_headers %}
|
||||
proxy_set_header {{ header.key }} {{ header.value }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if loc.custom_directives %}
|
||||
{% for directive in loc.custom_directives %}
|
||||
{{ directive }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
# enable subdomain method reverse proxy confs
|
||||
include /config/nginx/proxy-confs/*.subdomain.conf;
|
||||
# enable env var subdomain method reverse proxy confs
|
||||
include /config/nginx/env-proxy-confs/*.subdomain.conf;
|
||||
141
root/app/config-generator/templates/proxy.conf.j2
Normal file
141
root/app/config-generator/templates/proxy.conf.j2
Normal file
@@ -0,0 +1,141 @@
|
||||
## Version 2025/08/28
|
||||
# THIS FILE IS AUTO-GENERATED BY THE CONTAINER. DO NOT EDIT.
|
||||
#
|
||||
# make sure that your {{ item.name }} container is named {{ item.name }}
|
||||
# make sure that your dns has a cname set for {{ item.name }}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
{% if item.quic %}
|
||||
listen 443 quic reuseport;
|
||||
{% else %}
|
||||
# listen 443 quic reuseport;
|
||||
{% endif %}
|
||||
listen [::]:443 ssl;
|
||||
{% if item.quic %}
|
||||
listen [::]:443 quic reuseport;
|
||||
{% else %}
|
||||
# listen [::]:443 quic reuseport;
|
||||
{% endif %}
|
||||
|
||||
server_name {{ item.name }}.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
client_max_body_size {{ item.client_max_body_size | default('0') }};
|
||||
{% if item.proxy_redirect_off %}
|
||||
proxy_redirect off;
|
||||
{% endif %}
|
||||
{% if item.buffering_off %}
|
||||
proxy_buffering off;
|
||||
{% endif %}
|
||||
|
||||
{% if item.auth_provider and item.auth_provider not in ['none', 'basic'] %}
|
||||
# enable for {{ item.auth_provider }}
|
||||
include /config/nginx/{{ item.auth_provider }}-server.conf;
|
||||
{% endif %}
|
||||
|
||||
location / {
|
||||
{% if item.auth_provider == 'basic' %}
|
||||
# enable for basic auth
|
||||
auth_basic "Restricted";
|
||||
auth_basic_user_file /config/nginx/.htpasswd;
|
||||
{% elif item.auth_provider and item.auth_provider != 'none' %}
|
||||
# enable for {{ item.auth_provider }}
|
||||
include /config/nginx/{{ item.auth_provider }}-location.conf;
|
||||
{% else %}
|
||||
# No authentication enabled for this service.
|
||||
{% endif %}
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app {{ item.name }};
|
||||
set $upstream_port {{ item.port }};
|
||||
set $upstream_proto {% if item.https %}https{% else %}http{% endif %};
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
{% if item.hide_xframe %}
|
||||
proxy_hide_header X-Frame-Options;
|
||||
{% endif %}
|
||||
{% if item.iframe_friendly %}
|
||||
# Uncomment to allow loading in an iframe (i.e. Organizr)
|
||||
#proxy_hide_header X-Frame-Options;
|
||||
{% endif %}
|
||||
{% if item.hide_x_forwarded_port %}
|
||||
# Hide proxy port to prevent CSRF errors
|
||||
proxy_hide_header X-Forwarded-Port;
|
||||
{% endif %}
|
||||
{% if item.set_x_scheme %}
|
||||
proxy_set_header X-Scheme https;
|
||||
{% endif %}
|
||||
{% if item.websockets %}
|
||||
proxy_buffering off;
|
||||
proxy_socket_keepalive on;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
|
||||
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
|
||||
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
|
||||
{% endif %}
|
||||
{% if item.proxy_pass_headers %}
|
||||
{% for header in item.proxy_pass_headers %}
|
||||
proxy_pass_header {{ header }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if item.proxy_set_headers %}
|
||||
{% for header in item.proxy_set_headers %}
|
||||
proxy_set_header {{ header.key }} {{ header.value }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if item.proxy_hide_headers %}
|
||||
{% for header in item.proxy_hide_headers %}
|
||||
proxy_hide_header {{ header }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if item.add_headers %}
|
||||
{% for header in item.add_headers %}
|
||||
add_header {{ header.key }} "{{ header.value }}";
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if item.custom_directives %}
|
||||
{% for directive in item.custom_directives %}
|
||||
{{ directive }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
{% if item.api %}
|
||||
location ~ (?:/{{ item.name }})?/api {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app {{ item.name }};
|
||||
set $upstream_port {{ item.port }};
|
||||
set $upstream_proto {% if item.https %}https{% else %}http{% endif %};
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
{% endif %}
|
||||
{% if item.extra_locations %}
|
||||
{% for loc in item.extra_locations %}
|
||||
location ~ (?:/{{ item.name }})?{{ loc.path }} {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app {{ loc.app | default(item.name) }};
|
||||
set $upstream_port {{ loc.port | default(item.port) }};
|
||||
set $upstream_proto {% if loc.https %}https{% elif item.https and loc.https is not defined %}https{% else %}http{% endif %};
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port{% if loc.proxy_pass_path %}{{ loc.proxy_pass_path }}{% endif %};
|
||||
{% if loc.proxy_set_headers %}
|
||||
{% for header in loc.proxy_set_headers %}
|
||||
proxy_set_header {{ header.key }} {{ header.value }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if loc.proxy_hide_headers %}
|
||||
{% for header in loc.proxy_hide_headers %}
|
||||
proxy_hide_header {{ header }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if loc.custom_directives %}
|
||||
{% for directive in loc.custom_directives %}
|
||||
{{ directive }};
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
}
|
||||
@@ -1,13 +1,8 @@
|
||||
## Version 2024/03/14 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-location.conf.sample
|
||||
## Version 2025/03/25 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-location.conf.sample
|
||||
# Make sure that your authelia container is in the same user defined bridge network and is named authelia
|
||||
# Rename /config/nginx/proxy-confs/authelia.subdomain.conf.sample to /config/nginx/proxy-confs/authelia.subdomain.conf
|
||||
# For authelia 4.37 and below, make sure that the authelia configuration.yml has 'path: "authelia"' defined
|
||||
# For authelia 4.38 and above, make sure that the authelia configuration.yml has 'address: "tcp://:9091/authelia"' defined
|
||||
|
||||
## Send a subrequest to Authelia to verify if the user is authenticated and has permission to access the resource
|
||||
## For authelia 4.37 and below, use the following line
|
||||
# auth_request /authelia/api/verify;
|
||||
## For authelia 4.38 and above, use the following line
|
||||
auth_request /authelia/api/authz/auth-request;
|
||||
|
||||
## If the subreqest returns 200 pass to the backend, if the subrequest returns 401 redirect to the portal
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
## Version 2024/03/16 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-server.conf.sample
|
||||
## Version 2025/03/25 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authelia-server.conf.sample
|
||||
# Make sure that your authelia container is in the same user defined bridge network and is named authelia
|
||||
# Rename /config/nginx/proxy-confs/authelia.subdomain.conf.sample to /config/nginx/proxy-confs/authelia.subdomain.conf
|
||||
# For authelia 4.37 and below, make sure that the authelia configuration.yml has 'path: "authelia"' defined
|
||||
# For authelia 4.38 and above, make sure that the authelia configuration.yml has 'address: "tcp://:9091/authelia"' defined
|
||||
|
||||
# location for authelia subfolder requests
|
||||
location ^~ /authelia {
|
||||
auth_request off; # requests to this subfolder must be accessible without authentication
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_authelia authelia;
|
||||
proxy_pass http://$upstream_authelia:9091;
|
||||
}
|
||||
|
||||
# location for authelia 4.37 and below auth requests
|
||||
location = /authelia/api/verify {
|
||||
internal;
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_authelia authelia;
|
||||
proxy_pass http://$upstream_authelia:9091;
|
||||
|
||||
## Include the Set-Cookie header if present
|
||||
auth_request_set $set_cookie $upstream_http_set_cookie;
|
||||
add_header Set-Cookie $set_cookie;
|
||||
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_header Content-Length "";
|
||||
}
|
||||
|
||||
# location for authelia 4.38 and above auth requests
|
||||
# location for authelia auth requests
|
||||
location = /authelia/api/authz/auth-request {
|
||||
internal;
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_authelia authelia;
|
||||
proxy_pass http://$upstream_authelia:9091;
|
||||
proxy_pass http://$upstream_authelia:9091/api/authz/auth-request;
|
||||
|
||||
## Include the Set-Cookie header if present
|
||||
auth_request_set $set_cookie $upstream_http_set_cookie;
|
||||
@@ -62,11 +33,6 @@ location @authelia_proxy_signin {
|
||||
## Translate the Location response header from the auth subrequest into a variable
|
||||
auth_request_set $signin_url $upstream_http_location;
|
||||
|
||||
if ($signin_url = '') {
|
||||
## Set the $signin_url variable
|
||||
set $signin_url https://$http_host/authelia/?rd=$target_url;
|
||||
}
|
||||
|
||||
## Redirect to login
|
||||
return 302 $signin_url;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Version 2023/04/27 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authentik-server.conf.sample
|
||||
## Version 2025/03/25 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/authentik-server.conf.sample
|
||||
# Make sure that your authentik container is in the same user defined bridge network and is named authentik-server
|
||||
# Rename /config/nginx/proxy-confs/authentik.subdomain.conf.sample to /config/nginx/proxy-confs/authentik.subdomain.conf
|
||||
|
||||
@@ -19,7 +19,7 @@ location = /outpost.goauthentik.io/auth/nginx {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_authentik authentik-server;
|
||||
proxy_pass http://$upstream_authentik:9000;
|
||||
proxy_pass http://$upstream_authentik:9000/outpost.goauthentik.io/auth/nginx;
|
||||
|
||||
## Include the Set-Cookie header if present
|
||||
auth_request_set $set_cookie $upstream_http_set_cookie;
|
||||
|
||||
@@ -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 2025/07/18 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/site-confs/default.conf.sample
|
||||
|
||||
# redirect all traffic to https
|
||||
server {
|
||||
@@ -13,7 +13,9 @@ server {
|
||||
# main server block
|
||||
server {
|
||||
listen 443 ssl default_server;
|
||||
# listen 443 quic reuseport default_server;
|
||||
listen [::]:443 ssl default_server;
|
||||
# listen [::]:443 quic reuseport default_server;
|
||||
|
||||
server_name _;
|
||||
|
||||
@@ -80,3 +82,5 @@ server {
|
||||
|
||||
# enable subdomain method reverse proxy confs
|
||||
include /config/nginx/proxy-confs/*.subdomain.conf;
|
||||
# enable env var subdomain method reverse proxy confs
|
||||
include /config/nginx/env-proxy-confs/*.subdomain.conf;
|
||||
|
||||
9
root/defaults/nginx/tinyauth-location.conf.sample
Normal file
9
root/defaults/nginx/tinyauth-location.conf.sample
Normal file
@@ -0,0 +1,9 @@
|
||||
## Version 2025/06/08 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/tinyauth-location.conf.sample
|
||||
# Make sure that your tinyauth container is in the same user defined bridge network and is named tinyauth
|
||||
# Rename /config/nginx/proxy-confs/tinyauth.subdomain.conf.sample to /config/nginx/proxy-confs/tinyauth.subdomain.conf
|
||||
|
||||
## Send a subrequest to tinyauth to verify if the user is authenticated and has permission to access the resource
|
||||
auth_request /tinyauth;
|
||||
|
||||
## If the subreqest returns 200 pass to the backend, if the subrequest returns 401 redirect to the portal
|
||||
error_page 401 = @tinyauth_login;
|
||||
35
root/defaults/nginx/tinyauth-server.conf.sample
Normal file
35
root/defaults/nginx/tinyauth-server.conf.sample
Normal file
@@ -0,0 +1,35 @@
|
||||
## Version 2025/06/08 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/tinyauth-server.conf.sample
|
||||
# Make sure that your tinyauth container is in the same user defined bridge network and is named tinyauth
|
||||
# Rename /config/nginx/proxy-confs/tinyauth.subdomain.conf.sample to /config/nginx/proxy-confs/tinyauth.subdomain.conf
|
||||
|
||||
# location for tinyauth auth requests
|
||||
location /tinyauth {
|
||||
internal;
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_tinyauth tinyauth;
|
||||
proxy_pass http://$upstream_tinyauth:3000/api/auth/nginx;
|
||||
|
||||
proxy_set_header x-forwarded-proto $scheme;
|
||||
proxy_set_header x-forwarded-host $http_host;
|
||||
proxy_set_header x-forwarded-uri $request_uri;
|
||||
}
|
||||
|
||||
# virtual location for tinyauth 401 redirects
|
||||
location @tinyauth_login {
|
||||
internal;
|
||||
|
||||
## Set the $target_url variable based on the original request
|
||||
set_escape_uri $target_url $scheme://$http_host$request_uri;
|
||||
|
||||
## Set the $signin_url variable
|
||||
set $domain $host;
|
||||
if ($host ~* "^[^.]+\.([^.]+\..+)$") {
|
||||
set $domain $1;
|
||||
}
|
||||
set $signin_url https://tinyauth.$domain/login?redirect_uri=$target_url;
|
||||
|
||||
## Redirect to login
|
||||
return 302 $signin_url;
|
||||
}
|
||||
@@ -56,6 +56,12 @@ touch /config/etc/letsencrypt/cli.ini
|
||||
lsiown abc:abc /config/etc/letsencrypt/cli.ini
|
||||
grep -qF 'agree-tos' /config/etc/letsencrypt/cli.ini || echo 'agree-tos=true' >>/config/etc/letsencrypt/cli.ini
|
||||
|
||||
# Check for broken dns credentials value in cli.ini and remove
|
||||
sed -i '/dns--credentials/d' /config/etc/letsencrypt/cli.ini
|
||||
|
||||
# Disable Certbot's built in log rotation
|
||||
set_ini_value "max-log-backups" "0" /config/etc/letsencrypt/cli.ini
|
||||
|
||||
# copy dns default configs
|
||||
cp -n /defaults/dns-conf/* /config/dns-conf/ 2> >(grep -v 'cp: not replacing')
|
||||
lsiown -R abc:abc /config/dns-conf
|
||||
|
||||
@@ -22,6 +22,14 @@ if [[ ! -f /config/nginx/authentik-server.conf ]]; then
|
||||
cp /defaults/nginx/authentik-server.conf.sample /config/nginx/authentik-server.conf
|
||||
fi
|
||||
|
||||
# copy tinyauth config files if they don't exist
|
||||
if [[ ! -f /config/nginx/tinyauth-location.conf ]]; then
|
||||
cp /defaults/nginx/tinyauth-location.conf.sample /config/nginx/tinyauth-location.conf
|
||||
fi
|
||||
if [[ ! -f /config/nginx/tinyauth-server.conf ]]; then
|
||||
cp /defaults/nginx/tinyauth-server.conf.sample /config/nginx/tinyauth-server.conf
|
||||
fi
|
||||
|
||||
# copy old ldap config file to new location
|
||||
if [[ -f /config/nginx/ldap.conf ]] && [[ ! -f /config/nginx/ldap-server.conf ]]; then
|
||||
cp /config/nginx/ldap.conf /config/nginx/ldap-server.conf
|
||||
@@ -34,3 +42,19 @@ fi
|
||||
if [[ ! -f /config/nginx/ldap-server.conf ]]; then
|
||||
cp /defaults/nginx/ldap-server.conf.sample /config/nginx/ldap-server.conf
|
||||
fi
|
||||
|
||||
# clean the env target directory to ensure a fresh start
|
||||
rm -f /config/nginx/env-proxy-confs/*
|
||||
# check if any PROXY_CONFIG environment variables are set
|
||||
if env | grep -q "^PROXY_CONFIG_"; then
|
||||
echo "INFO: Found PROXY_CONFIG environment variables. Generating Nginx configs from environment..."
|
||||
# run the Python generator script
|
||||
echo "INFO: Running python config generator..."
|
||||
if ! python3 /app/config-generator/generate_configs.py; then
|
||||
echo "ERROR: The python config generator script failed. Please check the logs above. Container will not start."
|
||||
exit 1
|
||||
fi
|
||||
echo "INFO: Config generation complete."
|
||||
else
|
||||
echo "INFO: No PROXY_CONFIG variables found. User is expected to manage /config/nginx/proxy-confs/ manually."
|
||||
fi
|
||||
|
||||
@@ -6,6 +6,7 @@ mkdir -p \
|
||||
/config/{fail2ban,dns-conf} \
|
||||
/config/etc/letsencrypt/renewal-hooks \
|
||||
/config/log/{fail2ban,letsencrypt,nginx} \
|
||||
/config/nginx/env-proxy-confs \
|
||||
/config/nginx/proxy-confs \
|
||||
/run/fail2ban \
|
||||
/tmp/letsencrypt
|
||||
|
||||
Reference in New Issue
Block a user