WSL2+DenでMagento2の環境構築

:::note alert
Denは開発が終了してしまいました。
今後はDenのFork元のリポジトリであるWardenを使用しましょう！
[WSL2+WardenでMagento2の環境構築をする方法の備忘録](https://qiita.com/nao_v/items/b2bbd1a949c24e2b7732 "WSL2+WardenでMagento2の環境構築をする方法の備忘録")でインストール方法を紹介しています。
また、DenからWardenに移行する場合は、[DenのREADME](https://github.com/swiftotter/den?tab=readme-ov-file#den-is-no-longer-actively-maintained)を参考にしてください。
:::
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
2. [環境](#環境)
3. [WSL2のインストール](#wsl2のインストール)
4. [Denのインストール](#denのインストール)
5. [Magento環境の構築](#magento環境の構築)
6. [おわりに](#おわりに)
<!-- 各チャプター -->
# はじめに
<!-- 発端や概要を記載 -->
この記事は、[WSL2+WardenでMagento2の環境構築をする方法の備忘録](https://qiita.com/nao_v/items/b2bbd1a949c24e2b7732 "WSL2+WardenでMagento2の環境構築をする方法の備忘録")のDenによる焼き直しです。

DenとはWardenをForkしたリポジトリで、Wardenとの違いとして下記のように述べられています。
- Alpine Linuxをベースにした軽量なイメージの使用
- より迅速なアップデートスケジュール

[github](https://github.com/swiftotter/den "swiftotter/den")に使用可能なサービスのバージョンがリストしてあったり、単純にコマンドが短かったりと、使いやすい部分が多いので、私は環境を全てDenに置き換えました。
今回はDenへの移行方法と、Magento2のインストール方法を紹介します。

# 環境
| 1 | 2 |
|:-:|:-:|
|WSL2   |1.2.5.0   |
|Ubuntu    | 22.04  |
|Den   |1.0.0-beta.14   |

# WSL2のインストール
WSL2(Windows Subsystem for Linux 2)とは、Windows内でLinuxを実行できる仕組みである。（[詳細はマイクロソフトのドキュメント](https://docs.microsoft.com/ja-jp/windows/wsl/about)）
[マイクロソフトのドキュメントにあるインストール方法](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)の通りに実行すれば、wsl2をインストールできる。

# Denのインストール
1.Homebrewをインストールする
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
2.Denをインストールし、Global Serviceを起動する

```
brew install swiftotter/den/den
den svc up
```

3.起動に成功したら、以下のURLで確認できる。
・https://traefik.den.test/
・https://portainer.den.test/ (Defaultではオフ)
・https://dnsmasq.den.test/
・https://mailhog.den.test/

>PortainerはDockerのコンテナ等をGUIで管理できるツールですが、デフォルトではオフになっています。
オンにしたい場合は`~/.den/.env`に`DEN_SERVICE_PORTAINER=1`を追記してから`den svc up`します。
:::note warn
接続できなかった場合：
 [Denのドキュメント](https://swiftotter.github.io/den/configuration/dns-resolver.html)にもあるように、<font color="Red">dnsmasqサービスによるDNSの自動解決には、DNSリクエストがローカルネットワークを経由する必要がある。</font>
Windowsの設定方法は、[このサイト](https://www.tipsfound.com/windows10/11014)に分かりやすく載っている。
インターネットプロトコル バージョン 4 (TCP/IPv4)の優先DNSを127.0.0.1に設定する。
:::
:::note info
Wardenを使用していた方はDenに移行する際、`den install`を実行することで、SSL証明書関連のデータをDenに移植できます。
:::

# Magento環境の構築
1.プロジェクトのルートディレクトリで下記コマンドを実行。

```
den env-init [projectname] [environment type]
```
[projectname]：プロジェクトの名前を自由に決める。
[environment type]：[ドキュメント](https://swiftotter.github.io/den/environments/types.html)にあるタイプの中から一つ選ぶ。今回はmagento2の構築なのでmagento2とする。

.envというファイルが生成されるので、PHPのバージョンなどを変更したいときはここに記述する。

2.SSL証明書の作成

```
den sign-certificate [projectname].test
```

3.プロジェクトの環境を立ち上げる

```
den env up -d
```

4.php-fpmコンテナに入る

```
den shell
```

5.composerでMagento2をダウンロードする

```
META_PACKAGE=magento/project-community-edition META_VERSION=2.4.x

composer create-project --repository-url=https://repo.magento.com/ \
    "${META_PACKAGE}" . "${META_VERSION}"
```

META_VERSION＝2.4.xにMagentoのバージョンを入れる。

6.Magento2をインストールする(2.4.x)

```
bin/magento setup:install \
    --backend-frontname=backend \
    --amqp-host=rabbitmq \
    --amqp-port=5672 \
    --amqp-user=guest \
    --amqp-password=guest \
    --db-host=db \
    --db-name=magento \
    --db-user=magento \
    --db-password=magento \
    --search-engine=elasticsearch7 \
    --elasticsearch-host=elasticsearch \
    --elasticsearch-port=9200 \
    --elasticsearch-index-prefix=magento2 \
    --elasticsearch-enable-auth=0 \
    --elasticsearch-timeout=15 \
    --http-cache-hosts=varnish:80 \
    --session-save=redis \
    --session-save-redis-host=redis \
    --session-save-redis-port=6379 \
    --session-save-redis-db=2 \
    --session-save-redis-max-concurrency=20 \
    --cache-backend=redis \
    --cache-backend-redis-server=redis \
    --cache-backend-redis-db=0 \
    --cache-backend-redis-port=6379 \
    --page-cache=redis \
    --page-cache-redis-server=redis \
    --page-cache-redis-db=1 \
    --page-cache-redis-port=6379

## Configure Application
bin/magento config:set --lock-env web/unsecure/base_url \
    "https://${TRAEFIK_SUBDOMAIN}.${TRAEFIK_DOMAIN}/"

bin/magento config:set --lock-env web/secure/base_url \
    "https://${TRAEFIK_SUBDOMAIN}.${TRAEFIK_DOMAIN}/"

bin/magento config:set --lock-env web/secure/offloader_header X-Forwarded-Proto

bin/magento config:set --lock-env web/secure/use_in_frontend 1
bin/magento config:set --lock-env web/secure/use_in_adminhtml 1
bin/magento config:set --lock-env web/seo/use_rewrites 1

#開発環境では、admin userのパスワードをいちいち変えるのは面倒なので、設定でオフにしておきます。
bin/magento config:set admin/security/password_lifetime 0
bin/magento config:set admin/security/password_is_forced 0

#2段階認証も開発環境では不要なので、オフにしておきます。
bin/magento module:disable Magento_TwoFactorAuth

bin/magento config:set --lock-env system/full_page_cache/caching_application 2
bin/magento config:set --lock-env system/full_page_cache/ttl 604800

bin/magento config:set --lock-env catalog/search/enable_eav_indexer 1

bin/magento config:set --lock-env dev/static/sign 0

bin/magento deploy:mode:set -s developer

bin/magento indexer:reindex
bin/magento cache:flush
```

※バージョン2.4.x以前の場合、以下のElasticsearchのパラメータは省略する。

```
--search-engine=elasticsearch7 \
--elasticsearch-host=elasticsearch \
--elasticsearch-port=9200 \
--elasticsearch-index-prefix=magento2 \
--elasticsearch-enable-auth=0 \
--elasticsearch-timeout=15 \
```

代わりに以下のElasticsearchの設定コマンドを打つ。

```
bin/magento config:set --lock-env catalog/search/elasticsearch7_server_hostname elasticsearch
bin/magento config:set --lock-env catalog/search/elasticsearch7_server_port 9200
bin/magento config:set --lock-env catalog/search/elasticsearch7_index_prefix magento2
bin/magento config:set --lock-env catalog/search/elasticsearch7_enable_auth 0
bin/magento config:set --lock-env catalog/search/elasticsearch7_server_timeout 15
```

これでMagento2のインストールは完了。

以下のURLでアプリケーションにアクセスできる。
・https://app.[projectname].test/
・https://app.[projectname].test/backend/
・https://rabbitmq.[projectname].test/
・https://elasticsearch.[projectname].test/

# おわりに
基本的にコマンド等は、コマンド名がwardenからdenに変わっただけで、他の部分は変わりありません。
ただ、少しでも便利に、軽量にしたいという方はぜひDenへの移行を検討してみてください。