Ibexa DXP のインストール手順

**Ibexa DXP** のオープンソース版を LAMP 環境のサーバーに**インストール**する手順 [^install_ez_platform] について解説します。

[^install_ez_platform]: [Install Ibexa DXP - Developer Documentation](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform/)

## 作業環境
macOS 上で VirtualBox に Rockey Linux 8.5 (CentOS 8 相当) をインストールしてある環境を前提としています。
* macOS Monterey 12.2.1
* VirtualBox 6.1.32
* Rocky Linux 8.5

不慣れな方は「[Rocky Linux 8 を VirtualBox に最小インストールする - Qiita](https://qiita.com/bezeklik/items/79f0d65e971157aef907)」を参考にご準備いただければと思います。

## ミドルウェアのインストール
### システム要件
公式ドキュメントの情報としては、必要最低限のシステム要件として以下のようになっています。 [^requirements]

[^requirements]: [Ibexa DXP のシステム要件 - Qiita](https://qiita.com/bezeklik/items/cd8d1e666a045ca86950)

* OS
    * Debian 10.x
    * Ubuntu 20.04
    * RHEL / CentOS 8.1
* Web サーバー
    * Apache 2.4
    * Nginx 1.18
* DB サーバー
    * MariaDB 10.3, 10.4
    * MySQL 8.0
    * PostgreSQL 10
* PHP
    * 8.1
    * 8.0
    * 7.4
* PHP エクステンション
    * php-cli
    * php-fpm
    * php-mysql (php-mysqlnd) または php-pgsql
    * php-xml
    * php-mbstring
    * php-json
    * php-process (on RHEL/CentOS)
    * php-intl
    * php-curl
    * php-pear (optional, provides pecl)
    * php-gd または php-imagick (via pecl on RHEL/CentOS)
* グラフィックハンドラー
    * GraphicsMagick
    * ImageMagick
    * GD
* パッケージマネージャー
    * Composer 2.1
* アセットマネージャー
    * Node.js 14
    * yarn 1.15.2

### MySQL 8.0
```shell
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
dnf install https://repo.mysql.com/mysql80-community-release-el8.rpm
dnf install mysql-server
systemctl is-enabled mysqld
systemctl --now enable mysqld
grep 'password' /var/log/mysql/mysqld.log
mysql_secure_installation
```

### Apache 2.4 / PHP 8.1
```shell
rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module list php nginx
dnf module enable php:remi-8.1 nginx:1.20
dnf install php php-{gd,mysqlnd,process,intl}
systemctl is-enabled httpd php-fpm
systemctl --now enable httpd php-fpm
firewall-cmd --permanent --add-service=http{,s} && firewall-cmd --reload
```
php-cli, php-fpm, php-xml, php-mbstring は依存関係で自動的にインストールされます。
php-json は PHP 8.0.0 以降 PHP コアに組み込まれているためインストール不要です。[^php-json]

[^php-json]: <q cite="https://www.php.net/manual/ja/json.installation.php">PHP 8.0.0 以降、JSON 拡張モジュールは PHP コアに組み込まれているため、 常に有効になっています。</q> - <cite>[PHP: インストール手順 - Manual](https://www.php.net/manual/ja/json.installation.php)</cite>

### Node.js 14 / Yarn 1.22
```shell
dnf module list nodejs
dnf module enable nodejs:14
dnf install nodejs
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo --output /etc/yum.repos.d/yarn.repo
rpm --import https://dl.yarnpkg.com/rpm/pubkey.gpg
dnf install yarn
```

### 画像最適化ライブラリ
こちらは必須ライブラリではないので、動作確認目的ではインストール不要です。
```shell
dnf install jpegoptim pngquant gifsicle
yarn global add svgo cwebp-bin
```

### Composer / Git 2.27
```bash
dnf install git composer unzip
```

## IbexaDXP のインストール
### GitHub Personal access tokens の取得
[https://github.com/settings/tokens/new](https://github.com/settings/tokens/new)

### プロジェクトの作成
```shell
mkdir /var/www/ibexa && cd $_ && \
COMPOSER_MEMORY_LIMIT=-1 composer create-project ibexa/oss-skeleton .
```
ドキュメントでは `ibexa/content-skeleton` などとなっていますが、いずれも製品版で認証情報が必要になるため、オープンソース版をインストールする場合は `ibexa/oss-skeleton` を指定する必要があります。
https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors

### バージョン管理への追加
```shell
git init; git add . > /dev/null; git commit -m "init" > /dev/null
```

### .env
```shell
echo "DATABASE_URL=mysql://root:@localhost:3306/ibexa" >> .env
git add .env && git commit -m 'Add .env files'
```

### インストールの実行
```shell
php bin/console ibexa:install && \
php bin/console ibexa:graphql:generate-schema && \
composer run post-install-cmd
```

### SELinux とパーミッションの変更
```shell
setsebool -P httpd_can_network_connect 1 && \
setsebool -P httpd_execmem 1 && \
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/ibexa/var(/.*)?' && \
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/ibexa/public/var(/.*)?' && \
chown --recursive apache:apache /var/www/ibexa && \
restorecon -R $_
```
SELinux が有効時にデータベースを利用する為に `setsebool` コマンドで  `httpd_can_network_connect_db` を `1` に設定する必要があります。
SELinux が有効時に Redis を利用する場合は `setsebool` コマンドで  `httpd_can_network_connect` を `1` に設定する必要があります。この際、 `httpd_can_network_connect_db` は `httpd_can_network_connect` のサブセットなので `1` を指定する必要はありません。
SELinux が有効時に PHP の JIT コンパイルを利用するには `setsebool` コマンドで `httpd_execmem` を `1` に設定する必要があります。
現在の設定値は `getsebool httpd_{can_network_connect,execmem}` で確認できます。

### VirtualHost の設定
[vhost ファイルの例](https://github.com/ezsystems/developer-documentation/tree/master/code_samples/install/vhost_template/vhost.template)
https://doc.ibexa.co/en/latest/getting_started/install_ez_platform/#set-up-a-virtual-host
https://doc.ibexa.co/en/latest/guide/environments/
```apache:/etc/httpd/conf.d/ibexa.conf
<VirtualHost *:80>
    ServerName 192.168.56.100
    DocumentRoot /var/www/html/public
    DirectoryIndex index.php
    #LogLevel debug
    <Directory /var/www/html/public>
        <FilesMatch \.php$>
            #SetHandler "proxy:fcgi://localhost/:9000"
            SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
        </FilesMatch>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    #if[APP_ENV] SetEnvIf Request_URI ".*" APP_ENV=%APP_ENV%
    #if[APP_DEBUG] SetEnv APP_DEBUG "%APP_DEBUG%"
    #if[APP_HTTP_CACHE] SetEnv APP_HTTP_CACHE "%APP_HTTP_CACHE%"
    #if[TRUSTED_PROXIES] SetEnv TRUSTED_PROXIES "%TRUSTED_PROXIES%"

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
        RewriteRule ^var/.*(?i)\.(php3?|phar|phtml|sh|exe|pl|bin)$ - [F]
        RewriteCond %{ENV:BINARY_DATA_HANDLER} "dfs"
        RewriteRule ^/var/([^/]+/)?storage/images(-versioned)?/.* /index.php [L]
        RewriteRule ^/var/([^/]+/)?storage/images(-versioned)?/.* - [L]
        RewriteRule ^/favicon\.ico - [L]
        RewriteRule ^/robots\.txt - [L]
        RewriteRule ^/bundles/ - [L]
        RewriteRule ^/assets/ - [L]
        RewriteRule ^/build/ - [L]
        RewriteCond %{ENV:APP_ENV} !^(dev)
        RewriteRule ^/(css|js|fonts?)/.*\.(css|js|otf|eot|ttf|svg|woff) - [L]
        RewriteRule ^/([^/]+/)?index\.php([/?#]|$) - [R=404,L]
        RewriteRule .* /index.php
    </IfModule>
    <IfModule mod_expires.c>
        <LocationMatch "^/var/[^/]+/storage/images/.*">
            ExpiresActive on
            ExpiresDefault "now plus 10 years"
        </LocationMatch>
    </IfModule>
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/plain text/css application/json text/javascript application/javascript text/xml application/xml application/xml+rss
    </IfModule>
</VirtualHost>
```
```shell
httpd -t && systemctl reload httpd
```

## 管理画面へのログイン
![スクリーンショット 2022-04-05 6.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/6d8ddaad-c6bc-7d31-c38a-2bcec9a0308f.png)

http://192.168.56.100/admin

`/admin` にアクセスするとログイン画面が表示されます。
Username が `admin`、 Password が `publish` に設定されています。

## 日本語設定
```bash
php bin/console translation:extract --enable-extractor=ez_online_editor_attributes --dir=./templates --output-dir=./translations/ --output-format=yaml
```
[^]: <q cite="https://doc.ibexa.co/en/latest/extending/extending_online_editor/#custom-css-classes">If there are many custom attributes, to provide label translations for these attributes, you can use the `ez_online_editor_attributes` translation extractor to get a full list of all custom attributes for all elements in all scopes.</q><cite>[Extend Online Editor - Ibexa Developer Documentation](https://doc.ibexa.co/en/latest/extending/extending_online_editor/#custom-css-classes)</cite>

https://doc.ibexa.co/en/latest/guide/back_office_translations/
```yaml:config/packages/ibexa.yaml
ibexa:
    ui:
        translations:
            enabled: true
```
```shell
git commit -m 'Enable Back Office translations'
php bin/console cache:clear
```
`/admin/user/settings/update/location` にアクセスして「Japanese」を選択して右上の「Save」をクリックします。

## ウェルカムページ関連ファイルの削除
```shell
rm --verbose --force config/packages/ibexa_welcome_page.yaml && \
rm --verbose --force translations/ibexa_welcome_page.en.xlf && \
rm --verbose --force assets/scss/welcome-page.scss && \
rm --verbose --force templates/themes/standard/full/welcome_page.html.twig && \
sed -i '/Welcome/,/^$/d' webpack.config.js && \
git commit -m 'Delete welcome page related files'
php bin/console cache:clear
```