Руководство по Reverse Proxy серверу Nginx для Apache Superset

Подписывайтесь на канал @apache_superset_bi, чтобы быть в курсе последних новостей про Apache Superset

Руководство «Настройка Nginx для Apache Superset 3.1.1» (инструкция, guide, tutorial)

В этом руководстве будет приведен пример того, как настроить Nginx в качестве обратного прокси-сервера для Apache Superset, гарантируя безопасный и эффективный доступ. Пример будет реализован на VPS сервере с Ubuntu 20.04.

Что будет использовано при реализации примера:

  • VPS сервер с Ubuntu 20.04
  • Nginx локально установленный вне докера
  • Установка Apache Superset 3.1.1 с помощью docker compose утилиты (т.е. через контейнеры)
  • Настройка Talisman
  • Установка сертификата https для домена
  • Перенаправление домена на ip VPS сервера

Обратный прокси-сервер Nginx действует как промежуточный сервер, который перехватывает клиентские запросы и перенаправляет их на соответствующий вышестоящий серверный сервер, а затем пересылает ответ от сервера обратно клиенту. Обратный прокси-сервер предоставляет различные преимущества в качестве абстрактного уровня над вышестоящими серверами.

Настройка A DNS записи домена на IP адрес VPS сервера

В настройках DNS вашего хостинга меняем A-запись для домена (или поддомена):

После некоторого времени, DNS записи обновятся и адрес домена будет перенаправляться на IP адрес VPS сервера.

Установка Docker Community Edition и Docker Compose v2

В версии Docker Compose v2 отсутствует дефис в команде docker compose.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# Установка
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверка версий docker и docker compose:

docker --version
docker compose version

Установка и настройка Apache Superset

Заходим на VPS сервер:

ssh root@5.35.84.12

Заходим в opt:

cd /opt

Качаем репозиторий:

git clone https://github.com/apache/superset.git

Переходим в директорию

cd superset

Переключаемся на ветку релиза 3.1.1

git checkout 3.1.1

Меняем версию суперсета в файле docker-compose-non-dev.yml

x-superset-image: &superset-image apachesuperset.docker.scarf.sh/apache/superset:3.1.1

и убираем установку демо примеров:

SUPERSET_LOAD_EXAMPLES=no

Настройка параметров Apache Superset для https и Nginx

В файл /opt/superset/docker/pythonpath_dev/superset_config.py вносим блок с настройками:

#========================================================
#---------------- Start: CUSTOM SETTINGS ----------------
SECRET_KEY = 'FSCEAhVDPfdAH53tifAEvSTO4IioHaaz0ia23KdzigWMVPsGi2Q6v'
# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
# Talisman settings
TALISMAN_ENABLED = True
TALISMAN_CONFIG = {
    "content_security_policy": {
        "default-src": ["'self'"],
        "img-src": ["'self'", "blob:", "data:"],
        "worker-src": ["'self'", "blob:"],
        "connect-src": [
            "'self'",
            "https://api.mapbox.com",
            "https://events.mapbox.com",
            "https://gravatar.com/",
        ],
        "object-src": "'none'",
        "style-src": ["'self'", "'unsafe-inline'"],
        "script-src": ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
    },
    "content_security_policy_nonce_in": ["script-src"],
    "force_https": False,
    "session_cookie_secure": False
}
ENABLE_PROXY_FIX = True
PROXY_FIX_CONFIG = {"x_for": 1, "x_proto": 1, "x_host": 1, "x_port": 1, "x_prefix": 1}
#---------------- End: CUSTOM SETTINGS ------------------
#========================================================

Параметры Superset для активации фич и отключение HTML_SANITIZATION

FEATURE_FLAGS = {
    "ALERT_REPORTS": True,
    "DATAPANEL_CLOSED_BY_DEFAULT": True,
    "DASHBOARD_VIRTUALIZATION": True,
    "DASHBOARD_RBAC": True,
    "ENABLE_TEMPLATE_PROCESSING": True,
    "ESCAPE_MARKDOWN_HTML": True,
    "LISTVIEWS_DEFAULT_CARD_VIEW": True,
    "THUMBNAILS": True,
    "DRILL_BY": True,
    "DRILL_TO_DETAIL": True,
    "HORIZONTAL_FILTER_BAR": True,
    "ESTIMATE_QUERY_COST": True,
    "TAGGING_SYSTEM": True,
    "HTML_SANITIZATION": False,
}

Запуск Apache Superset с помощью Docker Compose

