Debian+podman+Directus(1)インストール
0. はじめに
詳細はここでは書かないが、情報の整理の枠組みがほしいと思っている。XML で書けばおしまいではなく、追加、検索が容易で、PDFが追加でき、メモ書きがOneNote ですぐにアクセスでき、… と夢は広がる。これを既存のサービスに頼るのではなく、自分で作る。それができる時代になった。手始めに、環境を整える。ChatGPT の推奨はDirectus だったので、これを使う。
今回は、インストールするまで。
1. 選定理由
データベースに情報を入れていくときに、フロントエンドをつける必要がある。データベースの堅牢さと、フロントエンドの使いやすさが重要である。それをヘッドレスCMSで実現する。Strapi と Directus が候補となる。Strapi は前回やりかけて終わっている。すっかり忘れているので、ゼロからやるなら、違うもので挑戦する。
サーバーは、Debian で運用している。Strapi も Directus も、パッケージは無い。どうせ、Node.js を最新にしなければならない、などの作業が発生するので、サーバーの環境を汚染しないためにも、コンテナで運用する。
コンテナを運用するに当たって、docker を選ぶと、Debianのパッケージではうまくいかないようだ。これを別個にインストールすると、また環境を汚染することになる。最近は podman がいい感じのようなので、パッケージの podman を選んだ。
2. インストール
2-1. マシンの確認
後でわかったことだが、これから使う Directus のイメージは、CPU の AVX 命令を使っている。これが備わっているCPUでないと動かない。古いマシンの場合には、事前にこれを確認して、動作しなければあきらめる。
cat /proc/cpuinfo | grep -i avx
2-2. podman の準備
- インストール
sudo apt install podman
ちなみに、一般ユーザーではpodman logs [コンテナID]
はうまく動かない。sudo journalctl -xe
でエラーを表示させなければならない。なにか工夫がありそうだが追求していない。
- 名前空間の設定
ファイルを編集して、次のような記述を追加する。この記述は、uid,gid それぞれ、100000から、65536個分という意味になる。すでにエントリーがある場合には、重ならないように設定する必要があるので注意する。先頭に# を入れればコメントになるので説明を入れておくと良い。username のところは、自分のログイン名とする。
# for podman
username:100000:65536
# for podman
username:100000:65536
設定を反映させるためにシステムを再起動する。(再起動させないで反映させる方法がありそうだけど。)
2-3. ディレクトリの作成
Directus で使うディレクトリの準備
mkdir -m 777 -p $HOME/lib/directus/database \
$HOME/lib/directus/extensions \
$HOME/lib/directus/uploads
以降、working directory を変更して作業する。
cd $HOME/lib/directus
モードについて777(-rwxrwxrwx)にしている。データベースにアクセスする際に、ログイン名のユーザー名で書き込めるだけではエラーになる。これも解決策がありそうだが追求していない。
2-4. pull と run
- pull
podman pull docker.io/directus/directus
- run
podman run -d \
--name directus \
-p 8055:8055 \
-v ./database:/directus/database \
-v ./uploads:/directus/uploads \
-v ./extensions:/directus/extensions \
-e KEY="a000000000000000" \
-e SECRET="b000000000000" \
-e ADMIN_EMAIL="abc@example.com" \
-e ADMIN_PASSWORD="password" \
-e DB_CLIENT="sqlite3" \
-e DB_FILENAME="/directus/database/data.db" \
docker.io/directus/directus:latest
- 注意とコメント
- KEY と SECRET は、数字だけにしてはならない。数字だけにすると、ログイン時に Unexpected なんとか、と表示され、journalctl -xe でみると、
ERROR: secretORPrivateKey is not valid key material
となってうまくいかない。(cf. secretOrPrivateKey is not valid key material) - Directus のページには、docker-compose を使ったインストール方法が掲載されているので、podman-comopse が必要かと思ったが、上のようにすれば解決する。
- データベースは、とりあえず、sqlite にしている。
- KEY と SECRET は、数字だけにしてはならない。数字だけにすると、ログイン時に Unexpected なんとか、と表示され、journalctl -xe でみると、
2-5. メールを送れるようにする
メインテナンスのためには、メールを送れるようにしておくとよい。上の run のままではメールは送れない。次のオプションを追加して run する。
-e EMAIL_TRANSPORT="smtp" \
-e EMAIL_FROM="メール送信者のアドレス" \
-e EMAIL_SMTP_HOST="ローカルにSMTPでのメール送信を請け負ってくれるマシン名" \
-e EMAIL_SMTP_PORT="25" \
-e PUBLIC_URL="http://example.com:8055/" \
- 注意
- この設定では、メール送信を請け負っってくれるサーバーが近所にあって、そこに smtp で連絡する前提になっている。
- パスワードリセットの通知メールにアクセス先が入っている。PUBLIC_URL は、その先頭部分になるのでここで指定する。
- -e で指定するのは環境変数とその値である。メールを含めて、それらの一覧は、Configuration Optionsで見ることができる。
2-6. 確認
locahostの8055番ポートにブラウザでアクセスする。
http://localhost:8055/
Forgot Password をクリックして、メールが送られることも確認する。
上で指定したメールアドレスとパスワードでサインインできればインストール完了!
サインイン後、パスワードを適宜設定し直す。
2-7. コンテナ内部にアクセスする
これで一通り動いたわけだが、コンテナ内部がどうなっているのか気になる。なにかトラブルになったときの原因究明のためにも、コンテナ内部二アクセスできると良い。提供されているイメージには bash が含まれていないので、sh でアクセスする。
- ps -a でコンテナIDを取得
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5089e910f1c9 docker.io/directus/directus:latest /bin/sh -c : && ... 34 minutes ago Up 34 minutes ago 0.0.0.0:8055->8055/tcp directus
- exec でコンテナ内のシェルを起動する
podman exec -it 5089e910f1c9 sh