|
| 1 | +#!/usr/bin/with-contenv bash |
| 2 | + |
| 3 | +AUTO_GEN="" |
| 4 | +# figure out which containers to generate confs for or which confs to remove |
| 5 | +if [ ! -f /auto-proxy/enabled_containers ]; then |
| 6 | + docker ps --filter "label=swag=enable" --format "{{.Names}}" > /auto-proxy/enabled_containers |
| 7 | + AUTO_GEN=$(cat /auto-proxy/enabled_containers) |
| 8 | +else |
| 9 | + ENABLED_CONTAINERS=$(docker ps --filter "label=swag=enable" --format "{{.Names}}") |
| 10 | + for CONTAINER in ${ENABLED_CONTAINERS}; do |
| 11 | + if [ ! -f "/auto-proxy/${CONTAINER}.conf" ]; then |
| 12 | + echo "**** New container ${CONTAINER} detected, will generate new conf. ****" |
| 13 | + AUTO_GEN="${CONTAINER} ${AUTO_GEN}" |
| 14 | + else |
| 15 | + INSPECTION=$(docker inspect ${CONTAINER}) |
| 16 | + for VAR in swag_port swag_proto swag_url swag_auth swag_auth_bypass; do |
| 17 | + VAR_VALUE=$(echo ${INSPECTION} | jq -r ".[0].Config.Labels[\"${VAR}\"]") |
| 18 | + if [ "${VAR_VALUE}" == "null" ]; then |
| 19 | + VAR_VALUE="" |
| 20 | + fi |
| 21 | + if ! grep -q "${VAR}=\"${VAR_VALUE}\"" "/auto-proxy/${CONTAINER}.conf"; then |
| 22 | + AUTO_GEN="${CONTAINER} ${AUTO_GEN}" |
| 23 | + echo "**** Labels for ${CONTAINER} changed, will generate new conf. ****" |
| 24 | + break |
| 25 | + fi |
| 26 | + done |
| 27 | + fi |
| 28 | + done |
| 29 | + EXISTING_CONFS=$(cat /auto-proxy/enabled_containers) |
| 30 | + for CONTAINER in $EXISTING_CONFS; do |
| 31 | + if ! grep -q "${CONTAINER}" <<< "${ENABLED_CONTAINERS}"; then |
| 32 | + echo "**** Removing conf for ${CONTAINER} ****" |
| 33 | + rm -rf "/auto-proxy/${CONTAINER}.conf" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 34 | + REMOVED_CONTAINERS="true" |
| 35 | + fi |
| 36 | + done |
| 37 | + echo "${ENABLED_CONTAINERS}" > /auto-proxy/enabled_containers |
| 38 | +fi |
| 39 | + |
| 40 | +for CONTAINER in ${AUTO_GEN}; do |
| 41 | + INSPECTION=$(docker inspect ${CONTAINER}) |
| 42 | + rm -rf "/auto-proxy/${CONTAINER}.conf" |
| 43 | + for VAR in swag_port swag_proto swag_url swag_auth swag_auth_bypass; do |
| 44 | + VAR_VALUE=$(echo ${INSPECTION} | jq -r ".[0].Config.Labels[\"${VAR}\"]") |
| 45 | + if [ "${VAR_VALUE}" == "null" ]; then |
| 46 | + VAR_VALUE="" |
| 47 | + fi |
| 48 | + echo "${VAR}=\"${VAR_VALUE}\"" >> "/auto-proxy/${CONTAINER}.conf" |
| 49 | + done |
| 50 | + . /auto-proxy/${CONTAINER}.conf |
| 51 | + if [ -f "/config/nginx/proxy-confs/${CONTAINER}.subdomain.conf.sample" ]; then |
| 52 | + cp "/config/nginx/proxy-confs/${CONTAINER}.subdomain.conf.sample" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 53 | + echo "**** Using preset proxy conf for ${CONTAINER} ****" |
| 54 | + if [ -n "${swag_auth_bypass}" ]; then |
| 55 | + echo "**** Swag auth bypass is auto managed via preset confs and cannot be overridden via env vars ****" |
| 56 | + fi |
| 57 | + if [ -n "${swag_port}" ]; then |
| 58 | + sed -i "s|set \$upstream_port .*|set \$upstream_port ${swag_port};|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 59 | + echo "**** Overriding port for ${CONTAINER} ****" |
| 60 | + fi |
| 61 | + if [ -n "${swag_proto}" ]; then |
| 62 | + sed -i "s|set \$upstream_proto .*|set \$upstream_proto ${swag_proto};|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 63 | + echo "**** Overriding proto for ${CONTAINER} ****" |
| 64 | + fi |
| 65 | + if [ -n "${swag_url}" ]; then |
| 66 | + sed -i "s|server_name .*|server_name ${swag_url};|" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 67 | + echo "**** Overriding url for ${CONTAINER} ****" |
| 68 | + fi |
| 69 | + if [ "${swag_auth}" == "authelia" ]; then |
| 70 | + sed -i "s|#include /config/nginx/authelia|include /config/nginx/authelia|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 71 | + echo "**** Enabling Authelia for ${CONTAINER} ****" |
| 72 | + elif [ "${swag_auth}" == "http" ]; then |
| 73 | + sed -i "s|#auth_basic|auth_basic|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 74 | + echo "**** Enabling basic http auth for ${CONTAINER} ****" |
| 75 | + elif [ "${swag_auth}" == "ldap" ]; then |
| 76 | + sed -i "s|#include /config/nginx/ldap.conf;|include /config/nginx/ldap.conf;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 77 | + sed -i "s|#auth_request /auth;|auth_request /auth;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 78 | + sed -i "s|#error_page 401 =200 /ldaplogin;|error_page 401 =200 /ldaplogin;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 79 | + echo "**** Enabling basic http auth for ${CONTAINER} ****" |
| 80 | + fi |
| 81 | + else |
| 82 | + echo "**** No preset proxy conf found for ${CONTAINER}, generating from scratch ****" |
| 83 | + cp "/config/nginx/proxy-confs/_template.subdomain.conf.sample" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 84 | + if [ -n "${swag_auth_bypass}" ]; then |
| 85 | + sed -i 's|^}$||' "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 86 | + for location in $(echo ${swag_auth_bypass} | tr "," " "); do |
| 87 | + cat <<DUDE >> "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 88 | +
|
| 89 | + location ~ ${location} { |
| 90 | + include /config/nginx/proxy.conf; |
| 91 | + include /config/nginx/resolver.conf; |
| 92 | + set \$upstream_app <container_name>; |
| 93 | + set \$upstream_port <port_number>; |
| 94 | + set \$upstream_proto <http or https>; |
| 95 | + proxy_pass \$upstream_proto://\$upstream_app:\$upstream_port; |
| 96 | +
|
| 97 | + } |
| 98 | +
|
| 99 | +DUDE |
| 100 | + done |
| 101 | + echo "}" >> "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 102 | + fi |
| 103 | + sed -i "s|<container_name>|${CONTAINER}|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 104 | + if [ -z "${swag_port}" ]; then |
| 105 | + swag_port=$(docker inspect ${CONTAINER} | jq -r '.[0].NetworkSettings.Ports | keys[0]' | sed 's|/.*||') |
| 106 | + if [ "${swag_port}" == "null" ]; then |
| 107 | + echo "**** No exposed ports found for ${CONTAINER}. Setting reverse proxy port to 80. ****" |
| 108 | + swag_port="80" |
| 109 | + fi |
| 110 | + fi |
| 111 | + sed -i "s|set \$upstream_port .*|set \$upstream_port ${swag_port};|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 112 | + echo "**** Setting port ${swag_port} for ${CONTAINER} ****" |
| 113 | + if [ -z "${swag_proto}" ]; then |
| 114 | + swag_proto="http" |
| 115 | + fi |
| 116 | + sed -i "s|set \$upstream_proto .*|set \$upstream_proto ${swag_proto};|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 117 | + echo "**** Setting proto ${swag_proto} for ${CONTAINER} ****" |
| 118 | + if [ -z "${swag_url}" ]; then |
| 119 | + swag_url="${CONTAINER}.*" |
| 120 | + fi |
| 121 | + sed -i "s|server_name .*|server_name ${swag_url};|" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 122 | + echo "**** Setting url ${swag_url} for ${CONTAINER} ****" |
| 123 | + if [ "${swag_auth}" == "authelia" ]; then |
| 124 | + sed -i "s|#include /config/nginx/authelia|include /config/nginx/authelia|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 125 | + echo "**** Enabling Authelia for ${CONTAINER} ****" |
| 126 | + elif [ "${swag_auth}" == "http" ]; then |
| 127 | + sed -i "s|#auth_basic|auth_basic|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 128 | + echo "**** Enabling basic http auth for ${CONTAINER} ****" |
| 129 | + elif [ "${swag_auth}" == "ldap" ]; then |
| 130 | + sed -i "s|#include /config/nginx/ldap.conf;|include /config/nginx/ldap.conf;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 131 | + sed -i "s|#auth_request /auth;|auth_request /auth;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 132 | + sed -i "s|#error_page 401 =200 /ldaplogin;|error_page 401 =200 /ldaplogin;|g" "/config/nginx/proxy-confs/auto-proxy-${CONTAINER}.subdomain.conf" |
| 133 | + echo "**** Enabling basic http auth for ${CONTAINER} ****" |
| 134 | + fi |
| 135 | + fi |
| 136 | +done |
| 137 | + |
| 138 | +if ([ -n "${AUTO_GEN}" ] || [ "${REMOVED_CONTAINERS}" == "true" ]) && ps aux | grep [n]ginx: > /dev/null; then |
| 139 | + if /usr/sbin/nginx -c /config/nginx/nginx.conf -t; then |
| 140 | + echo "**** Changes to nginx config are valid, reloading nginx ****" |
| 141 | + /usr/sbin/nginx -c /config/nginx/nginx.conf -s reload |
| 142 | + else |
| 143 | + echo "**** Changes to nginx config are not valid, skipping nginx reload. Please double check the config including the auto-proxy confs. ****" |
| 144 | + fi |
| 145 | +fi |
0 commit comments