Hi WRITE(Rust Headless CMS)に入門した




# Hi WRITE(Rust Headless CMS)に入門したぞー

晴れ時々エンジニアの**いっくん**です。
今日は**Headless CMS**について調べたことを共有しつつ、**Rustで書かれたTECHFUND社の[Hi WRITE](https://github.com/TECHFUND/hiwrite)** *1に入門した時のメモを共有します。
*1 ..[プレスリリース](https://prtimes.jp/main/html/rd/p/000000036.000022017.html)ご参照
<img width="500" src="https://prcdn.freetls.fastly.net/release_image/22017/36/22017-36-f1f0f257d02ba47fcfa398fab8d2744f-1160x607.png?format=jpeg&auto=webp&quality=85%2C75&width=1950&height=1350&fit=bounds">



## Headless CMSとは？

**Headless CMS**は、ウェブサイトやアプリケーションのフロントエンドと、コンテンツを管理するバックエンドを切り離すように設計された**コンテンツ管理システム**です。Headless CMSは、コンテンツを直接Webページにレンダリングする代わりに、**APIを通じてコンテンツを公開**し、あらゆる種類のフロントエンドやアプリケーションで表示することができます。

このアーキテクチャにより、ウェブサイト、モバイルアプリなど、**異なるコンテキストで同じコンテンツを再利用**することができ、それぞれのプラットフォームでコンテンツを再作成する必要がありません。また、サイトやアプリケーションのフロントエンドをバックエンドから独立して更新できるため、**コンテンツをより柔軟に管理**することができます。

**人気のあるヘッドレスCMSとしては、[Contentful](https://www.contentful.com/)、[GraphCMS](https://hygraph.com/)、[Directus](https://directus.io/solutions/headless-cms/)などがあります。** これらのCMSは、コンテンツを管理するためのWebベースのインターフェイスと、コンテンツにアクセスし操作するためのAPIを提供します。

## Headless CMSの利点は？
・**バックエンド（コンテンツの管理場所）とフロントエンド（コンテンツの表示方法）の分離されたアーキテクチャ**により、サイトやアプリケーションのフロントエンドをバックエンドから独立して更新できるため、**コンテンツの柔軟性と制御性が高く**なっています。　
内容の更新のたびにエンジニアに頼んでHTMLの編集をしてもらう必要がなく、誰でも管理画面からWebサイトの内容を書き換えることができます。

・**再利用可能なコンテンツ。** ヘッドレスCMSは、APIを通じてコンテンツを公開するので、ウェブサイト、モバイルアプリなどあらゆるコンテキストでそのコンテンツを再利用することができます。

・**フロントエンドが選択可能。**　ヘッドレスCMSは、HTTPリクエストを行い、JSONやXMLのレスポンスをパースできるフロントエンドやアプリケーションであれば、Rust、JavaScript、Pythonなど、あらゆるプログラミング言語やフレームワークで使用することができます。

・**パフォーマンスの向上。** ヘッドレスCMSは、レンダリングする必要がないため、従来のCMSよりも高速かつ効率的に動作することがあります。これは特にトラフィックの多いサイトやアプリケーションで有効です。

## なぜRust製を選んだの？
TECHFUND社の[プレスリリース](https://prtimes.jp/main/html/rd/p/000000036.000022017.html)からRust製のメリットを抜粋します。

・Rust言語の特徴である**並列処理性能**により、少ないサーバー構成でより多くのコンテンツを並列処理・管理することができるため、費用対効果が高い運用を可能。
・**導入が非常に簡単。** バイナリファイルをダウンロードし、実行するだけでCMSの運用開始できる。
・他のNode.jsやPHPベースのCMSよりも**高速なレスポンスタイム**を提供することが可能。

## なぜHi WRITEを選んだの？
**そこにHi WRITEがあったから**（キリッ）。
~~たまたまみつけたから。~~ 
オープンソースだから。**おそらく他にないのでは？**


## さあ、入門しますよー
ちなみに、私の環境は　AppleのM1 MacBook Pro（2020）です。

### 事前準備

#### 「Hi WRITE」Githubリポジトリからクローン

`git clone https://github.com/TECHFUND/hiwrite`

#### Rustのインストール

##### Homebrewを使う場合
`brew install rust`
##### rustupを使う場合
`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`

インストーラのダウンロードを行い、最新の安定版のRustがインストールされます。

#### RustのVersion確認
ターミナルを再起動して下記コマンドを発行する
`rustc --version`
このようにVersion名が出てくればインストール成功
`rustc 1.66.0 (69f9c33d7 2022-12-12)`

#### Postgresのインストール
[公式ページ](https://www.postgresql.org/)から使用環境に応じた安定版をダウンロードし、インストールする。
#### diesel_cliのインストール
**diesel**というのはRustのObject Relational Mapping(ORM, データベースを扱うためのライブラリ)であり、**diesel_cli**というのはそのコマンドラインツールである。

`cargo install diesel_cli --no-default-features --features postgres`
 
以下のエラーが出た場合、
```
  = note: ld: library not found for -lpq
          clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
libpqをインストールする。
`brew install libpq`

`diesel –version` でDieselとdiesel_cliのVersionが一致することを確認する
```
#diesel_cliのインスロール時のログ（後半のみ）
  Compiling heck v0.4.0
   Compiling migrations_internals v2.0.0
   Compiling migrations_macros v2.0.0
   Compiling diesel_migrations v2.0.0
   Compiling diesel_cli v2.0.1
    Finished release [optimized] target(s) in 22.14s
  Installing /Users/ikkun/.cargo/bin/diesel
   Installed package `diesel_cli v2.0.1` (executable `diesel`)

#dieselのバージョン確認
% diesel --version
diesel 2.0.1
```

### hiwriteデータベースを作成する

`psql -U postgres`でPostgresSQLへ接続し、`create database hiwrite`でデータベースを作成する。

```
% psql -U postgres
psql (15.1)
Type "help" for help.

postgres=# create database hiwrite;
CREATE DATABASE
```

`postgres=# \q`で接続を解除する。

### .envファイルの作成
リポジトリの`.env.sample`を参考に`.env`ファイルを作成する。

### Hi WRITE起動
`% cargo run -- migrate`と`% cargo run -- server`でHi WRITEが起動する。
```
    Finished dev [unoptimized + debuginfo] target(s) in 0.28s
     Running `target/debug/hiwrite migrate`
Running migration 2022-11-1-101223_init
Ran migrations.
HiWrite Up!
```
### コンテンツ管理
RESTful APIを使用してコンテンツの管理をします。
仕様は`http://localhost:8000/api/docs`を参照ください。

## まとめ
Headless CMSからRust製のHi WRITEを取り上げて入門してみました。これから遊んでみます。