Debian+podman+Directus(1)インストール

# 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でないと動かない。古いマシンの場合には、事前にこれを確認して、動作しなければあきらめる。
 ```bash:
 cat /proc/cpuinfo | grep -i avx
 ```
 ### 2-2. podman の準備
 * インストール
 ```bash:
 sudo apt install podman
 ```
 ちなみに、一般ユーザーでは``podman logs [コンテナID]`` はうまく動かない。``sudo journalctl -xe`` でエラーを表示させなければならない。なにか工夫がありそうだが追求していない。
* 名前空間の設定
ファイルを編集して、次のような記述を追加する。この記述は、uid,gid それぞれ、100000から、65536個分という意味になる。すでにエントリーがある場合には、重ならないように設定する必要があるので注意する。先頭に# を入れればコメントになるので説明を入れておくと良い。username のところは、自分のログイン名とする。
```bash:/etc/subuid
# for podman
username:100000:65536
```
```bash:/etc/subgid
# for podman
username:100000:65536
```
設定を反映させるためにシステムを再起動する。（再起動させないで反映させる方法がありそうだけど。）

### 2-3. ディレクトリの作成
Directus で使うディレクトリの準備
```bash:
mkdir -m 777 -p $HOME/lib/directus/database \
                $HOME/lib/directus/extensions \
                $HOME/lib/directus/uploads
```
以降、working directory を変更して作業する。
```bash:
cd $HOME/lib/directus
```
モードについて777(-rwxrwxrwx)にしている。データベースにアクセスする際に、ログイン名のユーザー名で書き込めるだけではエラーになる。これも解決策がありそうだが追求していない。
### 2-4. pull と run
* pull
```bash:
podman pull docker.io/directus/directus
```
* run
```bash:
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](https://github.com/directus/directus/issues/20485#issuecomment-1821057854))
  * Directus のページには、docker-compose を使ったインストール方法が掲載されているので、podman-comopse が必要かと思ったが、上のようにすれば解決する。
  * データベースは、とりあえず、sqlite にしている。 
### 2-5. メールを送れるようにする
　メインテナンスのためには、メールを送れるようにしておくとよい。上の run のままではメールは送れない。次のオプションを追加して run する。
```bash:
	     -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](https://docs.directus.io/self-hosted/config-options.html)で見ることができる。
### 2-6. 確認
 locahostの8055番ポートにブラウザでアクセスする。
 ``http://localhost:8055/``
 ![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253484/c766e401-a3ff-6d58-3175-60da28261f35.png)

　Forgot Password をクリックして、メールが送られることも確認する。
　上で指定したメールアドレスとパスワードでサインインできればインストール完了！
 ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253484/e3243d25-8434-7b6c-16e3-cd6ebfe858d6.png)
　サインイン後、パスワードを適宜設定し直す。
### 2-7. コンテナ内部にアクセスする
　これで一通り動いたわけだが、コンテナ内部がどうなっているのか気になる。なにかトラブルになったときの原因究明のためにも、コンテナ内部二アクセスできると良い。提供されているイメージには bash が含まれていないので、sh でアクセスする。
 * ps -a でコンテナIDを取得
```bash:
$ 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 でコンテナ内のシェルを起動する
```bash:
podman exec -it 5089e910f1c9 sh
```