Запустим развертывание контейнеров с помощью docker compose:

docker compose -f docker-compose-non-dev.yml up

До настройки Nginx суперсет будет доступен по адресу

http://nginx.superset-bi.ru:8088/login/

Ликбез по Docker: Различия между Docker Compose up, up -d, stop, start, down и down -v

  • docker compose -f docker-compose-non-dev.yml up развёртывает сервисы Superset и создаёт из docker-образа новые контейнеры, а также сети, тома и все конфигурации, указанные в файле Docker Compose. Добавляя флаг -d, вы выполняете команду в раздельном или фоновом режиме, сохраняя возможность управления терминалом.
  • docker compose -f docker-compose-non-dev.yml stop останавливает все сервисы, связанные с определённой конфигурацией Docker Compose. Она НЕ удаляет ни контейнеры, ни связанные с ними внутренние тома и сети.
  • docker compose -f docker-compose-non-dev.yml start запускает любые остановленные сервисы в соответствии с параметрами остановленной конфигурации, указанными в том же файле Docker Compose.
  • docker compose -f docker-compose-non-dev.yml down останавливает все сервисы, связанные с определённой конфигурацией Docker Compose. В отличие от команды stop, она также удаляет все контейнеры и внутренние сети, связанные с этими сервисами — но НЕ указанные внутри тома. Чтобы очистить и их, надо дополнить команду down флагом -v.

Установка NGinx

sudo apt update
sudo apt install nginx

Nginx настройка на http (без ssl сертификата)

Создаем конфиг файл Nginx для superset:

sudo nano /etc/nginx/sites-available/superset

Вставляем следующий код, при этом необходимо заменить домен nginx.superset-bi.ru на ваш собственный:

server {
    listen 80;

    server_name nginx.superset-bi.ru;

    location / {
        proxy_pass http://localhost:8088;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Далее запускаем команду:
sudo ln -s /etc/nginx/sites-available/superset /etc/nginx/sites-enabled

при повторном обновлении нужно запустить другую команду с -sf:
sudo ln -sf /etc/nginx/sites-available/superset /etc/nginx/sites-enabled

Затем запускаем проверку конфига:
sudo nginx -t

Рестартуем Nginx
sudo systemctl restart nginx

После этого Superset станет доступен на http адресе домена:

http://nginx.superset-bi.ru/

Как мы видим порт 8088 не отображается, хотя сам Superset контейнер доступен по этому порту:

Настройка Nginx и ssl Let’s Encrypt для использования https для Apache Superset

Установка сертификата SSL от Let’s Encrypt для домена Superset (https ssl сертификат)

Для этого установим пакет Certbot Nginx с помощью команды:

sudo apt install python3-certbot-nginx

Далее запускаем команду генерации ssl сертификата:

sudo certbot --nginx -d nginx.superset-bi.ru

Результат генерации ssl сертификата:

Проверить сгенерированные сертификаты и ключи:

ls /etc/letsencrypt/live/nginx.superset-bi.ru/

Изменяем настройки Nginx для https с сертификатом

После установки сертификата certbot может изменить конфиг файл самостоятельно.

Должно получиться следующая конфигурация:

server {

    server_name nginx.superset-bi.ru;

    location / {
        proxy_pass http://localhost:8088;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/nginx.superset-bi.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/nginx.superset-bi.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

После этого суперсет будет работать как и ожидается, без порта 8088 в url и с защищенным https трафиком:

cat /etc/letsencrypt/options-ssl-nginx.conf

Что находится в файле с настройками option-ssl-nginx.conf. Запускаем команду cat /etc/letsencrypt/options-ssl-nginx.conf

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";

Итоговая настройка Nginx с сертификатом ssl для https Apache Superset

server {

    server_name nginx.superset-bi.ru;

    location / {
        proxy_pass http://localhost:8088;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/nginx.superset-bi.ru/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/nginx.superset-bi.ru/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

server {
    if ($host = nginx.superset-bi.ru) {
        return 301 https://$host$request_uri;
    } 


    listen 80;

    server_name nginx.superset-bi.ru;
    return 404; 

}

Подписывайтесь на канал @apache_superset_bi, чтобы быть в курсе последних новостей про Apache Superset

Ivan Shamaev (Admin)
Работаю с Apache Superset с 2021 года. Веду этот блог, чтобы систематизировать свои знания и поделиться ими с другими специалистами. Подписывайтесь на мой телеграм канал @apache_superset_bi
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x