Docker Nginx - HTTP Basic Auth в зависимости от ENV переменной (опциональный)


11

В данной статье рассмотрим вопрос - Как включать или отключать базовую аутентификацию в контейнере докер nginx, в зависимости от ENV переменной?

Итак, для начала создадим директорию docker/nginx/ для размещения всех файлов, связанных со сборкой контейнера nginx. И в корне проекта разместим файл .env c настройками проекта:

Файл
.env
APP_DOMAIN="host.docker.internal"
BASIC_AUTH=1
BASIC_AUTH_USER=user
BASIC_AUTH_PASSWORD=password
Файл
docker-compose.yaml
services:
  nginx:
    container_name: nginx
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
      args:
        basic_auth: ${BASIC_AUTH}
    environment:
      - APP_DOMAIN=${APP_DOMAIN}
      - BASIC_AUTH=${BASIC_AUTH} #0 or 1
      - BASIC_AUTH_USER=${BASIC_AUTH_USER}
      - BASIC_AUTH_PASSWORD=${BASIC_AUTH_PASSWORD}
      - BASIC_AUTH_CONF_FILE=/etc/nginx/basic_auth.conf
    ports:
      - "80:80"
    restart: always
Файл
docker/nginx/Dockerfile
FROM nginx:1.27
ARG basic_auth

# Если нужна авторизация - то устанавливаем пакет apache2-utils
RUN test "$basic_auth" -eq 1 && (apt -y update && apt -y install apache2-utils) || echo "Basic auth disabled"

# Копируем дополнительный скрипт в директорию /docker-entrypoint.d
COPY ./docker/nginx/1-check-basic-auth.sh /docker-entrypoint.d/

# Копируем шаблон с настройками nginx
COPY ./docker/nginx/default.conf.template /etc/nginx/templates/default.conf.template

# Для теста копируем страницу index.html
COPY ./docker/nginx/index.html /usr/share/nginx/html/index.html

EXPOSE 80
Файл
docker/nginx/1-check-basic-auth.sh
#!/bin/sh
HTPASSWD_FILE="/etc/nginx/.htpasswd"

# Создаем пустой файл с настройками авторизации
echo "" > "$BASIC_AUTH_CONF_FILE"

if [ "$BASIC_AUTH" -eq 1 ]; then
    echo "Basic auth enabled: creating .htpasswd file"
    # Генерируем .htpasswd файл
    htpasswd -cb -B $HTPASSWD_FILE "$BASIC_AUTH_USER" "$BASIC_AUTH_PASSWORD"

    # Записываем в конфиг параметры для авторизации
    echo 'auth_basic "Restricted Access";' >> "$BASIC_AUTH_CONF_FILE"
    echo "auth_basic_user_file $HTPASSWD_FILE;" >> "$BASIC_AUTH_CONF_FILE"
fi
Файл
docker/nginx/default.conf.template
server {
   # Порт, на котором работает nginx
   listen [::]:80;
   listen 80;

   server_name ${APP_DOMAIN};

   location / {
      # подключаем файл с настроками для авторизации, созданный в скрипте 1-check-basic-auth.sh
      include ${BASIC_AUTH_CONF_FILE};

      root /usr/share/nginx/html;
      index index.html;
   }
}

Ссылка на github - https://github.com/disoft-by/example-docker-nginx-basic-auth-optional

Добавить комментарий
Может быть интересно

Закрываем порты docker контейнеров в iptables
Обновление правил после перезагрузки сервера.

7

По умолчанию при запуске команды  composer update происходит перезапись основных файлов в корне сайта (.htaccess, robots.txt). Но зачастую такое поведение мешает работе системы (если файлы отредактированы вручную, или для формирования robots.txt используется специальный модуль)

4

Небольшое предисловие - опоздал на поезд :-) Вот, сижу на вокзале... Сейчас 1:10, поезд в 6:28. Есть время отдохнуть, все вспомнить и поделиться впечатлениями о первом дне кемпа.
Дальнейший рассказ - история о моем первом визите на друпал-кемп, мои личные впечатления о мероприятии в целом, мои комментарии докладов, мои итоги первого дня кемпа. 

1
Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.
3

Данный скрипт поможет пересохранить файлы Excel в csv. Может быть полезно перед отправкой прайсов на хостинг для дальнейшей обработки

6
1