Superset を本番環境として構築する

メモ:  Category:ubuntu

Superset を本番環境として運用できるよう環境構築します。

ここでは、 WSGI サーバーに Superset のドキュメントで推奨されている Gunicorn を使用し、リバースプロキシに NGINX の組み合わせで用意します。また、Superset 用のユーザーを用意することでセキュリティ面についても検討していきたいと思います。

構築環境

  • Ubuntu 24.04 LTS
  • Python 3.11
  • Superset 5.0.0
  • PostgreSQL 16.9
  • Gunicorn
  • NGINX

準備

動作確認のため一時的に 8088 ポートを開けておきます。

$ sudo ufw allow 8088

メタデータデータベース PostgreSQL をインストールする

Superset では、管理情報を保存するデータベースが必要になります。本番環境の推奨は、 PostgreSQL か MySQL と記載されていますので PostgreSQL をインストールします。

ドキュメントに記載されている、 PostgreSQL のサポートされるバージョンは「10.X、11.X、12.X、13.X、14.X、15.X、16.X」で Ubuntu の公式パッケージが 16 でしたので、公式パッケージをインストールします。

インストールを始める前にパッケージリストを更新して、インストール済みのパッケージを更新します。

$ sudo apt update
$ sudo apt upgrade

それでは、 PostgreSQL をインストールします。

$ sudo apt install postgresql

念のため PostgreSQL のバージョンを確認します。

$ psql --version
psql (PostgreSQL) 16.9 (Ubuntu 16.9-0ubuntu0.24.04.1)

Superset 用にデータベースとユーザーを作成します。

$ sudo -u postgres psql
[sudo] password for hoge:
psql (16.9 (Ubuntu 16.9-0ubuntu0.24.04.1))
Type "help" for help.

対話モードになるので、データベールの作成やユーザーの作成を次のようの実施します。

postgres=# create database superset owner postgres;
CREATE DATABASE
postgres=# create user superset with password 'パスワードを指定';
CREATE ROLE
postgres=# grant all privileges on database superset to superset;
GRANT
postgres=# \connect superset postgres
You are now connected to database "superset" as user "postgres".
postgres=# grant all privileges on schema public to superset;
GRANT
postgres=# grant all privileges on all tables in schema public to superset;
GRANT
postgres=# grant all privileges on all sequences in schema public to superset;
GRANT
postgres=# \q

データベースの準備は以上です。

Python 3.11 をインストールする

ここからは、「Ubuntu 24.04.2 LTS へ Superset をインストールする」と同じように Superset がサポートしている python と Superset をインストールしていきます。 少し違うのは、 Superset 用にユーザーを作成しセキュリティ対策が行いやすいようにしていきます。

まずは、 Python からインストールします。

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-dev python3.11-venv build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev default-libmysqlclient-dev

Superset 用ユーザーを作成する

Superset 用のユーザー・グループを作成します。作成した supersetgrp グループに superset ユーザーを所属させます。

$ sudo adduser superset
$ sudo groupadd supersetgrp
$ sudo usermod -aG supersetgrp superset
$ sudo usermod -aG sudo superset

Superset をインストールするディレクトリを作成し、所有者やパーミッションを設定します。

$ sudo mkdir /home/superset/superset
$ sudo chown -R superset:supersetgrp /home/superset/superset
$ sudo chmod -R 770 /home/superset/superset

作成した Superset 用のユーザーへ切り替えます。

$ su - superset
$ cd ~/superset/

Superset をインストールする

Superset のドキュメントに Python の仮想環境で構築することが推奨されています。

次のコマンドを実行し、仮想環境を構築していきます。

$ python3.11 -m venv venv
$ source venv/bin/activate

有効化すると、プロンプトの前に仮想環境名が表示されます。

(venv) superset@host:~/superset$

pip で Superset をインストールします。 「 superset db upgrade 」でエラーにならないよう「 marshmallow 」の古いバージョンをインストールします。

(venv) superset@host:~/superset$ pip install --upgrade pip
(venv) superset@host:~/superset$ pip install apache_superset
(venv) superset@host:~/superset$ pip install marshmallow==3.20.1

いったん環境変数 FLASK_APP と設定ファイルのパスである SUPERSET_CONFIG_PATH を設定します。

(venv) superset@host:~/superset$ echo 'export FLASK_APP=superset' >> ~/.bashrc
(venv) superset@host:~/superset$ echo 'export SUPERSET_CONFIG_PATH=/home/superset/superset_config/superset_config.py' >> ~/.bashrc
source ~/.bashrc

設定ファイルを作成します。

(venv) superset@host:~/superset$ mkdir /home/superset/superset_config
vi /home/superset/superset_config/superset_config.py

メタデータを格納する PostgreSQL の接続文字と秘密キーを設定します。

