FreeBSD に PowerDNSAdmin をインストールする

PowerDNS を PostgreSQL バックエンドでインストールして、PowerDNS Admin を動かしたいということで、 順を追って手順を記録していきます。

もくじ

  • PostgreSQL をインストールする
  • PowerDNS をインストールする
  • PowerDNS Admin をインストールする ← 今回
  • h2o + Gunicorn で実行する

参考

github.com

準備

pdnsadm ユーザーの作成

PowerDNSAdmin を実行するユーザーを用意します。

# pw useradd pdnsadm -u 5120 -g pdns -s /usr/sbin/nologin -c "PowerDNSAdmin unpriviledged user"
# mkdir -p /usr/home/pdnsadm
# chown pdnsadm:pdns /usr/home/pdnsadm

ホームディレクトリは、本来 pw コマンドが自動で作ってくれるはずなのですが、なぜか作られませんでした。

PowerDNSAdmin v0.3.0 の取得

pdnsadm ユーザーになってホームディレクトリで

$ fetch https://github.com/PowerDNS-Admin/PowerDNS-Admin/archive/refs/tags/v0.3.0.zip
$ tar -xvs /PowerDNS-Admin-0.3.0/powerdns-admin/ -f v0.3.0.zip

必要なパッケージのインストール

まずは FreeBSD のパッケージをインストールします。

# pkg install python39 node16 yarn rust
# pkg install libxml2 libxslt pkgconf py39-bcrypt py39-cffi py39-ldap py39-xmlsec 

本当は py39-cryptography を入れることで rust の必要性を回避したいところですが、なかなか ports が 3.4.8 から上がらないので、仕方なく rust も入れます。 次に Python の virtualenv を用意しますが、上でインストールしたものは pip でのインストールが面倒なので、--system-site-packages オプションをつけます。pdnsadm ユーザーで、ホームディレクトリにて

$ python3.9 -m venv webpy39 --system-site-packages
$ . ./webpy39/bin/activate
(webpy39) $ python -m pip install --upgrade pip wheel

shell を tcsh にしている場合は

source ./webpy39/bin/activate.csh

そのまま PowerDNSAdmin のディレクトリに入って、要求されている python ライブラリをインストールします。

pip install の前に、mysqlclient==2.0.1コメントアウトします。また、PostgreSQL を利用するので、psycopg2 をインストールします。細かいですが、shell を上記の通りに /usr/sbin/nologin に設定している場合、su -m か何かで pdnsadm ユーザー権限になっていると思うので、HOME 環境変数の設定を忘れないでください。(tcsh だと setenv ですね)

(webpy39) $ export HOME=/usr/home/pdnsadm
(webpy39) $ cd powerdns-admin
(webpy39) $ pip install -r requirements.txt
(webpy39) $ pip install psycopg2

PowerDNSAdmin の設定と実行

PowerDNSAdmin の設定

powerdns-admin/powerdnsadmin/default_config.py に設定があるので、それを書き換えるという手もありますが、ひとまず powerdns-admin/configs/standalone.py にコピーしていじります。

import urllib.parse

# Basic App Configuration
SALT = "なんかランダム文字列"
SECRET_KEY = "なんかランダム文字列"
BIND_ADDRESS = "0.0.0.0"
PORT = 9191
OFFLINE_MODE = False

# Database Configuration
SQLA_DB_USER = "pdns"
SQLA_DB_PASSWORD = "DBに設定したpdns roleのパスワード"
SQLA_DB_HOST = "[::1]"
SQLA_DB_NAME = "pdns"
SQALCHEMY_TRACK_MODIFICATIONS = True

# Database - PostgreSQL
SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://{}:{}@{}/{}".format(
        urllib.parse.quote_plus(SQLA_DB_USER),
        urllib.parse.quote_plus(SQLA_DB_PASSWORD),
        SQLA_DB_HOST,
        SQLA_DB_NAME
        )

SAML_ENABLED = False
SAML_ASSERTION_ENCRYPTED = True

PostgreSQL への接続の設定については公式サイトに記述があります。 パスワードというかランダム文字列の生成については、専用のプログラムを使う方法や、汎用の方法があるので、参考にしてください。

Flask の設定

環境変数 FLASK_CONF と FLASK_APP を設定します。

$ cd /usr/home/pdnsadm/powerdns-admin
$ export FLASK_CONF=/usr/home/pdnsadm/powerdns-admin/configs/standalone.py
$ export FLASK_APP=powerdnsadmin/__init__.py

次にデータベースを初期化して web assets をビルドします。(よく分かっていませんが、参考サイトの言うがままに)

$ flask db upgrade
$ yarn install --pure-lockfile
$ flask assets build

実行

これで PowerDNSAdmin のインストールと設定ができたはずなので、

./run.py

を実行して 9191 番ポートで PowerDNSAdmin が動いているかを確認します。

h2o + Gunicorn で実行する

ちょっと長くなるので、次回に。