WardenでOroCommerceの環境構築

# 目次
1. [はじめに](#はじめに)
2. [環境](#環境)
3. [Wardenのインストール](#wardenのインストール)
4. [OroCommerceの環境構築](#orocommerceの環境構築)
5. [おわりに](#おわりに)

# はじめに
[OroCommerce](https://oroinc.com)は、B2B向けに設計されたオープンソースのeコマースプラットフォームです。

今回は、私がいつもMagento2の環境構築ツールとして使用している[Warden](https://warden.dev/)でOroCommerce用のDocker Imageが追加されていたため、「WardenでOroCommerceの環境構築」をしてみました。

本記事執筆時点ではまだ開発中のようなので、色々と補完する部分は有りましたが、構築には成功したので備忘録として残そうと思います。

# 環境
||Version|
|:-:|:-:|
|Warden|0.15.0|
|OroCommerce|6.0.3|

# Wardenのインストール
Wardenのインストールに関しては、[WSL2+WardenでMagento2の環境構築をする方法の備忘録](https://qiita.com/nao_v/items/b2bbd1a949c24e2b7732)で紹介しています。

# OroCommerceの環境構築
### 1.プロジェクトの初期化

```
warden env-init [projectname] [environment type]
```
[projectname]：プロジェクトの名前を自由に決めます。（今回は「oro」）
[environment type]：[ドキュメント](https://swiftotter.github.io/den/environments/types.html)にあるタイプの中から一つ選びます。執筆時点では「OroCommerce」がまだ無いため、「Symfony」をベースに作成します。

### 2.環境設定
.envファイルが生成されるので、各種ミドルウェアのバージョン等を設定します。
今回OroCommerce 6.0.3用に作成した.envファイルは下記の通りです。
```
WARDEN_ENV_NAME=oro
WARDEN_ENV_TYPE=symfony
WARDEN_WEB_ROOT=/src

TRAEFIK_DOMAIN=oro.test
TRAEFIK_SUBDOMAIN=app

WARDEN_DB=1
WARDEN_REDIS=1
WARDEN_RABBITMQ=0
WARDEN_ELASTICSEARCH=0
WARDEN_ELASTICHQ=0
WARDEN_VARNISH=0

ELASTICSEARCH_VERSION=8.11
MYSQL_DISTRIBUTION=postgres
MYSQL_DISTRIBUTION_VERSION=16
NODE_VERSION=20.10.0
COMPOSER_VERSION=2
PHP_VERSION=8.3
WARDEN_SVC_PHP_VARIANT=-orocommerce
PHP_XDEBUG_3=1
RABBITMQ_VERSION=3.12
REDIS_VERSION=7.2
VARNISH_VERSION=7.5
```
OroCommerce用のイメージを使用するために、「WARDEN_SVC_PHP_VARIANT」を指定しています。将来的にはOroCommerce用のEnvironment Typeが作られると思います。

RabbitMQやElasticSearchは、Enterprise Editionでしか使用できないため、今回はオフにしています。（今回はCommunity Editionをインストールします。）

### 3.各種コンテナ調整
.warden/warden-env.ymlファイルを作成し、下記の通り記述します。
```
services:
  nginx:
    volumes:
      - ./.warden/nginx/orocommerce.conf:/etc/nginx/available.d/orocommerce.conf
    environment:
      NGINX_TEMPLATE=orocommerce.conf
  db:
    environment:
      - POSTGRES_DB=oro
      - POSTGRES_USER=oro
      - POSTGRES_PASSWORD=oro
```
.warden/nginx/orocommerce.confファイルを作成し、下記の通り記述します。
```
location / {
    try_files $uri /index.php$is_args$args;
}

location /ws {
    proxy_pass http://php-fpm:8080;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;

    proxy_read_timeout 86400;
    proxy_send_timeout 86400;
}

location ~ ^/(index|index_dev|config|install)\.php(/|$) {
    fastcgi_pass $fastcgi_backend;

    fastcgi_split_path_info ^(.+\.php)(/.*)$;

    include fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS on;
    fastcgi_buffers 64 64k;
    fastcgi_buffer_size 128k;

    internal;
}

location ~* ^[^(\.php)]+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js)$ {
    access_log off;
    expires 1h;
    add_header Cache-Control public;
}

gzip on;
gzip_proxied any;
gzip_types
    text/plain
    text/css
    text/js
    text/xml
    text/javascript
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/xml+rss
    image/svg+xml;
gzip_vary on;

# Deny access to other "sensitive" locations / scripts
location ~* (\.php$|\.htaccess$|\.git) {
    deny all;
}
```
`location /ws {}` の部分を追加しています。
WebSocketを使用して様々な通知をリアルタイムで受け取る機能がありますので、そのための設定です。

dbにはPostgreSQL用の初期設定を追加しています。

### 4.SSL証明書の作成

```
warden sign-certificate oro.test
```

### 5.プロジェクトの環境を立ち上げ、php-fpmコンテナに入る

```
warden env up
warden shell
```

### 6.OroCommerce Community Edition(6.0.3)をダウンロード

```
composer create-project oro/commerce-crm-application . 6.0.3
```

### 7.パラメータ調整
.env-appをコピーし、.env-app.localとして下記設定を追加します。
```
ORO_DB_URL=postgres://oro:oro@db:5432/oro?sslmode=disable&charset=utf8&serverVersion=16

ORO_MAILER_DSN=smtp://mailhog:1025

ORO_WEBSOCKET_SERVER_DSN=//0.0.0.0:8080
ORO_WEBSOCKET_FRONTEND_DSN=//*:443/ws
ORO_WEBSOCKET_BACKEND_DSN=tcp://127.0.0.1:8080

ORO_REDIS_URL=redis://redis:6379
ORO_SESSION_DSN=${ORO_REDIS_URL}/0
# ORO_SESSION_DSNはORO_REDIS_URLの下に移動させる必要があります。
```

redisの設定を有効にするため、下記コマンドを実行します。
```
composer set-parameters redis
```
### 8.OroCommerceをインストールする
```
php bin/console oro:install --env=prod --timeout=2000

Application URL (http://localhost): https://app.oro.test
```
### 9.php-fpm再起動
SupervisorでMessage QueueとWebSocket Serverが自動起動していますが、パラメータを調整するまではエラーで落ちているかと思います。一度コンテナを再起動しておきましょう。
```
warden env restart php-fpm
```
### 10.ブラウザで表示確認
```
https://app.oro.test (フロントエンド)
https://app.oro.test/admin (管理画面)
```

# おわりに
WardenでOroCommerce用のEnvironment Typeが開発されればもっとスムーズにいくとは思いますが、ひとまず環境構築ができました。
Wardenの更新や、設定値等の調査が進み次第、記事もアップデートしていこうと思います。