キーの生成は、「openssl rand -base64 42」を使用します。

SQLALCHEMY_DATABASE_URI="postgresql://<UserName>:<DBPassword>@localhost:5432/<Database Name>"
SECRET_KEY="qAsIRG/kq+XPy1s0vjPbzuVv3SBTTc8oOUR2ZF1XTWLKebpjAjPegg8o"
LANGUAGES = {
    "en": {"flag": "us", "name": "English"},
    "ja": {"flag": "jp", "name": "Japanese"},
}

※参照:Config

Database Drivers をインストールする

警告が出たりするため、パッケージ管理関係を更新しておきます。

$ pip install --upgrade setuptools wheel pip

PosgreSQL 用のデータベース接続ドライバーをインストールします。

(venv) superset@host:~/superset$ pip install psycopg2

次のようなエラーが発生し、うまくインストールできませんでした。

Collecting psycopg2
  Downloading psycopg2-2.9.10.tar.gz (385 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: psycopg2
  Building wheel for psycopg2 (pyproject.toml) ... error
  error: subprocess-exited-with-error

調べてみたところ、 libpq-dev が必要という事でしたのでインストールしていきます。

$ sudo apt install libpq-dev python3-dev

もう一度、 psycopg2 をインストールします。

(venv) superset@host:~/superset$ pip install psycopg2

今度は正常にインストールされました。

それでは、 Superset を初期化して行きます。

(venv) superset@host:~/superset$ superset db upgrade
(venv) superset@host:~/superset$ superset fab create-admin
(venv) superset@host:~/superset$ superset load_examples
(venv) superset@host:~/superset$ superset init

Superset が動作するか確認します。

(venv) superset@host:~/superset$ superset run -h 0.0.0.0 -p 8088 --with-threads --reload --debugger

ブラウザからアクセスしてログイン画面が表示されれば、 Superset のインストールは完了です。

Gunicorn をインストールする

問題がないようでしたら、 WSGI server をインストールします。

(venv) superset@host:~/superset$ pip install gunicorn

次のコマンドを実行し、 gunicorn 経由で Superset を実行します。

(venv) superset@host:~/superset$ gunicorn -w 2 --timeout 60 -b 0.0.0.0:8088 "superset.app:create_app()"

こちらも問題が無ければ外部のブラウザからアクセスできます。

NGINX をインストールする

NGINX をインストールします。

$ su -
$ sudo apt install nginx

正常に動作しているか確認します。

$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-08-06 13:26:39 UTC; 3min 10s ago
       Docs: man:nginx(8)
    Process: 12254 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 12255 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 12285 (nginx)
      Tasks: 3 (limit: 4548)
     Memory: 2.4M (peak: 5.2M)
        CPU: 13ms
     CGroup: /system.slice/nginx.service
             ├─12285 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─12288 "nginx: worker process"
             └─12289 "nginx: worker process"

NGINX と Gunicorn が連携するよう NGINX の設定を行います。

「/etc/nginx/sites-available/」に設定ファイルを作成します。

$ sudo vi /etc/nginx/sites-available/superset

Gunicorn へ向かうよう次のように設定します。

server {
    listen 80;
    server_name ドメインまたはIPアドレス;

    location / {
        proxy_pass http://127.0.0.1:8088;
        proxy_set_header Host $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;
    }

    client_max_body_size 50M;
}

「/etc/nginx/sites-enabled/」にシンボリックリンクを作成すると、先ほど作成した設定ファイルが適用されます。

$ sudo ln -s /etc/nginx/sites-available/superset /etc/nginx/sites-enabled/
$ sudo nginx -t
$ sudo systemctl restart nginx

systemd のユニットファイルを作成

ログの出力先として次のディレクトリを作成します。

$ sudo mkdir /var/log/superset

systemd のユニットファイルを作成します。

$ sudo vi /etc/systemd/system/superset.service

作成するファイルに次のように追加します。

[Unit]
Description=Apache Superset
After=network.target

[Service]
User=superset
Group=supersetgrp
WorkingDirectory=/home/superset/superset
Environment="PATH=/home/superset/superset/venv/bin"
Environment="SUPERSET_CONFIG_PATH=/home/superset/superset_config/superset_config.py"
Environment="FLASK_APP=superset"
ExecStart=/home/superset/superset/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8088 "superset.app:create_app()"
Restart=always
StandardOutput=append:/var/log/superset/superset.log
StandardError=append:/var/log/superset/superset-error.log

[Install]
WantedBy=multi-user.target

作成したユニットファイルを有効にして、実行します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart superset
$ sudo systemctl enable superset

ファイアウォールの設定で 80 ポートを開け、ブラウザからアクセスしログイン画面が表示されれば設定完了です。

8088 ポートが開いたままなので、忘れないで削除します。

bluenote by BBB